OpenClaw—AI研究OpenClaw—AI研究
  • AI动态
  • OpenClaw教程
  • 技术解读
  • 用户故事

【开发日志】ShopSystem Day 19: AI 商品推荐(2026-09-01)

【开发日志】ShopSystem Day 19: AI 商品推荐(2026-09-01)

2026年9月1日 by WoodStone

ShopSystem 第三阶段开篇「AI 商品推荐」今日收尾。商品详情页底部新增「看了又看」与「同类热销」两组推荐区块,各最多展示 6 件商品;策略基于浏览历史频次、当前商品分类和销量热度做规则排序,不调用外部 AI 服务,API 始终可返回。同期附带把 5 处历史 SQL 的 LIMIT/OFFSET 改为参数化,统一走新增的 queryText 文本绑定 helper,mysql2 对 LIMIT 占位符的特殊处理彻底解决。

匿名态详情页两组推荐

推荐策略本次选择规则引擎而非外部大模型。核心考量是 0.5~1 天范围,接 OpenAI 或 Anthropic 需要做超时、降级、容错,投入产出比不划算;详情页 SSR 渲染,外部 HTTP 调用会让首屏延迟 500ms 以上,SEO 也不友好。规则推荐依赖的输入(view_count、sold、featured、rating_count、category)数据已经齐全,完全可以离线计算。响应里始终带 generatedBy: “rules” 字段,后续如果接 AI 增强重写推荐理由文案,把这个字段改成 “ai+rules” 或 “ai” 即可。

「看了又看」与「同类热销」语义分开。看了又看是个性化推荐,基于浏览历史 + 跨分类热度,登录用户走 browse_history 策略,从浏览历史表里 JOIN 商品,按分类匹配加分(同类 +8 分)、view_count 求和、最近浏览时间倒序做排序;未登录或浏览历史不足 6 件时,退化为 current_product_fallback,用当前商品所在分类的热销商品兜底。同类热销是通用推荐,永远走 category_and_heat 策略,按当前商品分类优先、销量降序、全平台浏览热度、featured、rating_count 多维排序,排除当前商品。

浏览历史热度直接复用 Day 18 沉淀的数据。Day 18 的 browse_history 表用 UNIQUE(user_id, product_id) UPSERT 策略,同商品永远只占一行,view_count 字段累计浏览次数。当时设计就为 Day 19 推荐系统预留了热度输入,本次零迁移直接消费。看了又看的 score = (CASE WHEN p.category_id = 当前 THEN 8 ELSE 0 END) + SUM(h.view_count),分类匹配 8 分的硬编码权重明显高于浏览次数累加,鼓励推荐同类商品。

登录态浏览历史推荐

同类热销用 LEFT JOIN 浏览热度而非 INNER JOIN。browse_history 是新表,很多商品可能没有浏览记录,LEFT JOIN 保证 0 浏览商品也能出现在结果里。排序优先级:同分类优先、销量降序、全平台浏览热度(SUM(view_count) 跨用户聚合)、featured 商家自营推荐位、rating_count 评价数、id ASC 稳定排序。同一商品被排除用 WHERE p.id <> ?,避免推荐自己。

queryText 文本绑定 helper 解决 mysql2 LIMIT ? 兼容性。Day 11 以来所有分页 SQL 写的是 LIMIT ${pageSize} 模板字符串内插,有 parseInt 钳制,实际无注入风险,但不规范。本次按任务卡要求改成 LIMIT ? 占位符,首次实际跑 mysql2 pool.execute prepared statement 协议报 Incorrect arguments to mysqld_stmt_execute,根因是 mysql2 对 LIMIT 占位符的特殊处理。新增 queryText 函数走 pool.query 文本协议,mysql2 仍用 mysql_real_escape_string 转义参数,与 prepared statement 等效。统一规范后,所有必须参数化 LIMIT 的场景走 queryText,其他场景继续用 query 不变。

5 处 P3 LIMIT/OFFSET 同步治理。favorites / admin products / account history 三个分页接口、history record 100 条裁剪、merchant coupons 两个分支,共 5 处全部改成 ? 参数化 + queryText。静态扫描 src/ 已无 LIMIT ${ 内插命中,5 个目标文件命中 LIMIT ? 或 OFFSET ?,git diff –check 通过。Qclaw 在 favorites 与 history 上跑 pageSize=3 业务回归,total 与 items 数量完全一致。

详情页推荐区 SSR 首屏直出。getProductRecommendations 在 Server Component 内 await,直接传给 ProductRecommendations 客户端组件渲染,不增加客户端 JS、SEO 友好、用户体感快。每张卡有图时走 next/image 优化,无图用 emoji 📦 兜底,折扣价/原价双显示,推荐原因徽章(结合你的浏览记录 / 同类热门商品 / 同分类热销)放在缩略图左下角白底小字,不抢戏。响应式 grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6,移动 2 列、平板 3 列、桌面 6 列整齐一行。设计 token 全部走语义类(hover:-translate-y-0.5、shadow-card-hover、from-warm-200、price text-lg),改色只改 Tailwind 配置不写死 hex。

推荐跳转后详情页

Qclaw 浏览器用户视角 15 项测试全过 0 Bug。详情页两组推荐区块渲染、登录 strategy=browse_history、匿名 strategy=current_product_fallback、跨类目浏览历史、推荐 API 返回结构、不存在商品 404、加购链路不破、5 处 P3 参数化回归,共 15 项断言全部通过。AI 推荐功能完整交付,从 macbook 详情页点 iphone 卡片跳转到新详情页也能正常展示两组推荐,跳转链路完整。

第三阶段「营销+推荐」首项收官🎉。从今天起 ShopSystem 进入营销+推荐赛道,后续 Day 20 满减/包邮、Day 21 限时秒杀、Day 22 店铺关注。view_count、last_viewed_at 这些 Day 18 沉淀的字段在 Day 19 推荐系统直接复用,数据资产越滚越厚…

← 返回文章列表
分类: 技术解读 标记: AI推荐, Day19, Next.js, ShopSystem, 开发日志, 电商

© 2026 OpenClaw—AI研究 版权所有

沪ICP备2026010690号-1