nex_docus/docs/code-structure-audit-2026-0...

221 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 代码结构审计与优化记录2026-04-08
本文依据 [`docs/code-structure-standards.md`](./code-structure-standards.md) 对当前仓库进行前后端结构审计,并记录本轮已落地的优化项。
## 1. 审计范围
- 后端:`backend/app/api/v1`、`backend/app/services`
- 前端:`frontend/src/pages`、`frontend/src/utils`、`frontend/src/components`
## 2. 主要结构问题
### 2.1 后端 Router 过厚
以下问题在多个 router 中重复出现:
- 项目存在性校验
- 读权限/写权限/成员角色判断
- 项目文档数量统计
- 公开项目与私密项目访问分支
受影响较明显的文件:
- `backend/app/api/v1/projects.py`
- `backend/app/api/v1/files.py`
- `backend/app/api/v1/preview.py`
- `backend/app/api/v1/search.py`
- `backend/app/api/v1/git_repos.py`
这类问题违反了“Router 只做协议转换”和“副作用与规则应收口”的要求,导致:
- 权限规则难以统一演进
- 同一类修改影响多个入口
- 新增接口时容易复制旧逻辑继续膨胀
### 2.2 前端文档页承担过多页面级编排
`frontend/src/pages/Document/DocumentPage.jsx` 在审计前同时承担了:
- 文件树加载
- URL deep link 同步
- 搜索与节点展开
- Markdown 文件加载
- PDF URL 组装
- Markdown 内链解析
- TOC 生成
- 页面展示渲染
这已经明显超过“页面入口必须薄”的建议范围,属于页面入口和页面编排层混杂。
### 2.3 前端认证存储边界分散
`access_token` 与登录态清理逻辑分散在:
- `request.js`
- `ProtectedRoute.jsx`
- `userStore.js`
- 多个页面文件
这违背了“前端基础设施应收口”的要求,也增加了未来切换 token 策略时的修改面。
## 3. 本轮已落地优化
### 3.1 后端新增项目域服务
新增:
- `backend/app/services/project_service.py`
收口能力:
- 项目存在性查询
- 项目成员查询
- 项目角色解析
- 项目读权限校验
- 项目角色权限校验
- 项目写权限校验
- 项目文档数量统计
- 项目序列化补充 `doc_count`
### 3.2 后端 Router 瘦身
已切换到项目域服务的文件:
- `backend/app/api/v1/projects.py`
- `backend/app/api/v1/files.py`
- `backend/app/api/v1/preview.py`
- `backend/app/api/v1/search.py`
- `backend/app/api/v1/git_repos.py`
效果:
- 权限判断不再散落在每个 handler 内
- `projects.py` 的列表序列化不再自己统计文档数
- `preview.py` 的公开/私密访问逻辑集中复用
- `files.py` 的读写权限边界更明确
### 3.3 前端抽离文档页编排层
新增:
- `frontend/src/pages/Document/useDocumentBrowser.js`
- `frontend/src/pages/Document/documentBrowserUtils.jsx`
抽离后的职责:
- 文件树加载与状态维护
- URL 参数驱动的文档打开
- Markdown/PDF 切换
- 搜索与节点展开
- TOC 生成
- Markdown 内链解析
`frontend/src/pages/Document/DocumentPage.jsx` 现在主要保留:
- 页面布局
- Git 操作 UI
- 分享设置 UI
- Markdown 渲染输出
### 3.4 前端认证存储收口
新增:
- `frontend/src/utils/authStorage.js`
已接入:
- `frontend/src/utils/request.js`
- `frontend/src/components/ProtectedRoute.jsx`
- `frontend/src/stores/userStore.js`
- `frontend/src/pages/Preview/PreviewPage.jsx`
- `frontend/src/pages/Document/DocumentPage.jsx`
### 3.5 继续下沉编辑页与浏览器副作用
新增:
- `frontend/src/pages/Document/useDocumentEditorWorkspace.js`
- `frontend/src/utils/browserIO.js`
- `frontend/src/pages/ProjectList/useProjectExport.js`
- `frontend/src/pages/ProjectList/useProjectShare.js`
- `frontend/src/pages/ProjectList/useProjectCollaboration.js`
- `frontend/src/pages/ProjectList/useProjectGitRepos.js`
本轮继续优化后:
- `DocumentEditor.jsx` 中的树加载、URL 同步、文件打开、刷新流程已下沉到工作区 hook
- 项目导出、文件名解析、复制链接等浏览器能力已从页面中抽出为通用工具
- `ProjectList.jsx``DocumentPage.jsx` 不再自己维护复制降级实现
- `ProjectList.jsx` 中的导出轮询、分享设置、成员协作、Git 仓库管理已各自收口为稳定子流程
### 3.6 补齐后端文件用例与预览页编排层
新增:
- `backend/app/services/project_export_service.py`
- `backend/app/services/project_file_service.py`
- `frontend/src/pages/Preview/usePreviewBrowser.js`
- `frontend/src/pages/Preview/previewBrowserUtils.js`
本轮继续优化后:
- `projects.py` 中的导出任务状态管理、过期清理与 ZIP 打包流程已下沉到独立导出服务
- `files.py` 的保存、创建、删除、重命名、移动流程已通过项目文件服务统一编排
- `backend/app/mcp/server.py` 不再复制文件写入后的索引、日志、通知逻辑,改为复用同一文件用例服务
- `PreviewPage.jsx` 中的密码校验、目录树加载、文档切换、搜索、TOC 与 PDF/Markdown 模式切换已下沉到页面级 hook
## 4. 验证结果
已执行:
1. `python3 -m py_compile backend/app/services/project_service.py backend/app/api/v1/projects.py backend/app/api/v1/files.py backend/app/api/v1/preview.py backend/app/api/v1/search.py backend/app/api/v1/git_repos.py`
2. `npm run build`(在 `frontend/` 下)
结果:
- 后端语法校验通过
- 前端生产构建通过
- 仍存在 Vite 默认的大包告警,属于性能优化项,不影响本轮结构改造正确性
## 5. 剩余建议
以下问题已在审计中确认,但未在本轮一并处理,以控制风险:
### 5.1 前端仍有超大页面待继续下沉
重点文件:
- `frontend/src/pages/Document/DocumentEditor.jsx`
- `frontend/src/pages/ProjectList/ProjectList.jsx`
- `frontend/src/pages/Preview/PreviewPage.jsx` 已完成一轮下沉,但页面内仍保留部分响应式布局与渲染分支,可后续继续压薄
建议方向:
- 将上传/导出/重命名/移动等流程拆为页面级 controller 或 hook
- 将下载、文件名解析、Blob 导出等浏览器副作用进一步沉到可复用基础模块
### 5.2 前端构建产物体积偏大
构建结果中仍存在明显的大 chunk 警告,建议后续评估:
- 文档页与编辑页按路由拆包
- PDF/Markdown 编辑器相关库延迟加载
- 搜索与预览相关能力按场景拆分
### 5.3 后端入口层仍有剩余热点
虽然项目导出和文件编排已下沉,但以下热点仍值得继续优化:
- `backend/app/api/v1/projects.py` 仍包含较多成员管理与分享配置流程,可继续按主题拆出更明确的 use case
- `backend/app/api/v1/files.py` 仍承载上传、导入、导出等多类文件主题,后续可继续按“编辑文件 / 传输文件 / 读取文档”拆分
## 6. 结论
本轮优化重点完成了两件事:
1. 后端将重复的项目访问规则从 router 中收口到项目域服务
2. 前端将文档浏览页的页面级编排从页面入口中拆出,并统一认证存储边界
这两项改动都直接对应结构规范中的高优先级问题,属于低风险、可验证、后续可继续扩展的结构优化。