# SaaS 项目目录结构规范(第一版) 本文档定义新 SaaS 项目的目录结构和职责边界。 原则: - 新旧隔离 - 前后端隔离 - 业务层和框架层隔离 - 目录一旦定下,后续新增功能必须按结构落位 --- ## 1. 顶层结构建议 ```text 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. 模块新增规则 以后新增功能时,按这个顺序决定落点: 1. 是业务对象?放 `domain` 2. 是业务用例?放 `application` 3. 是接口定义?放 `ports` 4. 是外部实现?放 `adapters` 5. 是页面或交互?放 `apps/web` 6. 是 API 路由?放 `apps/api` 7. 是后台任务执行?放 `apps/worker` 8. 是部署与运行?放 `infra` --- ## 4. 禁止事项 - 禁止把旧桌面版目录结构照搬过来 - 禁止在 `web` / `api` 中直接写核心业务规则 - 禁止 `domain` 依赖数据库、Redis、OSS、框架 - 禁止 `shared` 成为大杂烩 - 禁止把临时脚本堆进项目根目录 --- ## 5. 当前阶段结论 新 SaaS 项目必须从第一天就按这个结构起步。 这样做的价值是: - 不会再回到单体混乱结构 - AI 工具更容易分工协作 - 后面扩功能、拆模块、加 worker 都更顺