huangzd1997
|
882ccdac12
|
refactor(品牌工具页): 抽取 formatDateTime 与 uploadPathsToJava 公共工具
- 新增 shared/utils/datetime.ts:13 个品牌页逐字重复的 formatDateTime 收敛为一处;
语义不同的 3 个变体(toLocaleString / 字符串切片 / 支持时间戳)保留不动
- 新增 shared/utils/upload-to-java.ts:10 个品牌页的上传循环收敛,api 依赖注入便于单测;
保留 uploadOss(品牌Tab)与 returnEmptyWhenUnavailable(跟价)两处行为差异
- 补 datetime / upload-to-java 单测 10 例
净减约 327 行;vue-tsc 构建与 690 个前端单测全通过
|
2026-09-13 23:16:59 +08:00 |
|
huangzd1997
|
b70557a077
|
feat(认证/通知): 单设备登录互踢 + 站内通知铃铛系统
- 单设备登录:登录成功即 last-login-wins 绑定 users.machine;非超管旧 token
在下一次受保护请求抛 4011 下线,超管豁免;仅认 token 内签名 deviceId,不用请求头。
前端两端接入踢下线跳转(?kicked=1 提示),V118 清空历史 machine
- 站内通知:新增 notification 模块(任务失败扫描 / 密钥欠费 / 下游服务探测三类来源),
前后台铃铛组件 + 轮询;后台列表按主管数据范围(UserDataScopeSupport)过滤;V116 建表
均已于 2026-09-13 部署上线,此次补提交源码(此前仅存在于已部署 JAR/构建产物中)
|
2026-09-13 23:08:22 +08:00 |
|
huangzd1997
|
a0f6582914
|
feat(密钥管理): 代理配置后台明文展示 + 按次统计各密钥调用损耗
- 后台密钥管理「代理设置」列改为完整明文展示(含账号密码),便于运维核对;
新增 full 字段仅对代理模块下发,密钥两列保持脱敏
- 新增 biz_user_secret_usage_daily(V117):用户 × 模块 × 天累计真实对外请求次数
- 计次口径:LLM 每次真实 HTTP 请求(含重试)计 1 次;代理每次成功提取计 1 次
- LLM 埋点走 SecretUsageContext 上下文(批次外设置、线程池内快照恢复)
- 新增内部上报接口 /api/internal/user-secret-usage(X-Internal-Token)
- 新增后台页「密钥用量统计」:日期范围 + 用户名 + 分组筛选,含范围内汇总
|
2026-09-13 21:56:46 +08:00 |
|
huangzd1997
|
0c98c5bc15
|
docs(auth): 修正 JWT 默认密钥注释——桌面客户端本地 Flask 退役后服务端可独立轮换
原注释称"客户端内置同一密钥,服务端不能换"已过时(本地 Flask 与 /api/auth/sync
验签链路已随服务端化退役),会误导运维不敢轮换;2026-09-13 生产已轮换为
application-server.yml 独立密钥并验证。
|
2026-09-13 21:44:20 +08:00 |
|
huangzd1997
|
1066625078
|
feat(品牌服务): 内部接口按 uid 供用户代理提取链接;代理检测改真实提取+转发探测
- 新增 /api/internal/user-proxy(X-Internal-Token 自校验,18080 公网可达必须校验),
供主机 A 品牌检测服务(15126)按 uid 取用户代理提取链接,未配置返回空串
- 代理检测修复"假通过":旧实现把提取链接直接当静态代理交给 HttpClientPool,
链接无显式端口解析失败静默回退直连,检测到的是自家站点直连响应(40 个用户
3-39ms 全 301 假通过);现在先真实提取一次(余额不足/解析失败如实报),
再经提取到的代理请求自家域名,兼容旧静态代理地址
|
2026-09-13 21:21:48 +08:00 |
|
huangzd1997
|
fe052879bd
|
fix(用户管理): 删除用户时级联清理服务端密钥,修已删账号留下孤儿密钥行
biz_user_api_secret 按 uid 绑定且无外键,删除用户后密钥/代理配置成为无主行
(生产已出现 5 条孤儿)。deleteUser 内同步调用 adminClearByUser 并纳入同一事务,
删除失败(行不存在)时不触碰密钥。
|
2026-09-13 21:21:45 +08:00 |
|
huangzd1997
|
51c5fe1129
|
fix(任务中断): 已终态任务也幂等刷新缓存/快照,修历史遗留的处理中卡死
第一次修复只在 DB 刚被改成 FAILED 时同步缓存;对 DB 已是终态、但 Redis 里
仍缓存 RUNNING 的历史任务不生效(真机:28094 反复调中断仍返回 progress=RUNNING)。
现在无论是否刚更新 DB,都按 DB 现值同步模块缓存与进度快照,可自愈。
|
2026-09-13 15:46:18 +08:00 |
|
huangzd1997
|
3d208ea0e5
|
fix(任务中断): 标失败时同步模块缓存与进度快照,修"处理中"卡死
客户端重启上报中断只改了 file_task,模块缓存/进度快照仍是 RUNNING,
导致 progress/batch 继续回报 RUNNING:前端任务面板永远"处理中"并阻塞该工具后续任务
(2026-09-13 真机:店铺数据采集 28094 history=FAILED 但 progress=RUNNING,界面卡住)。
markInterrupted 现在同时刷新模块缓存(saveFileTaskCache)与进度快照(新增 markTerminal)。
|
2026-09-13 15:16:14 +08:00 |
|
huangzd1997
|
a4f60ef21c
|
fix(权限): 用户菜单权限“自己没掉”——分区落库时级联清理跨类型误删 + 编辑弹窗空授权提交
- 级联清理的有效集改为按目标「完整直接授权」计算(读库,含 admin/app 全类型)。
此前 admin/app 分区落库把本次提交的 id 当成完整有效集,员工持有的另一类型授权
会整体被判越权删除;两次分区落库互相补刀,最终清空员工全部菜单权限
(生产表现:保存某非超管的权限后,他直建员工的菜单隔三差五自己消失)
- AdminUserService 改为两类落库完成后再统一级联一次,新增 cascadeSubordinateOverreach 入口
- 后台「编辑用户」弹窗:授权未加载完成/失败时禁用保存并明确提示,
避免以空 columnIds 整树清空该用户授权(改动密码等操作也会连带触发)
- 回归测试:deferredCascadeKeepsSubordinateGrantsOfOtherMenuType、
perTypeReplacementDoesNotCascadeBeforeAllTypesWritten、edit_user_dialog_blocks_save_until_auth_loaded
已知既有红测试(与本次改动无关,干净 HEAD 上同样复现,未新增):
ArchitectureBoundaryTest.taskToBusinessDependencyDoesNotGrow(110 > 基线 84)、
HttpClientTimeoutEffectiveTest.connectTimeoutFiresOnUnreachableHost(本机网络环境 60s)
|
2026-09-13 14:18:01 +08:00 |
|
huangzd1997
|
3f6ad0c6ad
|
feat(后台分组): 分组筛选与分组列仅超管可见,非超管一律隐藏
管理员/普通用户数据已由后端裁剪到本人可访问分组,分组维度对其无意义;
账号归属分组是超管职责,故只有超管需要按分组筛选与区分。
- 隐藏分组筛选+分组列:品牌数据库、查询ASIN、最低价ASIN、去重总数据、
店铺管理、用户密钥
- 仅隐藏分组展示:店铺数据记录(筛选框+卡片行)、图片视频任务(所属分组行)、
撞款检测(明细抽屉分组列+卡片分组标签)
- 弹窗分组选择保留展示但锁定:非超管仅1个可访问分组时自动选中并置灰
(查询/最低价ASIN 另联动加载该分组店铺),多分组不锁以免限制用户
- 空数据行 colspan 随列显隐动态化
- 新增 tests/align-group-visibility.test.ts 回归守卫(5 条)
|
2026-09-13 14:00:19 +08:00 |
|
huangzd1997
|
0323f0bb7b
|
fix(密钥管理): 分组口径改为「分组创建人名下用户」
- 生产分组成员表 biz_shop_manage_group_member 基本未使用(仅 2 条老数据),导致分组列恒空
- 实际归属:分组 created_by_id/user_id 即主管,其组员为 users.created_by_id 指向该主管的用户
- 分组名批量查询与按分组圈人 SQL 均按此关系重写;按分组筛选含组长本人
- 无分组记录的用户分组列回退展示「所属主管(未建分组)」,避免空值
|
2026-09-13 13:42:06 +08:00 |
|
huangzd1997
|
1b733b23b9
|
feat(密钥管理): 按数据权限分组隔离与筛选
- 后台密钥列表改为按 biz_shop_manage_group 分组:主管只看自己带的分组成员,超管看全量可按 group_id 筛选
- 行数据补「所属分组」名称(批量查询);列表接口带回分组筛选项
- 修复超管筛选不生效:前端筛选参数统一 snake_case(camel 被后端静默忽略)
- 列表列/筛选项文案由「所属管理员」改为「分组」
|
2026-09-13 13:34:08 +08:00 |
|
huangzd1997
|
05ae0c62d6
|
feat(密钥管理): 后台分组过滤+欠费状态识别
- 后台密钥列表:主管只看本组子账户(created_by_id=自己),超管全量可按创建人筛选;行 VO 新增 createdById/createdByUsername
- 代理提取接口欠费(message=余额不足)识别为 insufficient_balance,不再静默回退直连
- 上游 LLM 网关欠费(code=insufficient_user_quota/预扣费额度失败)同样归为欠费并透传额度明细
- 前端:桌面设置面板显示"欠费",admin 后台单格药丸显示"欠费"、新增所属管理员列与超管筛选
|
2026-09-13 13:22:14 +08:00 |
|
huangzd1997
|
4bc4969e5a
|
docs(backend-java): 恢复 flyway 迁移模板/演练/盘点文档(原来只在未合入的并行分支上,master 的 MigrationInventory/FlywayTemplate 契约测试一直红)
|
2026-09-13 13:03:33 +08:00 |
|
huangzd1997
|
8cd8390d95
|
fix(健壮性): Java OOM 三处 + 双TE 502 根因 + admin-vue 403 白屏
Java:
- similarasin Excel 解析改 EasyExcel 流式(原 WorkbookFactory 全量 DOM,大表 OOM)+ 魔数校验
- collectdata 结果组装改游标分批 + 导入改流式(原全量驻留内存)
- GlobalExceptionHandler 转发响应过滤逐跳头与实例标识头(双 Transfer-Encoding 导致 nginx 502 的根因)
admin-vue:
- 403(无后台权限,如工具号 token)与 401 同样跳登录页,修复后台白屏
- task-266 测试断言对齐 daily-files 端点演进
|
2026-09-13 12:58:49 +08:00 |
|
huangzd1997
|
2a766efb83
|
feat(客户端密钥面板): 代理设置支持连通性检测与状态展示
- 代理卡片新增检测按钮:地址有改动时检测输入值(不落库),否则检测/落库已存值
- 状态行展示检测结果(连通正常/失败原因/耗时),颜色区分通过/失败/警示
- 余量无数据时显示"余额查询暂不可用"占位
|
2026-09-13 12:14:41 +08:00 |
|
huangzd1997
|
afa8560369
|
style(后台密钥管理): 用户名列加宽至 260px 并允许换行,长用户名不再截断
|
2026-09-13 10:51:19 +08:00 |
|
huangzd1997
|
c81ebb7053
|
fix(前端测试): 修复 npm test 卡死——定时器泄漏 + 去套娃 + 强制退出/超时
- 根因:polling-backoff-recovery 测试断言失败后跳过 loop.dispose(),残留自续期定时器导致 node --test 子进程永不退出
- dead-code-cleanup:移除套娃用例 test_full_vitest_green(再跑一遍全量套件,放大问题),execSync 加 300s 超时;其余静态断言保留
- package.json:node --test --test-force-exit --test-timeout=180000
- CI workflow 前端测试步骤改为 npm test(与 package.json 单一来源)
- 修正 3 处过时期望值(轮询退避/品牌 files+taskType/巡店 delete_conditions)
- 验证:本地 666 用例全过,19-24s,无残留进程
|
2026-09-13 10:51:19 +08:00 |
|
huangzd1997
|
b7d4d325e0
|
feat(密钥管理): 列表按用户聚合三字段列 + 代理配置服务端上报
- Java:后台列表一行一用户(货源查询密钥/外观专利密钥/代理设置),行级状态三项全通过才算通过;检测/清空改为按用户;搜索仅按用户名(去 UID);新增代理检测(经用户代理请求自家域名)与代理掩码(隐去账密)
- 后台前端:三字段列改版 + 行级状态筛选 + 用户名筛选
- 桌面前端:登录加载密钥时补报本地代理(只填空缺不覆盖)、保存/清空代理实时上报
|
2026-09-13 10:47:19 +08:00 |
|
huangzd1997
|
82a782550e
|
feat(密钥): 用户 API 密钥服务端化——V115 按账号绑定存储 + 后台密钥管理页 + 桌面端全站拦截与配置引导
- 新增 usersecret 模块:外观专利/货源查询密钥从本地 localStorage 迁移至 biz_user_api_secret(AES 加密、按 uid 绑定)
- 后台「密钥管理」页:脱敏展示、立即检测、清空;每日 04:30 分布式锁定时巡检
- 桌面端:密钥设置面板走服务端、未配齐引导 /setup-secrets、代理余量展示
- 删除专利汇令牌全链路与密钥保留时长选择器
|
2026-09-13 10:03:59 +08:00 |
|
huangzd1997
|
d1b56918fa
|
fix(跟价): 指定ASIN文件提交改 fileKey + 服务端三形态解析兼容
- 前端 resolveAsinRequestPaths 改发上传返回的 fileKey(与去重/转换/采集一致),
修复安全加固后服务端按拼接解析绝对路径失败导致"ASIN 文件不存在或不可读"
- Java parseAsinRowsByCountry 三种形态解析:绝对路径直读 → tempRoot 拼接 → fileKey 反查,
均过 isInsideTempDir 穿越校验,不放开临时目录外读取
|
2026-09-13 03:01:56 +08:00 |
|
huangzd1997
|
441917bfce
|
feat(后台/店铺数据): 结果下载增加进度弹窗
批量打包下载与单店下载接入 axios onDownloadProgress,progress 弹窗显示
百分比;后端未回 Content-Length 时退化为 indeterminate 流动条,避免用户
在大 zip 下载期间以为页面无响应。
|
2026-09-12 11:42:33 +08:00 |
|
huangzd1997
|
037a689316
|
chore(日志): 服务端高频轮询日志降噪
-history timing 降debug;status无变化降debug;/history /list免INFO;stale-check合并单行;心跳常规响应降debug
|
2026-09-11 21:22:41 +08:00 |
|
huangzd1997
|
db7cd22ed1
|
fix(鉴权/测试): 用户态工具鉴权改开关控制(默认关)+ 修复既有测试编译与断言
- collect-data/price-track 兜底鉴权改由 aiimage.security.user-tool-guard-enabled
控制,默认 false:老客户端直连不带认证头,先开启会让线上集采/跟价全线 401,
待携带 X-Internal-Token 的新客户端铺开后再置 true
- 补齐 DistributedJobLockService 构造参数缺失的 6 个测试类(双活分布式锁
commit 只改了主代码,测试已无法编译);断言按"先删 DB 行再物理删"的现语义校正
|
2026-09-11 18:03:54 +08:00 |
|
huangzd1997
|
9962d9797e
|
feat(后台): 店铺密钥页支持配置静态代理 + 手动检测白名单——列表展示代理/失败次数,操作列加「检测白名单」按钮(绕过缓存真实请求并重置自动重试计数)
|
2026-09-11 17:18:27 +08:00 |
|
huangzd1997
|
47459e2089
|
feat(紫鸟): 令牌级静态代理支持——白名单被拒的 key 走已授权代理 IP
- shop_key 新增 proxy_url / ip_whitelist_fail_count(V114 迁移)
- HttpClientPool 支持按代理地址复用的静态代理客户端
- 白名单连续失败达阈值后停止自动重试,控制台可按 key 配置代理(改动自
上一工作阶段遗留,功能已编译验证)
|
2026-09-11 17:11:50 +08:00 |
|
huangzd1997
|
e6021593ea
|
fix(安全/健壮性): 全工作区审查修复——鉴权兜底扩展+路径穿越+忙等+泄漏
- AdminApiGuardFilter 兜底扩展到 /api/collect-data、/api/price-track:无需鉴权的
工具接口纳入 JWT/内部令牌校验(原匿名可达即越权读写他人数据)
- pricetrack asinFiles 改为仅允许上传临时目录内文件(canonical 前缀校验),
修复请求路径直接 new File 可读服务器任意 csv/xlsx 的穿越
- dedupe 删除导入逐行 REQUIRES_NEW 事务改 500 条一批 IN 删除,50 万行导入
由 50 万个事务收敛为千级
- 前端记住密码 XOR 硬编码密钥改 WebCrypto AES-GCM(密钥随机生成独立存储),
登录流程接口改 async 并保证自动登录恢复时序
- 任务进度轮询失败按指数退避(原固定 5s 无限撞);下载进度终态条目 2 分钟
自动清理(原永久堆积);AmazonConsolePage statusTimer 卸载清理
|
2026-09-11 17:11:43 +08:00 |
|
huangzd1997
|
540d6588e6
|
fix(紫鸟): 店铺索引刷新加轮级时间预算熔断——单轮超 8 分钟即中断,剩余 key 顺延下一轮(游标续跑),避免紫鸟接口半死时整轮占锁几十分钟阻塞后续定时轮
|
2026-09-11 17:02:13 +08:00 |
|
huangzd1997
|
2a9110ec32
|
perf(店铺): 后台添加/改名店铺后异步触发一次紫鸟索引刷新——防抖合并2分钟窗口+延迟10秒等事务提交,拿不到锁或失败不影响添加流程,不等5分钟定时轮
|
2026-09-11 16:54:16 +08:00 |
|
huangzd1997
|
51fb77ec25
|
perf(紫鸟): 店铺索引刷新提速——间隔 10→5 分钟、每轮批量 100→200 个 apiKey,新店铺未命中等待时间约缩短 3/4
|
2026-09-11 16:38:56 +08:00 |
|
huangzd1997
|
30d31fb318
|
feat(代理): 代理配置按登录用户隔离——桌面端 current_uid 登录同步 + brand 页 proxy_users[uid] 读写,各用户各自代理池各自计费复用(未登录回退全局 proxy_url 兼容旧配置)
|
2026-09-11 16:09:56 +08:00 |
|
huangzd1997
|
bb52574767
|
fix(更新检测): 版本比较改真实比大小——线上版本不高于本机一律不提示更新;本机高于线上时明确提示无需更新(灰度/回滚/漏发版场景不再被引导降级)
|
2026-09-11 16:09:53 +08:00 |
|
huangzd1997
|
cd055f8ccd
|
fix(内存): 两处无界内存风险加固——brand-check 线程池改有界队列+CallerRuns(大批量检查不再无界堆积 OOM);OSS readObjectBytes 加 20MB 读取上限防大对象误用 OOM
|
2026-09-11 16:09:50 +08:00 |
|
huangzd1997
|
c2915036d6
|
fix(调度): 双节点下 collect-data/publish/image-video 定时调度加 Redis 分布式锁互斥——双活原来各自扫描执行同一批任务,重复派发/重复终态判定
|
2026-09-11 16:09:46 +08:00 |
|
huangzd1997
|
8dc03df95b
|
feat(task): 客户端崩溃恢复接口 POST /heartbeat/{taskId}/interrupted——客户端重启发现上次进程崩溃时立即把残留 RUNNING 任务标终态,替代最长等 30 分钟的心跳超时兜底
|
2026-09-11 16:09:42 +08:00 |
|
huangzd1997
|
bb74c9a192
|
fix(task): 新增陈旧任务自动修复兜底——历史任务永久停留中间状态的排查与兜底
生产库排查发现三类脏状态:陈旧 PENDING/SCHEDULED 无调度器再捞(243条)、
心跳残留的万年 RUNNING、SUCCESS 但结果报错(上报契约问题)。
已手工修复 269 条;本提交补常驻兜底:每 10 分钟检查 PENDING/SCHEDULED/RUNNING
心跳(updated_at)超 120 分钟即标 FAILED,分布式锁防双实例重复。
只用心跳线、不限制总时长——超长真活任务不会被误杀。
|
2026-09-11 16:03:01 +08:00 |
|
huangzd1997
|
32985c78f3
|
feat(下载): 工具页统一下载进度条——AmazonToolPageShell 挂载 DownloadProgressPanel
进度条组件原先只挂在 ImageVideoPage 内的 BrandTopBar,而所有工具页(货源查询/去重/拆分/
转换/删除品牌/外观专利/跟价/商品风险/巡店删除/取款/查询ASIN/匹配店铺/采集数据等)都经
AmazonToolPageShell 渲染,导致这些页面下载结果时没有任何进度展示。
在外壳挂载后一次覆盖全部工具页:面板 position:fixed 且数据来自全局 store,跨页面切换不会
丢进度;桌面客户端下载走 pywebview 进度事件,浏览器 Web 版本就无下载能力。
|
2026-09-11 15:43:58 +08:00 |
|
huangzd1997
|
8e684b92dd
|
fix(下载): 各模块结果下载由流式代理改 302 重定向到对象存储直链——原实现在 Controller 内边读边写代理整个文件,请求线程被下载时长占满;且恒回 200 全量,客户端 Range 断点续传实际失效
覆盖 brand(/tasks/{taskId}/download)、delete-brand(任务 + 结果两处)、appearance-patent、
patrol-delete、price-track、withdraw、query-asin、product-risk、shop-match、shop-data-crawl
共 10 个 Controller,与既有的 convert/dedupe/split 302 实现对齐(ResponseEntity.status(FOUND)
.location(直链) + Cache-Control no-store),并补重定向 info 日志便于排查。
前端各 tab 本就通过 saveUrlWithProgress(url, filename) 传入文件名与下载 id,不依赖
Content-Disposition,故无需前端改动即可同时获得断点续传与进度回调。
验证:两节点重启后逐个实测 11 个端点均 302(含 brand 任务下载与巡店/跟价的有文件记录);
无文件时保持既有业务错误响应(HTTP 200 + success:false)。
|
2026-09-11 15:43:46 +08:00 |
|
huangzd1997
|
d54dbf72c9
|
fix(similar-asin): 结果文件下载改 302 重定向到对象存储直链——原流式代理让请求线程被整个下载时长占满,货源结果单文件常见 100MB+(任务 27609 达 130MB),并发下载即拖垮 Tomcat 线程池;且代理恒回 200 全量,客户端 Range 断点续传实际失效
原实现在 Controller 内 openStream 边读边写把整个对象代理给客户端,改为
ResponseEntity.status(FOUND).location(直链) 后:① 请求线程立即释放(实测响应
从"随下载时长占用"降到 ~10ms);② 直链支持 Range,save_file_from_url_new 的
断点续传才真正生效。前端本就优先用 item.downloadUrl 直链、该接口仅兜底且客户端
保存名由前端传入不依赖响应头,故无需前端改动。补一条重定向 info 日志便于排查。
|
2026-09-11 12:03:57 +08:00 |
|
huangzd1997
|
94a0c287e0
|
feat(客户端更新): 登录页/首页更新面板显示更新包下载进度条
- 新增 shared/utils/update-progress.ts:进度事件解析/百分比钳制/文案格式化(纯函数)
- 新增 shared/components/UpdateProgressBar.vue:两页共用,失败态琥珀色并停在断点
百分比、总大小未知走不确定态
- useVersionUpdate:先挂监听再发桥调用(避免丢首帧),监听 pywebview-update-progress
(Python 侧 evaluate_js 推送,同 pywebview-download-progress 约定);失败保留上次进度
- 测试:tests/update-progress.test.ts(8 用例)
兼容:老客户端没有该事件源,进度条不出现,其余行为不变(优雅降级)。
注:本仓库 modules-withdraw / modules-image-video 有 3 个既存失败用例(隔离复现),
与本次改动无关;全仓库仅新增测试引用本次新增模块。
|
2026-09-11 01:59:42 +08:00 |
|
huangzd1997
|
47b2758fe8
|
fix(security): /debug/** 纳入兜底鉴权——修复 debug 端点可被匿名调用(含写操作)
2026-09-11 实测确认(本机公网直连):
http://47.110.241.161:18080/debug/request-info → 200 匿名返回实例元数据
http://api.aishufu.top:18080/debug/request-info → 200
https://api.aishufu.top/debug/request-info → 200
根因:SecurityConfig 是 anyRequest().permitAll(),唯一兜底过滤器 AdminApiGuardFilter 只覆盖
/api/admin/**(shouldNotFilter 对其它路径一律放行),而 modules/debug 两个控制器均无
@Profile/@ConditionalOn*/@PreAuthorize。其中 POST /debug/task-recovery/run-stale-finalize
是强制收尾指定 task 的写操作。
修法:不删端点(stale-task-finalize-guidelines.md 明确把该接口列为线上应急工具),
改为把 /debug 前缀纳入既有兜底过滤器——URL 不变、runbook 不破、复用已测鉴权逻辑,
应急调用方改用 X-Internal-Token 或管理员 JWT 即可通过。
另加 /debug 放行审计日志,便于事后追溯这类低频敏感调用。
单测 13 个全绿(新增 5 个):匿名调 /debug/request-info 与 run-stale-finalize 均被 401 拒绝、
带内部令牌可直达 controller、/debug 裸前缀纳入保护、/debugging 与 /debug-tools 等
同前缀不同段的路径不被误伤。
|
2026-09-11 01:33:58 +08:00 |
|
huangzd1997
|
dd45ffe34c
|
chore(清理): 删除死代码与过期文件——7个无引用DTO+图片工作台整棵子树(16文件)+冗余副本+一次性脚本+可再生审计快照
每项删除前均做过全仓库引用核对(含 tests/、两个前端、Python 侧):
- Java 7 个 DTO:BrandTaskRunRequest、LegacyBrandTaskCreateVo、Ziniao{SwitchShopRequest,CurrentShopVo,LoginUrlVo,SwitchShopVo}、
AppearancePatentParsedGroupManifestDto —— 全仓库仅命中声明行本身
- frontend-vue 整棵 src/pages/image/(16 文件):9a487ae9 起首页一级入口已删("图片已并入视频页"),
该子树完全自闭环;同步移除 /image 路由与 ImageVideoPage 的图片入口
- frontend-vue 两个孤儿组件 AiModuleSwitch/AiWorkflowShell:无引用,且位于 src/shared/components
而非 unplugin-vue-components 默认扫描的 src/components,不存在自动注册
- backend/tool/devices.py + .device_id:app_client/tool/devices.py 的冗余副本(活的是 app_client 那份),
app.py 只注册 version_bp,无任何引用
- admin-frontend-vue 的一次性 Playwright 调试脚本 rescan.tmp.mjs / diag-role-price.mjs
- backend-java/scripts/*_report.json ×4:可由 n1_scan.py 等重跑的审计快照
- frontend-vue/DESIGN.md:Last refreshed 2026-06-09,仍是 MPA 时代内容
- backend/requirement.txt:pip freeze 63 条裁剪为实际 import 的 5 条;run.sh 硬依赖该文件存在,故保留文件本身
验证:mvn compile 通过、vue-tsc --noEmit 通过、残留引用 grep 零命中。
注:仓库既有的 4 个失败测试类(FlywayMigration*DocTest、MigrationInventoryTest、HttpClientTimeoutEffectiveTest)
经 stash 对照实验确认与本次改动无关(相同 Failures/Errors 计数)。
|
2026-09-11 01:33:54 +08:00 |
|
huangzd1997
|
48ee76d60d
|
fix(patrol-delete): 任务跑完不出现「下载结果」按钮——轮询在任务终态即停,而结果 Excel 由 Java 侧 MQ 异步生成,两者时间窗内前端本地的 fileReady 永远停在 false
现象:任务 27547(用户 996)15:06:31 创建、15:12:20 完成,结果文件 15:12:20 已生成并上传 OSS
(result/patrol_delete/.../巡店删除-27547.xlsx,4033 字节,直链与 /results/{id}/download 均 200),
但页面上始终没有下载入口,用户只能靠刷新页面才刷出来。
排查(生产日志时间线):结果文件任务 15:12:10 入队(MQ)、15:12:20 完成;前端最后一次拉取
history/progress 是 15:12:12,之后客户端再无任何请求——即前端是在 fileReady 尚为 false 时停的轮询。
根因:waitForTaskTerminal 只认 taskStatus(SUCCESS/FAILED)就 return,随后 clearActiveQueueTask()
令 hasQueueWork=false、stopHistoryPolling() 停掉历史轮询,refreshTaskViews() 也只跑这一轮。
taskStatus 是 Python 端回传完毕的信号,而 Excel 是 Java 收尾后(finalizeTaskWorkbook →
enqueueAssembleResult)异步生成的,中间有数秒到数十秒间隔;错过就再也不会刷新,本地 fileReady
永远为 false,canDownload() 恒假 → 历史记录里不渲染「下载结果」按钮。
修复:
① 新增 isResultFilePending():判定「确实有文件任务在生成」(fileJobId 存在或
fileStatus=PENDING/RUNNING),文件已就绪(fileReady/downloadUrl)或已终态
(SUCCESS/FAILED)则不再等待;全部店铺失败的任务本就不生成文件(fileStatus 为空),不会被误等。
② waitForTaskTerminal 在任务终态后继续轮询至文件就绪,上限 MAX_FILE_WAIT_ROUNDS=12(≈2 分钟),
期间 queuePushResult 提示「正在生成结果文件(n/12)」,超时打 warn 后按终态返回,不阻塞队列。
③ 新增 settlePendingResultFiles():页面加载时若历史里存在「任务已完成、文件仍在生成」的记录
(在生成窗口内刷新页面/重开客户端的场景),继续轮询收敛,避免同一个坑的另一个入口。
仅在无未完成任务时执行,避免与 processQueue 重复轮询。
与同类页面对齐:BrandAppearancePatentTab 早已用 pendingFileTaskIds 等文件就绪再停轮询,
巡店删除页缺这一环。日志按规范用中文,关键分支(等待/超时/收敛完成)均有输出便于线上排查。
|
2026-09-10 15:26:59 +08:00 |
|
huangzd1997
|
5af4e1c23e
|
fix(admin-vue 查询ASIN): 列表筛选/分页参数对齐后端 snake_case,导出 XLSX 带上当前筛选
- query-asin-filter: toQueryAsinQuery 输出 page_size/group_id/shop_name(35bed42b 后端已改显式 snake,
camel 参数被静默忽略导致分组/店铺名筛选无作用、pageSize 固定回落 15)
- 新增 query-asin-export: 按当前筛选构建导出 URL,页面「导出 XLSX」不再恒为全量
- query-asin-import-api: 导入兜底分组 groupId→group_id(后端 importExcel 已改名,此前同样被丢弃)
- query-asin-delete-import-api: 保持 groupId 并加注释(后端仍隐式 camel,统一需两端同步部署)
- task-71 测试断言更新为 snake 契约(含 camel 不下发反断言)+ 新增导出 URL 用例
已上线 admin-vue-20260910-145200,线上 chunk 验证含 snake 参数;task-71 10/10 通过,vue-tsc 通过
|
2026-09-10 14:53:57 +08:00 |
|
huangzd1997
|
b9768aac5e
|
test(shop-data-crawl): 修复 ShopDataCrawlTaskServiceRetentionTest 因构造依赖漏 mock 导致的 NPE——Task 35 给 ShopDataCrawlTaskService 新增了 shopDataCrawlItemStoreService(行级明细落库)与 TaskProgressLightAssembler 两个构造依赖,而本测试的 @Mock 列表未同步更新;@InjectMocks 走构造注入时没有对应 @Mock 的构造参数会被传 null,于是 assembleDailyWorkbook 里的 saveShopBatchFromSnapshot 调用直接 NPE(11 用例 2 失败 5 错误,表现含'期望 IllegalStateException 实为 NullPointerException')。补两个 @Mock 后 11/11 通过,相关模块 310 用例全绿
|
2026-09-10 14:34:55 +08:00 |
|
huangzd1997
|
08e78ebe55
|
fix(shop-data-crawl): 累计档迁独立桶 shufu-shop-data 脱离默认桶30天过期规则+修复批量下载zip恒失败——① 新增 aiimage.oss.shop-data-bucket(默认 shufu-shop-data):上传侧 resolveBucket 按 SHOP_DATA_CRAWL、读取/删除/直链侧 bucketForObjectKey 按 result/shop_data_crawl/ 前缀双路路由(DB 里存的是裸 objectKey 不含桶名,key 不变故存量对象 mc mirror 即无缝切换),configuredBuckets 纳入新桶,启动自检未配置时告警 ② 批量下载 zip 原直接把 df.result_file_url 当绝对 URL(URI.create().toURL()),裸 objectKey 必抛 no protocol 导致整包 100% 失败,改由 loadDownloadRows 统一走 generateFreshDownloadUrl 拼直链 ③ 补 OssStorageServiceTest 5 用例覆盖此前零覆盖的上传选桶/裸key前缀路由
|
2026-09-10 14:31:00 +08:00 |
|
huangzd1997
|
6fe67b648f
|
feat(patrol-delete): 删除条件改为添加式交互——输入后回车/点添加逐个加入chips列表(可单项移除),去掉原'保存到条件库+勾选'两步式与已知状态下拉,启动时随任务携带条件
|
2026-09-09 19:06:27 +08:00 |
|
huangzd1997
|
96e93944d9
|
fix(patrol-delete): 删除条件为空的任务四层拦截——①前端启动前拦截(不再先创建后失败,避免任务残留执行中)并创建时上传delete_conditions ②Java服务端校验删除条件非空(旧版本/直调兜底) ③Python端空条件直接按失败上报,不再逐店空转
|
2026-09-09 18:59:45 +08:00 |
|
huangzd1997
|
0cf20527a4
|
fix(frontend): 菜单点击偶发无响应三处根因——①路由懒加载chunk失败被静默吞掉(新增onError自动整页重载+保险丝防循环) ②首页入口被权限接口阻塞(改乐观显示+缓存TTL10分钟+超时30s→8s) ③菜单hover预取目标页chunk(工具卡片/工作流步骤/顶部导航)
|
2026-09-09 18:53:34 +08:00 |
|
huangzd1997
|
83cb3ff84e
|
style(frontend): 全站背景图 webp 化(bg.jpg 4MB→251KB 压缩 + bg.webp)+品牌工具页默认策略调优(品牌检测默认改精确匹配 Simple、Terms 后置)+任务面板/登录页/亚马逊控制台观感微调
|
2026-09-09 18:32:56 +08:00 |
|