form.vue 3.4 KB

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