chore: 同步Saber 2.8.2版本

saber
ssc 4 years ago
parent 6f229ad563
commit 3b1f6c8257
  1. BIN
      .git.zip
  2. 2
      package.json
  3. 9
      public/cdn/avue/2.8.18/avue.min.js
  4. 1
      public/cdn/avue/2.8.18/index.css
  5. 4
      src/api/user.js
  6. 1
      src/config/website.js
  7. 4
      src/option/user/info.js
  8. 114
      src/page/login/userlogin.vue
  9. 2
      src/store/modules/user.js
  10. 57
      src/util/util.js
  11. 2
      src/views/plugin/workflow/process/components/button.vue
  12. 1
      src/views/resource/oss.vue
  13. 1
      src/views/system/tenant.vue
  14. 33
      src/views/wel/index.vue
  15. 4
      vue.config.js

Binary file not shown.

@ -1,6 +1,6 @@
{
"name": "saber-admin",
"version": "2.8.1",
"version": "2.8.2",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,11 +1,13 @@
import request from '@/router/axios';
import website from "@/config/website";
export const loginByUsername = (tenantId, username, password, type, key, code) => request({
export const loginByUsername = (tenantId, deptId, roleId, username, password, type, key, code) => request({
url: '/api/blade-auth/oauth/token',
method: 'post',
headers: {
'Tenant-Id': tenantId,
'Dept-Id': deptId,
'Role-Id': roleId,
'Captcha-Key': key,
'Captcha-Code': code,
},

@ -11,6 +11,7 @@ export default {
tenantMode: true, // 是否开启租户模式
tenantId: "000000", // 管理组租户编号
captchaMode: true, // 是否开启验证码模式
switchMode: true, // 是否开启部门切换模式
lockPage: '/lock',
tokenTime: 3000,
tokenHeader: 'Blade-Auth',

@ -26,12 +26,12 @@ export default {
label: '姓名',
span: 12,
row: true,
prop: 'name'
prop: 'realName'
}, {
label: '用户名',
span: 12,
row: true,
prop: 'realName'
prop: 'name'
}, {
label: '手机号',
span: 12,

@ -60,6 +60,12 @@
class="login-submit">{{$t('login.submit')}}
</el-button>
</el-form-item>
<el-dialog title="用户信息选择"
append-to-body
:visible.sync="userBox"
width="350px">
<avue-form :option="userOption" v-model="userForm" @submit="submitLogin"/>
</el-dialog>
</el-form>
</template>
@ -77,6 +83,10 @@
loginForm: {
//ID
tenantId: "000000",
//ID
deptId: "",
//ID
roleId: "",
//
username: "admin",
//
@ -102,7 +112,54 @@
{min: 1, message: "密码长度最少为6位", trigger: "blur"}
]
},
passwordType: "password"
passwordType: "password",
userBox: false,
userForm: {
deptId: '',
roleId: ''
},
userOption: {
labelWidth: 70,
submitBtn: true,
emptyBtn: false,
submitText: '登录',
column: [
{
label: '部门',
prop: 'deptId',
type: 'select',
props: {
label: 'deptName',
value: 'id'
},
dicUrl: '/api/blade-system/dept/select',
span: 24,
display: false,
rules: [{
required: true,
message: "请选择部门",
trigger: "blur"
}],
},
{
label: '角色',
prop: 'roleId',
type: 'select',
props: {
label: 'roleName',
value: 'id'
},
dicUrl: '/api/blade-system/role/select',
span: 24,
display: false,
rules: [{
required: true,
message: "请选择角色",
trigger: "blur"
}],
},
]
}
};
},
created() {
@ -111,23 +168,55 @@
},
mounted() {
},
watch: {
'loginForm.deptId'() {
const column = this.findObject(this.userOption.column, "deptId");
if (this.loginForm.deptId.includes(",")) {
column.dicUrl = `/api/blade-system/dept/select?deptId=${this.loginForm.deptId}`;
column.display = true;
} else {
column.dicUrl = '';
}
},
'loginForm.roleId'() {
const column = this.findObject(this.userOption.column, "roleId");
if (this.loginForm.roleId.includes(",")) {
column.dicUrl = `/api/blade-system/role/select?roleId=${this.loginForm.roleId}`;
column.display = true;
} else {
column.dicUrl = '';
}
}
},
computed: {
...mapGetters(["tagWel"])
...mapGetters(["tagWel", "userInfo"])
},
props: [],
methods: {
refreshCode() {
getCaptcha().then(res => {
const data = res.data;
this.loginForm.key = data.key;
this.loginForm.image = data.image;
})
if (this.website.captchaMode) {
getCaptcha().then(res => {
const data = res.data;
this.loginForm.key = data.key;
this.loginForm.image = data.image;
})
}
},
showPassword() {
this.passwordType === ""
? (this.passwordType = "password")
: (this.passwordType = "");
},
submitLogin (form, done) {
if (form.deptId !== '') {
this.loginForm.deptId = form.deptId;
}
if (form.roleId !== '') {
this.loginForm.roleId = form.roleId;
}
this.handleLogin();
done();
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
@ -137,6 +226,17 @@
spinner: "el-icon-loading"
});
this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
if (this.website.switchMode) {
const deptId = this.userInfo.dept_id;
const roleId = this.userInfo.role_id;
if (deptId.includes(",") || roleId.includes(",")) {
this.loginForm.deptId = deptId;
this.loginForm.roleId = roleId;
this.userBox = true;
loading.close();
return false;
}
}
this.$router.push({path: this.tagWel.value});
loading.close();
}).catch(() => {

@ -48,7 +48,7 @@ const user = {
//根据用户名登录
LoginByUsername({commit}, userInfo) {
return new Promise((resolve, reject) => {
loginByUsername(userInfo.tenantId, userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, userInfo.code).then(res => {
loginByUsername(userInfo.tenantId, userInfo.deptId, userInfo.roleId, userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, userInfo.code).then(res => {
const data = res.data;
if (data.error_description) {
Message({

@ -308,3 +308,60 @@ export const getQueryString = (name) => {
if (r != null) return unescape(decodeURI(r[2]));
return null;
}
/**
* 下载文件
* @param {String} path - 文件地址
* @param {String} name - 文件名,eg: test.png
*/
export const downloadFileBlob = (path, name) => {
const xhr = new XMLHttpRequest();
xhr.open('get', path);
xhr.responseType = 'blob';
xhr.send();
xhr.onload = function () {
if (this.status === 200 || this.status === 304) {
// 如果是IE10及以上,不支持download属性,采用msSaveOrOpenBlob方法,但是IE10以下也不支持msSaveOrOpenBlob
if ('msSaveOrOpenBlob' in navigator) {
navigator.msSaveOrOpenBlob(this.response, name);
return;
}
const url = URL.createObjectURL(this.response);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = name;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
};
}
/**
* 下载文件
* @param {String} path - 文件地址
* @param {String} name - 文件名,eg: test.png
*/
export const downloadFileBase64 = (path, name) => {
const xhr = new XMLHttpRequest();
xhr.open('get', path);
xhr.responseType = 'blob';
xhr.send();
xhr.onload = function () {
if (this.status === 200 || this.status === 304) {
const fileReader = new FileReader();
fileReader.readAsDataURL(this.response);
fileReader.onload = function () {
const a = document.createElement('a');
a.style.display = 'none';
a.href = this.result;
a.download = name;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
};
}
};
}

@ -29,7 +29,7 @@
size="medium"
v-loading="loading"
@click="$emit('print')">打印</el-button>
<el-button v-if="buttonList.find(b => b.buttonKey == 'wf_print')"
<el-button v-if="buttonList.find(b => b.buttonKey == 'wf_rollback')"
type="success"
size="medium"
v-loading="loading"

@ -224,6 +224,7 @@
prop: "backgroundUrl",
type: 'upload',
listType: 'picture-img',
dataType: 'string',
action: '/api/blade-resource/oss/endpoint/put-file',
propsHttp: {
res: 'data',

@ -170,6 +170,7 @@ export default {
prop: "backgroundUrl",
type: 'upload',
listType: 'picture-img',
dataType: 'string',
action: '/api/blade-resource/oss/endpoint/put-file',
propsHttp: {
res: 'data',

@ -9,10 +9,10 @@
<el-col :span="24">
<basic-container>
<p style="text-align: center">
<img src="https://img.shields.io/badge/Release-V2.8.1-green.svg" alt="Downloads"/>
<img src="https://img.shields.io/badge/Release-V2.8.2-green.svg" alt="Downloads"/>
<img src="https://img.shields.io/badge/JDK-1.8+-green.svg" alt="Build Status"/>
<img src="https://img.shields.io/badge/Spring%20Cloud-Hoxton.SR11-blue.svg" alt="Coverage Status"/>
<img src="https://img.shields.io/badge/Spring%20Boot-2.2.13.RELEASE-blue.svg" alt="Downloads"/>
<img src="https://img.shields.io/badge/Spring%20Boot-2.3.12.RELEASE-blue.svg" alt="Downloads"/>
<a target="_blank" href="https://bladex.vip">
<img src="https://img.shields.io/badge/Saber%20Author-Small%20Chill-ff69b4.svg" alt="Downloads"/>
</a>
@ -138,6 +138,33 @@
<el-row>
<basic-container>
<el-collapse v-model="logActiveNames" @change="handleChange">
<el-collapse-item title="2.8.2.RELEASE发布,增强用户登录方案" name="24">
<div>1.[升级]SpringBoot 2.3.12</div>
<div>2.[升级]SpringBootAdmin 2.3.1</div>
<div>3.[升级]Knife4j 2.0.9</div>
<div>4.[升级]Nacos 2.0.2</div>
<div>5.[升级]Seata 1.4.2</div>
<div>6.[回滚]MybatisPlus 3.4.2</div>
<div>7.[升级]DynamicDatasource 3.3.6</div>
<div>8.[升级]Druid 1.2.6</div>
<div>9.[升级]Avue 2.8.18</div>
<div>10.[新增]用户登录错误次数锁定功能</div>
<div>11.[新增]多部门多角色用户在登录时增加下拉选项</div>
<div>12.[新增]新增用户多条件查询接口</div>
<div>13.[新增]Ribbon组件权重读取逻辑</div>
<div>14.[新增]ExcelUtil新增WriteHandler参数</div>
<div>15.[新增]CacheUtil增加指定tenantId清空方法</div>
<div>16.[优化]手机短信校验逻辑增加手机号强制判断</div>
<div>17.[优化]短信调试功能增加资源编号读取</div>
<div>18.[优化]多租户切面逻辑</div>
<div>19.[优化]多租户缓存清空逻辑</div>
<div>20.[优化]ISqlInjector支持自定义覆盖</div>
<div>21.[优化]优化日志对于租户id的判断</div>
<div>22.[优化]Menu类重写hashCode方法</div>
<div>23.[优化]MySql脚本将long类型字段改为bigint(20)</div>
<div>24.[修复]用户中心字段绑定相反的问题</div>
<div>25.[修复]关闭验证码模式后首页仍调用验证码接口的问题</div>
</el-collapse-item>
<el-collapse-item title="2.8.1.RELEASE发布,适配Nacos2支持长链接特性" name="23">
<div>1.[升级]SpringCloud Hoxton.SR11</div>
<div>2.[升级]Avue 2.8.12</div>
@ -640,7 +667,7 @@
data() {
return {
activeNames: ['1', '2', '3', '5'],
logActiveNames: ['23']
logActiveNames: ['24']
};
},
computed: {

@ -18,9 +18,7 @@ module.exports = {
entry.add('@/mock').end();
},
css: {
extract: {
ignoreOrder: true
}
extract: { ignoreOrder: true }
},
//开发模式反向代理配置,生产模式请使用Nginx部署并配置反向代理
devServer: {

Loading…
Cancel
Save