form.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <el-form label-position="left" label-width="100px">
  3. <!-- 开发模式下显示该字段 -->
  4. <el-form-item v-if="is_dev" :label="$t('pages.role.is_default')">
  5. <el-radio-group v-model="form.is_default">
  6. <el-radio label="0">{{ $t('common.yes') }}</el-radio>
  7. <el-radio label="1">{{ $t('common.no') }}</el-radio>
  8. </el-radio-group>
  9. </el-form-item>
  10. <el-form-item :label="$t('pages.role.is_admin_role')">
  11. <el-radio-group v-model="form.is_admin_role">
  12. <el-radio label="1">{{ $t('common.yes') }}</el-radio>
  13. <el-radio label="0">{{ $t('common.no') }}</el-radio>
  14. </el-radio-group>
  15. </el-form-item>
  16. <el-form-item :label="$t('pages.role.name')">
  17. <el-input v-model="form.name" :placeholder="$t('pages.role.namePh')"></el-input>
  18. </el-form-item>
  19. <el-form-item :label="$t('pages.role.code')">
  20. <el-input v-model="form.code" :placeholder="$t('pages.role.codePh')"></el-input>
  21. </el-form-item>
  22. <el-form-item :label="$t('pages.role.is_use')">
  23. <el-radio-group v-model="form.is_use">
  24. <el-radio label="0">{{ $t('common.is_use_abled') }}</el-radio>
  25. <el-radio label="1">{{ $t('common.is_use_disabled') }}</el-radio>
  26. </el-radio-group>
  27. </el-form-item>
  28. <el-form-item :label="$t('pages.role.brief')">
  29. <el-input v-model="form.brief" type="textarea" :rows="3"></el-input>
  30. </el-form-item>
  31. <el-form-item :label="$t('pages.role.menu')">
  32. <template v-if="form.is_admin_role === '1'">
  33. <el-tree ref="roleTree" :data="getMenus()" node-key="code" default-expand-all show-checkbox @check-change="seletNode">
  34. <template #default="{ data }">
  35. <span>{{ data.name }}</span>
  36. </template>
  37. </el-tree>
  38. </template>
  39. <template v-else-if="form.is_admin_role === '0'">
  40. <el-tree ref="roleTree" :data="getUserMenus()" node-key="code" default-expand-all show-checkbox @check-change="seletNode">
  41. <template #default="{ data }">
  42. <span>{{ data.name }}</span>
  43. </template>
  44. </el-tree>
  45. </template>
  46. <template v-else>
  47. 请先选择是否是管理员!
  48. </template>
  49. </el-form-item>
  50. <el-row justify="center" style="text-align: center">
  51. <el-col :span="6">
  52. <el-button @click="onSubmit" type="primary">{{ $t('common.save') }}</el-button>
  53. </el-col>
  54. </el-row>
  55. </el-form>
  56. </template>
  57. <script setup>
  58. const form = inject('form')
  59. const menuList = inject('menuList')
  60. const userMenusList = inject('userMenusList')
  61. const onSubmit = inject('onSubmit')
  62. const roleTree = ref()
  63. const is_dev = import.meta.env.MODE === 'development'
  64. const getMenus = () => {
  65. const list = toRaw(menuList.value)
  66. const result = dealMenu(list)
  67. return result
  68. }
  69. const getUserMenus = () => {
  70. const list = toRaw(userMenusList.value)
  71. const result = dealMenu(list)
  72. return result
  73. }
  74. onMounted(() => {
  75. const treeSelected = toRaw(form.value.menu)
  76. for (const key of treeSelected) {
  77. roleTree.value.setChecked(key, true)
  78. }
  79. const selected = roleTree.value.getCheckedKeys()
  80. if (!selected.includes('home')) roleTree.value.setChecked('home', true)
  81. })
  82. /**
  83. * 处理目录:将目录,目录,子页面,权限统一转成 {name,code}形式,code为唯一值
  84. * 目录,目录,子页面:
  85. * route_name是唯一的,所以使用route_name作为code
  86. * 权限:
  87. * code并不是唯一,但是加上route_name就是唯一的
  88. * @param {Array} list 目录列表
  89. * @param {Array} route_names 将上级的route_name放入此数组中,在转为权限数据时,拼接成code
  90. */
  91. const dealMenu = (list, route_names = []) => {
  92. const result = []
  93. for (const i of list) {
  94. const { name, config = [], children = [], route_name } = i
  95. const thisRouteNameArr = [...route_names, route_name]
  96. const obj = { name, code: thisRouteNameArr.join('.') }
  97. if (route_name === 'home') obj.disabled = true
  98. const nextList = []
  99. // 先处理该页面配置
  100. if (config && config.length >= 0) {
  101. // 如果有配置: 目录,子页面两种情况,都统一处理
  102. for (const c of config) {
  103. const codeRouteNameArr = [...thisRouteNameArr]
  104. codeRouteNameArr.push(c.code)
  105. const cobj = { name: c.zh, code: codeRouteNameArr.join('.') }
  106. nextList.push(cobj)
  107. }
  108. }
  109. // 再处理目录/子页面
  110. if (children && children.length > 0) {
  111. const nextRouteNames = [...thisRouteNameArr]
  112. const midResult = dealMenu(children, nextRouteNames)
  113. nextList.push(...midResult)
  114. }
  115. obj.children = nextList
  116. result.push(obj)
  117. }
  118. return result
  119. }
  120. /**
  121. * 选择节点
  122. */
  123. const seletNode = () => {
  124. if (!form.value.menu) {
  125. form.value.menu = []
  126. }
  127. const selected = roleTree.value.getCheckedNodes(false, true)
  128. const result = []
  129. for (const s of selected) {
  130. const rs = toRaw(s)
  131. result.push(rs.code)
  132. }
  133. form.value.menu = result
  134. }
  135. </script>
  136. <style scoped></style>