You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
4.0 KiB

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.

# 邮件自动预报系统
Next.js 15 + Prisma + MySQL 8 + Ant Design 5 + Worker(IMAP 轮询)。
## 快速开始
```bash
# Windows 一键(推荐 local,不拉 node 镜像)
# .\docs\start-system.ps1
# 或 docs\start-system.cmd
# 全量 compose(需 Docker Hub):.\docs\start-system.ps1 -Mode compose
# 1. 依赖
pnpm install
# 2. 环境
cp .env.example .env
# 本地默认 MySQL 映射 7023(避免与宿主机 3306 冲突)
# DATABASE_URL=mysql://app:app@localhost:7023/email_forecast
# CC_MOCK=true # 无 CC 账号时开 mock
# 3. 数据库
docker compose up -d mysql
pnpm exec prisma db push
pnpm db:seed # 仅账号 admin/ops
# 4. Web + Worker(本地联调推荐;Worker 与系统一起起,才有自动拉取)
pnpm dev:stack
# 等价:pnpm dev 与 pnpm worker 同开
# http://localhost:3100 账号 admin/admin123 或 ops/ops123
# Windows 一键(mysql + web + worker):.\docs\start-system.ps1
# 4b. 仅 Web(不拉 IMAP)
pnpm dev
# 4c. 生产形态三件套(mysql + web + worker)
# 需已有 .env;首次会 db push + seed 账号(SEED_ON_START=true)
pnpm compose:up
pnpm compose:ps # 确认 web/worker/mysql 均为 running
# pnpm compose:logs
# 本机已用 pnpm dev 时,可只补 worker 容器:pnpm compose:up:core
# 5. IMAP 邮箱绑定(推荐:Web 设置页,无需改代码)
# Admin 登录 → 设置 → 新增绑定(填对方邮箱 + QQ 授权码)→ 测试连接
# 兼容回退:仍可在 .env 填 IMAP_USER / IMAP_PASS
pnpm imap:smoke # 仅连通(.env 回退)
pnpm imap:poll # 拉取一轮(优先 DB 绑定)
pnpm worker # 常驻轮询
# Admin 顶栏也可点「立即拉取」
```
## 架构
| 进程 | 职责 |
|---|---|
| `web` | UI + `/api/*` + ConfirmImport / SaveContainer + **设置/邮箱绑定** |
| `worker` | 仅 IMAP 拉取(读 `mailbox_account`)+ ParsePipeline + 超时回收 + 补偿 due + retention;**禁止**调 SaveContainer |
| `mysql` | 业务库 `email_forecast` |
> 本地只起 `pnpm dev` + mysql 时 **不会**自动拉信/回收。联调请用 `pnpm dev:stack`、`.\docs\start-system.ps1`,或 `docker compose up` 三件套。
## 邮件来源
列表数据仅来自 **IMAP 拉取**(设置页绑定邮箱)。开发种子 / 样例导入 / 旧 Demo 应用已移除。
## 路由
- `/login` `/mails` `/mails/[id]` `/mails/[id]/confirm` `/logs`(导入日志 / 拉取记录) `/settings`(Admin)
## 测试
```bash
pnpm test # vitest 单元/集成
pnpm test:e2e # playwright(需先起 dev)
# CC
pnpm cc:smoke # 跟随 .env(默认 mock 假成功,非 TEST 验收)
pnpm cc:smoke -- --mode=mock # 强制 mock
pnpm cc:smoke -- --mode=live # TEST 真烟雾:需 CC_MOCK=false + CC_USERNAME + 密码
pnpm retention:cleanup # 按 DATA_RETENTION_DAYS 清理(可加 --dry-run)
pnpm retention:cleanup -- --dry-run
```
### CC mock vs live(一期验收)
| 模式 | 条件 | 含义 |
|---|---|---|
| **mock** | 设置页 Mock 开,或 `.env CC_MOCK=true` | SaveContainer/冲突/船司走内存假数据;**不算** PRD TEST 烟雾 |
| **live** | 设置页关 Mock + 用户名/密码(或 `.env`) | 真打 `test.saas...`:`customerLogin` → 冲突/船司/`SaveContainer` |
配置入口:**设置 → CarrierCentral(CC)连接**(Admin)。DB 配置优先于 `.env`,保存后立即生效。
PDF《carriercentral 客户端通用接口》只定义路径与字段;**不能替代租户账号**。无 `customerLogin` token 无法 SaveContainer。
顶栏 / `GET /api/health` 会暴露 `cc_mode` / `cc_live_ready`,避免误把 mock 当验收。
## 文档
- **协作入口(给接手同事)**:`docs/邮箱项目.md`
- PRD:`docx/需求规格-邮件自动预报-v0.2.md`
- 技术设计:`docx/技术设计方案-邮件自动预报-v1.0.md`
- UI/UX:`docx/产品UI-UX设计方案-邮件自动预报-v1.0.md`
- 韧性:`docx/异常场景与系统韧性设计.md`
- 运营 SOP:`docx/运营SOP-邮件自动预报.md`