form.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. <el-tree ref="roleTree" :data="getMenus()" node-key="code" default-expand-all show-checkbox @check-change="seletNode">
  33. <template #default="{ data }">
  34. <span>{{ data.name }}</span>
  35. </template>
  36. </el-tree>
  37. </el-form-item>
  38. <el-row justify="center" style="text-align: center">
  39. <el-col :span="6">
  40. <el-button @click="onSubmit" type="primary">{{ $t('common.save') }}</el-button>
  41. </el-col>
  42. </el-row>
  43. </el-form>
  44. </template>
  45. <script setup>
  46. const form = inject('form')
  47. const menuList = inject('menuList')
  48. const onSubmit = inject('onSubmit')
  49. const roleTree = ref()
  50. const is_dev = import.meta.env.MODE === 'development'
  51. const getMenus = () => {
  52. const list = toRaw(menuList.value)
  53. const result = dealMenu(list)
  54. return result
  55. }
  56. onMounted(() => {
  57. const treeSelected = toRaw(form.value.menu)
  58. for (const key of treeSelected) {
  59. roleTree.value.setChecked(key, true)
  60. }
  61. const selected = roleTree.value.getCheckedKeys()
  62. if (!selected.includes('home')) roleTree.value.setChecked('home', true)
  63. })
  64. /**
  65. * 处理菜单:将目录,菜单,子页面,权限统一转成 {name,code}形式,code为唯一值
  66. * 目录,菜单,子页面:
  67. * route_name是唯一的,所以使用route_name作为code
  68. * 权限:
  69. * code并不是唯一,但是加上route_name就是唯一的
  70. * @param {Array} list 菜单列表
  71. * @param {Array} route_names 将上级的route_name放入此数组中,在转为权限数据时,拼接成code
  72. */
  73. const dealMenu = (list, route_names = []) => {
  74. const result = []
  75. for (const i of list) {
  76. const { name, config = [], children = [], route_name } = i
  77. const thisRouteNameArr = [...route_names, route_name]
  78. const obj = { name, code: thisRouteNameArr.join('.') }
  79. if (route_name === 'home') obj.disabled = true
  80. const nextList = []
  81. // 先处理该页面配置
  82. if (config.length >= 0) {
  83. // 如果有配置: 菜单,子页面两种情况,都统一处理
  84. for (const c of config) {
  85. const codeRouteNameArr = [...thisRouteNameArr]
  86. codeRouteNameArr.push(c.code)
  87. const cobj = { name: c.zh, code: codeRouteNameArr.join('.') }
  88. nextList.push(cobj)
  89. }
  90. }
  91. // 再处理菜单/子页面
  92. if (children.length > 0) {
  93. const nextRouteNames = [...thisRouteNameArr]
  94. const midResult = dealMenu(children, nextRouteNames)
  95. nextList.push(...midResult)
  96. }
  97. obj.children = nextList
  98. result.push(obj)
  99. }
  100. return result
  101. }
  102. /**
  103. * 选择节点
  104. */
  105. const seletNode = () => {
  106. if (!form.value.menu) {
  107. form.value.menu = []
  108. }
  109. const selected = roleTree.value.getCheckedNodes(false, true)
  110. const result = []
  111. for (const s of selected) {
  112. const rs = toRaw(s)
  113. result.push(rs.code)
  114. }
  115. form.value.menu = result
  116. }
  117. </script>
  118. <style scoped></style>