主题
数据流
text
相关代码: src/services/api.ts, server/proxyRoutes.tsSKU 管理数据流
获取 SKU 列表
技术债务
N+1 查询是当前的性能瓶颈。理想情况下,列表接口应该返回 available 和 displayOrder 字段。
创建 SKU
用户数据流
获取用户订单
数据转换
EAV → 扁平结构
输入 (Leopard API):
{
"id": "sku-123",
"specName": "GPU-8x-A100",
"price": "1000000",
"specFields": [
{ "key": "gpu-model", "value": "A100" },
{ "key": "gpu-count", "value": "8" },
{ "key": "memory", "value": "131072" }
]
}
输出 (前端 SKU):
{
"id": "sku-123",
"name": "GPU-8x-A100",
"price": 1000000,
"gpuModel": "A100",
"gpuCount": "8",
"memory": "131072"
}单位转换表
| 字段 | API 存储 | 前端显示 | 转换 |
|---|---|---|---|
| price | 微元 | 元 | ÷ 1,000,000 |
| memory | MB | GB | ÷ 1024 |
| gpuMemory | MB | GB | ÷ 1024 |
| vgpuMemory | MB | GB | ÷ 1000 |
| timestamp | Unix ms (string) | Date | new Date(parseInt(x)) |
请求路径映射
管理员 API
| 前端路径 | 后端路径 |
|---|---|
/api/leopard/products/skus | /apis/leopard.io/v1alpha1/products/skus |
/api/leopard/products/sku-infos/{id} | /apis/leopard.io/v1alpha1/products/sku-infos/{id} |
/api/ghippo/users | /apis/ghippo.io/v1alpha1/users |
用户代理 API
| 前端路径 | 后端路径 |
|---|---|
/proxy/users/{id}/orders | /apis/leopard.io/v1alpha1/orders |
/proxy/users/{id}/bills | /apis/leopard.io/v1alpha1/bills |
/proxy/users/{id}/wallet/balance | /apis/leopard.io/v1alpha1/wallet/balance |
/proxy/users/{id}/vouchers | /apis/leopard.io/v1alpha1/vouchers/active |
错误处理
前端
typescript
api.interceptors.response.use(
(response) => response,
(error) => {
console.error('API Error:', error.response?.data || error.message)
return Promise.reject(error)
}
)代理层
typescript
proxyReq.on('error', (e) => {
console.error('[Proxy] Request error:', e)
res.status(500).json({ error: 'Proxy error', detail: String(e) })
})缓存策略
| 数据 | 缓存位置 | TTL | 说明 |
|---|---|---|---|
| 用户 Token | 内存 + 文件 | 1 小时 | tokenManager |
| 产品列表 | React State | 页面生命周期 | useProducts |
| 区域列表 | React State | 页面生命周期 | useRegions |
| SKU 列表 | 无缓存 | - | 每次请求获取 |