主题
项目概览
text
相关代码: package.json, server/, src/D.Run Pitstop 是 Leopard 平台的运营管理后台,为管理员提供 SKU 管理、用户查询、账单审计等功能。
为什么需要这个系统?
Leopard 平台的 API 设计遵循用户隔离原则:用户只能查看自己的订单、账单、钱包数据。但运营人员需要:
- 查看任意用户的私有数据 - 订单、账单、钱包余额
- 管理 SKU 定价 - 上下架、调价、设置免费额度
- 发放代金券 - 批量创建和发放
核心设计决策
决策 1:双层代理而非 API 网关
为什么不用 API 网关?
- Leopard API 没有管理员代查用户数据的接口
- 通过 Ghippo 创建目标用户的临时 AccessToken 是唯一方案
- Token 管理逻辑与业务耦合紧密,放在 BFF 层更合适
决策 2:Cookie Session 而非 JWT
| 方案 | 优点 | 缺点 |
|---|---|---|
| JWT | 无状态,易扩展 | 前端需存储,易被 XSS 攻击 |
| Cookie Session | HttpOnly 安全,自动携带 | 需服务端存储(本项目用签名验证代替) |
选择 Cookie 的原因:
- 管理后台是内部系统,安全优先
- 使用 HMAC 签名验证,无需服务端存储
- 前端代码零 Token 处理逻辑
决策 3:EAV 转扁平结构
Leopard 使用 EAV(Entity-Attribute-Value)存储 SKU 规格:
json
// API 返回
{ "specFields": [{ "key": "gpu-model", "value": "RTX-4090" }] }
// 前端转换后
{ "gpuModel": "RTX-4090" }为什么在前端转换?
- 表格渲染需要直接访问字段
- 避免后端改动影响多个服务
- 转换逻辑集中在
src/services/api.ts
目录结构
drun-pitstop/
├── server/ # Node.js Express 代理层
│ ├── index.ts # 入口 + 会话管理
│ ├── proxyRoutes.ts # 用户代理路由
│ ├── tokenManager.ts # 用户 Token 动态管理
│ └── sessionManager.ts # Cookie 会话管理
├── src/
│ ├── pages/ # 路由页面
│ ├── components/ # UI 组件
│ ├── services/ # API 调用
│ ├── hooks/ # React Hooks
│ └── config/ # 产品配置
└── leopardapi/ # Swagger 文档参考