Showing
14 changed files
with
446 additions
and
15 deletions
@@ -8,10 +8,10 @@ VITE_GLOB_PUBLIC_PATH = / | @@ -8,10 +8,10 @@ VITE_GLOB_PUBLIC_PATH = / | ||
8 | # Please note that no line breaks | 8 | # Please note that no line breaks |
9 | 9 | ||
10 | # 本地 | 10 | # 本地 |
11 | -VITE_PROXY = [["/api","http://localhost:8080/api"],["/thingskit-scada","http://localhost:5173/thingskit-scada"],["/large-designer", "http://localhost:5555/large-designer/"]] | 11 | +VITE_PROXY = [["/api","http://222.180.200.114:30480/api"],["/thingskit-scada","http://localhost:5173/thingskit-scada"],["/large-designer", "http://localhost:5555/large-designer/"]] |
12 | 12 | ||
13 | # 实时数据的ws地址 | 13 | # 实时数据的ws地址 |
14 | -VITE_GLOB_WEB_SOCKET = ws://localhost:8080/api/ws/plugins/telemetry?token= | 14 | +VITE_GLOB_WEB_SOCKET = ws://222.180.200.114:30480/api/ws/plugins/telemetry?token= |
15 | 15 | ||
16 | # Delete console | 16 | # Delete console |
17 | VITE_GLOB_DROP_CONSOLE = true | 17 | VITE_GLOB_DROP_CONSOLE = true |
@@ -183,7 +183,7 @@ export const resetPassword = (params: ChangeAccountParams) => | @@ -183,7 +183,7 @@ export const resetPassword = (params: ChangeAccountParams) => | ||
183 | * 清除密码 | 183 | * 清除密码 |
184 | * @param params | 184 | * @param params |
185 | */ | 185 | */ |
186 | -export const clearUserPassword = (userId: string) => | 186 | +export const clearUserPassword = (userId: string, level: number) => |
187 | defHttp.post({ | 187 | defHttp.post({ |
188 | - url: Api.RESET_USER_PASSWORD + userId, | 188 | + url: Api.RESET_USER_PASSWORD + userId + '/' + level, |
189 | }); | 189 | }); |
@@ -128,6 +128,13 @@ export const formSchema: FormSchema[] = [ | @@ -128,6 +128,13 @@ export const formSchema: FormSchema[] = [ | ||
128 | }, | 128 | }, |
129 | }, | 129 | }, |
130 | { | 130 | { |
131 | + required: true, | ||
132 | + field: 'organizationId', | ||
133 | + label: '所属组织', | ||
134 | + colProps: { span: 24 }, | ||
135 | + component: 'OrgTreeSelect', | ||
136 | + }, | ||
137 | + { | ||
131 | field: 'remark', | 138 | field: 'remark', |
132 | label: '说明', | 139 | label: '说明', |
133 | component: 'InputTextArea', | 140 | component: 'InputTextArea', |
@@ -8,9 +8,8 @@ | @@ -8,9 +8,8 @@ | ||
8 | 8 | ||
9 | <script> | 9 | <script> |
10 | import { defineComponent } from 'vue'; | 10 | import { defineComponent } from 'vue'; |
11 | - import { useRoute } from 'vue-router'; | 11 | + import { useRoute, useRouter } from 'vue-router'; |
12 | import { PageWrapper } from '/@/components/Page'; | 12 | import { PageWrapper } from '/@/components/Page'; |
13 | - import { useGo } from '/@/hooks/web/usePage'; | ||
14 | import { Description } from '../../../components/Description'; | 13 | import { Description } from '../../../components/Description'; |
15 | import { getAccountInfo } from '../../../api/system/system'; | 14 | import { getAccountInfo } from '../../../api/system/system'; |
16 | import { accountSchema } from './account.detail.data'; | 15 | import { accountSchema } from './account.detail.data'; |
@@ -22,7 +21,8 @@ | @@ -22,7 +21,8 @@ | ||
22 | components: { PageWrapper, Description }, | 21 | components: { PageWrapper, Description }, |
23 | setup() { | 22 | setup() { |
24 | const route = useRoute(); | 23 | const route = useRoute(); |
25 | - const go = useGo(); | 24 | + |
25 | + const ROUTER = useRouter(); | ||
26 | const { setTitle, close } = useTabs(); | 26 | const { setTitle, close } = useTabs(); |
27 | const [register, { setDescProps }] = useDescription({ | 27 | const [register, { setDescProps }] = useDescription({ |
28 | title: '账号基础信息', | 28 | title: '账号基础信息', |
@@ -52,7 +52,8 @@ | @@ -52,7 +52,8 @@ | ||
52 | function goBack() { | 52 | function goBack() { |
53 | // 本例的效果时点击返回始终跳转到账号列表页,实际应用时可返回上一页 | 53 | // 本例的效果时点击返回始终跳转到账号列表页,实际应用时可返回上一页 |
54 | close(); | 54 | close(); |
55 | - go('/system/account'); | 55 | + ROUTER.go(-1); |
56 | + // go('/system/account'); | ||
56 | } | 57 | } |
57 | return { goBack, accountSchema, accountData, register }; | 58 | return { goBack, accountSchema, accountData, register }; |
58 | }, | 59 | }, |
@@ -245,7 +245,10 @@ | @@ -245,7 +245,10 @@ | ||
245 | delete postData.email; | 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 | closeModal(); | 252 | closeModal(); |
250 | emit('success'); | 253 | emit('success'); |
251 | createMessage.success(unref(isUpdate) ? '编辑成功' : '新增成功'); | 254 | createMessage.success(unref(isUpdate) ? '编辑成功' : '新增成功'); |
@@ -209,7 +209,7 @@ | @@ -209,7 +209,7 @@ | ||
209 | const handleClearPassword = async (record: Recordable) => { | 209 | const handleClearPassword = async (record: Recordable) => { |
210 | const { id } = record; | 210 | const { id } = record; |
211 | if (!id) return; | 211 | if (!id) return; |
212 | - const { message } = await clearUserPassword(id); | 212 | + const { message } = await clearUserPassword(id, 3); |
213 | createMessage.success(message); | 213 | createMessage.success(message); |
214 | }; | 214 | }; |
215 | 215 |
@@ -209,7 +209,7 @@ | @@ -209,7 +209,7 @@ | ||
209 | const handleClearPassword = async (record: Recordable) => { | 209 | const handleClearPassword = async (record: Recordable) => { |
210 | const { id } = record; | 210 | const { id } = record; |
211 | if (!id) return; | 211 | if (!id) return; |
212 | - const { message } = await clearUserPassword(id); | 212 | + const { message } = await clearUserPassword(id, 1); |
213 | createMessage.success(message); | 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,7 +69,7 @@ | ||
69 | import { TOption } from '/@/views/rule/linkedge/config/config.data'; | 69 | import { TOption } from '/@/views/rule/linkedge/config/config.data'; |
70 | import { PlusOutlined } from '@ant-design/icons-vue'; | 70 | import { PlusOutlined } from '@ant-design/icons-vue'; |
71 | import { useDrawer } from '/@/components/Drawer'; | 71 | import { useDrawer } from '/@/components/Drawer'; |
72 | - import RoleDrawer from '../../role/RoleDrawer.vue'; | 72 | + import RoleDrawer from './RoleDrawer.vue'; |
73 | import OrganizationDrawer from '/@/views/system/organization/OrganizationDrawer.vue'; | 73 | import OrganizationDrawer from '/@/views/system/organization/OrganizationDrawer.vue'; |
74 | import { useUserStore } from '/@/store/modules/user'; | 74 | import { useUserStore } from '/@/store/modules/user'; |
75 | import { IsPhoneExist } from '/@/api/system/system'; | 75 | import { IsPhoneExist } from '/@/api/system/system'; |
@@ -196,8 +196,9 @@ | @@ -196,8 +196,9 @@ | ||
196 | const handleClearPassword = async (record: Recordable) => { | 196 | const handleClearPassword = async (record: Recordable) => { |
197 | const { id } = record; | 197 | const { id } = record; |
198 | if (!id) return; | 198 | if (!id) return; |
199 | - const { message } = await clearUserPassword(id); | 199 | + const { message } = await clearUserPassword(id, 4); |
200 | createMessage.success(message); | 200 | createMessage.success(message); |
201 | + handleSuccess(); | ||
201 | }; | 202 | }; |
202 | // const handleDeleteOrBatchDelete = (record: Recordable) => { | 203 | // const handleDeleteOrBatchDelete = (record: Recordable) => { |
203 | // deleteTenantAdmin([record.id]).then(() => { | 204 | // deleteTenantAdmin([record.id]).then(() => { |
src/views/system/account/tenant/role.data.ts
0 → 100644
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,6 +160,7 @@ | @@ -160,6 +160,7 @@ | ||
160 | remark: values.remark, | 160 | remark: values.remark, |
161 | status: values.status, | 161 | status: values.status, |
162 | menu, | 162 | menu, |
163 | + roleType: 'PLATFORM_ADMIN', | ||
163 | }; | 164 | }; |
164 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); | 165 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); |
165 | saveOrUpdateRoleInfoWithMenu(req).then(() => { | 166 | saveOrUpdateRoleInfoWithMenu(req).then(() => { |
@@ -62,7 +62,7 @@ | @@ -62,7 +62,7 @@ | ||
62 | const spinning = ref(false); | 62 | const spinning = ref(false); |
63 | const checkedKeysWithHalfChecked = ref<(string | number)[]>([]); | 63 | const checkedKeysWithHalfChecked = ref<(string | number)[]>([]); |
64 | 64 | ||
65 | - const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ | 65 | + const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({ |
66 | labelWidth: 90, | 66 | labelWidth: 90, |
67 | schemas: formSchema, | 67 | schemas: formSchema, |
68 | showActionButtonGroup: false, | 68 | showActionButtonGroup: false, |
@@ -80,6 +80,29 @@ | @@ -80,6 +80,29 @@ | ||
80 | 80 | ||
81 | const { isPlatformAdmin } = useRole(); | 81 | const { isPlatformAdmin } = useRole(); |
82 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 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 | resetFields(); | 106 | resetFields(); |
84 | roleId.value = ''; | 107 | roleId.value = ''; |
85 | // 在打开弹窗时清除所有选择的菜单 | 108 | // 在打开弹窗时清除所有选择的菜单 |
@@ -83,7 +83,7 @@ export const formSchema: FormSchema[] = [ | @@ -83,7 +83,7 @@ export const formSchema: FormSchema[] = [ | ||
83 | field: 'status', | 83 | field: 'status', |
84 | label: '状态', | 84 | label: '状态', |
85 | component: 'RadioButtonGroup', | 85 | component: 'RadioButtonGroup', |
86 | - defaultValue: 0, | 86 | + defaultValue: 1, |
87 | componentProps: { | 87 | componentProps: { |
88 | options: [ | 88 | options: [ |
89 | { label: '启用', value: 1 }, | 89 | { label: '启用', value: 1 }, |