Files
atlas-seller-kit/docs/architecture/project-structure.md

131 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目结构与运行边界
> 状态:初始化骨架已创建并完成版本基线锁定。本文描述仓库的代码归属、构建关系和本地运行边界;业务规则仍以项目交接、API 契约和数据模型文档为准。
## 1. 目录结构
```text
atlas-seller-kit/
├── apps/ # 可独立启动、构建和部署的入口
│ ├── web/ # React + Vite 卖家工作台
│ ├── api/ # NestJS:HTTP、鉴权、事务与任务创建
│ ├── worker/ # BullMQ:Outbox 投递、媒体、AI、同步、发布
│ └── extension/ # WXT 浏览器采集扩展
├── packages/ # 跨应用的稳定复用单元
│ ├── contracts/ # Zod 契约、DTO、共享类型
│ └── database/ # SQL migrations、迁移/应用连接基础设施
├── infra/
│ ├── compose.yaml # local PostgreSQL、Redis、MinIO
│ └── README.md # 本地基础设施启动说明
├── docs/ # 产品、架构、API 与评审记录
├── package.json # 根命令、Node/pnpm 版本约束
├── .nvmrc # 本地 Node 24 LTS 版本
├── pnpm-workspace.yaml # workspace 边界
├── turbo.json # 构建、检查、测试任务图
└── tsconfig.base.json # 最小共享 TypeScript 编译约定
```
`apps` 只能依赖明确的 `packages`,不能横向导入另一个应用的源码。这样 API、Worker 和扩展即使独立部署,也始终共享同一份契约。反过来,`packages` 不得依赖任何 `apps`。
## 2. 代码与服务关系图
```mermaid
flowchart TB
subgraph Repository[Atlas Seller Kit · pnpm workspace]
subgraph Applications[apps:部署与运行入口]
WEB[web\nReact / Vite]
API[api\nNestJS HTTP API]
WORKER[worker\nBullMQ processors]
EXT[extension\nWXT Collector]
end
subgraph Shared[packages:跨应用稳定边界]
CONTRACTS[contracts\nZod · DTO · payload types]
DB[database\nSQL migrations · DB access]
end
subgraph LocalInfra[infra/compose.yaml:本地依赖]
PG[(PostgreSQL)]
REDIS[(Redis)]
MINIO[(MinIO)]
end
end
WEB -->|HTTPS /api| API
EXT -->|Bearer API request| API
API --> CONTRACTS
EXT --> CONTRACTS
API --> DB
WORKER --> DB
API -->|transactional outbox| PG
API --> REDIS
WORKER -->|consume / retry| REDIS
WORKER --> PG
WORKER --> MINIO
```
## 3. 运行时责任与数据流
```mermaid
sequenceDiagram
participant U as 用户
participant E as 浏览器扩展
participant W as Web
participant A as API
participant P as PostgreSQL
participant R as Redis / BullMQ
participant K as Worker
participant O as MinIO / Kodo
U->>E: 在来源商品页采集
E->>A: 共享契约校验后的采集载荷
A->>P: 同一事务写业务记录、operation、outbox event
A-->>E: 采集记录 / 编辑入口
K->>P: Dispatcher 领取未投递 outbox event
K->>R: 投递或消费可重试任务
K->>O: 下载、处理、转存素材
K->>P: 保存任务状态、结果与错误
U->>W: 查看进度、编辑、发布
W->>A: 鉴权后的 HTTP 请求
A->>P: SET LOCAL app.workspace_id 后读写
```
业务事实、审计、操作状态和 Outbox 只在 PostgreSQL 持久化;Redis/BullMQ 负责排队、限流和重试,不能成为唯一事实来源。local 使用 MinIO,staging/production 使用隔离的七牛 Kodo Bucket。
## 4. 依赖规则
| 位置 | 可以依赖 | 不应依赖 |
|---|---|---|
| `apps/web` | `packages/contracts`、前端库 | API/Worker 源码、数据库直连 |
| `apps/api` | `packages/contracts`、`packages/database` | Web/扩展源码 |
| `apps/worker` | `packages/contracts`、`packages/database` | Web/扩展源码、浏览器会话 |
| `apps/extension` | `packages/contracts` | API 内部模块、ERP localStorage token |
| `packages/contracts` | Zod 等无运行环境依赖库 | NestJS、React、数据库驱动 |
| `packages/database` | PostgreSQL 驱动、迁移工具 | HTTP/UI/平台适配逻辑 |
当前只抽取了已经确认会跨端复用的采集契约和数据库边界。认证、商品、定价或 Ozon 适配器尚不单独建共享包,等首个纵向闭环出现稳定复用关系后再提取,避免过早形成空壳“公共库”。
## 5. 本地开发入口
运行时基线:Node 24.20.0(见 `.nvmrc`)、pnpm 11.25.0、Web `8100`、API `8200`、扩展 dev server `8110`(仅本地开发用)。Worker 是队列消费者,不对浏览器提供 HTTP 服务,因此没有端口号。
```bash
cp .env.example .env
pnpm install
pnpm infra:up # PostgreSQL 18.6、Redis 7.4、MinIO
pnpm dev # Web、API、Worker、Extension 并行 watch
```
常用验证命令:`pnpm build`、`pnpm typecheck`、`pnpm format:check`。首次实现数据库迁移执行器时,必须将 `atlas_migrator` 和 `atlas_app_login` 的连接串分开配置,并在集成测试中验证 RLS 隔离。
本地 Docker 镜像使用明确标签而非 `latest`;完整依赖版本表见 [技术与部署方案](./technology-and-deployment.md)。
## 6. 接下来的实现顺序
1. 在 `packages/database` 实现只接受 migrator 连接串的可重复 SQL migration runner,并导入已评审的 `001_foundation.sql`、`002_product-domain.sql`。
2. 在 API 建立配置校验、认证、工作空间上下文和事务包装器;任何工作空间查询前固定 `SET LOCAL app.workspace_id`。
3. 建立 `operations`、幂等请求和 Outbox Dispatcher 的第一个集成测试闭环。
4. 再实现平台/门店、素材上传和 Web 对应页面;扩展仅在 API 采集入口稳定后接入实际解析器。
相关约束见:[技术与部署方案](./technology-and-deployment.md)、[数据库安全](./database-security.md)、[Outbox 与幂等](./transactional-outbox-and-idempotency.md)、[项目交接](../project/HANDOFF.md)。