Release Date: 2026-09-05
Tag: v3.7.40
- 后台报价列表接口
GET /api/v1/admin/offers默认排序改为sort="frontend",排序规则与前台完全一致:- 有货状态优先(
in_stock = true先于无货商品) - 基准币种优先(
CNY优先排前) - 商品价格低价优先(
price ASC) - 最新采集时间优先(
observed_at DESC)
- 有货状态优先(
- 在管理后台搜索与筛选栏中增加了“排序方式”下拉选择框,支持切换:
- 前台默认(在售优先 · 低价优先)
- 最新更新时间优先 (
updated_desc) - 价格从低到高 (
price_asc) - 价格从高到低 (
price_desc)
- 后台统计接口
GET /api/v1/admin/stats增加了product_counts(每个标准产品 slug 的在售公开商品数)和brand_counts(各品牌的在售公开商品数)汇总统计。 - 管理后台的品牌栏(Brand Rail)与产品栏(Product Rail)各按钮实时展示对应的商品数量徽标,方便快速浏览每个分类的具体库存与商品量。
- 后台报价列表新增返回
X-Total-Count响应头,列表上方展示共 {offerTotal} 条报价(已载入前 {offers.length} 条)。 - 列表底部增加“加载更多报价”按钮,当报价超过 100 条时支持分批分页加载,方便完整巡检所有商品。
- 在前后台通用目录
apps/web/lib/catalog.ts的 OpenAI 品牌列表中补齐了chatgpt-pro(ChatGPT Pro)分类选项。
- 针对用户反馈“后台页面每次执行审批操作以后就又回到了顶端”的问题进行了彻底根治:
- Optimistic In-place Updates:对批准公开、撤回公开、隐藏限制、恢复公开、重新归类单品等操作改为就地乐观更新 state,避免 React 重新渲染或 unmount 导致焦点重置及浏览器触发平滑回顶滚动。
preserveScroll滚动坐标保护:封装滚动位置记录与requestAnimationFrame即时恢复机制,锁定当前的window.scrollY。- 主动失焦与明确 Button 类型:在触发操作前对当前焦点元素执行
blur(),并明确给全部按钮设置type="button",杜绝默认表单提交行为。
- Backend Tests: 251 passed (
python -m pytest tests/). - Web Tests: 55 passed (
node --import tsx --test). - TypeScript Check: Clean pass with zero errors (
tsc --noEmit).