194 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <ai-detail class="rightsAdd">
 | |
|     <ai-title :title="addTitle" slot="title" isShowBottomBorder isShowBack @onBackClick="back"/>
 | |
|     <template #content>
 | |
|       <el-form size="small" ref="rightsForm" :model="form" label-width="120px" :rules="rules">
 | |
|         <ai-card title="基本信息">
 | |
|           <template #content>
 | |
|             <div class="grid">
 | |
|               <el-form-item label="应用角色名称" prop="roleName">
 | |
|                 <el-input v-model="form.roleName" placeholder="请输入应用角色名称" clearable/>
 | |
|               </el-form-item>
 | |
|               <el-form-item label="角色标记" prop="type" :rules="{required:true,message:'请选择角色标记'}">
 | |
|                 <ai-select v-model="form.type" dict="roleType" placeholder="请选择角色标记" clearable/>
 | |
|               </el-form-item>
 | |
|             </div>
 | |
|           </template>
 | |
|         </ai-card>
 | |
|         <ai-card title="权限信息">
 | |
|           <template #content>
 | |
|             <el-form-item label="权限列表" prop="menus">
 | |
|               <div class="roleList">
 | |
|                 <el-input v-model="filterText" placeholder="请输入..." clearable suffix-icon="iconfont iconSearch"
 | |
|                           @change="$refs.tree.filter(filterText)" :validate-event="false"/>
 | |
|                 <div class="tree_list">
 | |
|                   <el-tree class="filter-tree" ref="roleTree"
 | |
|                            :data="roleList"
 | |
|                            show-checkbox
 | |
|                            :props="defaultProps"
 | |
|                            default-expand-all
 | |
|                            :check-strictly="false"
 | |
|                            node-key="id"
 | |
|                            :default-checked-keys="form.menus"
 | |
|                            :filter-node-method="filterNode"
 | |
|                            @check="handleMenusSelect"/>
 | |
|                 </div>
 | |
|               </div>
 | |
|             </el-form-item>
 | |
|           </template>
 | |
|         </ai-card>
 | |
|       </el-form>
 | |
|     </template>
 | |
|     <template #footer>
 | |
|       <el-button @click="back()">取消</el-button>
 | |
|       <el-button type="primary" @click="confirm">保存</el-button>
 | |
|     </template>
 | |
|   </ai-detail>
 | |
| </template>
 | |
| <script>
 | |
| 
 | |
| export default {
 | |
|   name: "rightsAdd",
 | |
|   inject: ['top'],
 | |
|   props: {
 | |
|     instance: Function,
 | |
|     dict: Object,
 | |
|     permissions: Function
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       form: {},
 | |
|       id: '',
 | |
|       appList: [],
 | |
|       roleList: [],
 | |
|       defaultProps: {
 | |
|         children: 'list',
 | |
|         label: 'name'
 | |
|       },
 | |
|       treeList: [],
 | |
|       filterText: '',
 | |
|       msgTitle: '添加'
 | |
|     }
 | |
|   },
 | |
|   created() {
 | |
|     if (this.isEdit) {
 | |
|       let {id, name: roleName, type} = this.$route.query
 | |
|       this.form = {menus: [], id, roleName, type}
 | |
|       this.msgTitle = '编辑'
 | |
|     }
 | |
|     this.getPermissions()
 | |
|   },
 | |
|   computed: {
 | |
|     isEdit() {
 | |
|       return this.$route.query.id
 | |
|     },
 | |
|     addTitle() {
 | |
|       return this.isEdit ? '编辑应用角色' : '新增应用角色'
 | |
|     },
 | |
|     rules() {
 | |
|       return {
 | |
|         roleName: {required: true, message: '请输入应用角色名称'},
 | |
|         roleType: {required: true, message: '请选择角色标记'},
 | |
|         menus: {required: true, message: '请选择权限列表内容'},
 | |
|       }
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     filterNode(value, data) {
 | |
|       if (!value) return true;
 | |
|       return data.name.indexOf(value) !== -1;
 | |
|     },
 | |
|     //应用名称选择 获取权限列表
 | |
|     getId(data) {
 | |
|       if (data.list.length) {
 | |
|         data.list.forEach(item => {
 | |
|           this.getId(item)
 | |
|         })
 | |
|       } else {
 | |
|         if (data.checked) {
 | |
|           this.form.menus?.push(data.id)
 | |
|         }
 | |
|       }
 | |
|     },
 | |
|     getPermissions() {
 | |
|       this.filterText = ''
 | |
|       let {id: roleId} = this.form
 | |
|       this.instance.post(this.top.actions.detail, null, {
 | |
|         params: {roleId}
 | |
|       }).then(res => {
 | |
|         if (res?.data) {
 | |
|           this.roleList = res.data;
 | |
|           if (this.isEdit) {
 | |
|             this.roleList.forEach(e => this.getId(e))
 | |
|           }
 | |
|           this.roleList = this.roleList.filter(item => !(item.component && item.isApp == 0 && item.isMenu == 0))
 | |
|         }
 | |
|       })
 | |
|     },
 | |
|     handleMenusSelect(node, selected) {
 | |
|       this.$set(this.form, 'menus', [...selected?.checkedKeys])
 | |
|       this.$refs.rightsForm.validateField('menus')
 | |
|     },
 | |
|     //保存提交
 | |
|     confirm() {
 | |
|       this.$refs.rightsForm.validate().then(() => {
 | |
|         let menus = [this.$refs.roleTree?.getHalfCheckedKeys(), this.$refs.roleTree?.getCheckedKeys()]?.flat()?.toString()
 | |
|         this.instance.post(this.top.actions.modify, null, {
 | |
|           params: {...this.form, menus}
 | |
|         }).then(res => {
 | |
|           if (res?.msg == "success") {
 | |
|             this.$message.success(`${this.msgTitle}应用角色成功`)
 | |
|             this.back()
 | |
|             this.top.searchList()
 | |
|           }
 | |
|         })
 | |
|       })
 | |
|     },
 | |
|     //取消 返回
 | |
|     back(params = {}) {
 | |
|       this.$router.push(params)
 | |
|     }
 | |
|   },
 | |
| }
 | |
| </script>
 | |
| <style lang="scss" scoped>
 | |
| .rightsAdd {
 | |
|   width: 100%;
 | |
|   height: 100%;
 | |
|   position: relative;
 | |
| 
 | |
|   .el-form-item {
 | |
|     .el-select {
 | |
|       width: 100%;
 | |
|     }
 | |
| 
 | |
|     &.is-error {
 | |
|       .roleList {
 | |
|         border-color: #f46;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .roleList {
 | |
|     background-color: #fcfcfc;
 | |
|     border-radius: 2px;
 | |
|     border: solid 1px #d0d4dc;
 | |
|     padding: 8px;
 | |
| 
 | |
|     .input {
 | |
|       display: flex;
 | |
|       justify-content: space-between;
 | |
|       padding: 5px;
 | |
|       margin: 0;
 | |
|     }
 | |
| 
 | |
|     .tree_list {
 | |
|       padding: 5px;
 | |
|       height: 370px;
 | |
|       overflow: auto;
 | |
|     }
 | |
|   }
 | |
| 
 | |
| }
 | |
| </style>
 |