# WechatAdminWeb — 订阅模块后台实施计划

> 依据：`_docs/后端管理平台需求说明.md` 中 **「订阅模块 / 轻量核心版」** 与 **§7 管理端 API（MVP）**；技术栈以仓库现有 **node-core-framework** + **admin-framework.js** 为准。  
> 说明：需求文档后半部分「微信自动化平台 V1（合同/账单/分成/风控等）」**不在本期范围**，若后续要扩展，可单独立项。

---

## 1. 范围与验收对齐

### 1.1 本期必做（P0）

| 模块 | 内容 |
|------|------|
| 用户管理 | 增删改查、禁用；列表筛选（手机/公司/状态）；详情含当前订阅与 Token 概要 |
| 套餐管理 | CRUD、上下线、额度与 `enabled_features`（JSON） |
| 订阅 | 开通、升级、续费、取消；按 `user_id` 查询；状态机 `pending/active/expired/cancelled` |
| Token | 创建（仅一次明文）、吊销、有效期、`last_used_at`；单用户数量上限（如 5） |
| 对外鉴权 | Token 校验 + 有效订阅 + 功能点 + 月额度；统一错误码 |

### 1.2 本期次优先（P1）

| 模块 | 内容 |
|------|------|
| 支付 | `confirm-offline`、`confirm-link`（录入 `payment_ref` / 模拟回调开通） |
| 用量与额度 | `usage_monthly` 聚合、调用侧上报或管理端录入；超配额返回 `QUOTA_EXCEEDED` |
| 定时任务 | 到期扫描、月结归档、续费提醒（D-7/D-3/D-1） |

### 1.3 可选增强（P2）

- 审计日志表 + 关键操作写入（需求「最小风控与安全」）
- 一键吊销某用户全部 Token
- 简单运营看板（用户数、到期分布）

### 1.4 数据表命名统一

需求中同时出现 `subscriptions` 与 `user_subscriptions`。实施时 **固定一张业务订阅表**（建议表名 `biz_subscriptions` 或 `user_subscriptions`，与现有命名风格一致），在 DDL 与文档中只保留一种，避免混用。

`api_tokens` 轻量版建议含 **`plan_id` 冗余**（便于鉴权时少联表），与需求「3.4 Token」轻量版一致。

---

## 2. 技术约定（与仓库现状对齐）

### 2.1 后端

- **入口**：`app.js` → `Framework.init`（`framework/node-core-framework.js`）。
- **管理端 API 前缀**：`config/framework.config.js` 中 `apiPaths` 已配置为 **`/admin_api`** + `authType: 'admin'`。  
  - 需求文档中的 `/admin/...` 在实现时映射为 **`/admin_api/...`**（或在网关层做重写），**Swagger/前端 axios 基路径需统一**。
- **模型**：`api/model/*.js`，Sequelize `db.define` 风格（参考 `api/model/sys_user.js`）。
- **控制器**：`api/controller_admin/*.js`，导出形如 `"METHOD /path": async (ctx) => {}`（参考 `api/controller_admin/sys_file.js`）。
- **关联**：`config/model.associations.js` 中注册 `users` / `plans` / `subscriptions` / `api_tokens` / `usage_monthly` 的 `belongsTo`/`hasMany`。

### 2.2 需先修复的阻塞项

| 问题 | 处理 |
|------|------|
| `app.js` 引用 `./config/model.associations.wms.js`，仓库中 **不存在** | 改为引用 `./config/model.associations.js`，或在 `config` 下增加兼容 re-export，保证 `npm start` 可启动 |

### 2.3 管理端前端

- **入口**：`admin/src/main.js`，`AdminFramework.createApp` + `componentMap`（`admin/src/router/component-map.js`）。
- **页面**：为「用户 / 套餐 / 订阅 / Token / 支付确认」各增 Vue 页，并在 `componentMap` 注册；列表/表单模式对齐现有 `admin-framework` 与 `test/test.vue` 用法。
- **接口封装**：`admin/src/api/` 下新增模块，**baseURL 指向 `admin_api`**（与 `admin/config` 中 `apiUrl` 一致）。

### 2.4 定时任务

- `middleware/schedule.js` 的 `init()` 内用 `node-schedule` 注册：
  - 每天 **00:10** — 订阅到期扫描 → `expired`
  - 每月 **1 日 00:30** — 用量月结归档（如有需要）
  - 每天 **09:00** — 续费提醒（写通知表或日志，MVP 可先日志）

---

## 3. 数据层实施清单

### 3.1 DDL（MySQL）

新建迁移或 SQL 脚本（建议 `_docs/sql/` 或 `migrations/`，与团队习惯一致）包含：

- `biz_user`（与模型 `api/model/biz_user.js` 的 `tableName` 一致；与 `sys_user` 后台账号区分）
- `biz_plan`
- `biz_subscriptions`（字段含 `renew_mode`、`payment_channel`、`payment_ref` 等）
- `biz_api_token`（`token_hash`、`plan_id` 可选冗余）
- `biz_usage_monthly`（`stat_month` YYYY-MM）

### 3.2 Sequelize 模型文件

每个表一个 `api/model/biz_*.js`，字段类型、注释与需求一致；`enabled_features` 用 `JSON` 或 `TEXT` + 序列化。

### 3.3 安全

- Token 明文仅创建接口返回一次；库内只存 **hash**（如 SHA-256 + salt，与框架内 crypto 工具一致）。
- 管理端接口走 `admin` 鉴权；对外鉴权接口放 `api/controller_front` 或单独 `prefix`，**放入 allowUrls 或 Header 鉴权**，与需求「每次请求」流程一致。

---

## 4. API 实施清单（路径以 `/admin_api` 为准）

需求 §7 映射如下（**实际路由字符串以框架注册为准**）：

| 需求路径 | 实现前缀 |
|----------|----------|
| `POST /admin/users` | `POST /admin_api/biz_user/page` 等（以实际 controller 为准） |
| `GET /admin/users` | `GET /admin_api/users` |
| `GET /admin/users/{id}` | `GET /admin_api/users/:id` |
| `PUT /admin/users/{id}` | `PUT /admin_api/users/:id` |
| `POST /admin/users/{id}/disable` | `POST /admin_api/users/:id/disable` |
| 套餐 / 订阅 / Token / 支付 | 同上模式 |

**对外鉴权（非管理端）**建议单独一组，例如：

- `POST /api/auth/verify` 或 `GET /api/auth/context`：入参 Token + `feature` + 可选用量上报字段，返回用户上下文或错误码。

错误码与需求 §6 一致：`TOKEN_INVALID`、`TOKEN_EXPIRED`、`TOKEN_REVOKED`、`SUBSCRIPTION_INACTIVE`、`FEATURE_NOT_ALLOWED`、`QUOTA_EXCEEDED`。

---

## 5. 前端页面与菜单

| 页面 | 路由 component key（示例） | 功能 |
|------|------------------------------|------|
| 用户列表/编辑 | `subscription/user` | 表格 + 搜索 + 抽屉表单 |
| 套餐列表/编辑 | `subscription/plan` | JSON 功能点编辑器（简易 textarea 或 key-value） |
| 订阅操作 | `subscription/subscription` | 开通/升级/续费/取消向导或表单 |
| Token | `subscription/token` | 列表、创建（展示一次明文）、吊销 |
| 支付确认 | `subscription/payment` | 线下确认、链接确认表单 |

菜单数据若来自后端 `sys_menu`，需在库中插入对应菜单项，`component` 与 `component-map.js` **key 一致**。

---

## 6. 实施顺序（建议迭代）

1. **迭代 A**：修复 `model.associations` 引用；建表 + 模型 + associations；用户 + 套餐 CRUD API 与页面。
2. **迭代 B**：订阅状态机 + 开通/升级/续费/取消 API + 页面；支付确认打通「pending → active」。
3. **迭代 C**：Token 创建/吊销/哈希；对外鉴权接口 + 错误码；用量表与额度校验。
4. **迭代 D**：定时任务（到期扫描、提醒）；Swagger 补全；联调验收用例（需求 §9）。

---

## 7. 交付物

- 可运行的后端 + 管理端前端，完成「创建用户 → 支付确认 → 订阅生效 → Token 发放 → 鉴权与额度」闭环。
- 本文档同目录可补充 **`_docs/sql/001_biz_schema.sql`**（实施时产出）。
- API 文档：框架自带 `/api/docs`，需保证新接口有 Swagger 注解或框架要求的注释格式。

---

## 8. 参考文件（仓库内）

| 说明 | 路径 |
|------|------|
| 框架入口 | `app.js`、`config/framework.config.js` |
| 管理端控制器 | `api/controller_admin/sys_file.js` |
| 模型示例 | `api/model/sys_user.js` |
| 定时任务壳 | `middleware/schedule.js` |
| 前端挂载 | `admin/src/main.js`、`admin/src/router/component-map.js` |
| 需求原文 | `_docs/后端管理平台需求说明.md` |

---

*文档版本：v1 | 与 README 中 admin-framework / node-core-framework 在线文档对照开发。*
