Commit Graph

104 Commits

Author SHA1 Message Date
huangzd1997 db6869b77e perf(LLM任务): 首查短超时快速失败 + 退避抖动 + 标题失败跳过外观识别
生产 24h 数据:外观专利任务 LLM 重试失败 93+82 次几乎全是超时,
终态 41 行降级为「外观识别异常」;成功调用 p99=34s、超 60s 仅 0.02%。
原策略每轮重试都挂满 90s(被全局 call-timeout 钳制),且 1.5s/3s
密集重试整批落在同一劣化窗口内。

- 第 1 次尝试改用 llm-first-attempt-read-timeout-millis(默认 60s)快速失败,
  重试走完整读超时,慢而成功的正常调用不被误杀
- 重试等待改 LlmRetryBackoff:2s/10s + ±30% 抖动,覆盖更长窗口并打散同批尖峰
- 外观专利标题识别失败时跳过外观请求(该行必走回退,外观结果本就会被丢弃)
2026-09-14 00:28:40 +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 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 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 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 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 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 197643a8fa fix: 商标查询失败自动重试、货源结果图切回Excel内嵌防WPS #REF、外观专利标题模型改gemini-3.8-flash
- brand-check: 单品牌商标查询失败(异常/空响应/query_faild_data 非空)自动重试,
  次数与间隔可配(retry-times 默认3含首次 / retry-interval-millis 1000),命中侵权不重试;
  collectdata 品牌过滤与外观专利商标核验两侧同时受益
- similarasin: 货源结果Excel图片由WPS DISPIMG 切回 Excel 365 richData 单元格内嵌,
  修复 WPS 打开 DISPIMG 显示 #REF 的兼容回归;下载失败单元格回退为URL文本
- appearance-patent: 标题商标提取模型由 deepseek-v4-flash 切 gemini-3.8-flash
2026-09-08 19:01:08 +08:00
huangzd1997 f2906e8d6f fix(delete-brand): 分片缺失降级组装收尾+失败兜底生成可下载结果
- 结果分片缺失 ≤ missingChunkFallbackLimit(默认20) 时降级组装,缺失行标「未回传」,任务不再整体白跑
- 超阈值失败/组装异常时通过 ResultFileJobHandler.fallbackAssembleOnFailure 兜底生成部分结果文件
- 组装失败文案带缺失分片号明细(如 缺失分片: [247](已收 4283/4284))
- 新增 GET /api/delete-brand/tasks/{taskId}/missing-chunks,补传后自动恢复终态失败组装 job
- stale-check 失败文案改为含最后心跳时间与最近组装失败真实原因(修复误导性「回传长时间无响应」)
- 新增降级合并/缺失分片单测,Handler/Worker 日志审计 stage 白名单补 FALLBACK
2026-09-08 13:18:58 +08:00
huangzd1997 83e38d4278 fix(similarasin): LLM 切换 gemini-3.8-flash + 修复双实例 stale 判死盲区
- 模型切换:glm-5.3-flash / gemini-3.7-flash(类目/合规/图片对比,appearancepatent)→ gemini-3.8-flash
  涉及 SimilarAsinProperties、AppearancePatentProperties、application.yml、TLS 探针与测试断言
- stale 判死盲区:finalizeStaleTasks 去掉 isOwnerCurrent 过滤,改由 job 锁持有实例全局判死
  (任务 27117 线上死因:客户端 done 信号被任务锁拒后断线,owner 过滤导致无人判死,
  被另一实例 job stuck 扫描误判为"文件生成任务运行超时";appearancepatent 同源盲区一并修复)
- 客户端回传重试:3x2s → 8 次,40902 锁忙固定等 15s(app_client/similar_asin.py,随客户端发包生效)
2026-09-07 22:10:20 +08:00
huangzd1997 289f4488f9 fix(auth/logout): 禁用内置 LogoutFilter,登出改走 auth 模块清会话 cookie
POST /logout 原先被 Spring Security 内置 LogoutFilter 截走(204),只清空
SecurityContext,从不执行 LoginController.logout,导致 aiimage_token cookie
残留、退出登录后仍保持登录态。SecurityConfig 显式 logout.disable() 后请求
落到 POST /logout → 200 + Set-Cookie aiimage_token=;(Max-Age=0) 清除。
补充真实登出 E2E(live):登出返回 200、下发清除 cookie、无 cookie 后 401。
注:此前的 500/CNFE 系运行进程 jar 被覆盖为 thin jar 所致,重建 fat jar
并重启即恢复;本提交只改逻辑。11/11 live 用例通过。
2026-09-05 14:49:52 +08:00
huangzd1997 40224d8e56 fix(backend-java): 收口并发资源与恢复链路 2026-09-05 14:44:00 +08:00
huangzd1997 01e8c608e7 task-212(部分): 04 Handler SPI 实现迁回各业务模块(依赖反转大头)——13 个 *ResultFileJobHandler 从 modules/task/service 迁到各自模块 service
- TaskFileJobConfig 与相关测试 import 同步到新模块包;MappingSnapshot 源码路径按模块映射
- task 模块对业务 import 由 16+ 文件降到 3(TaskHeartbeatService/TaskResultFileJobWorker/ModuleHistoryCleanupService 尚需心跳/worker/清理 SPI 化)
- 全量回归 2308 测试 0 失败
2026-09-05 10:11:53 +08:00
huangzd1997 3ee281a433 fix(similarasin): LLM 默认模型改为 glm-5.3-flash(原 gemini-3.5-flash-lite/gemini-3.7-flash 在 ai.t8star 端点不可用,按指示统一) 2026-09-05 09:48:19 +08:00
huangzd1997 b468750d00 task-190: 日志脱敏契约(StructuredLog.maskToken 统一 Token 部分脱敏,ImageVideo maskForLog 委托;URL query/异常消息体不入日志、防注入)+ 8 条测试 2026-09-04 23:53:23 +08:00
huangzd1997 620ee15a48 task-178: 日志字段规范落地(StructuredLog 规范字段集+缺失占位+值消毒,字段名冻结)+ 8 条测试
- 规范字段 traceId/taskId/moduleType/stage/submissionId/chunkIndex/chunkTotal/jobId/result/errorType,顺序与 spec11 §2 一致
- format 只输出规范字段、缺失用 "-" 占位、换行/控制字符消毒、超长截断,防日志注入与字段漂移
- 源码锚点断言 Worker(task-file-job)/心跳(task-heartbeat) 代表性日志已带 taskId/moduleType 核心字段;不删现有日志
2026-09-04 23:37:50 +08:00
huangzd1997 05da03c5ba task-176: 重试计数与日志字段(IdempotentRetryGuard 观测扩展:WARN 日志字段 + aiimage.http.retry 指标)+ 8 条测试
- 重试/最终失败打 WARN:client/url(去 query)/method/retry/耗时/延迟/原因类名,不打印含敏感信息的异常消息体
- 重试记 aiimage.http.retry 指标(method/client 标签),Micrometer 注册表可选,无注册表静默跳过
- 保留 task-172 原 API(构造器/execute 兼容),原 8 条测试不受影响;守卫仍不接调用点
2026-09-04 23:29:13 +08:00
huangzd1997 e248b2b935 task-172: 幂等重试守卫(仅 GET/HEAD 或显式幂等标记在传输错误时自动重试,次数/退避取自配置并封顶)+ 8 条测试
- IdempotentRetryGuard:isIdempotent/backoffMillis/isTransportError/execute 纯策略组件
- 非幂等(POST 等)不自动重试;退避 2 次幂增长、5s 封顶;总尝试严格受 aiimage.http-client.max-retries 约束防风暴
- 仅新增类与测试,不接调用点,零生产行为变化
2026-09-04 23:13:41 +08:00
huangzd1997 c1f03d64d1 task-171: 图片下载客户端配置接入(ImageDownloadHttpConfigResolver,download/prefetch 模块级现有配置优先、命名空间兜底)+ 8 条测试
- 真实基线:SimilarAsinImageEmbedder(OkHttp) connect/read=imageDownloadTimeoutSeconds(5s)、call=2×download(10s)、prefetch 1800s
- resolver 提供 connect/read/call/prefetch/maxRetries 访问面,模块级优先、命名空间兜底,不改调用点
- 仅新增类与测试,零生产行为变化
2026-09-04 23:10:36 +08:00
huangzd1997 ec23c0d77c task-170: 紫鸟客户端配置接入(ZiniaoHttpConfigResolver 超时/重试读取,read 模块级现有配置优先、命名空间兜底)+ 8 条测试
- resolver 提供 connect/read/call/maxRetries/baseRetryDelay 访问面,不改动 ZiniaoClientImpl 调用点
- read 优先取 aiimage.ziniao.read-timeout-seconds(生产默认 15s,与 requestFactory(15000) 现状一致),未配置回退 aiimage.http-client.*
- 仅新增类与测试,零生产行为变化
2026-09-04 23:07:58 +08:00
huangzd1997 8241cd704e feat(admin): A1 管理后台收敛 Java 单后台完整实现并修复 guard 误拦内部令牌
Build Backend JAR / build (push) Has been cancelled
- Java 补齐后台全部迁移差集:shopduplicatecheck 店铺数据重复检查模块(V108 扫描表+查询/扫描服务)、
  PinyinAbbrUtil 拼音缩写、ImageHistory 接口调整为内部可用、AdminUser 支持内部令牌操作并放宽列表上限
- Flask 后台 admin_api.py 路由收敛转发 Java、admin.html/admin.js 适配新后台形态
- AdminApiGuardFilter 对可信 X-Internal-Token 放行(controller 自校验兜底),修复客户端仅凭
  内部令牌调用 /api/admin/shop-manages/credential 被误拦 401
- 测试:AdminApiGuardFilterTest 补可信/假令牌用例;AdminUserServiceTest 补菜单权限 mock;
  shopduplicatecheck 新增查询/聚合/CSV 单测
2026-09-04 11:30:09 +08:00
huangzd1997 3420c72c1d fix(oss): 软件版本安装包显式上传公开 client 桶,对齐历史直链布局
Build Backend JAR / build (push) Has been cancelled
生产 Java 未设 AIIMAGE_OSS_BUCKET,默认桶为私有 nanri-ai-images;而 web_config
历史版本全部存于公开 client 桶(oss.aishufu.top/client/nanri-image/versions/...,
桌面端检测更新匿名下载)。原 uploadSoftwareVersionPackage 走默认桶会把新版本写入
私桶导致客户端无法下载。改为显式写 software-version-bucket(新增可配属性,默认
client,env AIIMAGE_OSS_SOFTWARE_VERSION_BUCKET)并保持 nanri-image/versions/ 前缀。

注:本提交含 OssStorageService 上"软件版本上传"方法与早前 readObjectBytesBounded
改动,为软件版本模块(见 ③)的配套存储能力。
2026-09-04 10:21:47 +08:00
huangzd1997 e5909c9977 fix(admin): 补齐 /api/admin 方法级鉴权并加兜底过滤器
ShopKey/SkipPriceAsin/QueryAsin/ShopManage/ProductCategory 五个 controller
此前无任何 require* 鉴权,SecurityConfig 全局 permitAll 且 nginx 无 ACL,
公网 18080 上可匿名读写店铺密钥等敏感数据。统一补 requireAdminOrInternal;
其中 ShopManage/SkipPrice/QueryAsin 原先信任调用方传入 operatorId/superAdmin,
改为从已认证 principal 推导,消除传 superAdmin=true 越权扩大数据范围的问题。

新增 AdminApiGuardFilter 对 /api/admin/** 兜底要求有效身份(JWT 或内部令牌),
防止后续新增端点遗漏鉴权再裸奔;支持 admin-guard-enabled/exempt-prefixes 配置。
2026-09-04 10:21:12 +08:00
huangzd1997 417a2bf831 后台店铺数据记录页新增 Tab 切换与重复 ASIN 分析;task-169/170 HTTP 客户端配置接入;dedupe/brand 相关改造
Build Backend JAR / build (push) Has been cancelled
- 管理后台:店铺数据记录改为列表分页展示(去任务号/文件列/累计标题,'最新'改'更新时间'),新增'重复 ASIN' Tab 按跨店聚合展示 ASIN/店铺/分组/国家/日期/价格;修复失败/进行中任务被过滤不显示的问题
- task-169: BrandCheckHttpConfigResolver 从 aiimage.http-client.* 读取品牌检查超时/重试(默认同现状、钳制),附 8 条测试
- task-170: surefire 内存调整为 1536m
- dedupe: DedupeRunService 重构(事务边界/进度)、新增 DedupeRunProgressVo、Controller 与结果 VO 调整,PermissionMenuService 相应适配
- brand/dedupe 前端:BrandDedupeTab/BrandPatrolDeleteTab 改造、新增 CountrySelector 组件与 country-options、类型与接口端对齐、测试更新
- 移除无引用文件:backend/static/logo.jpg、prompts/
2026-09-03 01:57:41 +08:00
huangzd1997 162ed7e406 task-168: LLM 客户端配置接入(LlmHttpConfigResolver 从 aiimage.http-client.* 读取超时/重试,默认值同现状、钳制、可覆盖)+ 8 条测试 2026-09-02 08:16:12 +08:00
huangzd1997 8ca5b1d53b task-167: aiimage.http-client.* 配置命名空间(connect/read/call 超时与重试默认值同现状、非法值钳制、env 覆盖)+ 8 条测试;surefire 加 MaxMetaspaceSize 修复 fork 内存崩溃 2026-09-02 08:00:19 +08:00
huangzd1997 035ec9ac79 task-161: 巡检任务开关(aiimage.inspection.enabled 默认 disabled、cron 调度、分布式锁双实例去重、单巡检异常隔离、limit 透传)+ 8 条测试 2026-09-02 07:19:56 +08:00
huangzd1997 87a6d20f88 task-154: 临时目录磁盘容量告警(aiimage.storage.capacity-warn-bytes 阈值、告警含当前容量/阈值、10 分钟频率限制、测量失败容忍不阻塞)+ 8 条测试 2026-09-02 06:40:20 +08:00
huangzd1997 e2607ab723 task-98: 移除 similar-asin/appearance-patent 模块 Coze,状态机与共享组件改名 LLM
Build Backend JAR / build (push) Has been cancelled
- similarasin/appearancepatent 模块全部 Coze 工作流调用改走 direct-LLM(已确认唯一运行路径)
- 共享组件改名:CozeTaskQueueGate→TaskQueueGate、CozeGroupResultPropagator→GroupResultPropagator
- 状态机改名:biz_task_scope_state 的 coze_* 列→llm_*、stateJson coze 键→llm(V100 迁移已应用生产)
- 删除 biz_coze_credential 表、CozeCredential* 类、SimilarAsinCozeClient、AppearancePatentCozeClient→LlmClient
- 前端 brand 页 Coze 文案→LLM;Python 后端删除 cozepy 依赖与死配置
- 修复 TaskResultFileJobWorker 启动失败:TaskFileJobConfig 注册 ResultFileJobHandlerRegistry 与 13 个 handler bean(含 validateCoverage 启动校验)
2026-09-01 02:20:50 +08:00
huangzd1997 c8cd851b2f feat: 外观专利改直连 LLM(DeepSeek/Gemini)、无效ASIN菜单更名 BRAND_DB、紫鸟店铺索引场景化
Build Backend JAR / build (push) Has been cancelled
- AppearancePatent:Coze 工作流切换为 llm-host 直连模型(title/appearance 双模型、行并发、重试),配置键迁移并保留旧环境变量兜底
- InvalidAsinDataMapper 补充按值+品牌唯一键查询
- ZiniaoShopIndexService 新增店铺分类/索引场景
- V98:无效ASIN菜单 rename 补充 BRAND_DB;docs 架构优化规划
- 配套单测更新
2026-08-31 17:04:59 +08:00
huangzd1997 483374744a fix: Spring 多构造器类显式 @Autowired 标注 + V95 迁移兼容 MySQL 8.4
Build Backend JAR / build (push) Has been cancelled
- CapacityPlanService / ExternalCallMetricsRecorder / ZiniaoClientImpl:
  双构造器(生产 + 测试入口)导致 Spring 6 不自动推断构造器注入,
  启动报 'No default constructor found';生产构造器显式加 @Autowired
- V95:shop_key 列 V85 建表时已有,原 ADD COLUMN shop_key 会报
  duplicate column;MySQL 8.4 不支持 ADD COLUMN IF NOT EXISTS,改
  information_schema 动态 SQL;shop_key 缩到 VARCHAR(255) 以容纳
  (shop_key, business_date) 唯一键(1000 在 utf8mb4 下超 3072 字节
  索引上限);删除多余行改为单表 DELETE
2026-08-31 01:09:19 +08:00
huangzd1997 c517711169 task-80: 补充 JVM 堆、直接内存、临时磁盘和连接池容量配置说明 2026-08-30 22:30:56 +08:00
huangzd1997 39e52858d1 task-77: 统一 Coze、品牌检查和紫鸟 HTTP 客户端的连接复用策略 2026-08-30 21:08:28 +08:00
huangzd1997 6a4a115260 task-75: 虚拟线程任务等待队列上限与拒绝/延迟指标 2026-08-30 20:39:31 +08:00
huangzd1997 5105ca95c5 task-74: 隔离调度线程池、文件作业线程池和外部 Coze/图片执行池 2026-08-30 20:31:39 +08:00
huangzd1997 9de4603484 task-70: 历史清理改为 keyset 分页、小批量和短事务 2026-08-30 19:48:59 +08:00
huangzd1997 e2d6875ef9 task-66: 限制 RustFS 并发读写与重试的总资源预算
- 新增 aiimage.transient-storage.max-total-concurrent-operations 配置
  (默认 0 不启用):跨 upload/read/delete 的总并发预算
- executeWithRetry 入口获取一个总许可,整次操作(含全部重试)全程占用,
  重试不额外消耗,超预算立即拒绝并计入 operation=total rejected 指标
- 失败/完成后 finally 释放总许可,无残留锁;负值/0 视为未启用保持原行为
2026-08-30 18:57:26 +08:00
huangzd1997 9b1978aec8 task-65: transient payload 读取流式解压 + 解压后字节上限
- 新增 aiimage.transient-storage.max-decompressed-payload-bytes 配置
  (默认 100MB,即 2x 存储上限),覆盖 gzip 二进制与 gzip64 兼容两条路径
- decodeGzipStream 按 8KB 缓冲流式解压,累计输出超过上限立即中止并报错,
  防止压缩炸弹(zip bomb)在读取时无界膨胀内存
- 超限错误保留可识别消息(exceeds configured limit),由 resolvePayload 统一包装
2026-08-30 18:49:55 +08:00
huangzd1997 2cd5e07248 task-32: 将 task entity 本地缓存替换为有容量和过期回收的实现 2026-08-29 20:11:16 +08:00
huangzd1997 0e3dbe450f task-16: 图片预取改短预算 best-effort,超时取消在途并回退 URL
prefetchToDiskBestEffort 在 budgetSeconds 内尽力预取,预算耗尽即取消
在途任务并返回未预取数量;缺图单元格由既有 fallback 直接写 URL。
put 前检查中断标志,避免取消后写盘与 spool close 竞态产生残留文件。
预算通过 aiimage.similar-asin.image-prefetch-budget-seconds 配置(默认 60s),
长预算后台预热路径 prefetchToDisk 行为不变。
2026-08-29 17:37:11 +08:00
huangzd1997 dc69b002db task-15: async batched last_used_at touch refresh 2026-08-29 17:24:25 +08:00
huangzd1997 e201b13301 task-13: cap chunk merge row count and payload bytes with orphan fallback 2026-08-29 17:05:49 +08:00
huangzd1997 3b051bbafe task-8: WorkbookFactory 输入解析改为受控读取,验证超大 Excel 失败提示
解析前用 ZipFile 中央目录探测 xlsx(zip) 条目数与解压总字节(不读压缩
内容),超过 maxWorkbookZipEntries(20000)/maxWorkbookUncompressedBytes
(512MB) 立即拒绝并给出可识别提示;非 zip/损坏文件跳过探测交给
WorkbookFactory 兜底转业务异常。0/负值配置回退默认。新增 8 个测试覆盖
正常路径、多文件、幂等、空输入、单行、解压超限、条目超限、损坏文件、
依赖失败恢复。
2026-08-29 15:11:53 +08:00
huangzd1997 68b7d9a4a4 task-7: 限制单文件大小、最大行数和最大字段长度,防止解析任务无界增长
新增 maxSourceFileBytes(50MB)/maxParseRows(50000)/maxFieldLength(2000)
三个配置项:文件超限在解析入口拒绝(异常消息可识别)、行数超限拒绝、
超长单元格字段截断。0/负值配置回退默认。新增 8 个测试覆盖正常路径、
多文件、幂等、空文件、单行、边界(恰好=上限通过、超限拒绝)、
非法输入(文件超限/字段截断)、依赖失败恢复。
2026-08-29 15:08:14 +08:00
huangzd1997 16bec1c0fa task-5: 预览行数量改为配置驱动并做边界校验
解析响应预览上限从硬编码常量改为 SimilarAsinProperties.parseResponsePreviewLimit,
0/负值回退默认 100,超过 1000 clamp 到 1000 防止误配导致响应体无界膨胀。
新增 8 个测试覆盖默认路径、自定义值、幂等、空文件、单行、超限 clamp、非法配置回退、依赖失败恢复。
2026-08-29 14:48:01 +08:00
huangzd1997 18db20099a OSS 结果文件下载分流:新增 aiimage.oss.download-endpoint 配置,result/ 前缀对象生成独立下载域名直链(默认未配置时回退原行为)
Build Backend JAR / build (push) Has been cancelled
2026-08-26 13:37:11 +08:00
huangzd1997 338493ecaa 安全加固:CORS白名单、JWT密钥自动生成、SSRF防护、路径遍历与错误信息泄露修复
Build Backend JAR / build (push) Has been cancelled
2026-08-25 18:05:28 +08:00