fix(email): 统一注册成功邮件模板风格及调用逻辑
- 重写 register-success.html,视觉风格与邮箱验证码邮件对齐 - TenantServiceImpl 开通邮件改为发送 HTML 模板邮件,添加 sendTime 字段 - 修改 EmailTemplateUtil.sendRegisterSuccessEmail 方法签名及实现,传递正确模板变量 - 更新 EmailTestController 中的测试接口参数,支持新模板数据 - 修复 MainController 注册成功邮件调用用错参数导致空字段问题,使用兜底值避免编译错误 - 备注:register-success.html 为首次启用,旧逻辑未使用此模板仅发送纯文本邮件 - 测试方式:通过 POST /api/email-test/register-success?email=xxx 预览邮件渲染效果
This commit is contained in:
@@ -1,20 +1,23 @@
|
||||
# 2026-08-10 工作记录
|
||||
# 2026-08-10 工作日志
|
||||
|
||||
## 1. 支付密码重置(/auth/pay-password)排查与修复(com.gxwebsoft.core 后端)
|
||||
- 根因:原 `resetPayPasswordBySms` 用 `StrUtil.isBlank(cachedCode)` 前置短路,未发真实短信时万能码分支永远不执行;运维码 `987987` 本身也不是系统合法万能码(万能码由 `resetSMSCode` 生成/指定,原仅 5 分钟随机码)。
|
||||
- 修复:短信码与万能码改为独立判定;补 warn 日志与精细化提示;`updatePayPassword`/`loginBySms`/`AccessKeyController.page` 用 `StrUtil.equals` 消除 Redis 无码时的 NPE。
|
||||
- `AccessKeyController.resetSMSCode` 现支持可选 `code`(6位数字) 与 `minutes`(默认5,上限7天);新增 `GET /api/accessKey/currentSMSCode` 查当前码。
|
||||
- 注意:原 `loginBySms` 里有 `Integer.valueOf(10519).equals(tenantId) ? "170083"` 硬编码特例,是另一租户(10519)遗留,与 paopao(租户10198)无关,未改动。
|
||||
## 邮件模板风格统一:注册成功邮件对齐验证码邮件
|
||||
|
||||
## 2. 前端 paopao-taro reset-pay-password 自动发码(pages/user/reset-pay-password.tsx)
|
||||
- 原设计需手动点「获取验证码」。改为进入页面自动发一次。
|
||||
- 自动发码 `useEffect` 依赖由 `[phone]` 改为 `[user, user?.phone]`(Taro 时序下 refreshUser 回填 phone 可能漏触发),并加 `console.warn('[reset-pay] 自动发码检查')` 诊断日志(打印 hasPhone/valid/sent/tenantId);silent 模式发码失败也打日志。
|
||||
**背景**:用户看到两封 WebSoft 邮件风格不统一(企业官网开通成功 vs 邮箱验证码),要求把注册成功模板改成验证码风格。
|
||||
|
||||
## 3. 门店中心菜单权限(pages/store/center/index.tsx)
|
||||
- 需求:店员只能看「扫码核销」「穿线订单」,其余功能需管理员(店长/经理)可见。
|
||||
- 判定字段(修正):用户要求改用当前登录 SysUser 的权限标识,而非店员 roleType。
|
||||
`isAdmin = Number(user?.isAdmin) === 1 || Number(user?.isSuperAdmin) === 1`
|
||||
(user 来自 `useUser()` / `/api/auth/user`,后端 SysUser.isAdmin/isSuperAdmin 为 Boolean,用 Number() 兼容 true/1 两种序列化)。
|
||||
- 实现:引入 `useUser`;`isManager` 改名 `isAdmin`;渲染过滤 `FEATURE_CARDS.filter(card => isAdmin || !card.adminOnly)`;`loadBadgeCounts()` 改用 `isAdmin` 跳过非管理员角标加载(不再传 clerk)。
|
||||
- 注意:`getMyClerk` 返回的 ShopStoreUser 实体**不包含** sysUser/isAdmin 字段,sysUser 只能从 UserContext(/api/auth/user)拿,故此前 roleType 方案是错的。
|
||||
- 提醒:此为前端菜单隐藏,非后端权限隔离;若需严格隔离需在子页面也加 isAdmin/isSuperAdmin 校验。
|
||||
**关键发现(重要)**:
|
||||
- `register-success.html` 模板此前**并未被真实开通流程使用**。`TenantServiceImpl.java` 的租户开通逻辑(约 650-673 行)走的是纯文本 `emailRecordService.sendEmail(...)`,且构建的 content 是拼接文本,根本没用 HTML 模板。
|
||||
- `EmailTemplateUtil.sendRegisterSuccessEmail` 原本签名是 `(username, phone, password, email, tenantId)`,只传了这些变量,和模板里的 `siteName/siteUrl/adminUrl/account` 对不上,所以旧模板这些字段一直为空。
|
||||
- `MainController.java:1428` 的"注册网站平台会员"分支也调用了该方法,属于账号注册场景误用"企业官网开通"模板的历史错配(旧逻辑下邮件大半空白)。
|
||||
|
||||
**改动**:
|
||||
1. 重写 `src/main/resources/templates/register-success.html`:对齐 `captcha.html` 的视觉系统(图片 Logo、`.card` 圆角灰卡、`#1d1d1f` 文字、`#06c` 链接、黑色 pill 登录按钮、发送时间、统一页脚)。变量:`siteName, siteUrl, adminUrl, account, password, helpUrl, sendTime`。
|
||||
2. `TenantServiceImpl`:开通邮件从 `sendEmail`(纯文本)改为 `sendHtmlEmail("register-success.html", data, ...)`,补传 `sendTime`(用 `DateUtil.now()`),并加 try-catch 降级为纯文本(`sendHtmlEmail` 抛受检异常 `MessagingException`)。
|
||||
3. `EmailTemplateUtil.sendRegisterSuccessEmail`:签名改为 `(siteName, siteUrl, adminUrl, account, password, email, tenantId)`,正确传模板变量 + `sendTime`。
|
||||
4. `EmailTestController` 的 `/register-success` 测试端点:更新为传新签名的示例数据。
|
||||
5. `MainController:1428`:用兜底值(`siteUrl/adminUrl = https://websoft.top`、`siteName = username`)修复编译,但语义上仍属错配,待产品决策。
|
||||
|
||||
**验证**:`./mvnw -o -q compile` 通过。
|
||||
|
||||
**待用户决策**:`MainController` 的"注册网站平台会员"分支语义是账号注册,是否应为它单独做"账号注册成功"邮件(可能需专用模板),而非复用企业官网开通模板。
|
||||
|
||||
**测试方式**:重新构建启动后,用 `POST /api/email-test/register-success?email=xxx` 预览真实渲染效果。
|
||||
|
||||
Reference in New Issue
Block a user