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