Files
crawler-plugin/docs/specs/14-round2-pixel-align.md
T

62 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 14 Round2 像素复刻收尾 · 筛选契约修复 · 撞款数据范围(迭代分析 Spec)
> 场景:现有项目迭代(step-1 场景 3)。目标 = ①剩余 13 菜单页按样办(生成记录/去重汇总)模式像素复刻旧版(撞款页除外)②全站筛选失效修复 ③撞款数据范围需求(超管全部分组店铺、管理员仅本组店铺)。
## 模块 A:剩余 13 页像素复刻(对齐旧版 admin.html 对应 panel
**延续样办模式**:模板自绘旧版 markupform-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-tasksform-box 筛选(用户名/提交开始/提交结束 datetime-local)、panel-box toolbar 全选当前页+批量下载(N)+权限配置(仅超管)+汇总"共 N 个任务·本页 N 个视频"、任务卡片网格(video controls+状态徽章+用户名/分组/模式/生成时间/调试链接复制+下载)、空态"暂无符合条件的视频任务"、批量进度文案 |
| 13 | 店铺数据记录 | shop-center/data-tasks | panel-shop-data-crawl-tasksform-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 变量名** @RequestParamSpring Boot parent 默认 -parameters 开启 → 参数名=变量名 camel)→ 前端 snake 参数**全部匹配失败** → 后端落默认值(page=1 pageSize=15 等)→ 列表分页/筛选均不生效:
- `DedupeTotalDataController`(去重汇总列表/导出):page/pageSize/keyword/username/startDate/endDate/groupId/country
- `InvalidAsinDataController`(品牌库列表):page/pageSize/keyword/dataValue/brand/groupId
- `QueryAsinController`(查询ASIN 列表/导出/导入):page/pageSize/groupId/shopName/asin/country
已正确 snake 的对照(勿动):SkipPriceAsinController、AdminShopDataCrawlTasksController、AdminImageVideoTaskController、AdminUserController、AdminShopDataDuplicateCheckController、ProductCategoryControllertask-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 角色收口配套。
**待验证/修复项**
1. 超管"没展示全":本地栈以超管实测撞款接口(含分组筛选)返回店铺覆盖数 vs `biz_shop_manage` 全量;若快照数据源有限则确认"扫描基线"是否全量(超管触发扫描应覆盖全部,管理员扫描仅其可管集→快照范围受限,此为数据模型固有,需向用户说明或按需扩大扫描范围)。
2. 管理员范围:非超管验证仅返回本组店铺(多账号对比)。
3. operator.superAdmin() 来源核验(AdminAuthSupport 角色判定仅 super_admin 为真)。
## 依赖与顺序
1. 模块 B 先行(修复筛选,需 Java 重打包 + 本地栈重启)——验收基准确认。
2. 模块 A 按域分页推进(account 3 页 → asin 4 页[invalid/query/categories/skip] → shop 2 页 → records 2 页 → tasks 2 页),每批对齐+测试+commit,沿用样办断言模式对齐。
3. 模块 C 与 B 并行验证;超管全量如涉扫描基线/数据源则出方案与用户确认。
## 验收
- 每页:旧版观感目检 + 该页 align-* 断言(自绘结构)+ `npm test` 全绿 + `npm run build` + 本地栈截图。
- 筛选:逐页输入条件→查询→结果正确过滤(请求参数 snake 命中后端)。
- 撞款:超管/管理员两账号各验一次范围。