5.1 KiB
5.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
订单自动兑换系统 (Order Auto-Redemption System). 接收电商平台的 webhook 订单,通过 Playwright 浏览器自动化完成腾讯/QQ 等平台的兑换码兑换,生成用户领取链接。
Architecture
Monorepo: apps/backend + apps/frontend + deploy/
Backend (apps/backend/)
- Stack: Node.js (ESM), Express 5, PostgreSQL (pg), Playwright 1.42.1, Python OCR worker (ddddocr)
- Entry:
src/index.js— Express app bootstrap with health checks and graceful shutdown - Layering:
routes/→services/→repositories/→db/client.js(pg Pool singleton) - Config:
config/default.cjsas base,.envoverrides parsed insrc/config/runtime.js. No dotenv library — custom env file parser. - DB migrations:
src/db/migrations/— SQL files run automatically on startup viasrc/db/migrate.js(tracks applied migrations inschema_migrationstable) - Types: Gradual TypeScript migration in progress.
tsconfig.jsonwithallowJs: true, checkJs: false, strict: false— JSDoc type annotations on selected files, types defined insrc/types/ - Test runner: Node.js built-in
node --test
Key service domains:
services/session/— Playwright browser session management (login, redeem, screenshots), the core automation engineservices/claim/— Claim token generation and user-facing claim page APIservices/admin/— Admin panel CRUD (split into read/write helpers, auth, dashboard, etc.)services/order/— Webhook processing, order/inventory management, Agiso platform integrationservices/platforms/— Third-party platform adapters (currently Agiso for 闲鱼/Xianyu)subservices/ocr-worker/— Python (uv) microservice for CAPTCHA OCR, invoked via subprocess
Runtime data (data/ dir, mounted in Docker dev): logs, browser session artifacts, screenshots, order-fulfillment-bindings.json
Frontend (apps/frontend/)
- Stack: Vue 3, Vite 8, Element Plus, vue-router (hash mode), TypeScript
- Routes:
/tx/browser(browser session control),/claim/:token(user claim page),/admin/*(admin panel with role-based guards) - Auto-imports:
unplugin-auto-import+unplugin-vue-componentsfor Element Plus
Deployment (deploy/)
- Docker Compose:
docker-compose.yml(production),docker-compose.dev.yml(hot-reload dev) - Caddy reverse proxy:
/api/v1/*→ backend,/*→ frontend - Production Dockerfiles use Chinese mirrors (Tencent Cloud) for apt/npm/pip
Common Commands
Local Development (without Docker)
# Backend
cp .env.development.example .env
cd apps/backend
npm install
npm run dev # node --watch restart on src/ changes
# Frontend
cd apps/frontend
npm install
npm run dev # Vite dev server
# OCR worker (Python)
cd apps/backend/subservices/ocr-worker
uv sync
Docker Development (recommended)
cp .env.development.example .env
docker compose -f docker-compose.dev.yml up -d --build
# Access: http://localhost, noVNC: http://localhost:6080/vnc.html
Testing
# Run all backend tests
cd apps/backend && npm test
# Run a single test file
cd apps/backend && node --test src/services/session/session-redeem.test.js
# Run tests matching a pattern
cd apps/backend && node --test --test-name-pattern="redeem"
Type Checking
cd apps/backend && npm run typecheck # tsc --noEmit (selected files)
cd apps/frontend && npm run typecheck # vue-tsc --noEmit
Database
cd apps/backend && npm run db:migrate # Run migrations manually
cd apps/backend && npm run seed:dev-data # Seed dev data
cd apps/backend && npm run cleanup:dev-data # Clean dev data
Browser (Playwright)
cd apps/backend && npm run browser:install # macOS
cd apps/backend && npm run browser:install:linux # Linux (with deps)
API Routes
All backend routes are prefixed with /api/v1/:
/api/v1/tencent/browser/*— Browser session CRUD and control/api/v1/webhooks/agiso/*— Agiso platform webhook receiver/api/v1/claim/*— Claim token validation and redemption/api/v1/admin/*— Admin panel API (auth, orders, tasks, inventory, etc.)
Health checks (no prefix): /health, /health/live, /health/ready
Important Conventions
- Backend uses ESM throughout (
"type": "module") — always use.jsextensions in imports - Express route handlers use
buildSuccessPayload/sendRouteErrorfromsrc/utils/http.jsfor consistent response format - Database queries go through
src/db/client.js(query()/withTransaction()) — no raw pool usage in services - Runtime config is accessed via
runtimeConfigfromsrc/config/runtime.js— never read.envdirectly outside that module - Admin routes are split into separate files under
src/routes/admin/with shared middleware inshared.js - Frontend uses hash-based routing (
createWebHashHistory) — claim links include/#/claim/:token - Playwright version is pinned at
1.42.1— do not upgrade without testing browser automation flows