} onClick={() => setCreateOpen(true)}>
新建
{ setPage(p); setSize(s); }
}} />
{/* 弹窗 */}
);
}
```
---
## 常见错误和解决方案
### 问题 1:页面显示后没有数据
**原因**:API 端点不正确或权限不足
**解决**:
1. 检查 API 端点 URL
2. 检查用户权限
3. 查看浏览器控制台错误日志
### 问题 2:菜单项不显示
**原因**:权限检查失败
**解决**:
1. 检查 DynamicMenu.tsx 的权限逻辑
2. 验证用户权限是否包含该页面路径
3. 查看控制台的权限检查日志(带 🔍 标记)
### 问题 3:创建/编辑后页面没有刷新
**原因**:未调用 fetchList()
**解决**:
1. 确保在 submitCreate/submitEdit 中调用 fetchList()
2. 检查是否有错误导致代码未执行到刷新逻辑
### 问题 4:Token 过期导致 401 错误
**原因**:Token 已过期,ApiClient 应该自动处理
**解决**:
1. 检查 refreshToken 是否存在
2. 查看浏览器控制台的 token 刷新日志
3. 检查后端是否正确响应 token 刷新请求
---
## 性能优化建议
### 当前架构的瓶颈
1. **大型页面文件**
- UserLevelConfigs.tsx: 292 行
- SystemConfigs.tsx: 284 行
- 建议:拆分为表格、表单、操作等子组件
2. **重复的 CRUD 代码**
- 每个管理页面都有类似的列表、创建、编辑、删除逻辑
- 建议:提取通用的 CRUD Hook 或高阶组件
3. **API 响应处理不一致**
- userLevelConfigApi 返回 response.data
- systemConfigApi 返回 response
- 建议:统一响应处理方式
---
## 开发工作流
### 开发新功能的标准步骤
```
1. 分析需求,确定数据模型
↓
2. 创建 TypeScript 类型定义 (src/types/)
↓
3. 创建 API 服务函数 (src/services/)
↓
4. 创建页面组件 (src/pages/)
↓
5. 注册路由 (src/App.tsx)
↓
6. 添加菜单项 (src/components/DynamicMenu.tsx)
↓
7. 更新子导航(如需要) (src/components/Layout.tsx)
↓
8. 本地测试
↓
9. 提交代码
```
---
## 有用的命令
```bash
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 代码检查
npm run lint
# 预览生产构建
npm run preview
```
---
## 文档链接
- **项目架构概览**:PROJECT_ARCHITECTURE.md
- **API 模式详解**:API_PATTERNS.md
- **Ant Design 文档**:https://ant.design/
- **React Router 文档**:https://reactrouter.com/
- **Jotai 文档**:https://jotai.org/
---
## 常用类名和常量
### 用户等级配置
- 页面:`/system/user-level-configs`
- 菜单 key:`system-user-level-configs`
- 类型文件:`userLevelConfig.ts`
- API 服务:`userLevelConfigApi.ts`
### 系统配置
- 页面:`/system/system-configs`
- 菜单 key:`system-system-configs` 或 `system-global-configs`
- 类型文件:`systemConfig.ts`
- API 服务:`systemConfigApi.ts`
---
## 快速检查清单
创建新页面前,检查:
- [ ] 后端 API 已实现
- [ ] 类型定义完整
- [ ] API 服务函数齐全(CRUD 所有操作)
- [ ] 页面组件遵循 CRUD 模式
- [ ] 路由已注册
- [ ] 菜单项已添加
- [ ] 权限检查已配置(如需要)
- [ ] 表单验证规则完整
- [ ] 错误处理到位
- [ ] 加载状态反馈清晰