|  | @@ -23,18 +23,25 @@ |  | @@ -23,18 +23,25 @@ | 
| 23 | :tree-props="{children: 'children', hasChildren: 'hasChildren'}"> | 23 | :tree-props="{children: 'children', hasChildren: 'hasChildren'}"> | 
| 24 | <el-table-column type="selection" width="55"> | 24 | <el-table-column type="selection" width="55"> | 
| 25 | </el-table-column> | 25 | </el-table-column> | 
| 26 | -			<el-table-column type="index" width="60"> |  |  | 
| 27 | -			</el-table-column> |  |  | 
| 28 | -			<!--<el-table-column prop="roleId" label="ID" width="100" sortable>--> | 26 | +			<!--<el-table-column type="index" width="60">--> | 
| 29 | <!--</el-table-column>--> | 27 | <!--</el-table-column>--> | 
|  |  | 28 | +			<el-table-column prop="roleId" label="ID" width="120"> | 
|  |  | 29 | +			</el-table-column> | 
| 30 | <el-table-column prop="roleName" label="岗位/角色名称" min-width="200" sortable> | 30 | <el-table-column prop="roleName" label="岗位/角色名称" min-width="200" sortable> | 
| 31 | </el-table-column> | 31 | </el-table-column> | 
| 32 | <!--<el-table-column prop="departmentName" label="部门名称" min-width="200" sortable>--> | 32 | <!--<el-table-column prop="departmentName" label="部门名称" min-width="200" sortable>--> | 
| 33 | <!--</el-table-column>--> | 33 | <!--</el-table-column>--> | 
| 34 | -			<el-table-column prop="description" label="描述" min-width="200" sortable> | 34 | +			<el-table-column prop="description" label="描述" min-width="160" > | 
|  |  | 35 | +			</el-table-column> | 
|  |  | 36 | +			<el-table-column prop="type" label="类型" min-width="80" sortable> | 
|  |  | 37 | +			</el-table-column> | 
|  |  | 38 | +			<el-table-column prop="businessLicense" label="工商代码" min-width="180" > | 
|  |  | 39 | +			</el-table-column> | 
|  |  | 40 | +			<el-table-column prop="customsRegCode" label="海关备案代码" min-width="150" > | 
| 35 | </el-table-column> | 41 | </el-table-column> | 
| 36 | <el-table-column label="操作" min-width="260"> | 42 | <el-table-column label="操作" min-width="260"> | 
| 37 | <template slot-scope="scope"> | 43 | <template slot-scope="scope"> | 
|  |  | 44 | +					<el-button type="primary" size="small" @click="handleAdd(scope.$index, scope.row)">新增下级</el-button> | 
| 38 | <el-button size="small" @click="setPerm(scope.$index, scope.row)">设置权限</el-button> | 45 | <el-button size="small" @click="setPerm(scope.$index, scope.row)">设置权限</el-button> | 
| 39 | <el-button size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button> | 46 | <el-button size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button> | 
| 40 | <el-button type="danger" size="small" @click="handleDel(scope.$index, scope.row)">删除</el-button> | 47 | <el-button type="danger" size="small" @click="handleDel(scope.$index, scope.row)">删除</el-button> | 
|  | @@ -79,23 +86,37 @@ |  | @@ -79,23 +86,37 @@ | 
| 79 |  | 86 |  | 
| 80 | <!--新增界面--> | 87 | <!--新增界面--> | 
| 81 | <el-dialog title="新增" :visible.sync="addFormVisible" :close-on-click-modal="false"> | 88 | <el-dialog title="新增" :visible.sync="addFormVisible" :close-on-click-modal="false"> | 
| 82 | -			<el-form :model="addForm" label-width="80px" :rules="addFormRules" ref="addForm"> |  |  | 
| 83 | -				<el-form-item label="岗位/角色名称" prop="roleName"> |  |  | 
| 84 | -					<el-input v-model="addForm.roleName" auto-complete="off" placeholder="请输入岗位/角色名称:例如:ROLE_name"></el-input> | 89 | +			<el-form :model="addForm" label-width="120px" :rules="addFormRules" ref="addForm"> | 
|  |  | 90 | +				<el-form-item label="上级组织机构"> | 
|  |  | 91 | +					<span>{{addForm.parentName}}</span> | 
|  |  | 92 | +				</el-form-item> | 
|  |  | 93 | +				<el-form-item label="组织机构名称" prop="roleName"> | 
|  |  | 94 | +					<el-input v-model="addForm.roleName" auto-complete="off" placeholder="请输入组织机构名称:例如:公司名称"></el-input> | 
| 85 | </el-form-item> | 95 | </el-form-item> | 
| 86 | -				<el-form-item label="岗位/角色描述" prop="description"> |  |  | 
| 87 | -					<el-input v-model="addForm.description" auto-complete="off" placeholder="请输入岗位/角色描述:例如:用户管理员"></el-input> | 96 | +				<el-form-item label="组织机构描述" prop="description"> | 
|  |  | 97 | +					<el-input v-model="addForm.description" auto-complete="off" placeholder="组织机构描述:例如:组织机构简介"></el-input> | 
| 88 | </el-form-item> | 98 | </el-form-item> | 
| 89 | -				<el-form-item label="部门名称" prop="roleSign"> |  |  | 
| 90 | -					<el-select v-model="addForm.departmentId" placeholder="请选择"> | 99 | +				<el-form-item label="组织机构类型" prop="description"> | 
|  |  | 100 | +					<el-select | 
|  |  | 101 | +							v-model="addForm.type" | 
|  |  | 102 | +							filterable | 
|  |  | 103 | +							allow-create | 
|  |  | 104 | +							default-first-option | 
|  |  | 105 | +							placeholder="请选择类型"> | 
| 91 | <el-option | 106 | <el-option | 
| 92 | -								v-for="item in departmentNameList" |  |  | 
| 93 | -								:key="item.departmentId" |  |  | 
| 94 | -								:label="item.departmentName" |  |  | 
| 95 | -								:value="item.departmentId"> | 107 | +								v-for="item in companyOption" | 
|  |  | 108 | +								:key="item.value" | 
|  |  | 109 | +								:label="item.label" | 
|  |  | 110 | +								:value="item.value"> | 
| 96 | </el-option> | 111 | </el-option> | 
| 97 | </el-select> | 112 | </el-select> | 
| 98 | </el-form-item> | 113 | </el-form-item> | 
|  |  | 114 | +				<el-form-item label="工商企业代码" prop="description"> | 
|  |  | 115 | +					<el-input v-model="addForm.businessLicense" auto-complete="off" placeholder="社会信用代码或者组织机构代码"></el-input> | 
|  |  | 116 | +				</el-form-item> | 
|  |  | 117 | +				<el-form-item label="海关备案代码" prop="description"> | 
|  |  | 118 | +					<el-input v-model="addForm.customsRegCode" auto-complete="off" placeholder="海关备案后返回的备案代码"></el-input> | 
|  |  | 119 | +				</el-form-item> | 
| 99 | </el-form> | 120 | </el-form> | 
| 100 | <div slot="footer" class="dialog-footer"> | 121 | <div slot="footer" class="dialog-footer"> | 
| 101 | <el-button @click.native="addFormVisible = false">取消</el-button> | 122 | <el-button @click.native="addFormVisible = false">取消</el-button> | 
|  | @@ -106,9 +127,11 @@ |  | @@ -106,9 +127,11 @@ | 
| 106 | <!--权限设置界面--> | 127 | <!--权限设置界面--> | 
| 107 | <el-dialog title="岗位的权限设置" :visible.sync="PermFormVisible" :close-on-click-modal="false"> | 128 | <el-dialog title="岗位的权限设置" :visible.sync="PermFormVisible" :close-on-click-modal="false"> | 
| 108 | <el-form :model="permForm" label-width="80px"  ref="permForm"> | 129 | <el-form :model="permForm" label-width="80px"  ref="permForm"> | 
| 109 | -				<el-checkbox-group v-model="permIds" size="small"> |  |  | 
| 110 | -					<el-checkbox v-for="perm in permissons" :label="perm.permissionId" :key="perm.permissionId">{{perm.name}}</el-checkbox> |  |  | 
| 111 | -				</el-checkbox-group> | 130 | +				<el-tree :data="permissons" :props="treeDefaultProps" | 
|  |  | 131 | +					@check="clickDeal" | 
|  |  | 132 | +					show-checkbox highlight-current default-expand-all check-on-click-node check-strictly | 
|  |  | 133 | +					node-key="permissionId" ref="tree"> | 
|  |  | 134 | +				</el-tree> | 
| 112 | </el-form> | 135 | </el-form> | 
| 113 | <div slot="footer" class="dialog-footer"> | 136 | <div slot="footer" class="dialog-footer"> | 
| 114 | <el-button @click.native="PermFormVisible = false">取消</el-button> | 137 | <el-button @click.native="PermFormVisible = false">取消</el-button> | 
|  | @@ -131,6 +154,20 @@ |  | @@ -131,6 +154,20 @@ | 
| 131 | filters: { | 154 | filters: { | 
| 132 | roleName: '' | 155 | roleName: '' | 
| 133 | }, | 156 | }, | 
|  |  | 157 | +                companyOption: [ | 
|  |  | 158 | +					{ | 
|  |  | 159 | +						label: "集团", | 
|  |  | 160 | +						value: "集团" | 
|  |  | 161 | +					}, | 
|  |  | 162 | +					{ | 
|  |  | 163 | +                        label: "公司", | 
|  |  | 164 | +                        value: "公司" | 
|  |  | 165 | +					} | 
|  |  | 166 | +				], | 
|  |  | 167 | +                treeDefaultProps: { | 
|  |  | 168 | +                    children: 'children', | 
|  |  | 169 | +                    label: 'name', | 
|  |  | 170 | +                }, | 
| 134 | departmentNameList:[], | 171 | departmentNameList:[], | 
| 135 | roles: [], | 172 | roles: [], | 
| 136 | permissons: [], | 173 | permissons: [], | 
|  | @@ -175,7 +212,12 @@ |  | @@ -175,7 +212,12 @@ | 
| 175 | description: '', | 212 | description: '', | 
| 176 | roleName: '', | 213 | roleName: '', | 
| 177 | roleSign: 1, | 214 | roleSign: 1, | 
| 178 | -                    departmentId:'' | 215 | +                    departmentId:'', | 
|  |  | 216 | +					type: '', | 
|  |  | 217 | +                    businessLicense: '', | 
|  |  | 218 | +                    customsRegCode: '', | 
|  |  | 219 | +					parentName: '' | 
|  |  | 220 | + | 
| 179 | }, | 221 | }, | 
| 180 | permForm: { | 222 | permForm: { | 
| 181 | roleId: 1, | 223 | roleId: 1, | 
|  | @@ -228,7 +270,6 @@ |  | @@ -228,7 +270,6 @@ | 
| 228 |  | 270 |  | 
| 229 | }, | 271 | }, | 
| 230 |  | 272 |  | 
| 231 | - |  |  | 
| 232 | //获取部门列表 | 273 | //获取部门列表 | 
| 233 | getdepartmentNames() { | 274 | getdepartmentNames() { | 
| 234 |  | 275 |  | 
|  | @@ -268,7 +309,11 @@ |  | @@ -268,7 +309,11 @@ | 
| 268 | if(null!= error.response && error.response!==undefined){ | 309 | if(null!= error.response && error.response!==undefined){ | 
| 269 | let status= error.response.status; | 310 | let status= error.response.status; | 
| 270 | let msg = error.response.statusText; | 311 | let msg = error.response.statusText; | 
| 271 | -                        alert(status+msg); | 312 | +                        message({ | 
|  |  | 313 | +                            //  饿了么的消息弹窗组件 | 
|  |  | 314 | +                            message: status+msg, | 
|  |  | 315 | +                            type: "error" | 
|  |  | 316 | +                        }); | 
| 272 | }else { | 317 | }else { | 
| 273 | alert(error); | 318 | alert(error); | 
| 274 | } | 319 | } | 
|  | @@ -308,9 +353,10 @@ |  | @@ -308,9 +353,10 @@ | 
| 308 | this.getdepartmentNames(); | 353 | this.getdepartmentNames(); | 
| 309 | }, | 354 | }, | 
| 310 | setPerm: function (index, row) { | 355 | setPerm: function (index, row) { | 
|  |  | 356 | +                this.PermFormVisible = true; | 
|  |  | 357 | +                this.getPermList(); | 
| 311 | var _this = this; | 358 | var _this = this; | 
| 312 | this.permIds = []; | 359 | this.permIds = []; | 
| 313 | -                this.PermFormVisible = true; |  |  | 
| 314 | this.permForm = Object.assign({}, row); | 360 | this.permForm = Object.assign({}, row); | 
| 315 | let rolePerms = this.permForm.permissions; | 361 | let rolePerms = this.permForm.permissions; | 
| 316 | if (util.checkNull(rolePerms)){ | 362 | if (util.checkNull(rolePerms)){ | 
|  | @@ -320,22 +366,36 @@ |  | @@ -320,22 +366,36 @@ | 
| 320 | } | 366 | } | 
| 321 | }); | 367 | }); | 
| 322 | } | 368 | } | 
| 323 | -                this.getPermList(); | 369 | + | 
|  |  | 370 | +                this.$nextTick(() => { | 
|  |  | 371 | + | 
|  |  | 372 | +                    //反向适配 | 
|  |  | 373 | +                    this.$refs.tree.setCheckedKeys(this.permIds); | 
|  |  | 374 | +                }); | 
| 324 | }, | 375 | }, | 
| 325 | //显示新增界面,每次点开初始化数据 | 376 | //显示新增界面,每次点开初始化数据 | 
| 326 | -			handleAdd: function () { | 377 | +			handleAdd: function (index,row) { | 
| 327 | this.addFormVisible = true; | 378 | this.addFormVisible = true; | 
| 328 | this.addForm = { | 379 | this.addForm = { | 
| 329 | -                    username: '', |  |  | 
| 330 | -                    password: '', |  |  | 
| 331 | -                    sex: 1, |  |  | 
| 332 | -                    address: '', |  |  | 
| 333 | -                    realname: '', |  |  | 
| 334 | -                    email:	'', |  |  | 
| 335 | -                    mobilephone: '', |  |  | 
| 336 | -                    age: 1 |  |  | 
| 337 | -				}; |  |  | 
| 338 | -				this.getdepartmentNames(); | 380 | +                    description: '', | 
|  |  | 381 | +                    roleName: '', | 
|  |  | 382 | +                    roleSign: 1, | 
|  |  | 383 | +                    departmentId:'', | 
|  |  | 384 | +                    type: '', | 
|  |  | 385 | +                    businessLicense: '', | 
|  |  | 386 | +                    customsRegCode: '', | 
|  |  | 387 | +                    parentid: 0 | 
|  |  | 388 | + | 
|  |  | 389 | +                }; | 
|  |  | 390 | +				//如果新增下级 | 
|  |  | 391 | +				if(util.checkNull(row)){ | 
|  |  | 392 | +					//传递上级ID | 
|  |  | 393 | +                    let parentRole = Object.assign({}, row); | 
|  |  | 394 | +                    this.addForm.parentid = parentRole.roleId; | 
|  |  | 395 | +                    this.addForm.parentName = parentRole.roleName; | 
|  |  | 396 | +				} | 
|  |  | 397 | + | 
|  |  | 398 | +//				this.getdepartmentNames(); | 
| 339 | }, | 399 | }, | 
| 340 | //编辑 | 400 | //编辑 | 
| 341 | editSubmit: function () { | 401 | editSubmit: function () { | 
|  | @@ -406,7 +466,7 @@ |  | @@ -406,7 +466,7 @@ | 
| 406 | //NProgress.start(); | 466 | //NProgress.start(); | 
| 407 | let role = Object.assign({}, this.permForm); | 467 | let role = Object.assign({}, this.permForm); | 
| 408 | let roleId = role.roleId; | 468 | let roleId = role.roleId; | 
| 409 | -                            let permissionIds = this.permIds | 469 | +                            let permissionIds = this.$refs.tree.getCheckedKeys(); | 
| 410 | let para = {roleId,permissionIds}; | 470 | let para = {roleId,permissionIds}; | 
| 411 | updateRolePerm(para).then((res) => { | 471 | updateRolePerm(para).then((res) => { | 
| 412 | this.addLoading = false; | 472 | this.addLoading = false; | 
|  | @@ -449,6 +509,81 @@ |  | @@ -449,6 +509,81 @@ | 
| 449 | }).catch(() => { | 509 | }).catch(() => { | 
| 450 |  | 510 |  | 
| 451 | }); | 511 | }); | 
|  |  | 512 | +			}, | 
|  |  | 513 | +            treeHandleCheckChange: function (data, checked, indeterminate) { | 
|  |  | 514 | +                if(checked) { | 
|  |  | 515 | +                    this.permIds.push(data.permissionId); | 
|  |  | 516 | +                }else { | 
|  |  | 517 | +                    this.permIds.splice(this.permIds.contains(data.permissionId),1); | 
|  |  | 518 | +                } | 
|  |  | 519 | +                console.log(data, checked, indeterminate); | 
|  |  | 520 | + | 
|  |  | 521 | +            }, | 
|  |  | 522 | +            uniteParentSame(id,treeStatus){//当子节点全为未选中时父节点也变为未选中状态 | 
|  |  | 523 | +                let node = this.$refs.tree.getNode(permissionId);//获取当前节点的节点树 | 
|  |  | 524 | +                if (node.parent !== null && node.parent !== undefined) { | 
|  |  | 525 | +                    let parentNode =   node.parent.data;//获取当前节点的父节点树 | 
|  |  | 526 | +                    if (parentNode != undefined){//判断父节点是否存在 | 
|  |  | 527 | +                        for (let i = 0; i < parentNode.children.length; i++) { | 
|  |  | 528 | +                            let checkedKeys = this.$refs.tree.getCheckedKeys(); | 
|  |  | 529 | +                            let hafCheckedKeys = this.$refs.tree.getHalfCheckedKeys(); | 
|  |  | 530 | +                            let selectNodes = checkedKeys.concat(hafCheckedKeys);//获取已选择树节点 | 
|  |  | 531 | +                            let selected = selectNodes.indexOf(parentNode.children[i].permissionId); // -1当前节点的同级节点是否全部未选中 | 
|  |  | 532 | +                            if (selected !== -1){ | 
|  |  | 533 | +                                return; | 
|  |  | 534 | +                            } | 
|  |  | 535 | +                        } | 
|  |  | 536 | +                    }else { | 
|  |  | 537 | +                        return; | 
|  |  | 538 | +                    } | 
|  |  | 539 | +                    this.$refs.tree.setChecked(parentNode.permissionId, false);//修改节点为未选择 | 
|  |  | 540 | +                    if(node.level>2){//判断是否是最上级节点 | 
|  |  | 541 | +                        this.uniteParentSame(parentNode.permissionId,treeStatus) | 
|  |  | 542 | +                    } | 
|  |  | 543 | +                }else { | 
|  |  | 544 | +                    return; | 
|  |  | 545 | +                } | 
|  |  | 546 | +            }, | 
|  |  | 547 | + | 
|  |  | 548 | +            // 统一处理子节点为相同的勾选状态 | 
|  |  | 549 | +            uniteChildSame(treeList, isSelected){ | 
|  |  | 550 | +                this.$refs.tree.setChecked(treeList.permissionId, isSelected); | 
|  |  | 551 | +                if (treeList.children !== undefined){ | 
|  |  | 552 | +                    for (let i = 0; i < treeList.children.length; i++) { | 
|  |  | 553 | +                        this.uniteChildSame(treeList.children[i], isSelected) | 
|  |  | 554 | +                    } | 
|  |  | 555 | +                } | 
|  |  | 556 | +            }, | 
|  |  | 557 | +            // 统一处理父节点为选中 | 
|  |  | 558 | +            selectedParent(currentObj){ | 
|  |  | 559 | +                let currentNode = this.$refs.tree.getNode(currentObj); | 
|  |  | 560 | +                if (currentNode.parent.key !== undefined) { | 
|  |  | 561 | +                    this.$refs.tree.setChecked(currentNode.parent, true); | 
|  |  | 562 | +                    this.selectedParent(currentNode.parent) | 
|  |  | 563 | +                } | 
|  |  | 564 | +            }, | 
|  |  | 565 | +            clickDeal: function (currentObj, treeStatus){ | 
|  |  | 566 | +				// 用于:父子节点严格互不关联时,父节点勾选变化时通知子节点同步变化,实现单向关联。 | 
|  |  | 567 | +				let selected = treeStatus.checkedKeys.indexOf(currentObj.permissionId); // -1未选中 | 
|  |  | 568 | +				// 选中 | 
|  |  | 569 | +				if (selected !== -1) { | 
|  |  | 570 | +					// 子节点只要被选中父节点就被选中 | 
|  |  | 571 | +					this.selectedParent(currentObj); | 
|  |  | 572 | +					// 统一处理子节点为相同的勾选状态 | 
|  |  | 573 | +					this.uniteChildSame(currentObj, true) | 
|  |  | 574 | +				} else { | 
|  |  | 575 | +					// 未选中 处理子节点全部未选中 | 
|  |  | 576 | +					if (currentObj.children !== undefined){ | 
|  |  | 577 | +						if (currentObj.children.length !== 0) { | 
|  |  | 578 | +							this.uniteChildSame(currentObj, false) | 
|  |  | 579 | +						} | 
|  |  | 580 | +						//放开时为当子节点全为未选中时父节点也变为未选中状态   注释后就是父节点不和子节点强制绑定 | 
|  |  | 581 | +						// this.uniteParentSame(currentObj.id,treeStatus)//当子节点全为未选中时父节点也变为未选中状态 | 
|  |  | 582 | +					} | 
|  |  | 583 | +					// else { | 
|  |  | 584 | +					//     this.uniteParentSame(currentObj.id,treeStatus) | 
|  |  | 585 | +					// } | 
|  |  | 586 | +				} | 
| 452 | } | 587 | } | 
| 453 | }, | 588 | }, | 
| 454 | mounted() { | 589 | mounted() { |