ShopSystem Day 4 主线是把 Redis 接进来 + 商家入驻流程跑通 + 已登录用户下单自动回填 user_id。Day 3 留下来两个隐患:订单并发只有 MySQL 事务 + 行锁 + 库存原子扣减三层,在秒杀/抢购场景下用户排队等事务回滚体验差;所有订单 user_id 都是 NULL,平台没法做用户中心。Redis 就是来解决这两个问题的:购物车 session 缓存 + API 限流(15-60 次/秒,淘宝一半)+ 订单分布式锁(SETNX + Lua 释放),形成四层防护链。商家入驻是新业务模块,前后台都要打通:用户在前台 `/merchant-apply` 填表,管理员在 `/ladmintood/merchants` 审核,通过后自动把 users 表对应用户的 role 升级为 merchant。前台登录接入改动很小,只在 orders 路由加了几行:读 `shop_user_id` cookie、查 users 表验证 active、把 user_id 写入 orders 表(匿名保持 NULL 不强制登录)。

Redis 在生产服务器装上 `redis-server 7.0.15`,绑定 `127.0.0.1:6379`(用 daemonize 启动)。Next.js 项目装 ioredis,封装 `src/lib/redis.ts`(单例 + globalThis 锁 + safeRedisCall 降级 wrapper + acquireLock 分布式锁 helper)。`src/lib/cart-redis.ts` 把 session→cartId 映射搬进 Redis,key 格式 `cart:sess:

后台审核 `/ladmintood/merchants` 用卡片式布局(区别于订单的表格),每张卡:店名 + slug + 状态徽章 + 申请人信息网格 + 备注行 + 通过/拒绝操作。状态筛选 tab 在顶部(全部/待审核/已通过/已拒绝 + 实时计数),seed 数据后看到 2 条 pending + 1 条 approved,审核列表真实可用。审核 API `/api/admin/merchants/[id]/review` 做三件事:① 校验申请存在且 status=pending;② UPDATE merchant_applications 写 reviewed_by/reviewed_at/review_notes;③ 如果是 approve 且有关联用户,自动 `UPDATE users SET role=merchant` —— 用户角色升级一步到位,无需后续人工处理。MerchantReviewActions 是客户端组件,展开备注 textarea + 通过/拒绝按钮(拒绝按钮用红色描边区分),用 `router.refresh()` 让 server component 重新拉取数据。AdminShell 加了”🏪 商家审核”导航项,active 状态用品牌色高亮。前台登录接入改动只 8 行:`/api/orders` 在事务里读 `shop_user_id` cookie,parseInt 后查 users 表验证 status=active,user_id 写入 INSERT。匿名下单路径完全保留(降级不强制登录)。Redis 验证:ping → PONG、SET/GET → OK、ioredis smoke(lock 串行化 + safe 降级)全绿。限流阈值实测:default 跑 32 次第 31 次起被拒,strict 跑 17 次第 16 次起被拒。Build 一次过,新路由全部注册。

Day 4 收工整体改动:新增 `redis.ts`、`cart-redis.ts`、`rate-limit.ts` 三个核心库;`migrate.ts` 加 016 表;`orders/route.ts` 加限流 + 锁 + user_id 回填;新增 `merchant-apply/route.ts` + `merchant-apply/page.tsx` + `merchants/page.tsx` + `merchants/[id]/review/route.ts` + `MerchantReviewActions.tsx` 加商家审核导航。Day 5 预告:Redis 接入用户登录态(多设备 session 共享)、用户中心 `/account`(订单 + 收藏 + 收货地址)、商家后台商品上架流程、商品评价系统(下单后 7 天可评)。
OpenClaw—AI研究