Browse Source

用户模块 增加账号绑定逻辑

songfuqiang 2 years ago
parent
commit
ddee1434ee

+ 24 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/controller/MembersController.java

@@ -6,11 +6,14 @@ import cn.kdan.pdf.backend.core.model.member.MemberInfoResp;
 import cn.kdan.pdf.backend.core.model.member.MemberRegisterReq;
 import cn.kdan.pdf.backend.core.model.member.MemberRegisterResp;
 import cn.kdan.pdf.backend.core.model.member.ModifyPasswordReq;
+import cn.kdan.pdf.backend.core.params.BindAccountParam;
 import cn.kdan.pdf.backend.core.params.UserResetPwdParams;
+import cn.kdan.pdf.backend.core.pojo.app.BindAccountVo;
 import cn.kdan.pdf.backend.core.service.MemberService;
 import constant.CommonConstant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import pojo.AppRequestParam;
 import pojo.AppResultMap;
 import pojo.ResultMap;
 
@@ -109,4 +112,25 @@ public class MembersController {
         return new AppResultMap<>(CommonConstant.SUCCESS,CommonConstant.CODE_SUCCESS,"注销账号成功");
     }
 
+    /**
+     * 绑定账号
+     * @param param 入参
+     * @return 绑定信息
+     */
+    @PostMapping("/bindAccount")
+    public AppResultMap<BindAccountVo> bindAccount(@RequestBody AppRequestParam<BindAccountParam> param){
+        BindAccountVo bindAccountVo = memberService.bindAccount(param.getData());
+        return new AppResultMap<>(CommonConstant.SUCCESS,CommonConstant.CODE_SUCCESS,bindAccountVo);
+    }
+
+    /**
+     * 解绑账号
+     * @param param 入参
+     * @return 解绑信息
+     */
+    @PostMapping("/unbindAccount")
+    public AppResultMap<BindAccountVo> unbindAccount(@RequestBody AppRequestParam<BindAccountParam> param){
+        return null;
+    }
+
 }

+ 28 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/params/BindAccountParam.java

@@ -0,0 +1,28 @@
+package cn.kdan.pdf.backend.core.params;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author sfq
+ * @description
+ */
+@Data
+public class BindAccountParam {
+
+    @JsonProperty("access_token")
+    private String accessToken;
+
+    @JsonProperty("force_bind")
+    private String forceBind;
+
+    private String openid;
+
+    private String provider;
+
+    private String phone;
+
+    @JsonProperty("phone_zone")
+    private String phoneZone;
+
+}

+ 16 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/pojo/app/BindAccountVo.java

@@ -0,0 +1,16 @@
+package cn.kdan.pdf.backend.core.pojo.app;
+
+import lombok.Data;
+
+/**
+ * @author sfq
+ * @description
+ */
+@Data
+public class BindAccountVo {
+
+    private MemberVo member;
+
+    private SocialAccountVo socialAccount;
+
+}

+ 18 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/pojo/app/SocialAccountVo.java

@@ -0,0 +1,18 @@
+package cn.kdan.pdf.backend.core.pojo.app;
+
+import lombok.Data;
+
+/**
+ * @author sfq
+ * @description
+ */
+@Data
+public class SocialAccountVo {
+
+    private String provider;
+
+    private String accountId;
+
+    private String name;
+
+}

+ 14 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/MemberService.java

@@ -5,7 +5,9 @@ import cn.kdan.pdf.backend.core.model.member.MemberInfoResp;
 import cn.kdan.pdf.backend.core.model.member.MemberRegisterReq;
 import cn.kdan.pdf.backend.core.model.member.MemberRegisterResp;
 import cn.kdan.pdf.backend.core.model.member.ModifyPasswordReq;
+import cn.kdan.pdf.backend.core.params.BindAccountParam;
 import cn.kdan.pdf.backend.core.params.UserResetPwdParams;
+import cn.kdan.pdf.backend.core.pojo.app.BindAccountVo;
 
 public interface MemberService {
 
@@ -82,4 +84,16 @@ public interface MemberService {
      */
     String cancelAccount();
 
+    /**
+     * 绑定账号
+     * @return 绑定信息
+     */
+    BindAccountVo bindAccount(BindAccountParam param);
+
+    /**
+     * 解绑账号
+     * @return 解绑信息
+     */
+    BindAccountVo unbindAccount(BindAccountParam param);
+
 }

+ 11 - 1
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/SocialAccountService.java

@@ -1,6 +1,8 @@
 package cn.kdan.pdf.backend.core.service;
 
+import cn.kdan.pdf.backend.core.model.Members;
 import cn.kdan.pdf.backend.core.model.SocialAccounts;
+import cn.kdan.pdf.backend.core.params.BindAccountParam;
 
 /**
  * @author : SongFuQiang
@@ -25,13 +27,21 @@ public interface SocialAccountService {
     /**
      * 根据用户id查询社交账号表数据
      * @param userId 用户id
+     * @param provider 第三方
      * @return 社交账号信息
      */
-    SocialAccounts selectByMemberId(String userId);
+    SocialAccounts selectByMemberId(String userId, Integer provider);
 
     /**
      * 根据用户id删除社交账号信息
      * @param memberId 用户ID
      */
     void deleteByMemberId(String memberId);
+
+    /**
+     * 绑定社交账号
+     * @param member 当前用户
+     * @param param 绑定参数
+     */
+    String bindSocialAccount(Members member, BindAccountParam param);
 }

+ 75 - 2
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/MemberServiceImpl.java

@@ -3,16 +3,22 @@ package cn.kdan.pdf.backend.core.service.impl;
 import cn.kdan.pdf.backend.core.constant.AuthConstant;
 import cn.kdan.pdf.backend.core.constant.MembersConstant;
 import cn.kdan.pdf.backend.core.enums.CaptchaActionEnum;
+import cn.kdan.pdf.backend.core.enums.ProviderEnum;
 import cn.kdan.pdf.backend.core.enums.SubscriberTypeEnum;
 import cn.kdan.pdf.backend.core.enums.VerifyTypeEnum;
 import cn.kdan.pdf.backend.core.mapper.*;
 import cn.kdan.pdf.backend.core.mapper.ext.ExtMembersMapper;
 import cn.kdan.pdf.backend.core.model.*;
 import cn.kdan.pdf.backend.core.model.member.*;
+import cn.kdan.pdf.backend.core.params.BindAccountParam;
 import cn.kdan.pdf.backend.core.params.UserResetPwdParams;
+import cn.kdan.pdf.backend.core.pojo.app.BindAccountVo;
+import cn.kdan.pdf.backend.core.pojo.app.MemberVo;
+import cn.kdan.pdf.backend.core.pojo.app.SocialAccountVo;
 import cn.kdan.pdf.backend.core.service.AuthService;
 import cn.kdan.pdf.backend.core.service.MemberService;
 import cn.kdan.pdf.backend.core.service.SocialAccountService;
+import cn.kdan.pdf.backend.core.service.UserService;
 import constant.CommonConstant;
 import enums.CommonEnum;
 import exception.BackendRuntimeException;
@@ -60,6 +66,8 @@ public class MemberServiceImpl implements MemberService {
     private ExtMembersMapper extMembersMapper;
     @Autowired
     private SocialAccountService socialAccountService;
+    @Autowired
+    private UserService userService;
 
     /**
      * 默认时区
@@ -392,7 +400,7 @@ public class MemberServiceImpl implements MemberService {
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = BackendRuntimeException.class)
     public boolean resetPassword(UserResetPwdParams params) {
         MembersExample example = new MembersExample();
         //如果是手机方式
@@ -469,10 +477,75 @@ public class MemberServiceImpl implements MemberService {
         Members currentUser = getCurrentUser();
         String memberId = currentUser.getId();
         //删除社交账号socialAccount表+用户members表数据
-        if(!StringUtils.isEmpty(memberId) && currentUser.getTotalPoints() == 10){
+        //判断用户是否是空数据类型(未充值过券和会员服务)
+        if(!StringUtils.isEmpty(memberId) && currentUser.getTotalPoints() == 10
+                && SubscriberTypeEnum.no.value().equals(currentUser.getSubscriberType())){
             socialAccountService.deleteByMemberId(memberId);
             membersMapper.deleteByPrimaryKey(memberId);
         }
         return memberId;
     }
+
+    //todo 先做绑定第三方账号
+    @Override
+    @Transactional(rollbackFor = BackendRuntimeException.class)
+    public BindAccountVo bindAccount(BindAccountParam param) {
+        BindAccountVo bindAccountVo = new BindAccountVo();
+        SocialAccountVo socialAccountVo = new SocialAccountVo();
+        MemberVo memberVo = new MemberVo();
+        Members currentUser = getCurrentUser();
+        BeanUtils.copyProperties(currentUser,memberVo);
+        memberVo.setStatus("verified");
+        String provider = param.getProvider();
+        if("phone".equals(provider)){
+            String phone = param.getPhone();
+            if(StringUtils.isEmpty(phone)){
+                throw new BackendRuntimeException("手机号不能为空");
+            }
+            Members member = userService.getByAccount(phone);
+            if(member != null){
+                //不允许绑定自己
+                if(member.getId().equals(currentUser.getId())) {
+                    throw new BackendRuntimeException("不允许绑定自己");
+                }else{
+                    if(member.getTotalPoints() <= 10 && SubscriberTypeEnum.no.value().equals(member.getSubscriberType())){
+                        //删除该手机的账号数据,然后更新手机到当前用户
+                        membersMapper.deleteByPrimaryKey(member.getId());
+                        //更新当前账号的手机号为phone参数
+                        if(!StringUtils.isEmpty(param.getPhoneZone())){
+                            currentUser.setPhoneZone(param.getPhoneZone());
+                        }
+                        currentUser.setPhone(phone);
+                        currentUser.setUpdatedAt(new Date());
+                        update(currentUser);
+                    }else{
+                        throw new BackendRuntimeException("不允许绑定该账号,因为充过钱了!");
+                    }
+                }
+            }else{
+                //直接更新当前账号的手机号为phone参数
+                if(!StringUtils.isEmpty(param.getPhoneZone())){
+                    currentUser.setPhoneZone(param.getPhoneZone());
+                }
+                currentUser.setPhone(phone);
+                currentUser.setUpdatedAt(new Date());
+                update(currentUser);
+            }
+        } else{
+            //绑定第三方账号
+            String accountId = socialAccountService.bindSocialAccount(currentUser,param);
+        }
+
+        SocialAccounts socialAccounts = socialAccountService.selectByMemberId(currentUser.getId(), ProviderEnum.getCodeByName(provider));
+        BeanUtils.copyProperties(socialAccounts,socialAccountVo);
+
+        bindAccountVo.setMember(memberVo);
+        bindAccountVo.setSocialAccount(socialAccountVo);
+        return bindAccountVo;
+    }
+
+    @Override
+    public BindAccountVo unbindAccount(BindAccountParam param) {
+        return null;
+    }
 }

+ 64 - 2
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/SocialAccountServiceImpl.java

@@ -1,12 +1,20 @@
 package cn.kdan.pdf.backend.core.service.impl;
 
+import cn.kdan.pdf.backend.core.enums.ProviderEnum;
 import cn.kdan.pdf.backend.core.mapper.SocialAccountsMapper;
+import cn.kdan.pdf.backend.core.model.Members;
 import cn.kdan.pdf.backend.core.model.SocialAccounts;
 import cn.kdan.pdf.backend.core.model.SocialAccountsExample;
+import cn.kdan.pdf.backend.core.params.BindAccountParam;
+import cn.kdan.pdf.backend.core.pojo.third.Tencent;
+import cn.kdan.pdf.backend.core.pojo.third.Wechat;
 import cn.kdan.pdf.backend.core.service.SocialAccountService;
+import cn.kdan.pdf.backend.core.utils.TencentUtils;
+import cn.kdan.pdf.backend.core.utils.WechatUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 
 import javax.annotation.Resource;
 import java.util.Date;
@@ -44,9 +52,9 @@ public class SocialAccountServiceImpl implements SocialAccountService {
     }
 
     @Override
-    public SocialAccounts selectByMemberId(String userId) {
+    public SocialAccounts selectByMemberId(String userId, Integer provider) {
         SocialAccountsExample example = new SocialAccountsExample();
-        example.createCriteria().andMemberIdEqualTo(userId);
+        example.createCriteria().andMemberIdEqualTo(userId).andProviderEqualTo(provider);
         List<SocialAccounts> list = socialAccountsMapper.selectByExample(example);
         if(CollectionUtils.isEmpty(list)){
             return null;
@@ -60,4 +68,58 @@ public class SocialAccountServiceImpl implements SocialAccountService {
         example.createCriteria().andMemberIdEqualTo(memberId);
         socialAccountsMapper.deleteByExample(example);
     }
+
+    @Override
+    public String bindSocialAccount(Members member, BindAccountParam param) {
+        String accountId = "";
+        String accessToken = param.getAccessToken();
+        String openid = param.getOpenid();
+        String provider = param.getProvider();
+        if(ProviderEnum.TENCENT.getName().equals(provider)){
+            Tencent userInfo = TencentUtils.getUserInfo(accessToken);
+            String unionId = userInfo.getUnionId();
+            accountId = unionId;
+            SocialAccounts socialAccount = selectByAccountId(unionId);
+            //看看有没有该账号,没有就新增一条,有就更新用户id
+            if(ObjectUtils.isEmpty(socialAccount)){
+                socialAccount.setAccountId(unionId);
+                socialAccount.setMemberId(member.getId());
+                socialAccount.setName(userInfo.getNickname());
+                socialAccount.setProvider(ProviderEnum.getCodeByName(provider));
+                socialAccount.setAvatar(userInfo.getFigureUrl());
+                insertSocialAccount(socialAccount);
+            } else{
+                socialAccount.setMemberId(member.getId());
+                updateSocialAccount(socialAccount);
+            }
+        }else{
+            Wechat userInfo = WechatUtils.getUserInfo(openid, accessToken);
+            String unionId = userInfo.getUnionId();
+            accountId = unionId;
+            SocialAccounts socialAccount = selectByAccountId(unionId);
+            if(ObjectUtils.isEmpty(socialAccount)){
+                socialAccount.setAvatar(userInfo.getHeadImgUrl());
+                socialAccount.setAccountId(unionId);
+                socialAccount.setProvider(ProviderEnum.getCodeByName(provider));
+                socialAccount.setMemberId(member.getId());
+                socialAccount.setName(userInfo.getNickname());
+                insertSocialAccount(socialAccount);
+            } else{
+                socialAccount.setMemberId(member.getId());
+                updateSocialAccount(socialAccount);
+            }
+        }
+        return accountId;
+    }
+
+    /**
+     * 根据accountId更新社交账号
+     * @param socialAccount 社交账号信息
+     */
+    public void updateSocialAccount(SocialAccounts socialAccount) {
+        SocialAccountsExample example = new SocialAccountsExample();
+        example.createCriteria().andAccountIdEqualTo(socialAccount.getAccountId());
+        socialAccount.setUpdatedAt(new Date());
+        socialAccountsMapper.updateByExample(socialAccount,example);
+    }
 }