9.0 KiB
14 Round2 像素复刻收尾 · 筛选契约修复 · 撞款数据范围(迭代分析 Spec)
场景:现有项目迭代(step-1 场景 3)。目标 = ①剩余 13 菜单页按样办(生成记录/去重汇总)模式像素复刻旧版(撞款页除外)②全站筛选失效修复 ③撞款数据范围需求(超管全部分组店铺、管理员仅本组店铺)。
模块 A:剩余 13 页像素复刻(对齐旧版 admin.html 对应 panel)
延续样办模式:模板自绘旧版 markup(form-box/panel-box/table-scroll/旧式分页/原生控件),CSS 沿用旧版蓝白末层 token 与类名(.btn 渐变 42px/.btn-sm 36px/.form-group{label 上置}/.table-scroll{th #edf4fa}),script 逻辑复用现有 Vue 实现;每页差异点以 docs/plans/admin-front-vue/round2-align-checklist.md 为准。
页面清单与要点(13 页,撞款页例外不动):
| # | 菜单 | 路由 | 旧版 panel 要点 |
|---|---|---|---|
| 1 | 用户管理 | account/users | panel-users:筛选(用户名+所属管理员[仅超管])、列 ID/用户名/角色中文/所属管理员/创建时间、行 编辑/删除(删除确认"确定删除用户 “x” 吗?")、头部说明文案;创建/编辑弹窗沿用现有逻辑(菜单权限树) |
| 2 | 菜单权限配置 | account/menus | panel-columns:拖拽手柄提示、树形表(└缩进)、列 拖拽/ID/名称/类型(后台/软件)/上级/创建时间、行 编辑/删除(确认"确定删除菜单“xx”吗?");弹窗沿用现有逻辑 |
| 3 | 分组管理 | account/groups | panel-group-manage:顶部摘要 chips(超管"全部分组·N 个"/成员组 chips+另 N 个/未加入分组)、列 序号/名称/组长/组员数/chips/创建/修改、行 编辑/删除(仅组长/超管);编辑器沿用现有逻辑 |
| 4 | 品牌数据库(不符合ASIN) | asin-center/invalid | panel-invalid-asin-data:筛选 ASIN/品牌/分组、列 ID/ASIN/品牌/分组/来源(手动新增/自动导入)/创建时间、行 btn-sm 编辑/删除(确认"确定删除"xx"吗?");来源 AUTO 编辑隐藏分组 |
| 5 | 查询ASIN | asin-center/query | panel-query-asin:页头 新增 ASIN/导入添加/导入删除、筛选 分组/店铺名/国家/ASIN、列 序号/分组/店铺/ASIN(可复制)/国家/操作(配置 btn-sm)、rowspan 店铺合并;新增弹窗级联(分组→店铺);配置抽屉沿用现有逻辑 |
| 6 | 商品类目 | asin-center/categories | panel-product-categories:搜索条+搜索/清空/导出/新增类目、树形表(缩进 24px/级+[+/−]折叠+加粗+来源 tag 内置/自定义)、列 名称/层级路径/排序/来源/备注/操作、懒加载"加载更多 已加载 a/b"、行 btn-sm 编辑/删除(有子禁用)、编辑态标题"编辑商品类目"+保存类目+取消编辑;编辑时父级只读 |
| 7 | 最低价ASIN | asin-center/skip-price | panel-skip-price-asin:页头 新增 ASIN/导入文件新增/导入文件删除、筛选 分组/店铺名/国家/ASIN/最低价≥≤、列 序号/分组/店铺/ASIN/国家/最低价/操作(配置);新增弹窗级联+最低价(选填) |
| 8 | 店铺密钥管理 | shop-center/keys | panel-shop-keys:无筛选、列 序号/备注名/紫鸟账号名称/令牌(掩码)/白名单状态(正常/未加白名单/未检测+title 检测详情)/创建/修改、行 btn-sm 编辑/删除(确认"确定删除店铺密钥“xx”吗?");编辑留空令牌=不改 |
| 9 | 店铺管理 | shop-center/shops | panel-shop-manage:筛选 分组/店铺名、列 序号/分组/店铺名/商城名/自动化账号/账号/密码(******+眼睛→读取中...→显示密码/隐藏密码)/创建/修改、行 编辑/删除(确认"确定删除店铺“xx”吗?")、长文本省略 title;分组锁定非超管 |
| 10 | 软件版本管理 | records/software-version | panel-version:页头 上传新版本、列 版本号/下载链接/创建时间/操作(下载)、全量无分页;上传弹窗(版本号+ZIP)提交"上传软件版本",成功"发布成功。版本:{v},链接:{url}" |
| 11 | 数字人版本管理 | records/digital-human-version | panel-digital-human-version:页头 上传新版本、列 版本号/状态(草稿#999/已发布#52c41a/已废弃#ff4d4f)/最新★/文件大小(MB)/MD5(截12)/更新日志(截50)/发布时间/操作(发布/设为最新/下载/删除 按状态矩阵,确认文案见 admin.js)、数字页码分页 |
| 12 | 视频任务记录 | records/image-video-tasks | panel-image-video-tasks:form-box 筛选(用户名/提交开始/提交结束 datetime-local)、panel-box toolbar 全选当前页+批量下载(N)+权限配置(仅超管)+汇总"共 N 个任务·本页 N 个视频"、任务卡片网格(video controls+状态徽章+用户名/分组/模式/生成时间/调试链接复制+下载)、空态"暂无符合条件的视频任务"、批量进度文案 |
| 13 | 店铺数据记录 | shop-center/data-tasks | panel-shop-data-crawl-tasks:form-box 筛选(店铺/分组/国家/创建起止)、toolbar 全选可下载+批量下载(N)+权限配置+汇总"共 N 家店铺·本页 M 个结果文件"、每店卡片网格(店名/勾选+任务号+状态/分组/最新/国家/文件+下载文件/删除)、删除确认"确认删除店铺“x”的任务 {id} 及结果文件?"、批量 zip 进度;保留 9 卡/页宫格与旧版无的删除结果文件(用户已确认逐项评估保留) |
已有基础:round2-align-checklist.md(页面特异差异)、13-panel-checklist.md(面板×页面映射)、旧版基准 reference/old-admin/、样办 CSS 可复用(form-box/panel-box/btn/table-scroll/pagination/modal 已在两页实现,推广时抽公共 CSS 到共享模块或逐页内联,按现有惯例片段复用)。
模块 B:全站筛选不生效修复(P0 Bug)
根因(已实测/代码证实):前端 toAsinPageQuery(asin-filter.ts)输出 snake_case(page_size/group_id/start_date/end_date/keyword/username/country);下列 Java 控制器为裸 camel 变量名 @RequestParam(Spring Boot parent 默认 -parameters 开启 → 参数名=变量名 camel)→ 前端 snake 参数全部匹配失败 → 后端落默认值(page=1 pageSize=15 等)→ 列表分页/筛选均不生效:
DedupeTotalDataController(去重汇总列表/导出):page/pageSize/keyword/username/startDate/endDate/groupId/countryInvalidAsinDataController(品牌库列表):page/pageSize/keyword/dataValue/brand/groupIdQueryAsinController(查询ASIN 列表/导出/导入):page/pageSize/groupId/shopName/asin/country
已正确 snake 的对照(勿动):SkipPriceAsinController、AdminShopDataCrawlTasksController、AdminImageVideoTaskController、AdminUserController、AdminShopDataDuplicateCheckController、ProductCategoryController(task-284 已改)。
修复:Java 三控制器 @RequestParam 加显式 name="page"/"page_size"/"group_id"/"data_value"/"shop_name"/"start_date"/"end_date" 等 snake 名(与前端契约一致),并同步 service/mapper 无改动(仅参数绑定名)。导出/导入端点的同名参数一并改。需重打包后端 jar 并重启本地栈。
前端补充核查:SkipPricePage 最低价区间(minimum_price_from/to)是否已随 toSkipPriceQuery 下发(skip-price-filter 有 minimumPriceFrom/To,确认序列化含 snake 参数);menuCols 等其它域筛选是否已有 snake(验收时逐页操作核验)。
模块 C:撞款数据范围(DuplicateCheckPage 例外页功能需求)
需求:超管可查询全部店铺(含全部组);管理员仅本组店铺(自己创建或指派给自己的分组)。
现状:后端 resolveVisibleShopKeys(operatorId, superAdmin):superAdmin→null(全量);否则 selectManagedShopNames = group.created_by_id=me OR group.user_id=me 下店铺 → 与前端 407fc78e 角色收口配套。
待验证/修复项:
- 超管"没展示全":本地栈以超管实测撞款接口(含分组筛选)返回店铺覆盖数 vs
biz_shop_manage全量;若快照数据源有限则确认"扫描基线"是否全量(超管触发扫描应覆盖全部,管理员扫描仅其可管集→快照范围受限,此为数据模型固有,需向用户说明或按需扩大扫描范围)。 - 管理员范围:非超管验证仅返回本组店铺(多账号对比)。
- operator.superAdmin() 来源核验(AdminAuthSupport 角色判定仅 super_admin 为真)。
依赖与顺序
- 模块 B 先行(修复筛选,需 Java 重打包 + 本地栈重启)——验收基准确认。
- 模块 A 按域分页推进(account 3 页 → asin 4 页[invalid/query/categories/skip] → shop 2 页 → records 2 页 → tasks 2 页),每批对齐+测试+commit,沿用样办断言模式对齐。
- 模块 C 与 B 并行验证;超管全量如涉扫描基线/数据源则出方案与用户确认。
验收
- 每页:旧版观感目检 + 该页 align-* 断言(自绘结构)+
npm test全绿 +npm run build+ 本地栈截图。 - 筛选:逐页输入条件→查询→结果正确过滤(请求参数 snake 命中后端)。
- 撞款:超管/管理员两账号各验一次范围。