From c585647decdea30177ee08fabbc3d187e5af3aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 10 Aug 2026 20:02:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(auth):=20=E4=BF=AE=E5=A4=8D=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AF=86=E7=A0=81=E9=87=8D=E7=BD=AE=E4=B8=8E=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=9D=83=E9=99=90=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正 resetPayPasswordBySms 短信码判定逻辑,分离短信码与万能码检查 - 增加日志和提示优化,消除 Redis 无码时的空指针异常 - 支持 resetSMSCode 接口传入自定义码和有效期参数,新增查询当前码接口 - 前端 reset-pay-password 页面改为自动发送验证码,改进发送时机与日志记录 - 调整门店中心菜单权限判定,改用当前登录 SysUser 的管理员标识替代店员 roleType - 菜单渲染依据 isAdmin 权限过滤,优化非管理员的角标加载逻辑 - 明确前端权限隐藏,提示后端接口需独立权限验证 --- .workbuddy/memory/2026-08-10.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .workbuddy/memory/2026-08-10.md diff --git a/.workbuddy/memory/2026-08-10.md b/.workbuddy/memory/2026-08-10.md new file mode 100644 index 0000000..747a8ab --- /dev/null +++ b/.workbuddy/memory/2026-08-10.md @@ -0,0 +1,20 @@ +# 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 模式发码失败也打日志。 + +## 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 校验。