Skip to content

项目概览

text
相关代码: package.json, server/, src/

D.Run Pitstop 是 Leopard 平台的运营管理后台,为管理员提供 SKU 管理、用户查询、账单审计等功能。

为什么需要这个系统?

Leopard 平台的 API 设计遵循用户隔离原则:用户只能查看自己的订单、账单、钱包数据。但运营人员需要:

  1. 查看任意用户的私有数据 - 订单、账单、钱包余额
  2. 管理 SKU 定价 - 上下架、调价、设置免费额度
  3. 发放代金券 - 批量创建和发放

核心设计决策

决策 1:双层代理而非 API 网关

为什么不用 API 网关?

  • Leopard API 没有管理员代查用户数据的接口
  • 通过 Ghippo 创建目标用户的临时 AccessToken 是唯一方案
  • Token 管理逻辑与业务耦合紧密,放在 BFF 层更合适
方案优点缺点
JWT无状态,易扩展前端需存储,易被 XSS 攻击
Cookie SessionHttpOnly 安全,自动携带需服务端存储(本项目用签名验证代替)

选择 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 文档参考

下一步