feat: VIP会员开通 + 订单分类 + EnumResolver统一枚举

VIP 会员开通页面(VipPage)
  - 四部分布局:激活码 / 套餐选择(双列:Radio + 权益图库) / 协议确认 / 支付跟踪
  - 支付跟踪:仿照 RechargePage 模式,创建订单后进入待支付阶段,轮询 VipAPI.getVipOrder
  - 页面锁定:待支付中禁止关闭容器(PAGE_LOCK),仅可通过 "X" 关闭
  - 权益图库:双列布局右列展示,antd Image 组件支持点击放大预览
  - Bug 修复:取消错误判断 name==='AbortError' → instanceof RequestError && type===CANCELLED

  订单明细分类(OrdersPage)
  - 新增订单类型切换(充值订单 / VIP订单),各自独立数据源与列定义
  - startVipPolling:VIP 订单轮询(VipAPI.getVipOrder),与充值轮询对称
  - handleContinuePay 统一:根据 orderType 分发到对应轮询函数
  - Bug 修复:同 VipPage 的取消错误判断

  EnumResolver 统一枚举(enum-resolver.ts)
  - 新增 payments 模块:status.label/color + method.label
  - 扩展 vip.orderStatus.color
  - VipPage / OrdersPage 移除所有直接 Map 索引和本地映射函数,统一走 EnumResolver

  VipAPI 扩展(vip-api.ts)
  - 新增 getVipOrder(orderId):单订单查询端点 /api/v1/vip/orders/{order_id}

  PageDispatcher
  - /vip 路由注册 VipPage,label="VIP 会员开通",width=560
This commit is contained in:
2026-06-16 18:29:59 +08:00
parent 72a0290693
commit e1c8eff946
6 changed files with 895 additions and 58 deletions

View File

@@ -53,7 +53,7 @@ export interface VipLevelsItem {
model_package_id: number;
description: Nullable<string>;
image: Nullable<string>;
is_active: number;
is_active: boolean;
sort_order: number;
target_account_type: TargetAccountTypeValue;
seat_limit: Nullable<number>;
@@ -147,6 +147,12 @@ export class VipAPI {
return await get<VipOrderRead[]>(VipApiUrl.VipOrders, params as Record<string, unknown>);
}
/** 获取单个 VIP 订单详情 */
static async getVipOrder(orderId: string): Promise<VipOrderRead> {
const url = `${VipApiUrl.VipOrders}/${orderId}`;
return await get<VipOrderRead>(url);
}
/** 模拟支付成功(仅开发测试用) */
static async mockPay(orderId: string): Promise<VipOrderRead> {
return await get<VipOrderRead>(`${VipApiUrl.MockPay}/${orderId}`);