TASK:AiDA

This commit is contained in:
shahaibo
2024-12-11 16:21:18 +08:00
parent 2ac54a50ec
commit 82f7571612
5 changed files with 107 additions and 26 deletions

View File

@@ -314,14 +314,14 @@ public class AccountController {
@CrossOrigin @CrossOrigin
@GetMapping("/bindGoogle") @GetMapping("/bindGoogle")
@ApiOperation(value = "绑定谷歌") @ApiOperation(value = "绑定谷歌")
public Response<AccountLoginVO> bindGoogle(@RequestParam("credential") String credential) { public Response<Boolean> bindGoogle(@RequestParam("credential") String credential) {
return Response.success(accountService.bindGoogle(credential)); return Response.success(accountService.bindGoogle(credential));
} }
@CrossOrigin @CrossOrigin
@GetMapping("/bindWeChat") @GetMapping("/bindWeChat")
@ApiOperation(value = "绑定微信") @ApiOperation(value = "绑定微信")
public Response<AccountLoginVO> bindWeChat(@RequestParam("code") String code) { public Response<Boolean> bindWeChat(@RequestParam("code") String code) {
return Response.success(accountService.bindWeChat(code)); return Response.success(accountService.bindWeChat(code));
} }
} }

View File

@@ -1,5 +1,6 @@
package com.ai.da.mapper.primary.entity; package com.ai.da.mapper.primary.entity;
import com.ai.da.common.response.PageResponse;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
@@ -26,5 +27,9 @@ public class AccountExtend implements Serializable {
private String authType; private String authType;
private String headImgUrl;
private String name;
private String auth; private String auth;
} }

View File

@@ -1,5 +1,6 @@
package com.ai.da.model.vo; package com.ai.da.model.vo;
import com.ai.da.mapper.primary.entity.AccountExtend;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In; import io.swagger.models.auth.In;
@@ -8,6 +9,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@@ -40,4 +42,6 @@ public class AccountLoginVO {
private Long followerCount; private Long followerCount;
private List<AccountExtend> accountExtendList;
} }

View File

@@ -209,7 +209,7 @@ public interface AccountService extends IService<Account> {
AccountLoginVO getAccountDetail(); AccountLoginVO getAccountDetail();
AccountLoginVO bindGoogle(String credential); Boolean bindGoogle(String credential);
AccountLoginVO bindWeChat(String code); Boolean bindWeChat(String code);
} }

View File

@@ -2179,6 +2179,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
String userId = payload.getSubject(); String userId = payload.getSubject();
String email = payload.getEmail(); String email = payload.getEmail();
String name = (String) payload.get("name"); String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
log.info(userId); log.info(userId);
log.info(email); log.info(email);
log.info(name); log.info(name);
@@ -2191,6 +2192,13 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
if (CollectionUtil.isNotEmpty(accounts)) { if (CollectionUtil.isNotEmpty(accounts)) {
account = accounts.get(0); account = accounts.get(0);
} else { } else {
AccountExtend accountExtendInsert = new AccountExtend();
accountExtendInsert.setAuth(userId);
accountExtendInsert.setAuthType("Google");
accountExtendInsert.setHeadImgUrl(pictureUrl);
accountExtendInsert.setName(name);
// 用户不存在,创建新用户(自动注册) // 用户不存在,创建新用户(自动注册)
Account newUser = new Account(); Account newUser = new Account();
newUser.setUserEmail(email); newUser.setUserEmail(email);
@@ -2206,6 +2214,9 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
newUser.setSystemUser(3); newUser.setSystemUser(3);
accountMapper.insert(newUser); accountMapper.insert(newUser);
accountExtendInsert.setAccountId(newUser.getId());
accountExtendMapper.insert(accountExtendInsert);
account = newUser; account = newUser;
} }
@@ -2264,6 +2275,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
// 提取 unionid 和 nickname // 提取 unionid 和 nickname
String unionId = userInfoResponse.getString("unionid"); String unionId = userInfoResponse.getString("unionid");
String userName = userInfoResponse.getString("nickname"); String userName = userInfoResponse.getString("nickname");
String headimgurl = userInfoResponse.getString("headimgurl");
if (unionId == null) { if (unionId == null) {
throw new IllegalArgumentException("无法获取 unionid请检查微信开发平台配置"); throw new IllegalArgumentException("无法获取 unionid请检查微信开发平台配置");
} }
@@ -2278,6 +2290,8 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
AccountExtend accountExtendInsert = new AccountExtend(); AccountExtend accountExtendInsert = new AccountExtend();
accountExtendInsert.setAuth(unionId); accountExtendInsert.setAuth(unionId);
accountExtendInsert.setAuthType("WeChat"); accountExtendInsert.setAuthType("WeChat");
accountExtendInsert.setHeadImgUrl(headimgurl);
accountExtendInsert.setName(userName);
// 用户不存在,创建新用户(自动注册) // 用户不存在,创建新用户(自动注册)
Account newUser = new Account(); Account newUser = new Account();
@@ -2325,21 +2339,6 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId())); response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId()));
response.setFollowerCount(portfolioService.getFollowerCount(account.getId())); response.setFollowerCount(portfolioService.getFollowerCount(account.getId()));
return response; return response;
// // 2. 根据 unionid 检查用户是否存在
// User user = userRepository.findByUnionid(unionid);
// if (user == null) {
// // 用户不存在,进行注册
// user = new User();
// user.setUnionid(unionid);
// user.setOpenid(weChatResponse.getString("openid"));
// user.setNickname(weChatResponse.getString("nickname"));
// user.setAvatar(weChatResponse.getString("headimgurl"));
// userRepository.save(user);
// }
//
// // 3. 返回 unionid
// return unionid;
} }
private static final String WECHAT_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo"; private static final String WECHAT_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo";
@@ -2410,21 +2409,94 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
response.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); response.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId())); response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId()));
response.setFollowerCount(portfolioService.getFollowerCount(account.getId())); response.setFollowerCount(portfolioService.getFollowerCount(account.getId()));
response.setSystemUser(1);
//判断是否常用ip 不是则发邮件提示
// calculateExceptionIp(RequestInfoUtil.getIpAddress(request), account);
QueryWrapper<AccountExtend> qw = new QueryWrapper<>();
qw.lambda().eq(AccountExtend::getAccountId, response.getUserId());
List<AccountExtend> accountExtends = accountExtendMapper.selectList(qw);
if (CollectionUtil.isNotEmpty(accountExtends)) {
response.setAccountExtendList(accountExtends);
}
return response; return response;
} }
@Override @Override
public AccountLoginVO bindGoogle(String credential) { public Boolean bindGoogle(String credential) {
return null; try {
// 配置 Google ID Token 验证器
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(
new NetHttpTransport(),
JacksonFactory.getDefaultInstance())
.setAudience(Collections.singletonList(CLIENT_ID))
.build();
// 验证并解析 ID Token
GoogleIdToken idToken = verifier.verify(credential);
if (idToken != null) {
GoogleIdToken.Payload payload = idToken.getPayload();
// 提取用户信息
String userId = payload.getSubject();
String email = payload.getEmail();
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
AccountExtend accountExtendInsert = new AccountExtend();
accountExtendInsert.setAuth(userId);
accountExtendInsert.setAuthType("Google");
accountExtendInsert.setHeadImgUrl(pictureUrl);
accountExtendInsert.setName(name);
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
accountExtendInsert.setAccountId(authPrincipalVo.getId());
accountExtendMapper.insert(accountExtendInsert);
return Boolean.TRUE;
} else {
throw new IllegalArgumentException("Invalid ID token.");
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Failed to verify ID token: " + e.getMessage());
}
} }
@Override @Override
public AccountLoginVO bindWeChat(String code) { public Boolean bindWeChat(String code) {
return null; // 1. 获取 access_token 和 openid
JSONObject accessTokenResponse = getAccessTokenFromWeChat(code);
String accessToken = accessTokenResponse.getString("access_token");
String openId = accessTokenResponse.getString("openid");
if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(openId)) {
throw new RuntimeException("微信接口返回数据缺失: " + accessTokenResponse.toJSONString());
}
// 2. 获取用户信息
JSONObject userInfoResponse = getUserInfoFromWeChat(accessToken, openId);
// 提取 unionid 和 nickname
String unionId = userInfoResponse.getString("unionid");
String userName = userInfoResponse.getString("nickname");
String headimgurl = userInfoResponse.getString("headimgurl");
if (unionId == null) {
throw new IllegalArgumentException("无法获取 unionid请检查微信开发平台配置");
}
AccountExtend accountExtendInsert = new AccountExtend();
accountExtendInsert.setAuth(unionId);
accountExtendInsert.setAuthType("WeChat");
accountExtendInsert.setHeadImgUrl(headimgurl);
accountExtendInsert.setName(userName);
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
accountExtendInsert.setAccountId(authPrincipalVo.getId());
accountExtendMapper.insert(accountExtendInsert);
return Boolean.TRUE;
} }
} }