# order_site

订单自动兑换与履约管理系统。

项目采用前后端分离架构，主要用于接收订单、匹配履约规则、生成领取链接、管理库存、执行自动/半自动兑换，并提供后台页面处理人工复核、平台配置和任务追踪。

## 技术栈

- 前端：Vue 3、Vite、Element Plus、TypeScript
- 后端：Node.js、Express、PostgreSQL、Playwright
- OCR：独立 Python worker
- 网关：Caddy
- 本地与生产运行：Docker Compose

## 目录结构

```text
apps/
  backend/                  后端 API、任务编排、平台对接、数据库迁移
    src/
    data/                   本地开发运行数据和平台配置
    subservices/ocr-worker/ OCR 子服务源码
  frontend/                 前端后台、领取页和配置页面
deploy/
  caddy/                    Caddy 反向代理配置
  docker/                   前后端与 OCR 镜像 Dockerfile
docs/                       平台接口、迁移设计和部署资料
docker-compose.dev.yml      本地 Docker 开发环境
docker-compose.yml          生产/服务器 Compose
```

## 本地开发

推荐直接使用 Docker，本地不需要额外维护 Node、PostgreSQL、Playwright 浏览器和 OCR 运行环境。

```bash
cp .env.mac-docker.example .env
docker compose -f docker-compose.dev.yml up -d --build
```

启动后常用入口：

- 前端、后台、领取页：`http://localhost`
- 后端健康检查：`http://localhost/health`
- 后端 API 前缀：`http://localhost/api/v1/...`
- OCR worker：`http://127.0.0.1:8100/health`
- noVNC 浏览器画面：`http://127.0.0.1:6080/vnc.html`

查看容器状态：

```bash
docker compose -f docker-compose.dev.yml ps
```

查看日志：

```bash
docker compose -f docker-compose.dev.yml logs -f backend
docker compose -f docker-compose.dev.yml logs -f frontend
docker compose -f docker-compose.dev.yml logs -f ocr-worker
```

停止环境：

```bash
docker compose -f docker-compose.dev.yml down
```

## 开发验证

本项目以容器内验证为准。

```bash
docker compose -f docker-compose.dev.yml exec -T backend npm test
docker compose -f docker-compose.dev.yml exec -T backend npm run typecheck
docker compose -f docker-compose.dev.yml exec -T backend npm run build
docker compose -f docker-compose.dev.yml exec -T frontend npm run typecheck
docker compose -f docker-compose.dev.yml exec -T frontend npm run lint
```

前端生产构建：

```bash
docker compose -f docker-compose.dev.yml exec -T frontend npm run build
```

后端数据库迁移通常会在启动时自动执行；需要手动执行时：

```bash
docker compose -f docker-compose.dev.yml exec -T backend npm run db:migrate
```

## 热更新

开发版 Compose 会把源码挂载进容器：

- 修改 `apps/backend/src`：后端容器内 `tsx watch` 自动重启
- 修改 `apps/frontend/src`：Vite 自动 HMR
- 修改 `apps/backend/subservices/ocr-worker`：下次 OCR 调用会使用挂载后的代码
- 修改数据库 migration：重启后端会自动执行迁移

如果只改业务代码，一般不需要重新 `--build`。改 Dockerfile、系统依赖或基础镜像时再重新构建。

## 环境变量

本地开发从根目录 `.env` 读取，模板为：

```bash
cp .env.mac-docker.example .env
```

生产部署从 `.env.server.example` 复制：

```bash
cp .env.server.example .env
```

常用变量：

- `APP_BASE_URL`：应用公网地址，用于推导领取链接
- `CLAIM_BASE_URL`：领取页地址，优先级高于 `APP_BASE_URL`
- `ADMIN_SESSION_SECRET`：后台登录态签名密钥
- `ADMIN_DEFAULT_USERS_JSON`：默认后台用户
- `DATABASE_URL`：PostgreSQL 连接串
- `TENCENT_BROWSER_HEADLESS`：Playwright 是否无头运行
- `TENCENT_BROWSER_PREWARM`：启动时是否预热浏览器
- `OCR_BASE_URL`：OCR worker 地址

## 运行数据

本地开发数据：

- 后端配置与运行产物：`apps/backend/data`
- PostgreSQL 数据：Docker volume `postgres_dev_data`
- 后端日志：`apps/backend/data/logs`
- 浏览器会话：`apps/backend/data/browser-sessions`
- 兑换截图：`apps/backend/data/redeem-screenshots`

生产部署数据：

- 后端数据挂载到 `deploy/data/backend`
- PostgreSQL 数据保存在 Docker volume `postgres_data`
- Caddy 数据保存在 Docker volume `caddy_data`

注意：`apps/backend/data/*.json` 中可能包含账号、Cookie、token、平台配置等敏感信息。提交代码前请确认没有把真实生产凭据提交到仓库。

## 生产部署

在服务器上准备 `.env` 后启动：

```bash
cp .env.server.example .env
mkdir -p deploy/data/backend
docker compose up -d --build
```

生产入口：

- 前端与领取页：`https://你的域名/`
- 后端健康检查：`https://你的域名/health`
- 后端 API：`https://你的域名/api/v1/...`

生产 Compose 会自动：

- 启动 PostgreSQL
- 启动 OCR worker
- 启动后端并执行 migration
- 初始化默认后台管理员
- 同步履约目录
- 通过 Caddy 暴露前端和 API

查看生产日志：

```bash
docker compose logs -f backend
docker compose logs -f web
```

## 开发数据脚本

后端提供开发数据脚本：

```bash
docker compose -f docker-compose.dev.yml exec -T backend npm run seed:dev-data
docker compose -f docker-compose.dev.yml exec -T backend npm run cleanup:dev-data
```

脚本默认有预览/确认语义，执行前注意终端输出说明。

## 主要业务模块

- `apps/backend/src/routes`：API 路由
- `apps/backend/src/services/order`：订单、webhook、库存和履约匹配
- `apps/backend/src/services/fulfillment`：快手 Cloud 等履约编排
- `apps/backend/src/services/session`：腾讯登录、二维码、兑换和截图
- `apps/backend/src/services/admin`：后台读写、权限、配置管理
- `apps/backend/src/services/platforms`：外部平台 API 封装
- `apps/backend/src/repositories`：数据库访问
- `apps/frontend/src/views/admin`：后台页面
- `apps/frontend/src/views/claim`：用户领取页

## 排障

如果页面打不开：

```bash
docker compose -f docker-compose.dev.yml ps
docker compose -f docker-compose.dev.yml logs -f web
```

如果后端未 ready：

```bash
docker compose -f docker-compose.dev.yml logs -f backend
curl http://localhost/health/ready
```

如果浏览器兑换或扫码异常：

```bash
docker compose -f docker-compose.dev.yml logs -f backend
open http://127.0.0.1:6080/vnc.html
```

如果前端类型或 lint 失败：

```bash
docker compose -f docker-compose.dev.yml exec -T frontend npm run typecheck
docker compose -f docker-compose.dev.yml exec -T frontend npm run lint
```

如果后端单测失败：

```bash
docker compose -f docker-compose.dev.yml exec -T backend npm test
```

## 提交前检查清单

```bash
docker compose -f docker-compose.dev.yml exec -T backend npm test
docker compose -f docker-compose.dev.yml exec -T backend npm run typecheck
docker compose -f docker-compose.dev.yml exec -T frontend npm run typecheck
docker compose -f docker-compose.dev.yml exec -T frontend npm run lint
```

确认项：

- 没有提交真实账号、Cookie、token、手机号或生产配置
- `.env` 未被提交
- 数据库 migration 与代码一起提交
- 领取链接相关改动已在 Docker 环境验证
- 涉及 Playwright/OCR 的改动已看过 noVNC 或相关日志
