|
1
|
<template>
|
|
2
|
<a-drawer
|
|
3
4
5
6
7
8
9
10
|
:title="title"
:maskClosable="true"
:width="drawerWidth"
placement="right"
:closable="true"
@close="handleCancel"
:visible="visible"
style="height: 100%;">
|
|
11
12
13
14
|
<template slot="title">
<div style="width: 100%;">
<span>{{ title }}</span>
|
|
15
16
|
<span style="display:inline-block;width:calc(100% - 51px);padding-right:10px;text-align: right">
<a-button @click="toggleScreen" icon="appstore" style="height:20px;width:20px;border:0px"></a-button>
|
|
17
18
19
20
21
22
|
</span>
</div>
</template>
<a-spin :spinning="confirmLoading">
|
|
23
|
<a-form-model ref="form" :model="model" :rules="validatorRules">
|
|
24
|
|
|
25
26
27
|
<a-form-model-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="username">
<a-input placeholder="请输入用户账号" v-model="model.username" :readOnly="!!model.id"/>
</a-form-model-item>
|
|
28
29
|
<template v-if="!model.id">
|
|
30
31
32
|
<a-form-model-item label="登录密码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="password" >
<a-input type="password" placeholder="请输入登录密码" v-model="model.password" />
</a-form-model-item>
|
|
33
|
|
|
34
35
36
|
<a-form-model-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="confirmpassword" >
<a-input type="password" @blur="handleConfirmBlur" placeholder="请重新输入登录密码" v-model="model.confirmpassword"/>
</a-form-model-item>
|
|
37
38
|
</template>
|
|
39
40
41
|
<a-form-model-item label="用户姓名" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="realname">
<a-input placeholder="请输入用户姓名" v-model="model.realname" />
</a-form-model-item>
|
|
42
|
|
|
43
44
45
|
<a-form-model-item label="工号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="workNo">
<a-input placeholder="请输入工号" v-model="model.workNo" />
</a-form-model-item>
|
|
46
|
|
|
47
48
49
|
<a-form-model-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="phone">
<a-input placeholder="请输入手机号码" v-model="model.phone" />
</a-form-model-item>
|
|
50
|
|
|
51
52
53
|
<a-form-model-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-select-position placeholder="请选择职务" :multiple="false" v-model="model.post"/>
</a-form-model-item>
|
|
54
|
|
|
55
56
|
<a-form-model-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled" >
<j-multi-select-tag
|
|
57
58
59
60
|
:disabled="disableSubmit"
v-model="model.selectedroles"
:options="rolesOptions"
placeholder="请选择角色">
|
|
61
62
|
</j-multi-select-tag>
</a-form-model-item>
|
|
63
|
|
|
64
|
<!--部门分配-->
|
|
65
|
<a-form-model-item label="部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
|
|
66
|
<j-select-depart v-model="model.selecteddeparts" :multi="true" @back="backDepartInfo" :backDepart="true" :treeOpera="true">></j-select-depart>
|
|
67
|
</a-form-model-item>
|
|
68
69
|
<!--租户分配-->
|
|
70
71
|
<a-form-model-item label="租户分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
<j-multi-select-tag
|
|
72
73
74
75
|
:disabled="disableSubmit"
v-model="model.relTenantIds"
:options="tenantsOptions"
placeholder="请选择租户">
|
|
76
77
78
79
80
81
82
|
</j-multi-select-tag>
</a-form-model-item>
<a-form-model-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-model="model.userIdentity" @change="identityChange">
<a-radio :value="1">普通用户</a-radio>
<a-radio :value="2">上级</a-radio>
|
|
83
|
</a-radio-group>
|
|
84
|
</a-form-model-item>
|
|
85
|
<a-form-model-item label="负责部门" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="departIdShow==true">
|
|
86
|
<j-multi-select-tag
|
|
87
88
89
90
|
:disabled="disableSubmit"
v-model="model.departIds"
:options="nextDepartOptions"
placeholder="请选择负责部门">
|
|
91
92
93
94
95
96
|
</j-multi-select-tag>
</a-form-model-item>
<a-form-model-item label="头像" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-image-upload class="avatar-uploader" text="上传" v-model="model.avatar" ></j-image-upload>
</a-form-model-item>
|
|
97
|
|
|
98
|
<a-form-model-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
|
99
|
<a-date-picker
|
|
100
101
102
103
104
|
style="width: 100%"
placeholder="请选择生日"
v-model="model.birthday"
:format="dateFormat"
:getCalendarContainer="node => node.parentNode"/>
|
|
105
|
</a-form-model-item>
|
|
106
|
|
|
107
108
|
<a-form-model-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-select v-model="model.sex" placeholder="请选择性别" :getPopupContainer= "(target) => target.parentNode">
|
|
109
110
|
<a-select-option :value="1">男</a-select-option>
<a-select-option :value="2">女</a-select-option>
|
|
111
|
</a-select>
|
|
112
|
</a-form-model-item>
|
|
113
|
|
|
114
115
116
|
<a-form-model-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="email">
<a-input placeholder="请输入邮箱" v-model="model.email" />
</a-form-model-item>
|
|
117
|
|
|
118
119
120
|
<a-form-model-item label="座机" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="telephone">
<a-input placeholder="请输入座机" v-model="model.telephone" />
</a-form-model-item>
|
|
121
|
|
|
122
123
124
|
<a-form-model-item label="工作流引擎" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-model="model.activitiSync" placeholder="请选择是否同步工作流引擎" :type="'radio'" dictCode="activiti_sync"/>
</a-form-model-item>
|
|
125
|
|
|
126
|
</a-form-model>
|
|
127
|
</a-spin>
|
|
128
|
|
|
129
130
131
132
133
134
135
136
|
<div class="drawer-bootom-button" v-show="!disableSubmit">
<a-popconfirm title="确定放弃编辑?" @confirm="handleCancel" okText="确定" cancelText="取消">
<a-button style="margin-right: .8rem">取消</a-button>
</a-popconfirm>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">提交</a-button>
</div>
</a-drawer>
|
|
137
138
139
140
141
142
|
</template>
<script>
import moment from 'moment'
import Vue from 'vue'
import { ACCESS_TOKEN } from "@/store/mutation-types"
|
|
143
|
import { getAction } from '@/api/manage'
|
|
144
|
import { addUser,editUser,queryUserRole,queryall } from '@/api/api'
|
|
145
|
import { disabledAuthFilter } from "@/utils/authFilter"
|
|
146
|
import { duplicateCheck } from '@/api/api'
|
|
147
|
|
|
148
|
export default {
|
|
149
|
name: "UserModal",
|
|
150
151
|
components: {
},
|
|
152
153
|
data () {
return {
|
|
154
155
|
departDisabled: false, //是否是我的部门调用该页面
roleDisabled: false, //是否是角色维护调用该页面
|
|
156
|
modalWidth:800,
|
|
157
|
drawerWidth:700,
|
|
158
159
|
modaltoggleFlag:true,
confirmDirty: false,
|
|
160
|
userId:"", //保存用户id
|
|
161
162
163
|
disableSubmit:false,
dateFormat:"YYYY-MM-DD",
validatorRules:{
|
|
164
|
username:[{required: true, message: '请输入用户账号!'},
|
|
165
|
{validator: this.validateUsername,}],
|
|
166
|
password: [{required: true,pattern:/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,message: '密码由8位数字、大小写字母和特殊符号组成!'},
|
|
167
|
{validator: this.validateToNextPassword,trigger: 'change'}],
|
|
168
|
confirmpassword: [{required: true, message: '请重新输入登录密码!',},
|
|
169
|
{ validator: this.compareToFirstPassword,}],
|
|
170
|
realname:[{ required: true, message: '请输入用户名称!' }],
|
|
171
|
phone: [{required: true, message: '请输入手机号!'}, {validator: this.validatePhone}],
|
|
172
|
email: [{validator: this.validateEmail}],
|
|
173
|
roles:{},
|
|
174
|
workNo:[ { required: true, message: '请输入工号' },
|
|
175
|
{ validator: this.validateWorkNo }],
|
|
176
|
telephone: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' },]
|
|
177
|
},
|
|
178
|
departIdShow:false,
|
|
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
title:"操作",
visible: false,
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 5 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
},
uploadLoading:false,
confirmLoading: false,
headers:{},
url: {
|
|
194
195
|
fileUpload: window._CONFIG['domianURL']+"/sys/common/upload",
userWithDepart: "/sys/user/userDepartList", // 引入为指定用户查看部门信息需要的url
|
|
196
|
userId:"/sys/user/generateUserId", // 引入生成添加用户情况下的url
|
|
197
|
syncUserByUserName:"/act/process/extActProcess/doSyncUserByUserName",//同步用户到工作流
|
|
198
|
queryTenantList: '/sys/tenant/queryList'
|
|
199
|
},
|
|
200
201
202
|
tenantsOptions: [],
rolesOptions:[],
nextDepartOptions:[],
|
|
203
204
205
206
207
|
}
},
created () {
const token = Vue.ls.get(ACCESS_TOKEN);
this.headers = {"X-Access-Token":token}
|
|
208
|
this.initRoleList()
|
|
209
|
this.initTenantList()
|
|
210
211
212
213
214
215
216
|
},
computed:{
uploadAction:function () {
return this.url.fileUpload;
}
},
methods: {
|
|
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
add () {
this.refresh();
this.edit({activitiSync:'1',userIdentity:1});
},
edit (record) {
let that = this;
that.visible = true;
//根据屏幕宽度自适应抽屉宽度
this.resetScreenSize();
that.userId = record.id;
that.model = Object.assign({},{selectedroles:'',selecteddeparts:''}, record);
//身份为上级显示负责部门,否则不显示
if(this.model.userIdentity==2){
this.departIdShow=true;
}else{
this.departIdShow=false;
}
if(record.hasOwnProperty("id")){
that.getUserRoles(record.id);
that.getUserDeparts(record.id);
}
console.log('that.model=',that.model)
},
|
|
241
|
isDisabledAuth(code){
|
|
242
243
|
return disabledAuthFilter(code);
},
|
|
244
245
|
//窗口最大化切换
toggleScreen(){
|
|
246
247
248
249
250
251
252
|
if(this.modaltoggleFlag){
this.modalWidth = window.innerWidth;
}else{
this.modalWidth = 800;
}
this.modaltoggleFlag = !this.modaltoggleFlag;
},
|
|
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
|
// 根据屏幕变化,设置抽屉尺寸
resetScreenSize(){
let screenWidth = document.body.clientWidth;
if(screenWidth < 500){
this.drawerWidth = screenWidth;
}else{
this.drawerWidth = 700;
}
},
//初始化租户字典
initTenantList(){
getAction(this.url.queryTenantList).then(res=>{
if(res.success){
this.tenantsOptions = res.result.map((item,index,arr)=>{
let c = {label:item.name, value: item.id+""}
return c;
})
console.log('this.tenantsOptions: ',this.tenantsOptions)
}
})
},
//初始化角色字典
initRoleList(){
|
|
276
277
|
queryall().then((res)=>{
if(res.success){
|
|
278
279
280
281
282
|
this.rolesOptions = res.result.map((item,index,arr)=>{
let c = {label:item.roleName, value:item.id}
return c;
})
console.log('this.rolesOptions: ',this.rolesOptions)
|
|
283
284
285
|
}
});
},
|
|
286
|
getUserRoles(userid){
|
|
287
288
|
queryUserRole({userid:userid}).then((res)=>{
if(res.success){
|
|
289
290
|
this.model.selectedroles = res.result.join(",");
console.log('that.model.selectedroles=',this.model.selectedroles)
|
|
291
292
293
|
}
});
},
|
|
294
|
getUserDeparts(userid){
|
|
295
|
let that = this;
|
|
296
|
getAction(that.url.userWithDepart,{userId:userid}).then((res)=>{
|
|
297
|
if(res.success){
|
|
298
299
|
let departOptions=[];
let selectDepartKeys=[]
|
|
300
|
for (let i = 0; i < res.result.length; i++) {
|
|
301
|
selectDepartKeys.push(res.result[i].key);
|
|
302
|
//新增负责部门选择下拉框
|
|
303
304
305
|
departOptions.push({
value: res.result[i].key,
label: res.result[i].title
|
|
306
|
})
|
|
307
|
}
|
|
308
309
310
|
that.model.selecteddeparts = selectDepartKeys.join(",")
that.nextDepartOptions=departOptions;
console.log('that.nextDepartOptions=',that.nextDepartOptions)
|
|
311
312
|
}
})
|
|
313
|
},
|
|
314
315
316
317
318
319
320
321
322
323
324
325
|
backDepartInfo(info) {
this.model.departIds = this.model.selecteddeparts;
this.nextDepartOptions = info.map((item,index,arr)=>{
let c = {label:item.text, value: item.value+""}
return c;
})
},
refresh () {
this.userId=""
this.nextDepartOptions=[];
this.departIdShow=false;
},
|
|
326
327
328
329
|
close () {
this.$emit('close');
this.visible = false;
this.disableSubmit = false;
|
|
330
|
this.nextDepartOptions=[];
|
|
331
|
this.departIdShow=false;
|
|
332
|
this.$refs.form.resetFields();
|
|
333
334
335
336
337
|
},
moment,
handleSubmit () {
const that = this;
// 触发表单验证
|
|
338
339
|
this.$refs.form.validate(valid => {
if (valid) {
|
|
340
|
that.confirmLoading = true;
|
|
341
|
//如果是上级择传入departIds,否则为空
|
|
342
343
|
if(this.model.userIdentity!==2){
this.model.departIds="";
|
|
344
|
}
|
|
345
346
|
let obj;
if(!this.model.id){
|
|
347
348
|
this.model.id = this.userId;
obj=addUser(this.model);
|
|
349
|
}else{
|
|
350
|
obj=editUser(this.model);
|
|
351
352
353
354
355
|
}
obj.then((res)=>{
if(res.success){
that.$message.success(res.message);
that.$emit('ok');
|
|
356
357
358
359
360
|
}else{
that.$message.warning(res.message);
}
}).finally(() => {
that.confirmLoading = false;
|
|
361
362
|
that.close();
})
|
|
363
364
|
}else{
return false;
|
|
365
366
367
368
369
370
|
}
})
},
handleCancel () {
this.close()
},
|
|
371
372
|
validateToNextPassword (rule, value, callback) {
const confirmpassword=this.model.confirmpassword;
|
|
373
374
375
|
if (value && confirmpassword && value !== confirmpassword) {
callback('两次输入的密码不一样!');
}
|
|
376
|
if (value && this.confirmDirty) {
|
|
377
|
this.$refs.form.validateField(['confirmpassword']);
|
|
378
379
380
|
}
callback();
},
|
|
381
382
|
compareToFirstPassword (rule, value, callback) {
if (value && value !== this.model.password) {
|
|
383
384
385
386
387
388
|
callback('两次输入的密码不一样!');
} else {
callback()
}
},
validatePhone(rule, value, callback){
|
|
389
390
|
if(!value){
callback()
|
|
391
|
}else{
|
|
392
|
if(new RegExp(/^1[3|4|5|7|8|9][0-9]\d{8}$/).test(value)){
|
|
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
|
var params = {
tableName: 'sys_user',
fieldName: 'phone',
fieldVal: value,
dataId: this.userId
};
duplicateCheck(params).then((res) => {
if (res.success) {
callback()
} else {
callback("手机号已存在!")
}
})
}else{
callback("请输入正确格式的手机号码!");
}
}
},
validateEmail(rule, value, callback){
if(!value){
callback()
}else{
|
|
415
|
if(new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/).test(value)){
|
|
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
|
var params = {
tableName: 'sys_user',
fieldName: 'email',
fieldVal: value,
dataId: this.userId
};
duplicateCheck(params).then((res) => {
console.log(res)
if (res.success) {
callback()
} else {
callback("邮箱已存在!")
}
})
}else{
callback("请输入正确格式的邮箱!")
}
|
|
433
434
435
436
|
}
},
validateUsername(rule, value, callback){
var params = {
|
|
437
438
439
440
|
tableName: 'sys_user',
fieldName: 'username',
fieldVal: value,
dataId: this.userId
|
|
441
|
};
|
|
442
443
|
duplicateCheck(params).then((res) => {
if (res.success) {
|
|
444
445
446
447
448
|
callback()
} else {
callback("用户名已存在!")
}
})
|
|
449
|
},
|
|
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
|
validateWorkNo(rule, value, callback){
var params = {
tableName: 'sys_user',
fieldName: 'work_no',
fieldVal: value,
dataId: this.userId
};
duplicateCheck(params).then((res) => {
if (res.success) {
callback()
} else {
callback("工号已存在!")
}
})
},
|
|
465
|
handleConfirmBlur(e) {
|
|
466
|
const value = e.target.value;
|
|
467
468
469
470
471
472
473
474
475
476
|
this.confirmDirty = this.confirmDirty || !!value
},
beforeUpload: function(file){
var fileType = file.type;
if(fileType.indexOf('image')<0){
this.$message.warning('请上传图片');
return false;
}
//TODO 验证文件大小
},
|
|
477
|
identityChange(e){
|
|
478
|
if(e.target.value===1){
|
|
479
|
this.departIdShow=false;
|
|
480
|
}else{
|
|
481
|
this.departIdShow=true;
|
|
482
483
|
}
}
|
|
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
|
}
}
</script>
<style scoped>
.avatar-uploader > .ant-upload {
width:104px;
height:104px;
}
.ant-upload-select-picture-card i {
font-size: 49px;
color: #999;
}
.ant-upload-select-picture-card .ant-upload-text {
margin-top: 8px;
color: #666;
}
.ant-table-tbody .ant-table-row td{
padding-top:10px;
padding-bottom:10px;
}
|
|
508
509
|
.drawer-bootom-button {
position: absolute;
|
|
510
|
bottom: 0;
|
|
511
512
513
514
515
516
517
518
|
width: 100%;
border-top: 1px solid #e8e8e8;
padding: 10px 16px;
text-align: right;
left: 0;
background: #fff;
border-radius: 0 0 2px 2px;
}
|
|
519
520
521
522
523
524
525
|
/*【JTC-502】 添加用户两个滚动条*/
/deep/ .ant-drawer-body {
padding-bottom: 53px;
}
</style>
|