Commit 94b49066e79d8ce1fca97357f713419acc54c5b4

Authored by dev001
1 parent 8ced1b83

fix: 修改角色管理和账号管理roletype传参错误

... ... @@ -245,7 +245,10 @@
245 245 delete postData.email;
246 246 }
247 247 }
248   - await SaveOrUpdateUserInfo(postData as any, unref(isUpdate));
  248 + await SaveOrUpdateUserInfo(
  249 + { ...postData, roleType: 'PLATFORM_ADMIN' } as any,
  250 + unref(isUpdate)
  251 + );
249 252 closeModal();
250 253 emit('success');
251 254 createMessage.success(unref(isUpdate) ? '编辑成功' : '新增成功');
... ...
... ... @@ -209,7 +209,7 @@
209 209 const handleClearPassword = async (record: Recordable) => {
210 210 const { id } = record;
211 211 if (!id) return;
212   - const { message } = await clearUserPassword(id);
  212 + const { message } = await clearUserPassword(id, 1);
213 213 createMessage.success(message);
214 214 };
215 215
... ...
  1 +<template>
  2 + <BasicDrawer
  3 + v-bind="$attrs"
  4 + @register="registerDrawer"
  5 + showFooter
  6 + :title="getTitle"
  7 + width="500px"
  8 + @ok="handleSubmit"
  9 + >
  10 + <BasicForm @register="registerForm">
  11 + <template #menu>
  12 + <Spin :spinning="spinning">
  13 + <BasicTree
  14 + v-if="treeData.length"
  15 + checkable
  16 + toolbar
  17 + ref="treeRef"
  18 + :treeData="treeData"
  19 + @check="handleCheckClick"
  20 + :replace-fields="{ title: 'name', key: 'id' }"
  21 + :checkedKeys="roleMenus"
  22 + title="菜单分配"
  23 + />
  24 + </Spin>
  25 + </template>
  26 + </BasicForm>
  27 + </BasicDrawer>
  28 +</template>
  29 +<script lang="ts">
  30 + import { defineComponent, ref, computed, unref, nextTick } from 'vue';
  31 + import { BasicForm, useForm } from '/@/components/Form/index';
  32 + import { formSchema, KeysTypeEnum, RoleMenuDictEnum } from './role.data';
  33 + import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  34 + import { BasicTree, TreeActionType, TreeItem } from '/@/components/Tree';
  35 + import { useMessage } from '/@/hooks/web/useMessage';
  36 + const { t } = useI18n(); // 加载国际化
  37 + // 加载菜单数据
  38 + import { getMeMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu';
  39 + import { useI18n } from '/@/hooks/web/useI18n';
  40 + import { MenuRecord } from '/@/api/sys/model/menuModel';
  41 + import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system';
  42 + import { findDictItemByCode } from '/@/api/system/dict';
  43 + import { RoleEnum } from '/@/enums/roleEnum';
  44 + import { Spin } from 'ant-design-vue';
  45 + import { useRole } from '/@/hooks/business/useRole';
  46 + import { RoleListItem } from '/@/api/system/model/systemModel';
  47 +
  48 + type TreeData = MenuRecord & TreeItem;
  49 +
  50 + export default defineComponent({
  51 + name: 'RoleDrawer',
  52 + components: { BasicDrawer, BasicForm, BasicTree, Spin },
  53 + emits: ['success', 'register'],
  54 + setup(_, { emit }) {
  55 + const isUpdate = ref<boolean>(true);
  56 + const treeData = ref<TreeData[]>([]);
  57 + const roleMenus = ref<string[]>([]);
  58 + const roleId = ref<string>('');
  59 + const treeRef = ref<Nullable<TreeActionType>>();
  60 + const checked = ref<string[]>([]); //需要选中的节点
  61 + const spinning = ref(false);
  62 + const checkedKeysWithHalfChecked = ref<string[]>([]);
  63 +
  64 + const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
  65 + labelWidth: 100,
  66 + schemas: formSchema,
  67 + showActionButtonGroup: false,
  68 + });
  69 +
  70 + const transformName = (data: TreeData[]) => {
  71 + return data.map((item) => {
  72 + item.name = t(item.name);
  73 + if (item.children && item.children.length) {
  74 + item.children = transformName(item.children as unknown as TreeData[]);
  75 + }
  76 + return item;
  77 + });
  78 + };
  79 +
  80 + const { isTenantAdmin, isSysadmin, getRole } = useRole();
  81 + const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(
  82 + async (data: { isUpdate: boolean; record: RoleListItem }) => {
  83 + resetFields();
  84 + roleId.value = '';
  85 + // 在打开弹窗时清除所有选择的菜单
  86 + treeRef.value && treeRef.value?.setCheckedKeys([]);
  87 + isUpdate.value = data.isUpdate;
  88 + let roleType = unref(getRole) || RoleEnum.SYS_ADMIN;
  89 +
  90 + // 租户管理员创建角色时 菜单分配为客户菜单
  91 + if (unref(isTenantAdmin)) {
  92 + roleType = RoleEnum.TENANT_ADMIN;
  93 + }
  94 +
  95 + try {
  96 + spinning.value = true;
  97 + // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告
  98 +
  99 + // if (!unref(treeData).length) {
  100 + // 获取全部的菜单
  101 + const menuListModel = await getMeMenuList();
  102 + treeData.value = transformName(menuListModel as unknown as TreeData[]);
  103 + // }
  104 +
  105 + const keys = await getPermissionByRole(roleType);
  106 + const { keyType } = RoleMenuDictEnum[roleType];
  107 + treeData.value = filterPermissionTreeData(
  108 + unref(treeData) as unknown as TreeData[],
  109 + keys,
  110 + keyType
  111 + );
  112 +
  113 + // 如果编辑的是超级管理员 则不再过滤平台管理员禁用的权限
  114 + // 如果是超级管理员创建角色 创建角色属于平台管理员 因此过滤平台管理员禁用的权限
  115 + if (data?.record?.roleType !== RoleEnum.SYS_ADMIN && unref(isSysadmin)) {
  116 + const keys = await getPermissionByRole(RoleEnum.PLATFORM_ADMIN);
  117 + const { keyType } = RoleMenuDictEnum[RoleEnum.PLATFORM_ADMIN];
  118 + treeData.value = filterPermissionTreeData(
  119 + unref(treeData) as unknown as TreeData[],
  120 + keys,
  121 + keyType
  122 + );
  123 + }
  124 +
  125 + // 更新
  126 + if (unref(isUpdate)) {
  127 + checked.value = [];
  128 + roleId.value = data.record.id;
  129 +
  130 + //通过角色id去获取角色对应的菜单的ids
  131 + checkedKeysWithHalfChecked.value = roleMenus.value = await getMenusIdsByRoleId(
  132 + data.record.id
  133 + );
  134 + excludeHalfCheckedKeys(unref(treeData));
  135 + await nextTick();
  136 + unref(treeRef)?.setCheckedKeys(roleMenus.value);
  137 + setFieldsValue(data.record);
  138 + } else {
  139 + }
  140 + } catch (error) {
  141 + throw error;
  142 + } finally {
  143 + spinning.value = false;
  144 + }
  145 + }
  146 + );
  147 +
  148 + const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));
  149 +
  150 + async function handleSubmit() {
  151 + setDrawerProps({ confirmLoading: true });
  152 + const { createMessage } = useMessage();
  153 + try {
  154 + const values = await validate();
  155 + const treeCheckedKeys: string[] = (unref(treeRef)?.getCheckedKeys() as string[]) || [];
  156 + const menu = [...new Set([...unref(checkedKeysWithHalfChecked), ...treeCheckedKeys])];
  157 + const req = {
  158 + id: roleId.value,
  159 + name: values.name,
  160 + remark: values.remark,
  161 + status: values.status,
  162 + menu,
  163 + roleType: 'TENANT_ADMIN',
  164 + };
  165 + if (req.menu == undefined) return createMessage.error('请勾选权限菜单');
  166 + saveOrUpdateRoleInfoWithMenu(req).then(() => {
  167 + closeDrawer();
  168 + emit('success');
  169 + createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
  170 + });
  171 + } finally {
  172 + setTimeout(() => {
  173 + setDrawerProps({ confirmLoading: false });
  174 + }, 300);
  175 + }
  176 + }
  177 +
  178 + const getPermissionByRole = async (roleType: RoleEnum) => {
  179 + try {
  180 + const { key } = RoleMenuDictEnum[roleType];
  181 + const res = await findDictItemByCode({ dictCode: key });
  182 + return res.map((item) => item.itemValue);
  183 + } catch (error) {}
  184 + return [];
  185 + };
  186 +
  187 + const filterPermissionTreeData = (
  188 + data: MenuRecord[],
  189 + permissionKeys: string[],
  190 + keysType: KeysTypeEnum
  191 + ): TreeData[] => {
  192 + const permissionCompare = (
  193 + data: MenuRecord[],
  194 + permissionKeys: string[],
  195 + keysType: KeysTypeEnum
  196 + ): TreeData[] => {
  197 + return data.filter((item) => {
  198 + item.name = t(item.name);
  199 + const findFlag = permissionKeys.includes(item.permission);
  200 +
  201 + item.show = findFlag ? keysType === KeysTypeEnum.ENABLED : undefined;
  202 +
  203 + if (item.children && item.children.length) {
  204 + if (item.show) return true;
  205 + if (item.show === undefined) {
  206 + item.children = permissionCompare(item.children, permissionKeys, keysType);
  207 + item.show = item.children.some((item) =>
  208 + keysType === KeysTypeEnum.ENABLED
  209 + ? item.show
  210 + : item.show === undefined
  211 + ? true
  212 + : item.show
  213 + );
  214 + return item.show;
  215 + }
  216 + }
  217 +
  218 + return keysType === KeysTypeEnum.ENABLED
  219 + ? item.show
  220 + : item.show === undefined
  221 + ? true
  222 + : item.show;
  223 + }) as unknown as TreeData[];
  224 + };
  225 +
  226 + return permissionCompare(data, permissionKeys, keysType);
  227 + };
  228 +
  229 + const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => {
  230 + const needExcludeKeys: string[] = [];
  231 + const query = (data: MenuRecord[]) => {
  232 + data.forEach((item) => {
  233 + item.checked = roleMenus.value.includes(item.id);
  234 + if (item.children && item.children.length) {
  235 + query(item.children);
  236 + item.checked = item.children.every((item) => item.checked);
  237 + }
  238 + if (!item.checked) {
  239 + needExcludeKeys.push(item.id);
  240 + }
  241 + });
  242 + };
  243 + query(treeData);
  244 + roleMenus.value = unref(roleMenus).filter((key) => !needExcludeKeys.includes(key));
  245 + return needExcludeKeys;
  246 + };
  247 +
  248 + const handleCheckClick = (selectedKeys: string[], event: CheckEvent) => {
  249 + checkedKeysWithHalfChecked.value = [
  250 + ...selectedKeys,
  251 + ...(event.halfCheckedKeys as string[]),
  252 + ];
  253 + };
  254 +
  255 + return {
  256 + spinning,
  257 + registerDrawer,
  258 + registerForm,
  259 + getTitle,
  260 + handleSubmit,
  261 + treeData,
  262 + roleMenus,
  263 + treeRef,
  264 + handleCheckClick,
  265 + };
  266 + },
  267 + });
  268 +</script>
  269 +
  270 +<style scoped lang="less">
  271 + :deep(.vben-basic-tree) {
  272 + width: 100% !important;
  273 + }
  274 +
  275 + :deep(.is-unflod) {
  276 + display: none !important;
  277 + }
  278 +
  279 + :deep(.is-flod) {
  280 + display: none !important;
  281 + }
  282 +</style>
... ...
... ... @@ -69,7 +69,7 @@
69 69 import { TOption } from '/@/views/rule/linkedge/config/config.data';
70 70 import { PlusOutlined } from '@ant-design/icons-vue';
71 71 import { useDrawer } from '/@/components/Drawer';
72   - import RoleDrawer from '../../role/RoleDrawer.vue';
  72 + import RoleDrawer from './RoleDrawer.vue';
73 73 import OrganizationDrawer from '/@/views/system/organization/OrganizationDrawer.vue';
74 74 import { useUserStore } from '/@/store/modules/user';
75 75 import { IsPhoneExist } from '/@/api/system/system';
... ...
  1 +import { BasicColumn } from '/@/components/Table';
  2 +import { FormSchema } from '/@/components/Table';
  3 +import { DictEnum } from '/@/enums/dictEnum';
  4 +import { RoleEnum } from '/@/enums/roleEnum';
  5 +
  6 +export enum KeysTypeEnum {
  7 + DISABLED = 'disabled',
  8 + ENABLED = 'enabled',
  9 +}
  10 +
  11 +export const RoleMenuDictEnum: Recordable<{ key: string; keyType: KeysTypeEnum }> = {
  12 + [RoleEnum.PLATFORM_ADMIN]: {
  13 + key: DictEnum.DISABLED_PLATFORM_ADMIN_AUTH,
  14 + keyType: KeysTypeEnum.DISABLED,
  15 + },
  16 + [RoleEnum.SYS_ADMIN]: { key: DictEnum.ENABLED_SYSADMIN_AUTH, keyType: KeysTypeEnum.ENABLED },
  17 + [RoleEnum.TENANT_ADMIN]: { key: DictEnum.DISABLED_TENANT_AUTH, keyType: KeysTypeEnum.DISABLED },
  18 + [RoleEnum.CUSTOMER_USER]: { key: DictEnum.DISABLE_CUSTOMER_AUTH, keyType: KeysTypeEnum.DISABLED },
  19 +};
  20 +
  21 +export const columns: BasicColumn[] = [
  22 + {
  23 + title: '角色名称',
  24 + dataIndex: 'name',
  25 + width: 200,
  26 + },
  27 + {
  28 + title: '角色Code',
  29 + dataIndex: 'code',
  30 + width: 200,
  31 + },
  32 + {
  33 + title: '状态',
  34 + dataIndex: 'status',
  35 + width: 120,
  36 + slots: { customRender: 'status' },
  37 + },
  38 +
  39 + {
  40 + title: '备注',
  41 + dataIndex: 'remark',
  42 + width: 240,
  43 + },
  44 + {
  45 + title: '创建时间',
  46 + dataIndex: 'createTime',
  47 + width: 180,
  48 + },
  49 +];
  50 +
  51 +export const searchFormSchema: FormSchema[] = [
  52 + {
  53 + field: 'roleName',
  54 + label: '角色名称',
  55 + component: 'Input',
  56 + colProps: { span: 6 },
  57 + componentProps: {
  58 + maxLength: 255,
  59 + },
  60 + },
  61 + {
  62 + field: 'status',
  63 + label: '状态',
  64 + component: 'Select',
  65 + componentProps: {
  66 + options: [
  67 + { label: '启用', value: 1 },
  68 + { label: '停用', value: 0 },
  69 + ],
  70 + },
  71 + colProps: { span: 6 },
  72 + },
  73 +];
  74 +
  75 +export const formSchema: FormSchema[] = [
  76 + {
  77 + field: 'name',
  78 + label: '角色名称',
  79 + required: true,
  80 + component: 'Input',
  81 + componentProps: {
  82 + maxLength: 255,
  83 + placeholder: '请输入角色名称',
  84 + },
  85 + },
  86 + {
  87 + field: 'status',
  88 + label: '状态',
  89 + component: 'RadioButtonGroup',
  90 + defaultValue: 1,
  91 + componentProps: {
  92 + options: [
  93 + { label: '启用', value: 1 },
  94 + { label: '停用', value: 0 },
  95 + ],
  96 + },
  97 + },
  98 + {
  99 + label: '备注',
  100 + field: 'remark',
  101 + component: 'InputTextArea',
  102 + componentProps: {
  103 + maxLength: 255,
  104 + placeholder: '请输入备注',
  105 + },
  106 + },
  107 + {
  108 + label: '',
  109 + field: 'menu',
  110 + slot: 'menu',
  111 + component: 'Input',
  112 + },
  113 +];
... ...
... ... @@ -160,7 +160,7 @@
160 160 remark: values.remark,
161 161 status: values.status,
162 162 menu,
163   - roleType: 'TENANT_ADMIN',
  163 + roleType: 'PLATFORM_ADMIN',
164 164 };
165 165 if (req.menu == undefined) return createMessage.error('请勾选权限菜单');
166 166 saveOrUpdateRoleInfoWithMenu(req).then(() => {
... ...
... ... @@ -62,7 +62,7 @@
62 62 const spinning = ref(false);
63 63 const checkedKeysWithHalfChecked = ref<(string | number)[]>([]);
64 64
65   - const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
  65 + const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({
66 66 labelWidth: 90,
67 67 schemas: formSchema,
68 68 showActionButtonGroup: false,
... ... @@ -80,6 +80,29 @@
80 80
81 81 const { isPlatformAdmin } = useRole();
82 82 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  83 + if (data?.isUpdate) {
  84 + updateSchema({
  85 + field: 'status',
  86 + componentProps: {
  87 + options: [
  88 + { label: '启用', value: 1 },
  89 + { label: '停用', value: 0 },
  90 + ],
  91 + disabled: data.record.status == 1 ? true : false,
  92 + },
  93 + });
  94 + } else {
  95 + updateSchema({
  96 + field: 'status',
  97 + componentProps: {
  98 + options: [
  99 + { label: '启用', value: 1 },
  100 + { label: '停用', value: 0 },
  101 + ],
  102 + disabled: false,
  103 + },
  104 + });
  105 + }
83 106 resetFields();
84 107 roleId.value = '';
85 108 // 在打开弹窗时清除所有选择的菜单
... ...
... ... @@ -83,7 +83,7 @@ export const formSchema: FormSchema[] = [
83 83 field: 'status',
84 84 label: '状态',
85 85 component: 'RadioButtonGroup',
86   - defaultValue: 0,
  86 + defaultValue: 1,
87 87 componentProps: {
88 88 options: [
89 89 { label: '启用', value: 1 },
... ...