|
|
# 邮件自动预报系统
|
|
|
|
|
|
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`
|