# 💡 Summary
# 🧩 Cues
# 🪞Notes
## 项目介绍
我已浏览了仓库结构。下面用 Ant Design Pro + Umi Max 的视角,帮你快速理解每个目录的职责与常见开发流。
概览
- 这是一个基于 Umi Max 的后台运营系统(解忧杂货铺),采用“页面路由 + 领域服务 + 组件复用”的典型前端工程化结构。
```Java
- 路由集中配置在 `config/routes.ts:1`,
- src:业务源码(见下节)
- 页面放在 src/pages,
- 接口在 src/services,
- 公共组件在 src/components。
- config:Umi 配置与路由、代理等
- config/config.ts:1 项目主配置(主题、国际化、request、构建策略等)
- config/routes.ts:1 路由映射,直连 src/pages 下的页面组件
- config/proxy.ts:1 按环境代理后端 API
- public:静态资源与启动占位脚本,如 public/scripts/loading.js:1
- mock:本地开发的 API Mock,配合 Umi dev 使用
- dist:构建产物(构建后生成)
- tests:Jest 相关测试与初始化,如 tests/setupTests.jsx:1
- types:全局/共享 TS 类型定义与缓存,如 types/index.d.ts:1
- 工程与规范
- 代码风格与格式化:biome.json:1、.editorconfig:1
- 提交规范与钩子:.commitlintrc.js:1、.husky、.lintstagedrc:1
- 部署:.vercel/project.json:1
- 脚本与依赖:package.json:1
```
顶层目录
src 目录
- src/pages:页面路由对应的页面与子模块
- 示例:src/pages/Welcome.tsx:1、src/pages/User/Login/index.tsx:1
- 业务模块:如 route-management、poi-management、notes、evals、system-observation、crawl-task 等
- src/services:按领域划分的 API 请求与类型
- 例:src/services/route-management/index.ts:1 聚合导出;各子模块拆分 dashboard.ts、list.ts、label.ts、public-route.ts 等
- src/components:可复用 UI 组件(Header、Footer、卡片等)
- src/hooks:自定义 Hook(如 useUrlQueryParams)
- src/utils:工具函数(如剪贴板、通用工具)
- src/locales:国际化文案(此项目主要为 zh-CN)
- 根级运行与权限
- src/app.tsx:1 Umi 运行时配置(布局、初始状态等)
- src/access.ts:1 权限控制(如 canAdmin)
- src/global.less:1、src/global.tsx:1 全局样式与全局逻辑
- PWA 相关:src/manifest.json:1、src/service-worker.js:1
路由与页面
- 路由集中定义于 config/routes.ts:1,每个 component 指向 src/pages 下的某个页面目录/文件。
- 多级菜单 → routes 嵌套路由,如内容模块、用户管理、评测模块等。
本地 Mock
- mock 下与业务相关的文件(如 route-audit.ts、public-route.ts)提供了本地开发时的接口数据,减少后端依赖。
运行与构建
- 开发启动:npm run start:dev(推荐使用 dev 环境)
- 生产预览:npm run preview
- 构建产物:npm run build(输出到 dist)
- 代码检查:npm run lint,测试:npm test
建议的开发流程
- 新增页面:在 src/pages/<模块>/<子模块> 创建页面组件,并在 config/routes.ts:1 注册路由。
- 调用接口:在 src/services/<领域> 下新增 api.ts/types.ts 或补充到现有模块;页面中用 @umijs/max 的 request 或 hooks 调用。
- 复用组件:抽取到 src/components,按需在页面引用。
- 文案与样式:文案放 src/locales/zh-CN,样式放页面同目录的 index.less 或全局样式中。
需要我按某个业务模块(如 route-management 或 evals)更细地画一张“页面—服务—路由”的关系图吗?
## 模块移动
> 必做
- 调整路由层级:把根级的抓取管理路由块移入“内容模块”下
- 在 config/routes.ts:1,于 path: '/content-module' 的 routes 中新增:
- name: 'crawl-management'
- path: '/content-module/crawl-management'
- 子路由:
- path: '/content-module/crawl-management' → redirect: '/content-module/crawl-management/list'
- name: 'list',path: '/content-module/crawl-management/list',component: './crawl-task/list'
- 删除原根级的抓取管理块(config/routes.ts:226 起),避免重复菜单(见“可选”保留兼容跳转)。
- 文案键确认:你给的键已存在于 src/locales/zh-CN/menu.ts:1
- 'menu.content-module.crawl-management': '抓取管理'
- 'menu.content-module.crawl-management.list': '抓取任务'
代码引用更新
- 替换旧直链地址为新嵌套路由地址:
- src/pages/Notes/list/index.tsx:600 将 ${origin}/crawl-task/list?... 改为 ${origin}/content-module/crawl-management/list?...
- src/pages/crawl-task/list/index.tsx:712 面包屑 href: '/crawl-task' 改为 '/content-module/crawl-management'
可选(兼容与清理)
- 兼容跳转:在根级保留一个隐藏菜单的重定向,避免旧书签失效
- config/routes.ts:1 添加 { path: '/crawl-task', redirect: '/content-module/crawl-management', hideInMenu: true }
- 保持组件位置不变:页面仍用 component: './crawl-task/list',无需移动目录。
验证
- 重新启动或刷新开发服务后,确认“抓取管理/抓取任务”已出现在“内容模块”下,并能正常跳转。