From 403fbe8fa8d3df96d692ad41ffa1c300b0db5493 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期六, 24 八月 2024 18:02:02 +0800 Subject: [PATCH] APP端登录模块接口 --- xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java | 302 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 299 insertions(+), 3 deletions(-) diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java index ec96e38..46fd4ce 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java @@ -1,13 +1,39 @@ package com.xinquan.user.service.impl; +import cn.hutool.core.util.IdUtil; import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.constant.Constants; +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.common.core.enums.AppUserStatusEnum; +import com.xinquan.common.core.enums.DisabledEnum; +import com.xinquan.common.core.enums.TreeLevelEnum; +import com.xinquan.common.core.exception.ServiceException; import com.xinquan.common.core.utils.page.BeanUtils; +import com.xinquan.common.security.utils.SecurityUtils; +import com.xinquan.system.api.RemoteUserService; +import com.xinquan.system.api.domain.SysUser; +import com.xinquan.system.api.feignClient.SysUserClient; +import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppVerifyCellPhoneBody; +import com.xinquan.system.api.model.AppWXLoginBody; +import com.xinquan.system.api.model.AppleLoginUser; +import com.xinquan.system.api.model.LoginUser; +import com.xinquan.system.api.model.WXLoginUser; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; +import com.xinquan.user.domain.AppUserTree; import com.xinquan.user.mapper.AppUserMapper; import com.xinquan.user.service.AppUserService; +import com.xinquan.user.service.AppUserTreeService; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Objects; +import java.util.Optional; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * <p> @@ -18,20 +44,28 @@ * @since 2024-08-21 */ @Service +@RequiredArgsConstructor public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements AppUserService { + + private final SysUserClient sysUserClient; + private final RemoteUserService remoteUserService; + private final AppUserTreeService appUserTreeService; /** * 获取用户信息 + * * @param dto * @return */ @Override - public AppUser getUserByCondition(AppUserDTO dto) { - return this.lambdaQuery() + public Optional<AppUser> getUserByCondition(AppUserDTO dto) { + return this.lambdaQuery() + .eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId()) .eq(StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId()) .eq(StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone, dto.getCellPhone()) .eq(StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId, - dto.getWxOpenId()).oneOpt().orElse(null); + dto.getWxOpenId()) + .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt(); } /** @@ -44,4 +78,266 @@ AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class); return this.save(appUser); } + + /** + * APP微信登录 + * + * @param body + * @return + */ + @Override + public WXLoginUser wxLogin(AppWXLoginBody body) { + WXLoginUser wxLoginUser = new WXLoginUser(); + Optional<AppUser> optionalAppUser = this.getUserByCondition( + AppUserDTO.builder().wxOpenId(body.getWxOpenId()).build()); + // 存在账户,查询关联系统用户 + if (optionalAppUser.isPresent()) { + AppUser appUser = optionalAppUser.get(); + SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); + wxLoginUser.setSysUser(sysUser); + if (Objects.nonNull(sysUser.getUserName())) { + wxLoginUser.setBindStatus(1); + wxLoginUser.setCellPhone(appUser.getCellPhone()); + } + } else { + // 不存在账户,创建账户 + // 注册用户信息 + SysUser sysUser = new SysUser(); + sysUser.setNickName(body.getNickname()); + sysUser.setAvatar(body.getHeadImgUrl()); + + R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser, + SecurityConstants.INNER); + if (registerResult.getCode() == Constants.FAIL) { + throw new ServiceException(registerResult.getMsg()); + } + SysUser sysUserRes = registerResult.getData(); + AppUser appUser = new AppUser(); + appUser.setUserId(sysUserRes.getUserId()); + appUser.setWxOpenId(body.getWxOpenId()); + appUser.setNickname(body.getNickname()); + appUser.setAvatar(body.getHeadImgUrl()); + appUser.setGender(body.getSex()); + appUser.setBalance(BigDecimal.ZERO); + appUser.setSanskritFlag(DisabledEnum.NO.getCode()); + appUser.setBalance(BigDecimal.ZERO); + appUser.setIncome(BigDecimal.ZERO); + appUser.setTotalEnergyValue(0); + appUser.setRegisterTime(LocalDateTime.now()); + appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode()); + this.save(appUser); + // 初始化用户树苗 + initUserTree(appUser.getId()); + wxLoginUser.setSysUser(null); + wxLoginUser.setBindStatus(DisabledEnum.NO.getCode()); + } + return wxLoginUser; + } + + @Override + public AppleLoginUser appleLogin(String appleId) { + AppleLoginUser appleLoginUser = new AppleLoginUser(); + Optional<AppUser> optionalAppUser = this.getUserByCondition( + AppUserDTO.builder().appleId(appleId).build()); + // 存在账户,查询关联系统用户 + if (optionalAppUser.isPresent()) { + AppUser appUser = optionalAppUser.get(); + SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); + appleLoginUser.setSysUser(sysUser); + if (Objects.nonNull(sysUser.getUserName())) { + appleLoginUser.setBindStatus(1); + appleLoginUser.setCellPhone(appUser.getCellPhone()); + } + } else { + // 不存在账户,创建账户 + // 注册用户信息 + SysUser sysUser = new SysUser(); + String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6); + sysUser.setNickName(nickname); + sysUser.setAvatar("qwer"); + + R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser, + SecurityConstants.INNER); + if (registerResult.getCode() == Constants.FAIL) { + throw new ServiceException(registerResult.getMsg()); + } + SysUser sysUserRes = registerResult.getData(); + AppUser appUser = new AppUser(); + appUser.setUserId(sysUserRes.getUserId()); + appUser.setNickname(nickname); + appUser.setAvatar("qwer"); // TODO 待完善默认头像 + appUser.setBalance(BigDecimal.ZERO); + appUser.setSanskritFlag(DisabledEnum.NO.getCode()); + appUser.setBalance(BigDecimal.ZERO); + appUser.setIncome(BigDecimal.ZERO); + appUser.setTotalEnergyValue(0); + appUser.setRegisterTime(LocalDateTime.now()); + appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode()); + this.save(appUser); + // 初始化用户树苗 + initUserTree(appUser.getId()); + appleLoginUser.setSysUser(null); + appleLoginUser.setBindStatus(DisabledEnum.NO.getCode()); + } + + return appleLoginUser; + } + + /** + * 验证码登录 + * + * @param body + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public LoginUser appCaptchaLogin(AppCaptchaBody body) { + LoginUser loginUser = new LoginUser(); + Optional<AppUser> optionalAppUser = this.getUserByCondition( + AppUserDTO.builder().cellPhone(body.getCellPhone()).build()); + if (optionalAppUser.isPresent()) { + AppUser appUser = optionalAppUser.get(); + SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); + loginUser.setSysUser(sysUser); + } else { + // 注册用户信息 + SysUser sysUser = new SysUser(); + String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6); + sysUser.setNickName(nickname); + sysUser.setAvatar("qwer"); + sysUser.setUserName(body.getCellPhone()); + // 设置默认密码123456 + sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD)); + + R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser, + SecurityConstants.INNER); + if (registerResult.getCode() == Constants.FAIL) { + throw new ServiceException(registerResult.getMsg()); + } + SysUser sysUserRes = registerResult.getData(); + AppUser appUser = new AppUser(); + appUser.setUserId(sysUserRes.getUserId()); + appUser.setNickname(nickname); + appUser.setCellPhone(body.getCellPhone()); + appUser.setAvatar("qwer"); // TODO 待完善默认头像 + appUser.setBalance(BigDecimal.ZERO); + appUser.setSanskritFlag(DisabledEnum.NO.getCode()); + appUser.setBalance(BigDecimal.ZERO); + appUser.setIncome(BigDecimal.ZERO); + appUser.setTotalEnergyValue(0); + appUser.setRegisterTime(LocalDateTime.now()); + appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode()); + this.save(appUser); + // 初始化用户树苗 + initUserTree(appUser.getId()); + } + return loginUser; + } + + /** + * 初始化用户树苗 + * + * @param appUserId 用户id + */ + private void initUserTree(Long appUserId) { + AppUserTree appUserTree = new AppUserTree(); + appUserTree.setAppUserId(appUserId); + appUserTree.setTreeLevelType(TreeLevelEnum.SEED.getCode()); + appUserTree.setGrowthValue(0); + appUserTree.setSowAgain(2); + appUserTree.setCurrentEnergyValue(0); + appUserTreeService.save(appUserTree); + } + + /** + * 微信苹果登录验证手机号码操作 + * + * @param body + * @return + */ + @Override + public WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) { + Integer loginType = body.getLoginType(); + String wxOrAppleId = body.getWxOrAppleId(); + SysUser sysUser; + AppUser appUser; + // 先通过手机号查询用户,如果用户先使用手机号码登录过,那么就已经存在这个手机号码的用户了。 + Optional<AppUser> baseOptionalAppUser = this.getUserByCondition( + AppUserDTO.builder().cellPhone(body.getCellPhone()).build()); + // 如果存在 更新wxOpenId 或appleId + if (baseOptionalAppUser.isPresent()) { + appUser = baseOptionalAppUser.get(); + if (loginType.equals(1)) { + appUser.setWxOpenId(wxOrAppleId); + } else { + appUser.setAppleId(wxOrAppleId); + } + // 查询系统用户 + sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); + if (Objects.isNull(sysUser)) { + throw new ServiceException("系统用户不存在"); + } + } else { + Optional<AppUser> userOptional = getAppUserByThirdId(loginType, wxOrAppleId); + + if (loginType.equals(1)) { + // 微信登录 + handleUserNotPresent(userOptional, "该用户不存在,请重新进行微信授权登录"); + } else { + // 苹果登录 + handleUserNotPresent(userOptional, "该用户不存在,请重新进行苹果授权登录"); + } + appUser = userOptional.get(); + appUser.setCellPhone(body.getCellPhone()); + // 更新系统用户 + sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); + if (Objects.isNull(sysUser)) { + throw new ServiceException("系统用户不存在"); + } + sysUser.setUserName(body.getCellPhone()); + sysUser.setPassword( + SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD)); // 默认密码为123456 + sysUser.setPhonenumber(body.getCellPhone()); + sysUserClient.updateSysUser(sysUser); + } + // 更新用户信息 + this.updateById(appUser); + if (loginType.equals(1)) { + // 微信登录 + WXLoginUser wxLoginUser = new WXLoginUser(); + wxLoginUser.setBindStatus(1); + wxLoginUser.setCellPhone(body.getCellPhone()); + wxLoginUser.setSysUser(sysUser); + return wxLoginUser; + } else { + // 苹果登录 + AppleLoginUser appleLoginUser = new AppleLoginUser(); + appleLoginUser.setBindStatus(1); + appleLoginUser.setCellPhone(body.getCellPhone()); + appleLoginUser.setSysUser(sysUser); + return appleLoginUser; + } + } + + // 定义一个方法来处理用户不存在的情况 + private void handleUserNotPresent(Optional<AppUser> userOptional, String errorMessage) { + if (!userOptional.isPresent()) { + throw new ServiceException(errorMessage); + } + } + + /** + * 根据第三方id获取未注销用户 + * + * @param loginType 登录类型 1=微信 2=苹果 + * @param wxOrAppleId 微信openid或苹果appleId + * @return Optional<AppUser> + */ + private Optional<AppUser> getAppUserByThirdId(Integer loginType, String wxOrAppleId) { + return this.lambdaQuery() + .eq(loginType.equals(1), AppUser::getWxOpenId, wxOrAppleId) + .eq(loginType.equals(2), AppUser::getAppleId, wxOrAppleId) + .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT) + .oneOpt(); + } } -- Gitblit v1.7.1