RoleDrawer.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <template>
  2. <BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="500px" @ok="handleSubmit">
  3. <BasicForm @register="registerForm">
  4. <template #menu>
  5. <Spin :spinning="spinning"></Spin>
  6. </template>
  7. </BasicForm>
  8. </BasicDrawer>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent, ref, computed, unref, nextTick } from 'vue';
  12. import { BasicForm, useForm } from '/@/components/Form/index';
  13. import { formSchema, KeysTypeEnum, RoleMenuDictEnum } from './role.data';
  14. import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  15. import { BasicTree, TreeItem } from '/@/components/Tree';
  16. import { useMessage } from '/@/hooks/web/useMessage';
  17. const { t } = useI18n(); //加载国际化
  18. // 加载菜单数据
  19. import { getMenuList } from '/@/api/sys/menu';
  20. import { useI18n } from '/@/hooks/web/useI18n';
  21. import { MenuRecord } from '/@/api/sys/model/menuModel';
  22. import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system';
  23. import { findDictItemByCode } from '/@/api/system/dict';
  24. import { RoleEnum } from '/@/enums/roleEnum';
  25. import { Spin } from 'ant-design-vue';
  26. import { useUserStore } from '/@/store/modules/user';
  27. import { session } from '/@/utils/Memory';
  28. import { v4 as uuidv4 } from 'uuid';
  29. type TreeData = MenuRecord & TreeItem;
  30. export default defineComponent({
  31. name: 'RoleDrawer',
  32. components: { BasicDrawer, BasicForm, BasicTree, Spin },
  33. emits: ['success', 'register'],
  34. setup(_, { emit }) {
  35. const isUpdate = ref<boolean>(true);
  36. const treeData = ref<TreeData[]>([]);
  37. const roleMenus = ref<string[]>([]);
  38. const roleId = ref<string>('');
  39. const checked = ref<string[]>([]); //需要选中的节点
  40. const spinning = ref(false);
  41. var nowRole = null;
  42. const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
  43. labelWidth: 100,
  44. schemas: formSchema,
  45. showActionButtonGroup: false,
  46. });
  47. const transformName = (data: TreeData[]) => {
  48. return data.map((item) => {
  49. item.name = t(item.name);
  50. if (item.children && item.children.length) {
  51. item.children = transformName(item.children as unknown as TreeData[]);
  52. }
  53. return item;
  54. });
  55. };
  56. const userStore = useUserStore();
  57. const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  58. resetFields();
  59. roleId.value = '';
  60. // 在打开弹窗时清除所有选择的菜单
  61. isUpdate.value = data.isUpdate;
  62. const roleType = data?.record?.roleType || userStore.getRoleList.at(0);
  63. try {
  64. spinning.value = true;
  65. // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告
  66. if (!unref(treeData).length) {
  67. // 获取全部的菜单
  68. const menuListModel = await getMenuList();
  69. treeData.value = transformName(menuListModel as unknown as TreeData[]);
  70. }
  71. const keys = await getPermissionByRole(roleType);
  72. const { keyType } = RoleMenuDictEnum[roleType];
  73. treeData.value = getPermissionTreeData(
  74. unref(treeData) as unknown as TreeData[],
  75. keys,
  76. keyType
  77. );
  78. // 更新
  79. if (unref(isUpdate)) {
  80. checked.value = [];
  81. roleId.value = data.record.id;
  82. nowRole = data.record;
  83. setFieldsValue(data.record);
  84. } else {
  85. }
  86. } catch (error) {
  87. throw error;
  88. } finally {
  89. spinning.value = false;
  90. }
  91. });
  92. const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));
  93. async function handleSubmit() {
  94. setDrawerProps({ confirmLoading: true });
  95. const { createMessage } = useMessage();
  96. try {
  97. const values = await validate();
  98. const req = {
  99. groupName: values.groupName,
  100. sort: values.sort
  101. };
  102. if (unref(isUpdate)) {
  103. if (nowRole) {
  104. req.updateuser = session.getItem("userInfo").EMPLOYEE.EMPLOYEE_ID;
  105. req.groupid = nowRole.groupid;
  106. }
  107. } else {
  108. req.groupid = uuidv4()
  109. }
  110. saveOrUpdateRoleInfoWithMenu(req).then(() => {
  111. closeDrawer();
  112. emit('success');
  113. nowRole = null;
  114. createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
  115. });
  116. } finally {
  117. setTimeout(() => {
  118. setDrawerProps({ confirmLoading: false });
  119. }, 300);
  120. }
  121. }
  122. const getPermissionByRole = async (roleType: RoleEnum) => {
  123. try {
  124. const { key } = RoleMenuDictEnum[roleType];
  125. const res = await findDictItemByCode({ dictCode: key });
  126. return res.map((item) => item.itemValue);
  127. } catch (error) { }
  128. return [];
  129. };
  130. const getPermissionTreeData = (
  131. data: MenuRecord[],
  132. permissionKeys: string[],
  133. keysType: KeysTypeEnum
  134. ) => {
  135. const setDisabled = (data: MenuRecord[], flag: boolean) => {
  136. return data.map((item) => {
  137. item.name = t(item.name);
  138. if (item.children && item.children.length) {
  139. item.children = setDisabled(item.children, flag);
  140. }
  141. return {
  142. ...item,
  143. disabled: flag,
  144. icon: item.meta.icon,
  145. } as TreeData;
  146. });
  147. };
  148. const permissionCompare = (
  149. data: MenuRecord[],
  150. permissionKeys: string[],
  151. keysType: KeysTypeEnum
  152. ) => {
  153. return data.map((item) => {
  154. item.name = t(item.name);
  155. const findFlag = permissionKeys.includes(item.permission);
  156. if (findFlag) item.isDictCompareDisabled = true;
  157. const disabledFlag = keysType === KeysTypeEnum.DISABLED ? findFlag : !findFlag;
  158. item.disabled = disabledFlag;
  159. if (item.isDictCompareDisabled && item.children && item.children.length) {
  160. setDisabled(item.children, disabledFlag);
  161. } else {
  162. if (item.children && item.children.length) {
  163. item.children = permissionCompare(item.children, permissionKeys, keysType);
  164. item.disabled = item.children.every((temp) => temp.disabled);
  165. }
  166. }
  167. return {
  168. ...item,
  169. icon: item.meta.icon,
  170. } as TreeData;
  171. });
  172. };
  173. const result = permissionCompare(data, permissionKeys, keysType).map((item) => {
  174. if (item.children && item.children.length) {
  175. const rootDisabledFlag = item.children.every((temp) => temp.disabled);
  176. item.disabled = rootDisabledFlag;
  177. }
  178. return item;
  179. });
  180. return result;
  181. };
  182. return {
  183. spinning,
  184. registerDrawer,
  185. registerForm,
  186. getTitle,
  187. handleSubmit,
  188. treeData,
  189. roleMenus,
  190. };
  191. },
  192. });
  193. </script>
  194. <style scoped lang="less">
  195. :deep(.vben-basic-tree) {
  196. width: 100% !important;
  197. }
  198. :deep(.is-unflod) {
  199. display: none !important;
  200. }
  201. :deep(.is-flod) {
  202. display: none !important;
  203. }
  204. </style>