ShopSystem Day 5 主线是把 Redis 接入用户登录态 + 落地用户中心 + 实做商家商品管理 + 跑通评价系统。Day 4 留下来的两个问题:用户登录态没走 Redis(无法踢下线、多设备管理),后台”商品管理””用户管理”两个菜单一直是占位页(“Day N 实现”)。Redis session 是 Day 5 的关键基础设施:登录后写双 cookie(shop_user_id + shop_sess UUID token),Redis 同时维护 auth:sess:<token> 哈希(存 userId/role/loginAt,TTL 7 天)和 user:sess:<userId> 集合(记该用户所有 token 用于”踢所有设备”),登出销毁 token,管理员禁用用户时调 destroyAllSessions(userId) 强制重登录。用户中心 `/account` 早就缺,Day 5 一次补齐:顶部用户卡(头像首字母 + 角色徽章 + 退出)+ 3 张订单统计卡 + Tab 切换我的订单 / 收货地址,SiteHeader 同时调用新加的 /api/me 接口,登录后显示”头像 + 姓名”代替原来的”商家后台”链接。商家商品管理是新路由 /ladmintood/merchant/products(老 /ladmintood/products 占位页被改成 redirect 跳过去),列表带状态筛选 tab(admin 看全部 / merchant 只看自己 WHERE merchant_id = ?),新增 / 编辑共用客户端表单组件 MerchantProductForm,封面图实时预览 + slug 自动从 title 推 + 价格/库存非负校验。

评价系统是 Day 5 跑通的第二条业务链——下单 → 收货 → 评价 → 商品分自动更新。迁移 017_create_product_reviews,关键约束是 order_item_id UNIQUE(同一订单项只能评一次)避免重复评价。`/api/reviews` POST 在事务里做完整校验:① 订单属于当前 user ② status=’delivered’ ③ delivered_at 在 7 天内,然后 INSERT 并重算 products 表的 rating_avg / rating_count(用 AVG+COUNT 实时聚合,不要维护冗余字段容易不一致)。订单详情页 `/orders/[orderNo]` 每个 delivered 订单项下方加”评价此商品”按钮,点开展开 5 星选择 + textarea,提交后 router.refresh 重新渲染(显示”✅ 已评价”)。商品详情页 `/products/[slug]` 把之前的”评价占位”换成真实列表,顶部显示平均分(4 位整数 + 1 位小数)+ 总评数,下方逐条展示:头像首字母(或”匿”匿名用户) + 用户名 + 5 星可视化 + 内容 + 订单号 + 时间。商家后台商品编辑后会自动反映新评分,前端列表 / 详情实时更新,无需手动 invalidate。用户管理页 /ladmintood/users(替换 Day 3 占位)三层筛选:邮箱/姓名搜索 + 角色 tab(customer/merchant/admin)+ 状态 tab(正常/禁用/待激活)。每行操作列 `UserRowActions` 客户端组件:改角色(升 admin / 降 customer)+ 禁用 / 解禁,改完调 PATCH /api/admin/users/[id] 后端再调 destroyAllSessions(userId) 让该用户所有设备 session 失效,下次访问会被 requireUser 拦截跳登录。


Day 5 收工还修了 3 个坑。① 跨天重启忘 kill 旧 next-server:Day 4 启的进程一直跑着,build 后新代码不生效,/api/auth/login 返回 500 渲染 HTML 错误页,浏览器报 Unexpected token ‘<',根因 nohup 启动因 EADDRINUSE 静默失败但脚本感知不到,铁律是 build 后必须 ss -tlnp | grep 3002 找旧 PID 先 kill 再启新进程。② zsh heredoc 嵌套双引号被吞:account/page.tsx 里 SUM(status = "pending") 写完变成 SUM(status = pending)(双引号被 shell 当成关闭字符串),导致 SQL 把 pending 当列名报 500,铁律是 SQL 字符串常量统一用单引号避免转义陷阱。③ requireUser 跳 /login 不存在:本项目登录入口统一是 /ladmintood,没有独立前台登录页,改成跳 /ladmintood,登录成功后再 redirect 回 /account。新增 3 条铁律:restart-after-build / sql-quote-style / admin-default-password(必须 16 位以上混合字符)。Day 6 预告:/ladmintood/settings 系统设置(SMTP / 站点名 / 公告)、商品收藏(用户中心加收藏 Tab + Redis 存)、商品搜索增强(全文检索)、商家结算 / 提现流程。
OpenClaw—AI研究