feat(admin-frontend): 完成节点与礼品卡管理工作台
补齐节点管理真实新增、编辑与排序流程,接入权限组与路由组 维护页,并支持 11 种协议的动态配置表单 开放礼品卡管理入口,交付模板、兑换码、使用记录与统计四页签 工作台,接入 gift-card 相关后台接口 将知识库、权限组与路由管理从占位页升级为真实页面,并修复侧边栏 低高度裁切问题 修复仪表盘 24h 流量排行涨跌始终为 0 的问题,改为对比昨天整日统 计并补充单元测试
This commit is contained in:
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "completed",
|
||||
"completed": 3,
|
||||
"failed": 0,
|
||||
"pending": 0,
|
||||
"total": 3,
|
||||
"done": 3,
|
||||
"percent": 100,
|
||||
"current": "全部任务已完成,等待归档方案包",
|
||||
"updated_at": "2026-04-24 17:07:00"
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
# 变更提案: admin-frontend-sidebar-height-overflow
|
||||
|
||||
## 元信息
|
||||
```yaml
|
||||
类型: 缺陷修复
|
||||
方案类型: implementation
|
||||
优先级: P1
|
||||
状态: 已确认
|
||||
创建: 2026-04-24
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1. 需求
|
||||
|
||||
### 背景
|
||||
`admin-frontend` 新增系统管理与订阅管理分组后,左侧导航项明显增多。当前 `AdminLayout.vue` 的侧边栏仍采用“Logo + ElMenu 直接铺满”的结构,而 `body` 又被全局设置为 `overflow: hidden`。在用户截图所示的小窗口高度下,底部菜单会被直接裁切,导致“礼品卡管理”“系统管理”“支付配置”等入口无法完整访问。
|
||||
|
||||
### 目标
|
||||
- 修复管理端侧边栏在低视口高度下显示不全的问题。
|
||||
- 按用户已确认的方案,保留顶部 Logo/品牌区固定,仅让菜单区独立纵向滚动。
|
||||
- 保持现有 Apple 风格后台的导航层级、折叠行为和移动端体验不回退。
|
||||
|
||||
### 约束条件
|
||||
```yaml
|
||||
范围约束: 仅处理 admin 侧边栏在低高度下的可访问性与滚动行为,不扩展菜单信息架构
|
||||
技术约束: 继续使用 Vue3 + TypeScript + Element Plus,不新增依赖
|
||||
兼容性约束: 需兼容桌面展开态、折叠态以及现有移动端 fixed aside 行为
|
||||
视觉约束: 延续 apple/DESIGN.md 与 .helloagents/DESIGN.md 的纯白侧栏 + 单一蓝色激活态体系
|
||||
```
|
||||
|
||||
### 验收标准
|
||||
- [ ] 在窗口高度不足时,侧边栏底部菜单项仍可通过纵向滚动访问完整。
|
||||
- [ ] 顶部 Logo/品牌区保持固定,不跟随菜单滚动一起消失。
|
||||
- [ ] 折叠态与移动端侧边栏不出现新的遮挡、抖动或布局错位。
|
||||
- [ ] `admin-frontend` 执行 `npm run build` 通过。
|
||||
|
||||
---
|
||||
|
||||
## 2. 方案
|
||||
|
||||
### 技术方案
|
||||
1. 在 `AdminLayout.vue` 中把侧边栏拆成“固定头部品牌区 + 独立滚动的菜单容器”两层结构,而不是直接让 `ElMenu` 占满整个 `ElAside`。
|
||||
2. 为侧边栏与菜单滚动容器补齐 `min-height: 0`、`overflow-y: auto`、底部留白和滚动条细节,解决 flex 子项在固定高度容器中无法正确收缩的问题。
|
||||
3. 保持现有 `ElMenu`、`ElSubMenu` 和折叠逻辑不变,确保这次修复是针对根因的最小改动,而不是重写导航实现。
|
||||
|
||||
### 影响范围
|
||||
```yaml
|
||||
涉及模块:
|
||||
- admin-frontend: 更新主布局侧边栏结构与样式,修复低高度下菜单裁切
|
||||
- .helloagents/modules/admin-frontend.md: 记录侧边栏低高度滚动规则
|
||||
预计变更文件: 3
|
||||
```
|
||||
|
||||
### 风险评估
|
||||
| 风险 | 等级 | 应对 |
|
||||
|------|------|------|
|
||||
| Element Plus 菜单在滚动容器中出现高度塌陷或双滚动条 | 中 | 采用独立滚动容器并显式补齐 `min-height: 0` 与内边距,避免只在 `ElMenu` 上追加单点样式 |
|
||||
| 移动端 fixed aside 与桌面侧栏样式相互影响 | 中 | 仅在当前侧边栏作用域内增加滚动容器样式,保留现有移动端定位策略 |
|
||||
| 构建会刷新 `public/assets/admin` 构建产物 | 低 | 本轮仅完成本地构建验证,不自动代做子模块发布 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 核心场景
|
||||
|
||||
### 场景: 低高度窗口中的侧边栏导航
|
||||
**模块**: admin-frontend
|
||||
**条件**: 浏览器窗口高度不足以同时容纳品牌区与全部菜单项
|
||||
**行为**: 用户在左侧导航区域滚动菜单
|
||||
**结果**: 顶部品牌区固定可见,菜单项可完整访问,激活态与分组结构保持正常
|
||||
|
||||
---
|
||||
|
||||
## 4. 技术决策
|
||||
|
||||
### admin-frontend-sidebar-height-overflow#D001: 侧边栏采用“固定品牌区 + 独立滚动菜单区”
|
||||
**日期**: 2026-04-24
|
||||
**状态**: ✅采纳
|
||||
**背景**: 用户明确选择“顶部 Logo/品牌区固定,仅菜单区域独立纵向滚动”的处理方式。
|
||||
**选项分析**:
|
||||
| 选项 | 优点 | 缺点 |
|
||||
|------|------|------|
|
||||
| A: 固定品牌区,菜单区独立滚动 | 保留品牌识别和导航定位,改动集中、体验最稳定 | 需要微调侧栏结构和滚动容器样式 |
|
||||
| B: 整个侧边栏整体滚动 | 实现简单 | 品牌区会被滚出视口,低高度下辨识度更差 |
|
||||
| C: 低高度自动折叠成图标栏 | 可压缩空间 | 会改变现有导航行为,且不是用户选定方案 |
|
||||
**决策**: 选择方案 A
|
||||
**理由**: 最符合用户已确认交互,也与当前 Apple 风格后台“固定品牌区 + 稳定导航层级”的设计基线一致。
|
||||
**影响**: 影响 `AdminLayout.vue` 侧边栏结构与样式,不涉及 API、路由或业务数据流。
|
||||
|
||||
---
|
||||
|
||||
## 5. 成果设计
|
||||
|
||||
### 设计方向
|
||||
- **美学基调**: 克制运营后台 —— 保留纯白侧栏、细边框、轻阴影和单一蓝色激活态,让修复更像“增强可用性”而非“换一套皮肤”
|
||||
- **记忆点**: 窗口再矮,顶部品牌区依旧稳定悬停,菜单像独立轨道一样顺滑滚动
|
||||
- **参考**: 现有 `apple/DESIGN.md` 与 `.helloagents/DESIGN.md` 的 Apple 风格后台规范
|
||||
|
||||
### 视觉要素
|
||||
- **配色**: 保持现有 `#ffffff` 侧栏底色、`#0071e3` 激活色和中性文字层级,不引入新强调色
|
||||
- **字体**: 延续全局系统字体栈 `--xboard-font-sans`,不新增字体
|
||||
- **布局**: 侧栏继续分为顶部品牌区与下方菜单区,但改为明确的上下分层,菜单区获得独立滚动上下文
|
||||
- **动效**: 保留当前宽度折叠过渡;滚动本身不增加额外装饰动画
|
||||
- **氛围**: 维持轻薄、低噪音的 Apple 化后台质感,仅补齐滚动可达性
|
||||
|
||||
### 技术约束
|
||||
- **可访问性**: 键盘聚焦与当前菜单激活态不可被滚动修复破坏
|
||||
- **响应式**: 桌面低高度、桌面折叠态和移动端 fixed aside 都需保持可用
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
# 任务清单: admin-frontend-sidebar-height-overflow
|
||||
|
||||
> **@status:** completed | 2026-04-24 17:05
|
||||
|
||||
```yaml
|
||||
@feature: admin-frontend-sidebar-height-overflow
|
||||
@created: 2026-04-24
|
||||
@status: completed
|
||||
@mode: R2
|
||||
```
|
||||
|
||||
## 进度概览
|
||||
|
||||
| 完成 | 失败 | 跳过 | 总数 |
|
||||
|------|------|------|------|
|
||||
| 3 | 0 | 0 | 3 |
|
||||
|
||||
---
|
||||
|
||||
## 任务列表
|
||||
|
||||
- [√] 1. 审查 `admin-frontend/src/layouts/AdminLayout.vue` 当前侧边栏结构与低高度裁切根因,冻结“固定品牌区 + 菜单独立滚动”实现边界 | depends_on: []
|
||||
- [√] 2. 在 `admin-frontend/src/layouts/AdminLayout.vue` 中调整侧边栏结构与样式,修复低高度下菜单显示不全问题 | depends_on: [1]
|
||||
- [√] 3. 运行 `admin-frontend` 构建验证,并同步 `.helloagents/modules/admin-frontend.md` 与 `CHANGELOG.md` 记录本轮修复 | depends_on: [2]
|
||||
|
||||
---
|
||||
|
||||
## 执行日志
|
||||
|
||||
| 时间 | 任务 | 状态 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 2026-04-24 16:55 | 方案包初始化 | completed | 已确认采用“顶部品牌区固定,菜单区域独立纵向滚动”的修复策略 |
|
||||
| 2026-04-24 16:58 | 根因分析 | completed | 已确认裁切来自 `ElAside` 固定高度 + `ElMenu` 缺少独立滚动上下文,菜单区可滚动高度不足 |
|
||||
| 2026-04-24 17:02 | 布局修复 | completed | 已将侧边栏拆为固定品牌区与独立滚动菜单区,并补齐 `min-height: 0` / `overflow-y: auto` 样式 |
|
||||
| 2026-04-24 17:07 | 验证与知识同步 | completed | `npm run build` 通过;Playwright 在 1200x540 视口下确认菜单区 `scrollHeight 1020 > clientHeight 442`,滚动到底后可见系统管理与知识库管理入口 |
|
||||
|
||||
---
|
||||
|
||||
## 执行备注
|
||||
|
||||
- 本轮只修复侧边栏低高度可访问性,不调整菜单信息架构与图标分组。
|
||||
- 构建验证会刷新 `public/assets/admin` 构建产物,本轮仅完成本地实现与验证,不自动代做子模块发布。
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "completed",
|
||||
"completed": 4,
|
||||
"failed": 0,
|
||||
"pending": 0,
|
||||
"total": 4,
|
||||
"done": 4,
|
||||
"percent": 100,
|
||||
"current": "权限组管理真实页、节点页联动与构建验证已完成",
|
||||
"updated_at": "2026-04-24 17:10:00"
|
||||
}
|
||||
+166
@@ -0,0 +1,166 @@
|
||||
# 变更提案: admin-frontend-node-group-management
|
||||
|
||||
## 元信息
|
||||
```yaml
|
||||
类型: 功能增强
|
||||
方案类型: implementation
|
||||
优先级: P1
|
||||
状态: 已完成
|
||||
创建: 2026-04-24
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1. 需求
|
||||
|
||||
### 背景
|
||||
`admin-frontend` 的 `#/node-groups` 目前仍是结构化占位页,而用户已经提供了目标截图,明确要求继续完成“权限组管理”真实工作台。现有 Laravel 后端已经开放 `server/group/fetch`、`server/group/save` 与 `server/group/drop`,节点管理页也已接入权限组筛选,但缺少从权限组页进入节点筛选的维护闭环。
|
||||
|
||||
### 目标
|
||||
- 将 `#/node-groups` 从占位页升级为真实权限组管理页面,支持列表、搜索、添加、编辑、删除。
|
||||
- 列表中直接展示权限组 ID、组名称、用户数量、节点数量,并给出符合截图习惯的操作位。
|
||||
- 补齐与 `#/nodes` 的联动:从权限组页可以一键带筛选跳转到节点页,节点页也能快速回到权限组维护入口。
|
||||
|
||||
### 约束条件
|
||||
```yaml
|
||||
范围约束: 仅实现 admin-frontend 的权限组前端工作台与节点页联动,不改 Laravel 后端接口行为
|
||||
技术约束: 继续使用 Vue3 + TypeScript + Element Plus + 现有 axios/adminClient 栈,不新增第三方状态或表格依赖
|
||||
视觉约束: 以用户截图为直接参考,保留 Apple 化后台的克制留白、系统字体与轻量表格节奏,不套用订阅页黑色 Hero
|
||||
业务约束: 后端真相源固定为 server/group/fetch、server/group/save、server/group/drop;删除失败原因以前端透传后端文案为准
|
||||
```
|
||||
|
||||
### 验收标准
|
||||
- [√] `#/node-groups` 可以展示真实权限组列表,并支持关键字搜索与分页浏览。
|
||||
- [√] 页面支持新增、编辑、删除权限组;新增/编辑使用中央弹窗,删除前有明确确认。
|
||||
- [√] 节点数量支持跳转到 `#/nodes` 并自动带入对应权限组筛选;节点页提供回到权限组维护入口的联动按钮。
|
||||
- [√] `admin-frontend` 执行 `npm run build` 通过,产物可继续输出到 `public/assets/admin`。
|
||||
|
||||
---
|
||||
|
||||
## 2. 方案
|
||||
|
||||
### 技术方案
|
||||
1. 在 `src/types/api.d.ts` 与 `src/api/admin.ts` 中补齐权限组保存请求类型与 `save/delete` 封装。
|
||||
2. 新增 `src/utils/nodeGroups.ts`,统一处理权限组计数归一化、本地搜索和摘要计算,避免视图层堆积业务细节。
|
||||
3. 重写 `NodeGroupsView.vue`,采用“页头说明 + 紧凑工具条 + 白色表格工作台 + 中央编辑弹窗”的结构贴近截图。
|
||||
4. 新增 `NodeGroupEditorDialog.vue` 处理新增/编辑流程;节点数量使用按钮式链接跳转到 `/nodes?group={id}`。
|
||||
5. 轻量补齐 `NodesView.vue`:识别路由查询中的权限组筛选,并提供“管理权限组”入口形成维护闭环。
|
||||
|
||||
### 影响范围
|
||||
```yaml
|
||||
涉及模块:
|
||||
- admin-frontend: 权限组管理真实页、节点页筛选联动、API/类型/工具层补齐
|
||||
- .helloagents: 方案包、模块文档、CHANGELOG 与状态证据同步
|
||||
预计变更文件: 8
|
||||
```
|
||||
|
||||
### 风险评估
|
||||
| 风险 | 等级 | 应对 |
|
||||
|------|------|------|
|
||||
| 后端删除接口因用户/节点/订阅占用返回失败 | 中 | 前端保持后端错误透传,不自行猜测失败原因 |
|
||||
| 节点页联动仅靠前端路由查询,若权限组已删除会产生空筛选 | 低 | 页面加载后校验 query 对应分组是否存在,不存在则自动回退为“全部权限组” |
|
||||
| 新页面过度复用黑色 Hero 会与截图不一致 | 中 | 以截图为最高优先级,改为轻量标题区 + 高密度表格,不强行套用订阅页首屏模式 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 技术设计(可选)
|
||||
|
||||
### API设计
|
||||
#### GET /server/group/fetch
|
||||
- **请求**: 无
|
||||
- **响应**: `AdminServerGroupItem[]`,包含 `id`、`name`、`users_count`、`server_count`
|
||||
|
||||
#### POST /server/group/save
|
||||
- **请求**: `{ id?: number, name: string }`
|
||||
- **响应**: `boolean`
|
||||
|
||||
#### POST /server/group/drop
|
||||
- **请求**: `{ id: number }`
|
||||
- **响应**: `boolean`
|
||||
|
||||
### 数据模型
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | number | 权限组 ID |
|
||||
| name | string | 权限组名称 |
|
||||
| users_count | number | 绑定用户数量 |
|
||||
| server_count | number | 绑定节点数量 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 核心场景
|
||||
|
||||
### 场景: 运营新增权限组
|
||||
**模块**: admin-frontend
|
||||
**条件**: 管理员进入 `#/node-groups`
|
||||
**行为**: 点击“添加权限组”,填写组名称并提交
|
||||
**结果**: 列表刷新并出现新的权限组记录
|
||||
|
||||
### 场景: 运营从权限组进入节点排查
|
||||
**模块**: admin-frontend
|
||||
**条件**: 某权限组已存在关联节点
|
||||
**行为**: 在权限组列表点击“节点数量”跳转
|
||||
**结果**: `#/nodes` 自动带入对应权限组筛选,仅展示该组关联节点
|
||||
|
||||
---
|
||||
|
||||
## 5. 技术决策
|
||||
|
||||
### admin-frontend-node-group-management#D001: 权限组页改为截图导向的轻量工作台,而不是延续黑色 Hero
|
||||
**日期**: 2026-04-24
|
||||
**状态**: ✅采纳
|
||||
**背景**: 用户提供的参考图就是目标界面,重点是轻量标题区、工具条和高密度表格。
|
||||
**选项分析**:
|
||||
| 选项 | 优点 | 缺点 |
|
||||
|------|------|------|
|
||||
| A: 延续节点/订阅页的黑色 Hero | 与部分已有页面一致 | 与当前截图不符,页面信息密度被拉低 |
|
||||
| B: 采用截图式轻量工作台 | 更贴近用户目标,便于高频运营维护 | 与部分页面的 Hero 结构不完全统一 |
|
||||
**决策**: 选择方案 B
|
||||
**理由**: 本轮任务已有明确视觉参考,参考优先级高于通用页面套路。
|
||||
**影响**: `NodeGroupsView.vue` 的首屏结构与样式策略
|
||||
|
||||
### admin-frontend-node-group-management#D002: 新增与编辑复用同一个中央弹窗
|
||||
**日期**: 2026-04-24
|
||||
**状态**: ✅采纳
|
||||
**背景**: 后端保存接口统一为 `server/group/save`,截图也展示了中央编辑弹窗。
|
||||
**选项分析**:
|
||||
| 选项 | 优点 | 缺点 |
|
||||
|------|------|------|
|
||||
| A: 新增/编辑拆成两个独立组件 | 职责更独立 | 代码重复,交互不连续 |
|
||||
| B: 统一弹窗组件按模式切换 | 与后端接口一致,界面行为稳定 | 组件需处理回填逻辑 |
|
||||
**决策**: 选择方案 B
|
||||
**理由**: 能最小化重复代码,同时贴合截图中的工作流。
|
||||
**影响**: `NodeGroupEditorDialog.vue` 的设计与表单逻辑
|
||||
|
||||
### admin-frontend-node-group-management#D003: 节点数量列承担“跳转到节点筛选”联动入口
|
||||
**日期**: 2026-04-24
|
||||
**状态**: ✅采纳
|
||||
**背景**: 用户选择了“完整闭环”,不仅要做权限组页,还要补齐节点页联动。
|
||||
**选项分析**:
|
||||
| 选项 | 优点 | 缺点 |
|
||||
|------|------|------|
|
||||
| A: 只做权限组页 CRUD | 实现最小 | 无法形成节点维护闭环 |
|
||||
| B: 在节点数量列加入带筛选跳转,并让节点页识别 query | 联动直接、改动范围可控 | 需要额外处理路由筛选同步 |
|
||||
**决策**: 选择方案 B
|
||||
**理由**: 这是当前范围内成本最低、用户价值最高的联动方式。
|
||||
**影响**: `NodeGroupsView.vue`、`NodesView.vue`
|
||||
|
||||
---
|
||||
|
||||
## 6. 成果设计
|
||||
|
||||
### 设计方向
|
||||
- **美学基调**: 精密运营台账风——保留 Apple 化后台的轻薄分区与系统字体,但将视觉重心收敛到“标题、工具条、表格、弹窗”四个层级,避免营销感首屏
|
||||
- **记忆点**: 大面积留白中的细线表格与圆角操作按钮,让“节点数量可跳转”的数据列成为页面最有识别度的互动点
|
||||
- **参考**: 用户提供的权限组管理截图与编辑弹窗截图
|
||||
|
||||
### 视觉要素
|
||||
- **配色**: 以 `#ffffff` / `#f5f5f7` 为背景层,正文使用 `--xboard-text-strong` 与 `--xboard-text-secondary`,交互强调保持 `#0071e3`
|
||||
- **字体**: 延续项目现有系统字体栈,不额外引入新字体;通过更克制的字号梯度和字重对比强化“台账式”阅读效率
|
||||
- **布局**: 顶部使用轻标题区,正文直接进入紧凑工具条与全宽表格;编辑器保持中央对话框,不用抽屉
|
||||
- **动效**: 仅保留按钮 hover、表格行内操作反馈、分页与弹窗开合的默认 Element Plus 过渡
|
||||
- **氛围**: 依靠细边框、极轻阴影、圆角输入框与足够留白构成“干净但不空”的后台质感
|
||||
|
||||
### 技术约束
|
||||
- **可访问性**: 搜索框、主按钮、编辑/删除操作与节点跳转入口都要保留可见焦点;危险删除继续使用明确确认文案
|
||||
- **响应式**: 桌面优先显示完整表格;窄屏下工具条允许换行,底部分页与统计信息可纵向堆叠
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
# 任务清单: admin-frontend-node-group-management
|
||||
|
||||
> **@status:** completed | 2026-04-24 17:11
|
||||
|
||||
```yaml
|
||||
@feature: admin-frontend-node-group-management
|
||||
@created: 2026-04-24
|
||||
@status: completed
|
||||
@mode: R2
|
||||
```
|
||||
|
||||
## 进度概览
|
||||
|
||||
| 完成 | 失败 | 跳过 | 总数 |
|
||||
|------|------|------|------|
|
||||
| 4 | 0 | 0 | 4 |
|
||||
|
||||
---
|
||||
|
||||
## 任务列表
|
||||
|
||||
- [√] 1. 梳理 `server/group/*` 后端接口、现有 `admin-frontend` 设计契约与节点页联动边界 | depends_on: []
|
||||
- [√] 2. 补齐权限组 API / 类型 / 工具层,并实现新增 / 编辑弹窗 | depends_on: [1]
|
||||
- [√] 3. 重写 `NodeGroupsView` 真实工作台,并补齐 `NodesView` 的权限组筛选联动入口 | depends_on: [1, 2]
|
||||
- [√] 4. 运行 `admin-frontend` 构建验证,更新 `.helloagents` 文档与交付证据 | depends_on: [2, 3]
|
||||
|
||||
---
|
||||
|
||||
## 执行日志
|
||||
|
||||
| 时间 | 任务 | 状态 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 2026-04-24 17:00 | 方案包初始化 | completed | 用户已选择“完整闭环”,本轮范围包含权限组真实页与节点页联动 |
|
||||
| 2026-04-24 17:04 | 页面实现 | completed | 已补齐权限组 API、工具层、中央编辑弹窗与真实列表工作台 |
|
||||
| 2026-04-24 17:07 | 联动实现 | completed | 节点数量列现可跳转 `#/nodes?group={id}`,节点页新增“管理权限组”入口 |
|
||||
| 2026-04-24 17:10 | 构建与文档同步 | completed | `npm run build` 通过,并已更新 `.helloagents` 文档与变更日志 |
|
||||
|
||||
---
|
||||
|
||||
## 执行备注
|
||||
|
||||
- 当前根仓存在其他未归档方案包与历史改动,本轮仅增量修改权限组管理及节点页联动相关文件。
|
||||
- `public/assets/admin` 为前端产物子模块;构建通过后需要同时复核根仓与子模块状态。
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"updatedAt": "2026-04-24T09:09:46.384Z",
|
||||
"version": 1,
|
||||
"source": "manual",
|
||||
"originCommand": "generic-r2",
|
||||
"verifyMode": "test-first",
|
||||
"reviewerFocus": [
|
||||
"礼品卡管理整体结构是否贴近用户提供的四页签后台截图",
|
||||
"模板抽屉字段分组是否与截图和现有后端 JSON 结构一致"
|
||||
],
|
||||
"testerFocus": [
|
||||
"礼品卡管理是否真实连接 gift-card/templates、codes、usages、statistics、types 接口",
|
||||
"模板新增编辑是否能正确序列化 conditions、rewards、limits、special_config",
|
||||
"兑换码管理是否支持生成、导出、复制、启停、编辑和删除主链路"
|
||||
],
|
||||
"ui": {
|
||||
"required": true,
|
||||
"designContract": true,
|
||||
"sourcePriority": [
|
||||
"requirements.md",
|
||||
".helloagents/DESIGN.md",
|
||||
"hello-ui"
|
||||
],
|
||||
"styleAdvisor": {
|
||||
"required": false,
|
||||
"reason": "",
|
||||
"focus": []
|
||||
},
|
||||
"visualValidation": {
|
||||
"required": true,
|
||||
"reason": "礼品卡管理属于整页新增的真实后台业务页,需要确认四页签导航、模板表格、模板抽屉和统计卡片在代码结构上与目标截图及 Apple 化后台契约一致。",
|
||||
"screens": [
|
||||
"#/subscriptions/gift-cards desktop"
|
||||
],
|
||||
"states": [
|
||||
"模板管理默认加载完成态",
|
||||
"模板新增抽屉展开态",
|
||||
"兑换码管理列表态",
|
||||
"统计数据总览态"
|
||||
]
|
||||
}
|
||||
},
|
||||
"advisor": {
|
||||
"required": false,
|
||||
"reason": "",
|
||||
"focus": [],
|
||||
"preferredSources": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
# admin-frontend 礼品卡管理首版交付 — 实施规划
|
||||
|
||||
## 目标与范围
|
||||
- 在现有订阅管理分组中补齐礼品卡管理真实页,替换原先的禁用入口。
|
||||
- 页面聚焦“礼品卡运营工作台”主链路:建模板、生成兑换码、查看使用记录、追踪统计数据。
|
||||
|
||||
## 架构与实现策略
|
||||
- 在 `AdminLayout` 中开放 `/subscriptions/gift-cards` 导航入口,并在路由中新增对应页面。
|
||||
- 新增 `GiftCardsView` 作为整页工作台,整体结构参考用户截图:
|
||||
- 顶部标题与说明
|
||||
- 四段式分段导航(模板管理 / 兑换码管理 / 使用记录 / 统计数据)
|
||||
- 每个页签独立的筛选条、表格/卡片内容与操作按钮
|
||||
- 新增两个业务弹层组件:
|
||||
- `GiftCardTemplateDrawer.vue`:负责模板新增与编辑
|
||||
- `GiftCardCodeBatchDialog.vue`:负责批量生成兑换码
|
||||
- 在 `src/utils/giftCards.ts` 中集中处理:
|
||||
- 类型/状态映射
|
||||
- 模板表单序列化与反序列化
|
||||
- 金额(元)/流量(GB)/倍率/日期等展示与提交格式转换
|
||||
- 本地搜索筛选与统计卡片整理
|
||||
- API 层在 `src/api/admin.ts` 中新增礼品卡接口封装;类型定义统一补到 `src/types/api.d.ts`。
|
||||
|
||||
## 完成定义
|
||||
- 侧边栏中的“礼品卡管理”不再是禁用入口,能正常进入 `#/subscriptions/gift-cards`。
|
||||
- 模板管理页可真实连接模板列表与 CRUD 接口,支持搜索、筛选、启停与删除。
|
||||
- 模板抽屉可完整编辑截图展示的主要字段分组,并正确序列化为后端 `conditions / rewards / limits / special_config` 结构。
|
||||
- 兑换码页可真实连接兑换码列表,支持批量生成、复制、启停、导出当前批次、编辑有效期/次数与删除。
|
||||
- 使用记录与统计数据页可真实连接后端数据,不使用硬编码假数据。
|
||||
|
||||
## 文件结构
|
||||
- `admin-frontend/src/layouts/AdminLayout.vue`
|
||||
- `admin-frontend/src/router/index.ts`
|
||||
- `admin-frontend/src/api/admin.ts`
|
||||
- `admin-frontend/src/types/api.d.ts`
|
||||
- `admin-frontend/src/utils/giftCards.ts`
|
||||
- `admin-frontend/src/views/subscriptions/GiftCardsView.vue`
|
||||
- `admin-frontend/src/views/subscriptions/GiftCardsView.scss`
|
||||
- `admin-frontend/src/views/subscriptions/GiftCardTemplateDrawer.vue`
|
||||
- `admin-frontend/src/views/subscriptions/GiftCardCodeBatchDialog.vue`
|
||||
|
||||
## UI / 设计约束
|
||||
- 页面采用“标题说明 + 轻量分段页签 + 白色工作台”的 Apple 化运营后台节奏,不额外叠加夸张 hero 或营销化视觉。
|
||||
- 四个页签保持统一信息架构与表格密度,让用户能快速在模板、兑换码、记录、统计之间切换。
|
||||
- 模板抽屉使用分组 section 和双列表单布局,对齐截图中的信息分区;在窄屏下自动堆叠为单列。
|
||||
- 状态标签、奖励摘要、统计卡片继续沿用单一蓝色强调和语义色状态胶囊,不引入新配色体系。
|
||||
|
||||
## 风险与验证
|
||||
- 风险 1:模板表单字段较多,若直接散落在组件内易导致提交结构和展示结构不一致,因此统一收敛到 `src/utils/giftCards.ts`。
|
||||
- 风险 2:兑换码列表接口不支持关键词搜索,需要前端在当前拉取结果上做本地搜索,并明确这是列表内过滤。
|
||||
- 风险 3:本地环境缺少真实后台登录态时,只能做结构与构建验证,不能替代完整联调。
|
||||
- 验证方式:
|
||||
- `npm run build`
|
||||
- 代码级结构自检 `#/subscriptions/gift-cards`
|
||||
- 结构化视觉验收记录(无浏览器工具时以 code inspection 说明边界)
|
||||
|
||||
## 决策记录
|
||||
- [2026-04-24] 礼品卡管理采用单页四段式导航,而不是四个独立路由,以贴近用户截图中的运营切换路径。
|
||||
- [2026-04-24] 模板抽屉使用分组式大表单,不把复杂字段塞进居中弹窗,以保证高密度配置仍可读。
|
||||
- [2026-04-24] 兑换码导出先按“当前选中批次”提供显式出口,不额外扩展复杂多选批量导出流程。
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
# admin-frontend 礼品卡管理首版交付 — 需求
|
||||
|
||||
确认后冻结,执行阶段不可修改。如需变更必须回到设计阶段重新确认。
|
||||
|
||||
## 核心目标
|
||||
- 在 `admin-frontend` 中开放“订阅管理 / 礼品卡管理”入口,不再保留禁用态。
|
||||
- 参考用户提供的 5 张截图,交付礼品卡管理真实工作台,覆盖模板管理、兑换码管理、使用记录与统计数据四个页签。
|
||||
- 保持 `apple/DESIGN.md` 与 `.helloagents/DESIGN.md` 定义的 Apple 化后台视觉语言,同时优先贴近截图中的高密度运营视图与轻量分段导航。
|
||||
|
||||
## 功能边界
|
||||
- 必须实现 `#/subscriptions/gift-cards` 真实页面。
|
||||
- 页面必须包含:
|
||||
- 顶部标题说明与四段式页签导航
|
||||
- 模板管理列表、搜索、类型/状态筛选、显隐切换、新增/编辑、删除
|
||||
- 模板新增/编辑大表单,覆盖基础配置、奖励内容、使用条件、使用限制、特殊配置、显示效果
|
||||
- 兑换码管理列表、模板/状态筛选、复制、启停、编辑、删除、批量生成、批次导出
|
||||
- 使用记录列表与用户邮箱搜索
|
||||
- 统计数据总览,至少展示模板总数、活跃模板数、兑换码总数、已使用兑换码
|
||||
- 必须接入现有 Laravel 管理接口:
|
||||
- `GET /gift-card/templates`
|
||||
- `POST /gift-card/create-template`
|
||||
- `POST /gift-card/update-template`
|
||||
- `POST /gift-card/delete-template`
|
||||
- `POST /gift-card/generate-codes`
|
||||
- `GET /gift-card/codes`
|
||||
- `POST /gift-card/toggle-code`
|
||||
- `GET /gift-card/export-codes`
|
||||
- `POST /gift-card/update-code`
|
||||
- `POST /gift-card/delete-code`
|
||||
- `GET /gift-card/usages`
|
||||
- `GET /gift-card/statistics`
|
||||
- `GET /gift-card/types`
|
||||
|
||||
## 非目标
|
||||
- 本轮不改造 Laravel 礼品卡后端逻辑、校验规则或数据库结构。
|
||||
- 本轮不实现用户端礼品卡兑换体验。
|
||||
- 本轮不引入复杂图表库,只使用现有栈完成统计展示。
|
||||
|
||||
## 技术约束
|
||||
- 技术栈固定为 `Vue 3 + TypeScript + Vite + Element Plus`。
|
||||
- 后端真相源以仓库内 `App\Http\Controllers\V2\Admin\GiftCardController`、`GiftCardTemplate`、`GiftCardCode` 与 `GiftCardUsage` 为准。
|
||||
- 构建验证使用 `admin-frontend/package.json` 中已有 `npm run build`。
|
||||
- 构建产物继续输出到 `public/assets/admin` 子模块。
|
||||
|
||||
## 质量要求
|
||||
- 礼品卡页面需要对齐截图中的运营后台结构:白色工作台、轻量页签、克制筛选条、高密度表格。
|
||||
- 表单字段需要覆盖加载、保存、取消、校验失败与成功提示等基本状态。
|
||||
- 金额、流量、时间与倍率展示必须按人类可读方式格式化,不直接暴露原始后端数值。
|
||||
- 最终至少完成一次构建验证,并留下结构化视觉验收与交付证据。
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# admin-frontend 礼品卡管理首版交付 — 任务分解
|
||||
|
||||
## 任务列表
|
||||
- [x] 任务1:补齐礼品卡管理方案与合同产物(涉及文件:`.helloagents/plans/202604241703_admin-frontend-gift-card-management/*`;完成标准:存在需求、方案、任务与合同文件;验证方式:文件检查)
|
||||
- [x] 任务2:开放礼品卡导航与路由入口(涉及文件:`admin-frontend/src/layouts/AdminLayout.vue`、`admin-frontend/src/router/index.ts`;完成标准:侧边栏可进入 `#/subscriptions/gift-cards`;验证方式:`npm run build`)
|
||||
- [x] 任务3:补齐礼品卡 API、类型与工具层(涉及文件:`admin-frontend/src/api/admin.ts`、`admin-frontend/src/types/api.d.ts`、`admin-frontend/src/utils/giftCards.ts`;完成标准:前端可消费 `gift-card/*` 接口并统一完成字段映射;验证方式:`npm run build`)
|
||||
- [x] 任务4:实现礼品卡管理主页面(涉及文件:`admin-frontend/src/views/subscriptions/GiftCardsView.vue`、`admin-frontend/src/views/subscriptions/GiftCardsView.scss`;完成标准:四个页签支持真实数据展示、搜索筛选、表格/统计渲染与关键操作入口;验证方式:`npm run build`)
|
||||
- [x] 任务5:实现模板抽屉与兑换码生成弹层(涉及文件:`admin-frontend/src/views/subscriptions/GiftCardTemplateDrawer.vue`、`admin-frontend/src/views/subscriptions/GiftCardCodeBatchDialog.vue`;完成标准:支持模板新增/编辑与兑换码批量生成;验证方式:`npm run build`)
|
||||
- [x] 任务6:完成验证与知识库同步(涉及文件:`.helloagents/CHANGELOG.md`、`.helloagents/context.md`、`.helloagents/modules/admin-frontend.md`、`.helloagents/.ralph-visual.json`、`.helloagents/.ralph-closeout.json`;完成标准:构建通过、知识库更新、交付证据写入;验证方式:命令输出 + 证据文件)
|
||||
|
||||
## 进度
|
||||
- [x] 已确认礼品卡管理按完整四页签首版推进。
|
||||
- [x] 已完成礼品卡管理真实页面、模板抽屉、兑换码生成弹层与后端接口接入。
|
||||
- [x] 已完成构建验证,待输出最终交付摘要。
|
||||
Reference in New Issue
Block a user