From b70ddb31e90ca86362505d659a29910fd89e99e4 Mon Sep 17 00:00:00 2001 From: xlsea Date: Fri, 9 May 2025 20:26:55 +0800 Subject: [PATCH 1/4] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=8C=89=E9=92=AE=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/monitor/login-infor/index.vue | 12 +- src/views/monitor/oper-log/index.vue | 11 +- src/views/system/client/index.vue | 41 ++++--- src/views/system/config/index.vue | 40 ++++--- src/views/system/dept/index.vue | 84 +++++++------- src/views/system/dict/data/index.vue | 40 ++++--- src/views/system/dict/type/index.vue | 39 ++++--- src/views/system/menu/index.vue | 117 +++++++++++-------- src/views/system/notice/index.vue | 40 ++++--- src/views/system/oss-config/index.vue | 39 ++++--- src/views/system/oss/index.vue | 12 +- src/views/system/post/index.vue | 39 ++++--- src/views/system/tenant/index.vue | 77 +++++++------ src/views/system/user/index.vue | 14 ++- src/views/tool/gen/index.vue | 142 ++++++++++++++---------- 15 files changed, 455 insertions(+), 292 deletions(-) diff --git a/src/views/monitor/login-infor/index.vue b/src/views/monitor/login-infor/index.vue index 677a4251..e9954aa0 100644 --- a/src/views/monitor/login-infor/index.vue +++ b/src/views/monitor/login-infor/index.vue @@ -1,5 +1,4 @@ @@ -169,7 +173,7 @@ async function handleExport() { :scroll-x="962" :loading="loading" remote - :row-key="row => row.id" + :row-key="row => row.#foreach($column in $columns)#if($column.isPk == '1')$column.javaField#end#end" :pagination="mobilePagination" class="sm:h-full" /> diff --git a/src/components/custom/form-tip.vue b/src/components/custom/form-tip.vue index a94ea2be..41040d00 100644 --- a/src/components/custom/form-tip.vue +++ b/src/components/custom/form-tip.vue @@ -19,7 +19,7 @@ defineProps(); diff --git a/src/components/custom/menu-tree-select.vue b/src/components/custom/menu-tree-select.vue index 296d5713..99e72676 100644 --- a/src/components/custom/menu-tree-select.vue +++ b/src/components/custom/menu-tree-select.vue @@ -1,5 +1,5 @@ + + + + diff --git a/src/constants/business.ts b/src/constants/business.ts index 2e4b8e4f..a9718f3a 100644 --- a/src/constants/business.ts +++ b/src/constants/business.ts @@ -116,3 +116,15 @@ export const ossAccessPolicyRecord: Record = }; export const ossAccessPolicyOptions = transformRecordToOption(ossAccessPolicyRecord); + +/** data scope */ +export const dataScopeRecord: Record = { + '1': '全部数据权限', + '2': '自定数据权限', + '3': '本部门数据权限', + '4': '本部门及以下数据权限', + '5': '仅本人数据权限', + '6': '部门及以下或本人数据权限' +}; + +export const dataScopeOptions = transformRecordToOption(dataScopeRecord); diff --git a/src/router/elegant/imports.ts b/src/router/elegant/imports.ts index 15319570..763722ac 100644 --- a/src/router/elegant/imports.ts +++ b/src/router/elegant/imports.ts @@ -38,6 +38,7 @@ export const views: Record Promise import("@/views/system/oss-config/index.vue"), system_oss: () => import("@/views/system/oss/index.vue"), system_post: () => import("@/views/system/post/index.vue"), + system_role: () => import("@/views/system/role/index.vue"), system_tenant: () => import("@/views/system/tenant/index.vue"), system_user: () => import("@/views/system/user/index.vue"), tool_gen: () => import("@/views/tool/gen/index.vue"), diff --git a/src/router/elegant/routes.ts b/src/router/elegant/routes.ts index aae7747f..0009b4a3 100644 --- a/src/router/elegant/routes.ts +++ b/src/router/elegant/routes.ts @@ -250,6 +250,15 @@ export const generatedRoutes: GeneratedRoute[] = [ i18nKey: 'route.system_post' } }, + { + name: 'system_role', + path: '/system/role', + component: 'view.system_role', + meta: { + title: 'system_role', + i18nKey: 'route.system_role' + } + }, { name: 'system_tenant', path: '/system/tenant', diff --git a/src/router/elegant/transform.ts b/src/router/elegant/transform.ts index 73dc4976..9427af4d 100644 --- a/src/router/elegant/transform.ts +++ b/src/router/elegant/transform.ts @@ -187,6 +187,7 @@ const routeMap: RouteMap = { "system_oss": "/system/oss", "system_oss-config": "/system/oss-config", "system_post": "/system/post", + "system_role": "/system/role", "system_tenant": "/system/tenant", "system_user": "/system/user", "tool": "/tool", diff --git a/src/service/api/system/menu.ts b/src/service/api/system/menu.ts index 045b0f39..f05e199e 100644 --- a/src/service/api/system/menu.ts +++ b/src/service/api/system/menu.ts @@ -34,3 +34,11 @@ export function fetchDeleteMenu(menuId: CommonType.IdType) { method: 'delete' }); } + +/** 获取角色菜单权限 */ +export function fetchGetRoleMenuTreeSelect(roleId: CommonType.IdType) { + return request({ + url: `/system/menu/roleMenuTreeselect/${roleId}`, + method: 'get' + }); +} diff --git a/src/service/api/system/role.ts b/src/service/api/system/role.ts index ddd4350b..d22567f3 100644 --- a/src/service/api/system/role.ts +++ b/src/service/api/system/role.ts @@ -27,8 +27,17 @@ export function fetchUpdateRole(data: Api.System.RoleOperateParams) { }); } +/** 修改角色状态 */ +export function fetchUpdateRoleStatus(data: Api.System.RoleOperateParams) { + return request({ + url: '/system/role/changeStatus', + method: 'put', + data + }); +} + /** 批量删除角色信息 */ -export function fetchDeleteRole(roleIds: CommonType.IdType[]) { +export function fetchBatchDeleteRole(roleIds: CommonType.IdType[]) { return request({ url: `/system/role/${roleIds.join(',')}`, method: 'delete' diff --git a/src/service/api/system/user.ts b/src/service/api/system/user.ts index d174aea1..f705dcd6 100644 --- a/src/service/api/system/user.ts +++ b/src/service/api/system/user.ts @@ -34,6 +34,15 @@ export function fetchUpdateUser(data: Api.System.UserOperateParams) { }); } +/** 修改用户状态 */ +export function fetchUpdateUserStatus(data: Api.System.UserOperateParams) { + return request({ + url: '/system/user/changeStatus', + method: 'put', + data + }); +} + /** 批量删除用户信息 */ export function fetchBatchDeleteUser(userIds: CommonType.IdType[]) { return request({ diff --git a/src/typings/api/system.api.d.ts b/src/typings/api/system.api.d.ts index f578179c..8f8d6dfe 100644 --- a/src/typings/api/system.api.d.ts +++ b/src/typings/api/system.api.d.ts @@ -10,10 +10,13 @@ declare namespace Api { * backend api module: "system" */ namespace System { + /** data scope */ + type DataScope = '1' | '2' | '3' | '4' | '5' | '6'; + /** role */ type Role = Common.CommonRecord<{ /** 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) */ - dataScope: string; + dataScope: DataScope; /** 部门树选择项是否关联显示 */ deptCheckStrictly: boolean; /** 用户是否存在此角色标识 默认不存在 */ @@ -45,21 +48,19 @@ declare namespace Api { type RoleOperateParams = CommonType.RecordNullable< Pick< Api.System.Role, - | 'roleId' - | 'roleName' - | 'roleKey' - | 'roleSort' - | 'dataScope' - | 'menuCheckStrictly' - | 'deptCheckStrictly' - | 'status' - | 'remark' - > + 'roleId' | 'roleName' | 'roleKey' | 'roleSort' | 'menuCheckStrictly' | 'status' | 'remark' + > & { menuIds: CommonType.IdType[] } >; /** role list */ type RoleList = Common.PaginatingQueryRecord; + /** role menu tree select */ + type RoleMenuTreeSelect = Common.CommonRecord<{ + checkedKeys: CommonType.IdType[]; + menus: MenuList; + }>; + /** all role */ type AllRole = Pick; @@ -261,6 +262,8 @@ declare namespace Api { parentName: string; /** 子菜单 */ children: MenuList; + id?: CommonType.IdType; + label?: string; }>; /** menu list */ diff --git a/src/typings/components.d.ts b/src/typings/components.d.ts index 551e563e..6a54a594 100644 --- a/src/typings/components.d.ts +++ b/src/typings/components.d.ts @@ -12,6 +12,7 @@ declare module 'vue' { BetterScroll: typeof import('./../components/custom/better-scroll.vue')['default'] BooleanTag: typeof import('./../components/custom/boolean-tag.vue')['default'] ButtonIcon: typeof import('./../components/custom/button-icon.vue')['default'] + copy: typeof import('./../components/custom/menu-tree-select copy.vue')['default'] CountTo: typeof import('./../components/custom/count-to.vue')['default'] DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default'] DictRadio: typeof import('./../components/custom/dict-radio.vue')['default'] @@ -39,6 +40,7 @@ declare module 'vue' { IconIcRoundUpload: typeof import('~icons/ic/round-upload')['default'] IconLocalBanner: typeof import('~icons/local/banner')['default'] 'IconMaterialSymbols:download2Rounded': typeof import('~icons/material-symbols/download2-rounded')['default'] + 'IconMaterialSymbols:syncOutline': typeof import('~icons/material-symbols/sync-outline')['default'] 'IconMaterialSymbols:upload2Rounded': typeof import('~icons/material-symbols/upload2-rounded')['default'] IconMdiArrowDownThin: typeof import('~icons/mdi/arrow-down-thin')['default'] IconMdiArrowUpThin: typeof import('~icons/mdi/arrow-up-thin')['default'] @@ -51,6 +53,7 @@ declare module 'vue' { LangSwitch: typeof import('./../components/common/lang-switch.vue')['default'] LookForward: typeof import('./../components/custom/look-forward.vue')['default'] MenuToggler: typeof import('./../components/common/menu-toggler.vue')['default'] + MenuTree: typeof import('./../components/custom/menu-tree.vue')['default'] MenuTreeSelect: typeof import('./../components/custom/menu-tree-select.vue')['default'] MonacoEditor: typeof import('./../components/common/monaco-editor.vue')['default'] NAlert: typeof import('naive-ui')['NAlert'] diff --git a/src/typings/elegant-router.d.ts b/src/typings/elegant-router.d.ts index 86a089db..d74f1839 100644 --- a/src/typings/elegant-router.d.ts +++ b/src/typings/elegant-router.d.ts @@ -41,6 +41,7 @@ declare module "@elegant-router/types" { "system_oss": "/system/oss"; "system_oss-config": "/system/oss-config"; "system_post": "/system/post"; + "system_role": "/system/role"; "system_tenant": "/system/tenant"; "system_user": "/system/user"; "tool": "/tool"; @@ -127,6 +128,7 @@ declare module "@elegant-router/types" { | "system_oss-config" | "system_oss" | "system_post" + | "system_role" | "system_tenant" | "system_user" | "tool_gen" diff --git a/src/views/_builtin/user-center/modules/user-avatar.vue b/src/views/_builtin/user-center/modules/user-avatar.vue index a51cadb4..45d03571 100644 --- a/src/views/_builtin/user-center/modules/user-avatar.vue +++ b/src/views/_builtin/user-center/modules/user-avatar.vue @@ -44,6 +44,7 @@ const options = reactive({ /** 编辑头像 */ function handleEdit() { + options.img = imageUrl.value; showDrawer(); } @@ -86,6 +87,7 @@ async function handleCrop() { if (!error) { window.$message?.success('头像更新成功!'); imageUrl.value = URL.createObjectURL(blob); + authStore.userInfo.user!.avatar = imageUrl.value; hideDrawer(); } }, 'image/png'); @@ -114,7 +116,7 @@ function handleClose() {
-
+
- user-avatar
选择图片 - - 确认裁剪 - + 确认裁剪
diff --git a/src/views/system/menu/modules/menu-operate-drawer.vue b/src/views/system/menu/modules/menu-operate-drawer.vue index f5dea01e..f9e0ae64 100644 --- a/src/views/system/menu/modules/menu-operate-drawer.vue +++ b/src/views/system/menu/modules/menu-operate-drawer.vue @@ -153,7 +153,7 @@ async function handleSubmit() { } else if (model.menuType === 'C') { component = humpToLine(model.component?.replaceAll('/', '_') || ''); } else if (model.menuType === 'M') { - component = model.parentId === 0 ? 'layout.base' : undefined; + component = 'layout.base'; } // request diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue new file mode 100644 index 00000000..590bf1e2 --- /dev/null +++ b/src/views/system/role/index.vue @@ -0,0 +1,250 @@ + + + + + diff --git a/src/views/system/role/modules/role-operate-drawer.vue b/src/views/system/role/modules/role-operate-drawer.vue new file mode 100644 index 00000000..76886c1f --- /dev/null +++ b/src/views/system/role/modules/role-operate-drawer.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/src/views/system/role/modules/role-search.vue b/src/views/system/role/modules/role-search.vue new file mode 100644 index 00000000..7a51345b --- /dev/null +++ b/src/views/system/role/modules/role-search.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/views/system/tenant/index.vue b/src/views/system/tenant/index.vue index 922070f9..e9a68e44 100644 --- a/src/views/system/tenant/index.vue +++ b/src/views/system/tenant/index.vue @@ -220,6 +220,9 @@ async function handleExport() { > diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 8c567f5d..039603c1 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -2,14 +2,14 @@ import { ref } from 'vue'; import { NButton, NDivider } from 'naive-ui'; import { useBoolean, useLoading } from '@sa/hooks'; -import { fetchBatchDeleteUser, fetchGetDeptTree, fetchGetUserList } from '@/service/api/system'; +import { fetchBatchDeleteUser, fetchGetDeptTree, fetchGetUserList, fetchUpdateUserStatus } from '@/service/api/system'; import { useAppStore } from '@/store/modules/app'; import { useTable, useTableOperate } from '@/hooks/common/table'; import { useDict } from '@/hooks/business/dict'; import { useAuth } from '@/hooks/business/auth'; import ButtonIcon from '@/components/custom/button-icon.vue'; -import DictTag from '@/components/custom/dict-tag.vue'; import { $t } from '@/locales'; +import StatusSwitch from '@/components/custom/status-switch.vue'; import UserOperateDrawer from './modules/user-operate-drawer.vue'; import UserImportModal from './modules/user-import-modal.vue'; import UserSearch from './modules/user-search.vue'; @@ -19,7 +19,6 @@ defineOptions({ }); useDict('sys_user_sex'); -useDict('sys_normal_disable'); const { hasAuth } = useAuth(); const appStore = useAppStore(); @@ -96,7 +95,14 @@ const { align: 'center', minWidth: 80, render(row) { - return ; + return ( + handleStatusChange(row, value, callback)} + /> + ); } }, { @@ -211,6 +217,25 @@ function handleResetTreeData() { function handleImport() { openImportModal(); } + +/** 处理状态切换 */ +async function handleStatusChange( + row: Api.System.User, + value: Api.Common.EnableStatus, + callback: (flag: boolean) => void +) { + const { error } = await fetchUpdateUserStatus({ + userId: row.userId, + status: value + }); + + callback(!error); + + if (!error) { + window.$message?.success('状态修改成功'); + getData(); + } +}