feat(invite): 支持已登录用户直接加入应用

- 后端accept接口code参数改为可选,支持通过Authorization头识别登录用户
- 已登录用户加入时不再弹手机号授权,前端调用新增的doJoinAppForLoggedInUser方法
- 未注册用户仍通过手机号授权码code加入,调用doJoinAppForNewUser方法
- 拆分前端加入逻辑,新增handleConfirmJoin统一处理已登录加入流程
- 优化按钮交互,已登录状态下按钮变为普通点击,移除协议强制勾选
- 错误处理和状态提示完善,加入成功后自动跳转首页
This commit is contained in:
2026-04-12 11:56:11 +08:00
parent 6084cd5a5b
commit 2ae30ac692
3 changed files with 108 additions and 14 deletions

View File

@@ -85,6 +85,52 @@ doJoinApp(wxCode: string, accessToken: string)
---
## 任务:后端改造支持已登录用户直接加入
### 问题
后端 `/api/_app/developer/invite/accept` 接口强制要求传 `code`(手机号授权码),导致已登录用户也需要弹手机号授权。
### 后端改造方案
修改 `AppMpInviteController.acceptInvite` 方法:
#### 1. 参数校验调整
- `code` 改为可选参数
- 不传 `code` 时,从 `Authorization` 头获取当前登录用户
#### 2. 双模式支持
```java
if (StrUtil.isBlank(code)) {
// 模式一:已登录用户(通过 Authorization 头识别)
userId = getCurrentUserId();
} else {
// 模式二:未注册用户(通过手机号授权码获取手机号,创建用户)
String phone = getPhoneByCode(code);
userId = getOrCreateUserByPhone(phone);
}
```
#### 3. getCurrentUserId 方法
- 尝试从 Spring Security Context 获取
- 如果获取不到(免登录接口),手动解析 `Authorization` 头的 JWT Token
### 前端配合改造
- 已登录用户:普通 `onClick` 按钮 → `handleConfirmJoin``doJoinAppForLoggedInUser`(不传 `code`
- 未注册用户:`getPhoneNumber` 按钮 → `handleGetPhoneNumber``doJoinAppForNewUser`(传 `code`
### 文件修改
**后端:**
- `/Users/gxwebsoft/JAVA/websopy-java/src/main/java/com/gxwebsoft/app/controller/AppMpInviteController.java`
- `acceptInvite` 方法支持 `code` 可选
- 使用 `BaseController.getLoginUserId()` 获取当前登录用户(无需额外方法)
**前端:**
- `/Users/gxwebsoft/VUE/websopy-mp/src/passport/invite/index.tsx`
- 已登录按钮改为普通 `onClick`
- 新增 `handleConfirmJoin` 方法
- 拆分 `doJoinApp``doJoinAppForLoggedInUser``doJoinAppForNewUser`
---
## 优化:已登录用户不强制勾选协议
### 改动
@@ -93,3 +139,24 @@ doJoinApp(wxCode: string, accessToken: string)
### 文件修改
- `src/passport/invite/index.tsx` - `handleConfirmJoin` 移除协议检查
---
## 修复:后端需要手机号授权码
### 问题
后端 `invite/accept` 接口只接受 `getPhoneNumber` 获取的手机号授权码,用 `wx.login()` 的 code 会报「获取手机号失败」。
### 解决
两种用户状态都走 `getPhoneNumber` 按钮:
- 已登录:文字「确认加入」,回调 `handleConfirmJoinGetPhoneNumber`
- 未注册:文字「微信手机号快速加入」,回调 `handleGetPhoneNumber`
### 差异
| 用户状态 | 回调 | 行为 |
|------|------|------|
| 已登录 | `handleConfirmJoinGetPhoneNumber` | 直接用 `code + access_token` 调加入接口 |
| 未注册 | `handleGetPhoneNumber` | 先 `loginByMpWxPhone` 注册登录,再调加入接口 |
### 文件修改
- `src/passport/invite/index.tsx` - 两种状态都用 getPhoneNumber 按钮