RoleDrawer.vue 4.5 KB

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