Files
websopy-mp/.workbuddy/memory/2026-04-12.md
赵忠林 6084cd5a5b feat(passport): 优化已登录用户加入时协议勾选逻辑
- 已登录用户点击「确认加入」时不再强制勾选协议
- 移除 handleConfirmJoin 中对协议勾选的检查
- 未注册用户仍需勾选协议后才能授权手机号
- 确保登录状态异常时有提示信息显示
2026-04-12 11:44:37 +08:00

96 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026-04-12 工作记录
## 任务:优化邀请加入应用按钮逻辑
### 需求描述
loginByOpenId 返回有用户数据(已登录)时,不显示手机号授权按钮,直接显示「确认加入」普通按钮;
loginByOpenId 返回未注册时才走 getPhoneNumber 授权分支。
### 解决方案
完全重写 `invite/index.tsx`,核心逻辑:
#### 按钮渲染逻辑
```tsx
{isLoggedIn ? (
// 已登录:普通按钮,直接加入,携带 Authorization 头
<Button onClick={handleConfirmJoin}>确认加入</Button>
) : (
// 未注册:手机号授权按钮(兜底,实际大多已被重定向到 login 页)
<Button open-type="getPhoneNumber" onGetPhoneNumber={handleGetPhoneNumber}>微信手机号快速加入</Button>
)}
```
#### handleJoinApp 统一入口
- `useToken` 参数:已登录用户,请求头加 `Authorization: Bearer xxx`
- `phoneCode` 参数:未注册用户,请求体加 code/encryptedData/iv
### 文件修改
- `src/passport/invite/index.tsx` - 完整重写,区分已登录/未注册两种按钮状态
---
## 任务:未注册用户在邀请页内完成授权注册,不跳登录页
### 需求
- loginByOpenId 未注册 → 在页面内显示「微信手机号授权」按钮
- 授权成功 → 调用 `loginByMpWxPhone` 注册/登录 → 自动执行加入应用
- 不再跳转 passport/login 页面
### 关键逻辑
1. `checkLoginStatus`:已注册 isLoggedIn=true未注册 isLoggedIn=false**两种情况都显示邀请页**
2. 未注册按钮:`open-type="getPhoneNumber"``handleGetPhoneNumber`
- 授权码调 `SERVER_API_URL/wx-login/loginByMpWxPhone` 完成注册登录
- 保存 token → isLoggedIn=true → 立即调 `doJoinApp`
3. 已注册按钮:普通 `onClick``handleConfirmJoin``doJoinApp(access_token)`
4. `doJoinApp`:统一加入接口,请求头带 `Authorization: Bearer {access_token}`
### 文件修改
- `src/passport/invite/index.tsx` - 完整重写(彻底移除跳登录页逻辑)
---
## 修复:「授权码不能为空」报错
### 问题
已登录用户点「确认加入」时,后端报 `授权码不能为空`
后端 `/api/_app/developer/invite/accept` 接口不管是否登录,都要求传 `code`(微信授权码)。
### 解决
统一用一个 `getPhoneNumber` 按钮处理两种场景:
- **已注册**:文字「确认加入」→ 触发 getPhoneNumber → `doJoinApp(code, accessToken)`
- **未注册**:文字「微信手机号快速加入」→ 触发 getPhoneNumber → 先 `loginByMpWxPhone` 注册 → 再 `wx.login()` 获取新 code → `doJoinApp(newCode, access_token)`
### doJoinApp 参数
```ts
doJoinApp(wxCode: string, accessToken: string)
// 请求体带 code请求头带 Authorization: Bearer xxx
```
---
## 优化:已登录用户不弹手机号授权
### 改动
- 已登录按钮:普通 `onClick`,文字「确认加入」
- 未注册按钮:`getPhoneNumber` 授权,文字「微信手机号快速加入」
### 逻辑差异
| 用户状态 | 按钮类型 | 获取 code 方式 |
|------|------|------|
| 已登录 | 普通 onClick | `wx.login()` |
| 未注册 | getPhoneNumber | 授权回调的 `code` |
### 文件修改
- `src/passport/invite/index.tsx` - 按钮区分两种类型,已登录用普通 onClick
---
## 优化:已登录用户不强制勾选协议
### 改动
- 已登录用户点击「确认加入」时,不再检查 `agreementChecked`
- 未注册用户仍需勾选协议后才能授权手机号
### 文件修改
- `src/passport/invite/index.tsx` - `handleConfirmJoin` 移除协议检查