RoleEdit.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px" @close="close">
  3. <el-form ref="form" label-width="80px" :model="form" :rules="rules">
  4. <el-form-item label="角色名称" prop="roleName">
  5. <el-input v-model="form.roleName" />
  6. </el-form-item>
  7. <el-form-item label="权限字符" prop="roleKey">
  8. <el-input v-model="form.roleKey" />
  9. </el-form-item>
  10. <el-form-item label="角色顺序" prop="sort">
  11. <el-input-number v-model="form.sort" controls-position="right" :min="0" />
  12. </el-form-item>
  13. <el-form-item label="状态" prop="status">
  14. <el-radio-group v-model="form.status">
  15. <el-radio label="10">正常</el-radio>
  16. <el-radio label="20">停用</el-radio>
  17. <!-- <el-radio-->
  18. <!-- v-for="dict in dict.type.sys_normal_disable"-->
  19. <!-- :key="dict.value"-->
  20. <!-- :label="dict.value"-->
  21. <!-- >{{dict.label}}</el-radio>-->
  22. </el-radio-group>
  23. </el-form-item>
  24. <el-form-item label="菜单权限">
  25. <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
  26. <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
  27. <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">
  28. 父子联动
  29. </el-checkbox>
  30. <div class="vab-tree-border">
  31. <el-tree ref="menu" :check-strictly="!form.menuCheckStrictly" :data="treeList" node-key="id" show-checkbox>
  32. <template #default="{ data }">
  33. <span>{{ data.meta.title }}</span>
  34. </template>
  35. </el-tree>
  36. </div>
  37. </el-form-item>
  38. <el-form-item label="备注" prop="remark">
  39. <el-input v-model="form.remark" placeholder="请输入内容" type="textarea" />
  40. </el-form-item>
  41. </el-form>
  42. <template #footer>
  43. <el-button @click="close">取 消</el-button>
  44. <el-button type="primary" @click="save">确 定</el-button>
  45. </template>
  46. </el-dialog>
  47. </template>
  48. <script>
  49. import roleApi from '@/api/system/role'
  50. import menuApi from '@/api/system/menu'
  51. export default {
  52. name: 'RoleEdit',
  53. data() {
  54. return {
  55. form: {
  56. sort: 0,
  57. status: '10',
  58. },
  59. rules: {
  60. roleName: [{ required: true, trigger: 'blur', message: '请输入角色名称' }],
  61. roleKey: [{ required: true, trigger: 'blur', message: '请输入权限字符' }],
  62. status: [{ required: true, trigger: 'blur', message: '请输入状态' }],
  63. },
  64. title: '',
  65. dialogFormVisible: false,
  66. treeList: [],
  67. menuExpand: false,
  68. menuNodeAll: false,
  69. }
  70. },
  71. created() {
  72. this.fetchData()
  73. },
  74. methods: {
  75. showEdit(row) {
  76. if (!row) {
  77. this.title = '添加'
  78. } else {
  79. this.title = '编辑'
  80. this.getEntityById(row.id)
  81. }
  82. this.dialogFormVisible = true
  83. },
  84. close() {
  85. this.$refs['form'].resetFields()
  86. this.form = this.$options.data().form
  87. this.dialogFormVisible = false
  88. },
  89. async fetchData() {
  90. const { data: data } = await menuApi.getTree({ isAll: 'all' })
  91. this.treeList = data
  92. },
  93. async getEntityById(id) {
  94. const { data: data } = await roleApi.getEntityById({ id: id })
  95. this.form = data
  96. this.form.menuCheckStrictly = this.form.menuCheckStrictly === '10'
  97. this.form.deptCheckStrictly = this.form.deptCheckStrictly === '10'
  98. this.$nextTick(() => {
  99. this.$refs.menu.setCheckedKeys(this.form.menuIds)
  100. })
  101. },
  102. save() {
  103. // 具体业务请自行调整
  104. this.$refs['form'].validate(async (valid) => {
  105. if (valid) {
  106. if (this.form.menuCheckStrictly) {
  107. this.form.menuCheckStrictly = '10'
  108. } else {
  109. this.form.menuCheckStrictly = '20'
  110. }
  111. if (this.form.deptCheckStrictly) {
  112. this.form.deptCheckStrictly = '10'
  113. } else {
  114. this.form.deptCheckStrictly = '20'
  115. }
  116. this.form.menuIds = this.getMenuAllCheckedKeys()
  117. if (this.form.id) {
  118. const { msg } = await roleApi.doEdit(this.form)
  119. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  120. } else {
  121. const { msg } = await roleApi.doAdd(this.form)
  122. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  123. }
  124. this.$emit('fetch-data')
  125. this.close()
  126. }
  127. })
  128. },
  129. // 所有菜单节点数据
  130. getMenuAllCheckedKeys() {
  131. // 目前被选中的菜单节点
  132. let checkedKeys = this.$refs.menu.getHalfCheckedKeys()
  133. // 半选中的菜单节点
  134. let halfCheckedKeys = this.$refs.menu.getCheckedKeys()
  135. checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
  136. return checkedKeys
  137. },
  138. // 树权限(展开/折叠)
  139. handleCheckedTreeExpand(value, type) {
  140. if (type == 'menu') {
  141. let treeList = this.treeList
  142. for (let i = 0; i < treeList.length; i++) {
  143. this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value
  144. }
  145. } else if (type == 'dept') {
  146. let treeList = this.treeList
  147. for (let i = 0; i < treeList.length; i++) {
  148. this.$refs.dept.store.nodesMap[treeList[i].deptId].expanded = value
  149. }
  150. }
  151. },
  152. // 树权限(全选/全不选)
  153. handleCheckedTreeNodeAll(value, type) {
  154. if (type == 'menu') {
  155. this.$refs.menu.setCheckedNodes(value ? this.treeList : [])
  156. } else if (type == 'dept') {
  157. this.$refs.dept.setCheckedNodes(value ? this.treeList : [])
  158. }
  159. },
  160. // 树权限(父子联动)
  161. handleCheckedTreeConnect(value, type) {
  162. if (type == 'menu') {
  163. this.form.menuCheckStrictly = value ? true : false
  164. } else if (type == 'dept') {
  165. this.form.deptCheckStrictly = value ? true : false
  166. }
  167. },
  168. },
  169. }
  170. </script>
  171. <style lang="scss" scoped>
  172. .vab-tree-border {
  173. height: 200px;
  174. padding: $base-padding;
  175. overflow-y: auto;
  176. border: 1px solid #dcdfe6;
  177. border-radius: $base-border-radius;
  178. }
  179. </style>