From d76655a30a07f3728929d907e18c3c7223e315e2 Mon Sep 17 00:00:00 2001 From: Yvan <8574526@qq,com> Date: Wed, 7 Jan 2026 20:01:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/package.json | 26 +- web/src/access.ts | 37 +- web/src/app.tsx | 147 ++++- web/src/components/Footer/index.tsx | 18 +- web/src/components/Logo/index.tsx | 37 -- .../RightContent/AvatarDropdown.tsx | 135 ++--- web/src/components/index.ts | 3 +- web/src/pages/404.tsx | 22 +- web/src/pages/dashboard/index.less | 133 ----- web/src/pages/dashboard/index.tsx | 270 --------- web/src/pages/person/index.tsx | 338 ----------- web/src/pages/system/api/index.tsx | 147 ----- web/src/pages/system/authority/index.tsx | 252 -------- web/src/pages/system/dictionary/index.tsx | 264 --------- web/src/pages/system/menu/index.tsx | 126 ---- web/src/pages/system/operation/index.tsx | 198 ------- web/src/pages/system/params/index.tsx | 157 ----- web/src/pages/system/state/index.tsx | 126 ---- web/src/pages/system/user/index.tsx | 285 ---------- web/src/pages/user/login/index.less | 204 ------- web/src/pages/user/login/index.tsx | 538 ++++++++++++------ web/src/requestErrorConfig.ts | 169 +----- web/src/services/system/api.ts | 106 ---- web/src/services/system/authority.ts | 53 -- web/src/services/system/casbin.ts | 21 - web/src/services/system/dictionary.ts | 61 -- web/src/services/system/dictionaryDetail.ts | 77 --- web/src/services/system/index.ts | 13 - web/src/services/system/menu.ts | 75 --- web/src/services/system/operationRecord.ts | 34 -- web/src/services/system/params.ts | 61 -- web/src/services/system/systemConfig.ts | 12 - web/src/services/system/typings.d.ts | 468 --------------- web/src/services/system/user.ts | 108 ---- web/src/utils/format.ts | 76 --- web/src/utils/index.ts | 7 - web/src/utils/page.ts | 25 - web/src/utils/storage.ts | 102 ---- 38 files changed, 603 insertions(+), 4328 deletions(-) delete mode 100644 web/src/components/Logo/index.tsx delete mode 100644 web/src/pages/dashboard/index.less delete mode 100644 web/src/pages/dashboard/index.tsx delete mode 100644 web/src/pages/person/index.tsx delete mode 100644 web/src/pages/system/api/index.tsx delete mode 100644 web/src/pages/system/authority/index.tsx delete mode 100644 web/src/pages/system/dictionary/index.tsx delete mode 100644 web/src/pages/system/menu/index.tsx delete mode 100644 web/src/pages/system/operation/index.tsx delete mode 100644 web/src/pages/system/params/index.tsx delete mode 100644 web/src/pages/system/state/index.tsx delete mode 100644 web/src/pages/system/user/index.tsx delete mode 100644 web/src/pages/user/login/index.less delete mode 100644 web/src/services/system/api.ts delete mode 100644 web/src/services/system/authority.ts delete mode 100644 web/src/services/system/casbin.ts delete mode 100644 web/src/services/system/dictionary.ts delete mode 100644 web/src/services/system/dictionaryDetail.ts delete mode 100644 web/src/services/system/index.ts delete mode 100644 web/src/services/system/menu.ts delete mode 100644 web/src/services/system/operationRecord.ts delete mode 100644 web/src/services/system/params.ts delete mode 100644 web/src/services/system/systemConfig.ts delete mode 100644 web/src/services/system/typings.d.ts delete mode 100644 web/src/services/system/user.ts delete mode 100644 web/src/utils/format.ts delete mode 100644 web/src/utils/index.ts delete mode 100644 web/src/utils/page.ts delete mode 100644 web/src/utils/storage.ts diff --git a/web/package.json b/web/package.json index a0450ab..ed91c35 100644 --- a/web/package.json +++ b/web/package.json @@ -1,9 +1,9 @@ { - "name": "ant-design-pro", - "version": "6.0.0", + "name": "kratos-admin", + "version": "1.0.0", "private": true, - "description": "An out-of-box UI solution for enterprise applications", - "repository": "git@github.com:ant-design/ant-design-pro.git", + "description": "KRA - Kratos Admin Management System", + "repository": "", "scripts": { "analyze": "cross-env ANALYZE=1 max build", "build": "max build", @@ -35,12 +35,24 @@ "dependencies": { "@ant-design/icons": "^6.1.0", "@ant-design/pro-components": "^2.8.9", + "@ant-design/charts": "^2.2.1", "antd": "^6.0.0", "antd-style": "^3.7.0", + "axios": "^1.8.2", "classnames": "^2.5.1", "dayjs": "^1.11.13", + "echarts": "^5.5.1", + "echarts-for-react": "^3.0.2", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "qs": "^6.13.0", "react": "^19.1.0", - "react-dom": "^19.1.0" + "react-cropper": "^2.3.3", + "react-dom": "^19.1.0", + "react-qr-code": "^2.0.15", + "screenfull": "^6.0.2", + "spark-md5": "^3.0.2", + "zustand": "^5.0.0" }, "devDependencies": { "@ant-design/pro-cli": "^3.3.0", @@ -50,9 +62,13 @@ "@testing-library/react": "^16.3.0", "@types/express": "^5.0.3", "@types/jest": "^30.0.0", + "@types/lodash": "^4.17.13", + "@types/nprogress": "^0.2.3", + "@types/qs": "^6.9.17", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@types/react-helmet": "^6.1.11", + "@types/spark-md5": "^3.0.4", "@umijs/lint": "^4.6.1", "@umijs/max": "^4.6.2", "cross-env": "^10.0.0", diff --git a/web/src/access.ts b/web/src/access.ts index 3fb22f0..373d9fa 100644 --- a/web/src/access.ts +++ b/web/src/access.ts @@ -1,42 +1,11 @@ /** - * 权限配置 - 参考GVA的权限验证逻辑 * @see https://umijs.org/docs/max/access#access - */ - + * */ export default function access( - initialState: { currentUser?: API.UserInfo } | undefined, + initialState: { currentUser?: API.CurrentUser } | undefined, ) { const { currentUser } = initialState ?? {}; - - // 获取当前用户的角色ID - const authorityId = currentUser?.authorityId || currentUser?.authority?.authorityId; - - // 超级管理员角色ID(与GVA保持一致,888为超级管理员) - const isSuperAdmin = authorityId === 888; - - // 普通管理员 - const isAdmin = !!currentUser && !!authorityId; - return { - // 是否为超级管理员 - canSuperAdmin: isSuperAdmin, - // 是否为管理员(已登录且有角色) - canAdmin: isAdmin, - // 是否已登录 - isLogin: !!currentUser, - // 按钮权限检查函数 - 参考GVA的btnAuth - canAccess: (btnKey: string) => { - // 超级管理员拥有所有权限 - if (isSuperAdmin) return true; - // 检查当前路由的按钮权限 - const btns = (currentUser as any)?.btns || {}; - return !!btns[btnKey]; - }, + canAdmin: currentUser && currentUser.access === 'admin', }; } - -/** - * 按钮权限Hook - 参考GVA的useBtnAuth - * 在组件中使用: const { canAccess } = useAccess(); - * 然后: canAccess('add') 检查是否有添加权限 - */ diff --git a/web/src/app.tsx b/web/src/app.tsx index 3031e42..2c1dd16 100644 --- a/web/src/app.tsx +++ b/web/src/app.tsx @@ -2,9 +2,11 @@ import { AvatarDropdown, AvatarName, Footer, + Question, SelectLang, } from "@/components"; -import { getUserInfo } from "@/services/system/user"; +import { createAdminService } from "@/services/index"; +import { Admin } from "@/services/kratos/admin/v1/index"; import { LinkOutlined } from "@ant-design/icons"; import type { Settings as LayoutSettings } from "@ant-design/pro-components"; import { SettingDrawer } from "@ant-design/pro-components"; @@ -17,42 +19,32 @@ const isDev = process.env.NODE_ENV === "development"; const isDevOrTest = isDev || process.env.CI; const loginPath = "/user/login"; -/** - * 获取用户信息 - 参考GVA的GetUserInfo - */ -const fetchUserInfo = async (): Promise => { - try { - const token = localStorage.getItem('token'); - if (!token) { - return undefined; - } - const res = await getUserInfo(); - // 与GVA一致,code === 0 表示成功 - if (res.code === 0 && res.data?.userInfo) { - // 同步更新localStorage中的userInfo - 与GVA一致 - localStorage.setItem('userInfo', JSON.stringify(res.data.userInfo)); - return res.data.userInfo; - } - return undefined; - } catch (error) { - // 错误已在requestErrorConfig中处理,这里不需要额外处理 - // 401错误会弹出Modal,用户点击确定后跳转登录页 - return undefined; - } -}; +const adminService = createAdminService(); /** * @see https://umijs.org/docs/api/runtime-config#getinitialstate - */ + * */ export async function getInitialState(): Promise<{ - settings?: Partial & { showWatermark?: boolean }; - currentUser?: API.UserInfo; + settings?: Partial; + currentUser?: API.CurrentUser; loading?: boolean; - fetchUserInfo?: () => Promise; + fetchUserInfo?: () => Promise; }> { - // 如果不是登录页面,获取用户信息 - 与GVA的permission.js逻辑一致 + const fetchUserInfo = async () => { + try { + return await adminService.Current({}); + } catch (error) { + history.push(loginPath); + } + return undefined; + }; + // 如果不是登录页面,执行 const { location } = history; - if (![loginPath, "/user/register", "/user/register-result"].includes(location.pathname)) { + if ( + ![loginPath, "/user/register", "/user/register-result"].includes( + location.pathname + ) + ) { const currentUser = await fetchUserInfo(); return { fetchUserInfo, @@ -65,3 +57,98 @@ export async function getInitialState(): Promise<{ settings: defaultSettings as Partial, }; } + +// ProLayout 支持的api https://procomponents.ant.design/components/layout +export const layout: RunTimeLayoutConfig = ({ + initialState, + setInitialState, +}) => { + return { + actionsRender: () => [ + , + , + ], + avatarProps: { + src: initialState?.currentUser?.avatar, + title: , + render: (_, avatarChildren) => ( + {avatarChildren} + ), + }, + waterMarkProps: { + content: initialState?.currentUser?.name, + }, + footerRender: () =>