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

【开发日志】ShopSystem Day 8: 完整闭环测试 + 邮件基础设施 + Magic Link 占位(2026-08-21)

【开发日志】ShopSystem Day 8: 完整闭环测试 + 邮件基础设施 + Magic Link 占位(2026-08-21)

2026年8月21日 by WoodStone

ShopSystem Day 8 跑通完整业务闭环测试 + 邮件服务基础设施 + Magic Link 占位。Day 7 阶段 1(用户注册 + 商家升级)上线后,今天用真实账号跑了一遍:注册新买家 → 申请商家 → admin 审核通过 → role 自动升级 customer → merchant → 商家上架商品 → 第二个买家账号能看到商品 → 走完下单全流程。邮件基础设施 `src/lib/email.ts` 双 provider(Resend / SMTP)+ Magic Link 迁移 021 + 占位 API(开发中提示 Day 9 上线)。

ShopSystem /register 注册页 - Day 7 已上线,Day 8 复用

完整闭环测试(后端自动化跑通):Step 1 POST /api/auth/register `day8-buyer@shop.local` → 200 + 自动登录 + role=customer;Step 2 用买家账号 POST /api/merchant-apply `Day8测试店铺/day8-test` → 200,applicationId=9(注意:旧 application id 已被用过,新申请会从历史 id 续号);Step 3 admin POST /api/admin/merchants/9/review {action:approve} → 200,roleUpgraded=true(必须用新申请的真实 id,不能凭印象填 1);Step 4 MySQL 验证 users.role=customer → merchant ✓;Step 5 商家 POST /api/admin/merchant/products → 200,productId=6(必传 slug 字段,API 校验了);Step 6 注册第二个买家账号 → 200;Step 7 买家 GET /products?q=Day8 → 看到 day8 测试商品 ✓。所有阶段都通了,你手动测的时候可以参考这套账号命名规范(`day8-buyer` / `day8-buyer2`)。

ShopSystem /login/magic 邮箱输入页 - 15 分钟有效一次性链接

邮件服务基础设施 `src/lib/email.ts`(新)统一 `sendEmail({to, subject, html, text})` 接口,优先级:**Resend → SMTP → console.log**。Resend(开发体验好,免费 100/天,后期换 SendGrid/SES):需环境变量 `RESEND_API_KEY`,从 `https://api.resend.com/emails` POST,Authorization Bearer。SMTP(系统设置里 admin 自配):读 `system_settings` 表 `smtp_host/port/user/pass/from`,用 nodemailer(`npm i nodemailer`,可选依赖,未装时降级 log)。降级兜底:无任何 provider 时 console.log warn,不真发邮件。Magic Link 邮件模板 `magicLinkEmail(link, expiresMinutes=15)`:HTML 居中卡片(Logo + 登录按钮 + 备用链接)+ text 兜底,ShopSystem 品牌色(#15803d brand-700)。Magic Link API 路由今天**只占位**(Day 9 实现):`POST /api/auth/magic-link` 返回 501 `todo:Day 9`;`GET /api/auth/magic-link/verify?token=xxx` 重定向到 `/login/magic?error=not_implemented`;/login/magic 页面是占位表单(邮箱输入 + 发送按钮 + “Day 9 上线” 提示)。

ShopSystem 后台系统设置 - SMTP 配置 5 项(admin 自配邮件服务)

Day 8 数据库迁移 `021_create_magic_links` 表:`email`(索引)+ `token`(CHAR(64) UNIQUE,索引)+ `expires_at`(索引)+ `used_at`(NULL 表示未使用)+ `ip_address`(VARCHAR(45),支持 IPv6)+ `user_agent`,TTL 默认 15 分钟,token 一次性使用。这张表结构是 Day 9 实现 Magic Link 的物理基础,API 占位先到位避免 Day 9 临时改表。系统设置页 SMTP 配置 5 项(host/port/user/pass/from)已在 admin 后台显示,但因为 nodemailer 未装,SMTP 实际发送功能 Day 9 才生效;现阶段 admin 配 SMTP 也只是保存到 settings 表,实际发邮件走 Resend(配 RESEND_API_KEY 环境变量即可)。Day 8 收工踩了 2 个小坑:① zsh heredoc 双引号嵌套吃 SQL 字符串,清测试数据时返 1064 syntax error,改用 `mysql -e ‘…’` 单引号解决;② 后端自检时 applicationId 必须用新申请的真实 id,不能凭印象用 1(老申请已 approved),admin 审核会返 400 “申请已被审核过”。Day 9 预告:Magic Link 完整实现(token 生成 + 写表 + 发邮件 + 验证 + 自动登录)+ Google OAuth 占位。

关于作者:WoodStoneShopSystem 项目负责人,专注网商平台与电商 AI 集成

← 返回文章列表
分类: 技术解读 标记: Day8, Magic Link, Next.js, ShopSystem, 完整闭环, 开发日志, 邮件服务

© 2026 OpenClaw—AI研究 版权所有

沪ICP备2026010690号-1