RoleDrawer.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <el-drawer :title="title" v-model="drawerOpened" @close="clear">
  3. <el-form label-position="right" label-width="80px" :model="formData" :rules="formRules" ref="formInstance">
  4. <el-form-item label="角色名称" prop="roleName">
  5. <el-input placeholder="角色名称" v-model="formData.roleName" />
  6. </el-form-item>
  7. <el-form-item label="角色权限">
  8. <!-- <PermissioTreeCard title="平台入口权限" :tree-data="menuPermTreeData" ref="menuCardInstance" /> -->
  9. <PermissioTreeCard title="菜单权限" :tree-data="menuPermTreeData" ref="menuCardInstance" />
  10. <PermissioTreeCard title="功能权限" :tree-data="funcPermTreeData" ref="funcCardInstance" />
  11. </el-form-item>
  12. <el-form-item label="备注" prop="remark">
  13. <el-input type="textarea" placeholder="备注" v-model="formData.remark" />
  14. </el-form-item>
  15. </el-form>
  16. <template #footer>
  17. <el-button @click="reset">重置</el-button>
  18. <el-button type="primary" @click="submit">提交</el-button>
  19. </template>
  20. </el-drawer>
  21. </template>
  22. <script setup lang="ts">
  23. import { reactive, ref, computed, toRaw } from 'vue';
  24. import PermissioTreeCard from './PermissionTreeCard.vue';
  25. import { RoleForm, Role, AssignedPermissions } from '@/types/role/type';
  26. import { FormRules, FormInstance, ElMessage } from 'element-plus';
  27. import useMenuPermTree from '../hooks/useMenuPermissionTree';
  28. import useFuncPermTree from '../hooks/useFunctionPermissionTree';
  29. import { createRole, editRole, getAssignedPerms } from '@/api/system/role';
  30. defineProps<{
  31. title: string;
  32. }>();
  33. const emits = defineEmits<{
  34. (e: 'submitted'): void; // 提交之后触发的事件
  35. }>();
  36. const { menuPermTreeData } = useMenuPermTree();
  37. const { funcPermTreeData } = useFuncPermTree();
  38. const drawerOpened = ref(false);
  39. const menuCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();
  40. const funcCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();
  41. let initialPermissions: AssignedPermissions | null = null;
  42. const emptyValue = {
  43. id: null,
  44. roleName: '',
  45. remark: '',
  46. menuIds: [],
  47. permIds: [],
  48. };
  49. // 表单相关
  50. let defaultFormData: RoleForm = { ...emptyValue };
  51. let formData = reactive<RoleForm>(defaultFormData);
  52. const formRules: FormRules = {
  53. roleName: { required: true, trigger: 'blur', message: '请填写角色名称' },
  54. remark: {},
  55. };
  56. const formInstance = ref<FormInstance>();
  57. const isEditing = computed(() => formData.id != null);
  58. /**
  59. * 打开 drawer。如果未传递 roleId,表示创建角色;反之,表示编辑角色
  60. * @param roleId 可选
  61. */
  62. const open = (role?: Role) => {
  63. if (role) {
  64. defaultFormData.id = role.id;
  65. defaultFormData.roleName = role.roleName;
  66. defaultFormData.remark = role.remark;
  67. formData.id = role.id;
  68. formData.roleName = role.roleName;
  69. formData.remark = role.remark;
  70. getAssignedPermissions(role.id);
  71. // TODO: 获取已拥有的权限
  72. } else {
  73. formData.id = null;
  74. formData.roleName = '';
  75. formData.remark = '';
  76. defaultFormData = { ...emptyValue };
  77. menuCardInstance.value?.setAssignedPermissions([]);
  78. funcCardInstance.value?.setAssignedPermissions([]);
  79. }
  80. drawerOpened.value = true;
  81. };
  82. /**
  83. * 获取当前角色已分配的权限数据,并更新相应的权限数
  84. */
  85. const getAssignedPermissions = async (roleId: number) => {
  86. try {
  87. initialPermissions = await getAssignedPerms(roleId);
  88. displayAssignedPermissions(initialPermissions);
  89. } catch (e) {
  90. console.error(e);
  91. }
  92. };
  93. const displayAssignedPermissions = (result: AssignedPermissions | null) => {
  94. if (!result) {
  95. menuCardInstance.value?.setAssignedPermissions([]);
  96. funcCardInstance.value?.setAssignedPermissions([]);
  97. return;
  98. }
  99. if (result?.menuIds?.length) {
  100. menuCardInstance.value?.setAssignedPermissions(result.menuIds);
  101. } else {
  102. menuCardInstance.value?.setAssignedPermissions([]);
  103. }
  104. if (result?.permIds?.length) {
  105. funcCardInstance.value?.setAssignedPermissions(result.permIds);
  106. } else {
  107. funcCardInstance.value?.setAssignedPermissions([]);
  108. }
  109. };
  110. /**
  111. * 重置表单,恢复为修改之前的默认值
  112. */
  113. const reset = () => {
  114. formInstance.value?.resetFields();
  115. Object.assign(formData, defaultFormData);
  116. displayAssignedPermissions(initialPermissions!);
  117. };
  118. const clear = () => {
  119. formInstance.value?.resetFields();
  120. formData = Object.assign(formData, emptyValue);
  121. displayAssignedPermissions(null);
  122. };
  123. /**
  124. * 提交。创建和编辑统一
  125. */
  126. const submit = async () => {
  127. formData.menuIds = menuCardInstance.value!.getSelectedPermissions();
  128. formData.permIds = funcCardInstance.value!.getSelectedPermissions();
  129. const api = isEditing.value ? editRole : createRole;
  130. try {
  131. await formInstance.value?.validate();
  132. await api(toRaw(formData));
  133. drawerOpened.value = false;
  134. ElMessage.success('提交成功');
  135. // 让父组件更新列表
  136. emits('submitted');
  137. } catch (e) {
  138. console.error(e);
  139. }
  140. };
  141. defineExpose({ open });
  142. </script>