b5a62ee9a3
- domain: User, Workspace, Project, AssetLibrary, Asset, IngestJob - ports: repository interfaces - application: use cases - adapters: in-memory - API: FastAPI 5 routes - worker: Celery ingest_asset - tests: 4 passing
3.5 KiB
3.5 KiB
SaaS 项目目录结构规范(第一版)
本文档定义新 SaaS 项目的目录结构和职责边界。
原则:
- 新旧隔离
- 前后端隔离
- 业务层和框架层隔离
- 目录一旦定下,后续新增功能必须按结构落位
1. 顶层结构建议
saas/
docs/
apps/
web/
api/
worker/
packages/
domain/
application/
ports/
adapters/
shared/
infra/
docker/
nginx/
scripts/
tests/
integration/
e2e/
2. 目录职责
2.1 docs/
存放所有正式文档:
- PRD
- 架构文档
- 数据模型
- API 规范
- 发布说明
- 运维说明
- 里程碑和范围文档
规则:
- 文档必须是单一真相源
- 先改文档,再改实现
2.2 apps/web/
前端 Web 应用。
职责:
- 页面
- 路由
- 组件
- 页面状态绑定
- 调用后端 API
禁止:
- 在这里写核心业务规则
- 在这里写任务执行逻辑
2.3 apps/api/
后端 API 应用。
职责:
- 提供 HTTP API
- 鉴权
- 请求校验
- 调用 Application Use Cases
禁止:
- 把业务规则直接写在路由层
- 直接耦合底层外部实现
2.4 apps/worker/
后台任务执行应用。
职责:
- 执行素材分类任务
- 执行视频生成任务
- 执行同步和诊断任务
原则:
- Worker 只执行任务,不处理 Web 交互
2.5 packages/domain/
核心业务对象和值对象。
职责:
- User
- Workspace
- Project
- Asset
- AssetLibrary
- GenerationTask
- GeneratedVideo
- 业务规则
禁止:
- import Web 框架
- import 数据库驱动
- import UI 工具
2.6 packages/application/
用例层。
职责:
- 创建项目
- 上传素材
- 分类素材
- 发起生成
- 查询进度
- 获取结果
原则:
- 编排业务流程
- 通过 ports 调外部能力
2.7 packages/ports/
接口定义层。
职责:
- 仓储接口
- 存储接口
- 队列接口
- 通知接口
- 日志接口
原则:
- 不依赖具体实现
2.8 packages/adapters/
外部实现层。
职责:
- PostgreSQL 实现
- Redis / Celery 实现
- OSS / S3 实现
- 鉴权实现
- 日志实现
2.9 packages/shared/
共享的通用工具和基础类型。
职责:
- 通用配置
- 错误类型
- 公共 schema
- 公共常量
规则:
- 只放真正跨层复用的通用内容
- 禁止把业务逻辑偷塞进 shared
2.10 infra/
基础设施目录。
职责:
- Docker
- Nginx
- 启动脚本
- 本地开发环境脚本
- 部署脚本
2.11 tests/
测试目录。
建议拆分:
integration/:前后端/数据库/队列联调测试e2e/:核心流程端到端测试
应用/包内部也可各自保留单元测试目录。
3. 模块新增规则
以后新增功能时,按这个顺序决定落点:
- 是业务对象?放
domain - 是业务用例?放
application - 是接口定义?放
ports - 是外部实现?放
adapters - 是页面或交互?放
apps/web - 是 API 路由?放
apps/api - 是后台任务执行?放
apps/worker - 是部署与运行?放
infra
4. 禁止事项
- 禁止把旧桌面版目录结构照搬过来
- 禁止在
web/api中直接写核心业务规则 - 禁止
domain依赖数据库、Redis、OSS、框架 - 禁止
shared成为大杂烩 - 禁止把临时脚本堆进项目根目录
5. 当前阶段结论
新 SaaS 项目必须从第一天就按这个结构起步。
这样做的价值是:
- 不会再回到单体混乱结构
- AI 工具更容易分工协作
- 后面扩功能、拆模块、加 worker 都更顺