当前仓库已有 frontend/ React 前端,并且前端已经按真实接口模式组织了服务层,默认通过 /api/v1 调用后端。backend/ 目录目前只有数据库设计文档,尚未存在可运行的服务端项目。因此需要先初始化一个可扩展的业务后端骨架,作为后续真实接口实现与前后端联调的基础。
本次确认后的技术栈采用 NestJS,初始化目标不是只生成一个空工程,而是生成可直接承接认证、顾客、模板、模拟任务等业务域的标准服务端骨架。
backend/ 下初始化一个基于 NestJS 的服务端项目。/api/v1,与前端现有请求方式保持一致。{ ok, data, error }。Prisma + MySQL + Redis 的工程接入能力。auth、customers、templates、simulations、health。初始化后的目标结构如下:
backend/
src/
main.ts
app.module.ts
common/
dto/
filters/
interceptors/
response/
constants/
config/
app.config.ts
env.schema.ts
prisma/
prisma.module.ts
prisma.service.ts
redis/
redis.module.ts
redis.service.ts
modules/
health/
auth/
customers/
templates/
simulations/
prisma/
schema.prisma
test/
.env.example
package.json
tsconfig.json
nest-cli.json
README.md
说明:
common/ 放全局共享能力,不放业务逻辑。modules/ 下每个域独立包含 controller、service、dto、module。prisma/ 独立为基础设施模块,后续供各业务模块注入。redis/ 作为异步任务、轮询状态、会话扩展的预留基础设施。main.ts 负责:
/api/v1。ValidationPipe。使用 @nestjs/config 管理环境变量,并在启动阶段对变量做 schema 校验。首批环境变量包括:
PORTAPP_BASE_URLDATABASE_URLREDIS_URLJWT_SECRETJWT_EXPIRES_INCORS_ORIGINNODE_ENV提供 .env.example,保证本地初始化后即可复制为 .env 使用。
所有成功响应使用统一结构:
{
"ok": true,
"data": {},
"error": null
}
所有失败响应使用统一结构:
{
"ok": false,
"data": null,
"error": {
"code": "ERROR_CODE",
"message": "错误说明"
}
}
这与前端 frontend/src/services/http/client.ts 中的解析方式保持一致。
使用 Prisma 作为 ORM,数据库为 MySQL。初始化阶段完成:
schema.prisma 创建。PrismaService 封装。首批模型以现有 数据库设计.md 为依据,优先覆盖:
hairstylist_usercustomer_treatment_recordai_hair_simulationai_hair_simulation_taskhair_templatehair_template_make_task初始化阶段先把模型映射落地到 Prisma schema,为后续真实实现做准备。
初始化阶段接入 Redis 模块,但不强制马上引入队列框架。当前只要求:
是否后续引入 BullMQ,不在本轮初始化中决定。
目标:
接口:
GET /api/v1/health返回:
目标:
首批接口:
POST /api/v1/auth/stylist/loginPOST /api/v1/auth/logout约束:
token、tokenName、stylistId、name、email。tokenName 默认与前端一致,使用 Authorization。目标:
首批接口:
GET /api/v1/customersGET /api/v1/customers/:idPOST /api/v1/customersPATCH /api/v1/customers/:idGET /api/v1/customers/:id/recordsPOST /api/v1/customers/:id/remindersGET /api/v1/stylist/dashboard/customer-summary初始化阶段要求:
目标:
首批接口:
GET /api/v1/templatesGET /api/v1/templates/:idPOST /api/v1/templatesPATCH /api/v1/templates/:idDELETE /api/v1/templates/:idPOST /api/v1/templates/bulk-deletePOST /api/v1/templates/generation-jobsGET /api/v1/templates/generation-jobs/:idPOST /api/v1/templates/generate-and-saveGET /api/v1/templates/:id/resultsGET /api/v1/templates/:id/statsGET /api/v1/stylist/dashboard/template-summary初始化阶段要求:
目标:
首批接口:
POST /api/v1/simulationsGET /api/v1/simulations/:idGET /api/v1/simulations/:id/resultsPOST /api/v1/simulation-results/:id/savePOST /api/v1/simulation-results/:id/adjustmentsPOST /api/v1/aftercare-results/:id/follow初始化阶段要求:
前端当前关键契约来自以下文件:
初始化阶段必须保证以下契约:
/api/v1。ApiEnvelope 一致。LoginResult 一致。{ items, total } 的列表数据结构,作为 data 内容。Authorization: <token>。初始化时不追求一次性完整建模所有历史字段,但以下要求必须满足:
is_deleted、create_time、update_time 等现有设计约定。对 hair_template_make_task 与 ai_hair_simulation_task 两类异步任务表,应优先保留状态字段、错误信息字段、结果字段与外部任务 ID 字段。
初始化阶段的错误处理约束如下:
初始化阶段测试目标以工程可用性为主,不追求业务覆盖率:
GET /api/v1/health 的基础 e2e 测试。初始化阶段应同步生成:
backend/README.md,说明安装、环境变量、运行、测试、数据库初始化方式。.env.example,提供本地开发必需变量。这样可直接替代或修正前端 README 中目前对后端“已存在”的描述偏差。
本设计只覆盖“标准业务骨架初始化”这一阶段,不包含以下后续专题:
这些内容应在后续实现计划中拆成独立步骤。
完成初始化后,应至少满足以下条件:
backend/ 成为一个可安装依赖并启动的 NestJS 项目。GET /api/v1/health 可得到统一响应结构。下一步应进入实现计划阶段,分解为:
待实现计划确认后,再进入正式编码。