From 3124d0b923379ff4ff378fb204e9f7660d3e9939 Mon Sep 17 00:00:00 2001 From: chansee97 Date: Fri, 29 Aug 2025 07:24:55 +0800 Subject: [PATCH] =?UTF-8?q?=C2=B7fix:=20=E5=AE=8C=E5=96=84=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=A8=A1=E5=9D=97=EF=BC=8C=E8=A7=92=E8=89=B2=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/en_US.json | 1 + locales/zh_CN.json | 1 + src/api/system/menu.ts | 4 +- src/api/system/role.ts | 8 + src/router/guard.ts | 2 +- src/router/routes.static.ts | 14 +- src/typings/entities/role.d.ts | 12 + src/views/setting/menu/columns.tsx | 20 +- .../setting/menu/components/MenuModal.vue | 5 +- .../setting/menu/components/PageForm.vue | 1 + src/views/setting/menu/index.vue | 2 +- src/views/setting/role/columns.tsx | 132 ++++++++++ .../setting/role/components/RoleModal.vue | 134 ++++++++++ src/views/setting/role/index.vue | 90 +++++++ src/views/setting/user/columns.tsx | 4 + .../setting/user/components/TableModal.vue | 238 ------------------ .../setting/user/components/UserModal.vue | 154 ++++++++++++ src/views/setting/user/index.vue | 8 +- 18 files changed, 571 insertions(+), 259 deletions(-) create mode 100644 src/views/setting/role/columns.tsx create mode 100644 src/views/setting/role/components/RoleModal.vue create mode 100644 src/views/setting/role/index.vue delete mode 100644 src/views/setting/user/components/TableModal.vue create mode 100644 src/views/setting/user/components/UserModal.vue diff --git a/locales/en_US.json b/locales/en_US.json index f348813..9343ab8 100644 --- a/locales/en_US.json +++ b/locales/en_US.json @@ -125,6 +125,7 @@ "setting": "System settings", "userCenter": "Personal Center", "accountSetting": "User settings", + "roleSetting": "Role settings", "cascader": "Administrative region selection", "dict": "Dictionary example" }, diff --git a/locales/zh_CN.json b/locales/zh_CN.json index d627301..4ecf6c3 100644 --- a/locales/zh_CN.json +++ b/locales/zh_CN.json @@ -150,6 +150,7 @@ "justSuper": "super可见", "setting": "系统设置", "accountSetting": "用户设置", + "roleSetting": "角色设置", "dictionarySetting": "字典设置", "menuSetting": "菜单设置", "userCenter": "个人中心", diff --git a/src/api/system/menu.ts b/src/api/system/menu.ts index 1500547..ce83875 100644 --- a/src/api/system/menu.ts +++ b/src/api/system/menu.ts @@ -44,6 +44,6 @@ export function deleteMenu(id: number) { * 查询菜单树 * GET /menu/selectTree */ -export function selectMenuTree() { - return request.Get>('/menu/selectTree') +export function getMenuOptions() { + return request.Get>('/menu/options') } diff --git a/src/api/system/role.ts b/src/api/system/role.ts index abaa004..631faa5 100644 --- a/src/api/system/role.ts +++ b/src/api/system/role.ts @@ -25,6 +25,14 @@ export function getRoleList(params?: RoleQueryParams) { return request.Get>('/role', { params }) } +/** + * 查询角色选项 + * GET /role/options + */ +export function getRoleOptions() { + return request.Get>('/role/options') +} + /** * 查询角色详情 * GET /role/{id} diff --git a/src/router/guard.ts b/src/router/guard.ts index 700b589..df1947d 100644 --- a/src/router/guard.ts +++ b/src/router/guard.ts @@ -38,7 +38,6 @@ export function setupRouterGuard(router: Router) { // 如果是login路由,直接放行 if (to.name === 'login') { // login页面不需要任何认证检查,直接放行 - // 继续执行后面的逻辑 } // 如果路由明确设置了requiresAuth为false,直接放行 else if (to.meta.requiresAuth === false) { @@ -70,6 +69,7 @@ export function setupRouterGuard(router: Router) { } catch { // 如果路由初始化失败(比如 401 错误),重定向到登录页 + local.remove('accessToken') const redirect = to.fullPath !== '/' ? to.fullPath : undefined next({ path: '/login', query: redirect ? { redirect } : undefined }) return diff --git a/src/router/routes.static.ts b/src/router/routes.static.ts index f444e53..50a4ed9 100644 --- a/src/router/routes.static.ts +++ b/src/router/routes.static.ts @@ -350,6 +350,16 @@ export const staticRoutes: AppRoute.RowRoute[] = [ id: 701, parentId: 7, }, + { + name: 'roleSetting', + path: '/setting/role', + title: '角色设置', + requiresAuth: true, + icon: 'icon-park-outline:every-user', + component: '/setting/role/index.vue', + id: 702, + parentId: 7, + }, { name: 'dictionarySetting', path: '/setting/dict', @@ -357,7 +367,7 @@ export const staticRoutes: AppRoute.RowRoute[] = [ requiresAuth: true, icon: 'icon-park-outline:book-one', component: '/setting/dict/index.vue', - id: 702, + id: 703, parentId: 7, }, { @@ -367,7 +377,7 @@ export const staticRoutes: AppRoute.RowRoute[] = [ requiresAuth: true, icon: 'icon-park-outline:application-menu', component: '/setting/menu/index.vue', - id: 703, + id: 704, parentId: 7, }, { diff --git a/src/typings/entities/role.d.ts b/src/typings/entities/role.d.ts index 8d15b28..2c97d93 100644 --- a/src/typings/entities/role.d.ts +++ b/src/typings/entities/role.d.ts @@ -5,6 +5,10 @@ namespace Entity { type RoleType = string interface Role { + /** + * 角色ID + */ + roleId: number /** * 菜单ID数组 */ @@ -29,6 +33,14 @@ namespace Entity { * 显示顺序 */ sort: number + /** + * 创建时间 + */ + createTime?: string + /** + * 更新时间 + */ + updateTime?: string [property: string]: any } } diff --git a/src/views/setting/menu/columns.tsx b/src/views/setting/menu/columns.tsx index 7c47d0d..5321346 100644 --- a/src/views/setting/menu/columns.tsx +++ b/src/views/setting/menu/columns.tsx @@ -17,7 +17,7 @@ export function createMenuColumns(actions: MenuColumnActions): DataTableColumns< { title: '菜单名称', key: 'title', - width: 200, + width: 400, }, { title: '图标', @@ -55,7 +55,7 @@ export function createMenuColumns(actions: MenuColumnActions): DataTableColumns< const menuTypeMap = { directory: { label: '目录', type: 'primary' }, page: { label: '菜单', type: 'warning' }, - permission: { label: '按钮', type: 'success' }, + permission: { label: '权限', type: 'info' }, } as const const menuInfo = menuTypeMap[row.menuType] return {menuInfo.label} @@ -82,13 +82,15 @@ export function createMenuColumns(actions: MenuColumnActions): DataTableColumns< render: (row) => { return ( - onAdd(row)} - > - 新建 - + {row.menuType !== 'permission' && ( + onAdd(row)} + > + 新建 + + )} onEdit(row)} diff --git a/src/views/setting/menu/components/MenuModal.vue b/src/views/setting/menu/components/MenuModal.vue index a269f00..0bdf280 100644 --- a/src/views/setting/menu/components/MenuModal.vue +++ b/src/views/setting/menu/components/MenuModal.vue @@ -1,6 +1,6 @@ + + diff --git a/src/views/setting/role/index.vue b/src/views/setting/role/index.vue new file mode 100644 index 0000000..f1187b4 --- /dev/null +++ b/src/views/setting/role/index.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/views/setting/user/columns.tsx b/src/views/setting/user/columns.tsx index 4aecb61..d0d925a 100644 --- a/src/views/setting/user/columns.tsx +++ b/src/views/setting/user/columns.tsx @@ -72,6 +72,7 @@ export function createUserColumns(actions: UserColumnActions): DataTableColumns< title: '邮箱', align: 'center', key: 'email', + render: row => renderProCopyableText(row.email), }, { title: '手机号', @@ -83,6 +84,7 @@ export function createUserColumns(actions: UserColumnActions): DataTableColumns< title: '状态', align: 'center', key: 'userStatus', + width: 100, render: (row) => { return ( renderProDateText(row.createTime, { pattern: 'datetime', }), @@ -109,6 +112,7 @@ export function createUserColumns(actions: UserColumnActions): DataTableColumns< title: '操作', align: 'center', key: 'actions', + width: 120, render: (row) => { return ( diff --git a/src/views/setting/user/components/TableModal.vue b/src/views/setting/user/components/TableModal.vue deleted file mode 100644 index 87531bf..0000000 --- a/src/views/setting/user/components/TableModal.vue +++ /dev/null @@ -1,238 +0,0 @@ - - - diff --git a/src/views/setting/user/components/UserModal.vue b/src/views/setting/user/components/UserModal.vue new file mode 100644 index 0000000..369aa16 --- /dev/null +++ b/src/views/setting/user/components/UserModal.vue @@ -0,0 +1,154 @@ + + + diff --git a/src/views/setting/user/index.vue b/src/views/setting/user/index.vue index 23362c3..efedf1f 100644 --- a/src/views/setting/user/index.vue +++ b/src/views/setting/user/index.vue @@ -2,7 +2,7 @@ import { createProSearchForm, useNDataTable } from 'pro-naive-ui' import { deleteUser, getUserList } from '@/api' import { createUserColumns, searchColumns } from './columns' -import TableModal from './components/TableModal.vue' +import UserModal from './components/UserModal.vue' const searchForm = createProSearchForm({ initialValues: { @@ -39,11 +39,11 @@ const tablecolumns = createUserColumns({ onStatusChange: () => {}, }) -async function getUserPage({ curent, pageSize }, formData) { +async function getUserPage({ current, pageSize }: any, formData: Entity.User[]) { try { const { data } = await getUserList({ ...formData, - pageNum: curent, + pageNum: current, pageSize, }) return { @@ -121,6 +121,6 @@ const treeData = ref([ - +