# Goalfymax 管理后台项目架构概览 ## 项目概述 这是一个基于 **React 18** + **Vite** + **Ant Design 5** + **React Router 7** 的现代管理后台应用。 - **技术栈**:React 18.3.1 + TypeScript + Vite 5.4.20 + Ant Design 5.27.4 - **状态管理**:Jotai(原子状态管理) - **HTTP 客户端**:Axios 1.12.2 - **日期处理**:Dayjs 1.11.18 - **总文件数**:48 个 TypeScript/TSX 文件 - **代码行数**:~7000+ 行代码 --- ## 目录结构 ``` src/ ├── App.tsx # 主应用入口,定义静态路由 ├── main.tsx # Vite 应用入口点 ├── index.css # 全局样式 ├── App.css # 应用样式 │ ├── atoms/ # 状态管理(Jotai 原子状态) │ └── auth.ts # 认证状态原子 │ ├── components/ # 可复用 UI 组件 │ ├── Layout.tsx # 主布局组件(侧边栏+主区域) │ ├── DynamicMenu.tsx # 动态菜单组件(权限感知) │ ├── DynamicMenu.css # 菜单样式 │ ├── AuthGuard.tsx # 认证守卫组件 │ ├── PermissionGuard.tsx # 权限守卫组件 │ ├── PagePermissionGuard.tsx │ ├── QuotaCharts.tsx # 配额图表组件 │ ├── QuotaRulesForm.tsx # 配额规则表单 │ ├── QuotaRulesTable.tsx # 配额规则表格 │ ├── QuotaHistoryTable.tsx # 配额历史表格 │ ├── QuotaFilters.tsx # 配额过滤器 │ ├── QuotaStats.tsx # 配额统计 │ └── UserProjectQuotaPage.tsx │ ├── hooks/ # 自定义 React Hooks │ ├── useAuth.ts # 认证 Hook(登录、登出、Token 管理) │ ├── usePagePermissions.ts # 页面权限 Hook │ └── usePermissions.ts # 操作权限 Hook │ ├── pages/ # 页面组件 │ ├── Dashboard.tsx # 仪表盘 │ ├── Overview.tsx # 总览页 │ ├── Operations.tsx # 运营页 │ ├── Monitoring.tsx # 监控页 │ ├── Finance.tsx # 财务页 │ ├── SystemHealth.tsx # 系统健康 │ ├── QuotaRules.tsx # 配额规则管理 │ ├── UserProjectQuota.tsx # 用户项目配额管理 │ ├── UserManagement.tsx # 系统用户管理 │ ├── RoleManagement.tsx # 角色管理 │ ├── GoalfyMaxUsers.tsx # GoalfyMax 用户管理 │ ├── UserLevelConfigs.tsx # 用户等级配置管理 │ ├── SystemConfigs.tsx # 系统配置管理 │ ├── UserFeedback.tsx # 用户反馈管理 │ ├── MessagePush.tsx # 消息推送管理 │ ├── TokenHistory.tsx # Token 历史 │ ├── TokenAnalytics.tsx # Token 分析 │ ├── VendorModelPricing.tsx# 供应商模型价格管理 │ └── ... │ ├── routes/ # 路由配置 │ └── DynamicRoutes.tsx # 动态路由配置(基于权限的动态路由) │ ├── services/ # API 服务层 │ ├── api.ts # 核心 API 客户端(ApiClient)+ API 服务导出 │ ├── userLevelConfigApi.ts # 用户等级配置 API │ ├── systemConfigApi.ts # 系统配置 API │ ├── userApi.ts # 用户 API │ ├── roleApi.ts # 角色 API │ └── ... │ ├── types/ # TypeScript 类型定义 │ ├── userLevelConfig.ts # 用户等级配置类型 │ ├── systemConfig.ts # 系统配置类型 │ ├── quota.ts # 配额类型 │ ├── userProjectQuota.ts # 用户项目配额类型 │ └── ... │ ├── utils/ # 工具函数 │ └── storageMigration.ts # 存储迁移工具 │ └── assets/ # 静态资源 └── react.svg ``` --- ## 核心架构设计 ### 1. 路由设计 **双层路由系统**: #### App.tsx 中的静态路由 - 定义所有可用的路由路径 - 组织模块化的路由结构(dashboard、operations、monitoring、system 等) ```typescript // 示例:系统管理路由 } /> } /> } /> } /> } /> ``` #### DynamicRoutes.tsx 中的权限感知路由 - 根据用户权限动态显示/隐藏路由 - 使用 `usePagePermissions()` hook 获取用户权限 - 只挂载有权限访问的路由 ### 2. 菜单系统 **DynamicMenu 组件**特点: - 权限感知的菜单项过滤 - 支持一级和二级菜单 - 自动同步当前路由位置 - 详细的权限检查日志 核心逻辑: ```typescript const filterAccessibleMenus = (items: MenuItem[]): MenuItem[] => { // 1. 仪表盘始终显示 // 2. 父级菜单权限检查(如 /system、/operations) // 3. 单个菜单项权限检查 // 4. 返回过滤后的菜单项 } ``` ### 3. API 调用模式 **分层结构**: ``` UI 组件 ↓ Custom Hook (useXxx) ↓ API Service (xxxApi.ts) ↓ ApiClient (api.ts) ↓ Axios 实例 + 拦截器 ↓ 后端 API ``` #### ApiClient 类特性 - **自动 Token 管理**:请求自动附加 Authorization 头 - **Token 刷新机制**:401 错误时自动刷新 token - **请求队列**:刷新 token 期间的请求入队等待 - **错误处理**:统一处理认证失败和其他错误 #### API 服务示例 **系统配置 API**(systemConfigApi.ts): ```typescript export const getSystemConfigList = async (params) => { const response = await apiClient.get('/admin/system-configs', { params }); return response; // 返回完整响应对象 } export const createSystemConfig = async (data) => { const response = await apiClient.post('/admin/system-configs', data); return response.data; } ``` **用户等级配置 API**(userLevelConfigApi.ts): ```typescript export const getUserLevelConfigList = async (params) => { const response = await apiClient.get('/admin/user-level-configs', { params }); return response.data; } ``` --- ## 关键文件详解 ### 1. 用户等级配置(UserLevelConfigs) **文件清单**: - `/src/pages/UserLevelConfigs.tsx` - 页面组件(292 行) - `/src/services/userLevelConfigApi.ts` - API 服务(60 行) - `/src/types/userLevelConfig.ts` - 类型定义(47 行) **功能**: - 列表查询(分页) - 创建新等级配置 - 编辑等级配置 - 删除等级配置 - 启用/禁用等级配置 **数据模型**: ```typescript interface UserLevelConfig { id: number; level_name: string; // 等级名称 level_code: string; // 等级代码 project_limit: number; // 项目数限制 description: string; // 描述 sort_order: number; // 排序顺序 status: number; // 1=启用, 0=禁用 created_at: string; updated_at: string; } ``` ### 2. 系统配置(SystemConfigs) **文件清单**: - `/src/pages/SystemConfigs.tsx` - 页面组件(284 行) - `/src/services/systemConfigApi.ts` - API 服务(66 行) - `/src/types/systemConfig.ts` - 类型定义(51 行) **功能**: - 列表查询(分页) - 创建新系统配置 - 编辑系统配置 - 删除系统配置 - 启用/禁用系统配置 **数据模型**: ```typescript interface SystemConfig { id: number; key: string; // 唯一标识 name: string; // 配置名称 value: string; // 配置值 type: string; // 配置类型(string, int, bool, json) desc: string; // 配置描述 status: number; // 1=启用, 0=禁用 createdAt: string; updatedAt: string; } ``` ### 3. Layout 组件(布局) **结构**: ``` ┌─────────────────────────────┐ │ Header(顶部栏) │ ├─────────┬───────────────────┤ │ │ │ │ Sidebar │ Main Content │ │(Menus) │ (页面内容) │ │ │ │ ├─────────┼───────────────────┤ │ Footer(页脚) │ └─────────────────────────────┘ ``` **特性**: - 侧边栏可折叠/展开(按钮) - 动态菜单(DynamicMenu) - 子导航标签(针对多级菜单页面) - 用户认证状态显示 + 登出按钮 ### 4. 认证流程(useAuth Hook) **功能**: - SSO 单点登录 - Token 管理(access_token + refresh_token) - 自动 Token 刷新 - Token 过期检测和重新登录 --- ## API 端点规范 ### 用户等级配置 ``` GET /admin/user-level-configs # 列表(分页) GET /admin/user-level-configs/all # 全部(不分页) GET /admin/user-level-configs/:id # 详情 POST /admin/user-level-configs # 创建 PUT /admin/user-level-configs/:id # 更新 PUT /admin/user-level-configs/:id/status # 更新状态 DELETE /admin/user-level-configs/:id # 删除 ``` ### 系统配置 ``` GET /admin/system-configs # 列表(分页) GET /admin/system-configs/all # 全部(不分页) GET /admin/system-configs/:id # 详情 GET /admin/system-configs/key/:key # 按 Key 查询 POST /admin/system-configs # 创建 PUT /admin/system-configs/:id # 更新 PUT /admin/system-configs/:id/status # 更新状态 DELETE /admin/system-configs/:id # 删除 ``` ### 其他 API ``` GET /admin/goalfymax-users # GoalfyMax 用户列表 GET /admin/user-feedback # 用户反馈 GET /admin/message-push/logs # 推送记录 GET /admin/vendor-model-pricing # 供应商模型价格 POST /admin/message-push/send # 发送消息 ``` --- ## 权限系统 ### 权限检查层级 1. **页面级权限**(usePagePermissions) - 检查用户是否可以访问某个页面 - 返回可访问的页面列表 2. **操作级权限**(usePermissions) - 检查用户是否可以执行某个操作 - 如:创建、编辑、删除、启用/禁用 3. **菜单级权限**(DynamicMenu) - 根据页面权限动态显示/隐藏菜单项 - 支持嵌套菜单的权限管理 ### 权限存储 - 通过 localStorage 缓存 - 从后端 SSO API 获取用户权限信息 - Jotai 原子状态管理 --- ## 页面模块划分 ### 系统管理(/system) - 配额/套餐规则 - 用户项目配额 - 系统用户管理 - 角色管理 - GoalfyMax 用户管理 - **用户等级配置** - **系统配置** ### 运营(/operations) - 用户反馈管理 - 消息推送管理 - 供应商模型价格管理 ### 监控(/monitoring) - Token 历史 - Token 分析 - 系统健康 ### 财务(/finance) - 财务数据统计 --- ## 通用 CRUD 页面模式 ### UserLevelConfigs 和 SystemConfigs 采用的设计模式 **页面结构**: 1. 数据列表(分页表格) 2. 创建弹窗 3. 编辑弹窗 4. 操作列(编辑、启用/禁用、删除) **状态管理**: ```typescript const [list, setList] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [size, setSize] = useState(10); const [editing, setEditing] = useState(null); const [editOpen, setEditOpen] = useState(false); const [createOpen, setCreateOpen] = useState(false); ``` **操作流程**: 1. **查询列表**:`fetchList()` → API → 更新 state 2. **创建**:表单验证 → API → 刷新列表 3. **编辑**:打开弹窗 → 表单填充 → 表单验证 → API → 刷新列表 4. **删除**:确认弹窗 → API → 刷新列表 5. **状态切换**:API → 刷新列表 --- ## 代码架构建议 ### 当前优点 1. 清晰的分层结构(页面 → Hook → API → Client) 2. 类型安全(完整的 TypeScript 类型定义) 3. 权限管理系统 4. 可复用的 CRUD 模式 5. 自动 Token 刷新机制 ### 需要关注的方面 1. **页面文件大小**:UserLevelConfigs.tsx 和 SystemConfigs.tsx 都接近 300 行,可以考虑拆分 2. **组件复用**:考虑提取通用的 CRUD 表格组件 3. **错误处理**:某些 API 调用的错误处理需要完善 4. **加载状态**:分页加载、动作加载等状态管理可以统一 --- ## 开发指南 ### 添加新的配置管理页面 **步骤**: 1. **创建类型定义** (`src/types/xxxConfig.ts`) ```typescript export interface XxxConfig { id: number; name: string; value: string; status: number; created_at: string; updated_at: string; } export interface XxxConfigListRequest { page?: number; size?: number; } export interface XxxConfigListResponse { data: XxxConfig[]; total: number; } ``` 2. **创建 API 服务** (`src/services/xxxConfigApi.ts`) ```typescript export const getXxxConfigList = async (params) => (await apiClient.get('/admin/xxx-configs', { params })).data; export const createXxxConfig = async (data) => (await apiClient.post('/admin/xxx-configs', data)).data; // ... 其他 CRUD 操作 ``` 3. **创建页面组件** (`src/pages/XxxConfigs.tsx`) - 参考 UserLevelConfigs.tsx 或 SystemConfigs.tsx 的结构 - 实现列表、创建、编辑、删除、状态切换 4. **添加路由** (`src/App.tsx`) ```typescript } /> ``` 5. **添加菜单项** (`src/components/DynamicMenu.tsx`) ```typescript { key: 'system-xxx-configs', label: 'Xxx 配置', icon: , path: '/xxx-configs', } ``` --- ## 总结 这是一个**结构良好的 React 管理后台**,具有: - 权限驱动的动态菜单和路由 - 清晰的分层 API 架构 - 完整的 TypeScript 类型支持 - 通用的 CRUD 页面模式 - 自动化的 Token 管理 最近的开发方向是**添加系统配置管理功能**(SystemConfigs 和 UserLevelConfigs),这些都是遵循统一的模式和最佳实践。