# Account Package Cards + QR Pay Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 把账户中心流量/SIM 套餐选择改成卡片网格,并在支付成功后弹出可展示 AgPay 二维码、可手动刷新状态的独立支付弹窗。
**Architecture:** 全部落在 `src/views/AccountView/AccountView.vue`。保留 `t-radio-group`/`t-radio` 的选择语义,用 class + `:deep` 做成卡片网格;支付结果统一走 `openPaymentDialog(payment, meta)`,把 `providerPayload` 解析成 `
` src,共用一个 `t-dialog`。刷新走已有 `GET /v1/account/payments/:id`。
**Tech Stack:** Vue 3 + TDesign Vue Next (`t-radio-group`/`t-radio`/`t-dialog`/`t-button`) + axios `request` + `urls.PAYMENTS`/`urls.PAYMENT`
**Spec:** `docs/superpowers/specs/2026-09-01-account-package-cards-qr-pay-design.md`
---
## File map
| File | Responsibility |
|---|---|
| Modify: `src/views/AccountView/AccountView.vue` | 套餐卡片 DOM/样式;支付弹窗;payload 解析;购买/去支付/SIM 充值接线 |
| No new files | 保持与现有 AccountView 模式一致,不拆组件(单文件已承载账户域) |
---
### Task 1: 套餐卡片网格(流量 + SIM)
**Files:**
- Modify: `src/views/AccountView/AccountView.vue`(流量 radio 块约 L55–70;SIM radio 块约 L270–278;scoped style 尾部)
- [ ] **Step 1: 改流量套餐 markup 为卡片结构**
把:
```vue
{{ pkg.name }} · {{ (Number(pkg.amountBytes) / 1024 / 1024 / 1024).toFixed(0) }}GB · {{ money(pkg.price) }}
/ {{ pkg.validityDays }}天
```
换成:
```vue
{{ pkg.name }}
{{ (Number(pkg.amountBytes) / 1024 / 1024 / 1024).toFixed(0) }} GB
{{ money(pkg.price) }}
有效期 {{ pkg.validityDays }} 天
长期有效
```
可选增强(同一 Step):订单概要显示选中套餐价:
```vue
{{ money(selectedTrafficPackage.price) }}
```
并加 computed:
```js
const selectedTrafficPackage = computed(() =>
trafficPackages.value.find((pkg) => String(pkg.id) === String(selectedTrafficPackageId.value)) || null
)
```
- [ ] **Step 2: 改 SIM 充值弹窗套餐为同一卡片结构**
```vue
{{ pkg.name }}
{{ pkg.amountGb }} GB
{{ moneyFromFen(pkg.saleFeeFen) }}
有效期 {{ pkg.validityMonths }} 个月
按运营商规则
```
- [ ] **Step 3: 加卡片网格样式(scoped + recharge-modal 全局补丁)**
在 `