Sfoglia il codice sorgente

增加风控规则 同应用不允许x天内不允许用户注册多渠道

marxjaw 4 mesi fa
parent
commit
dcfc547999

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/controller/UserController.java

@@ -241,7 +241,7 @@ public class UserController {
         return loginRecordMapper.queryLoginCount(appUserQueryParam);
     }
 
-    @GetMapping("/user/queryByOpenid")
+    @GetMapping("/queryByOpenid")
     public List<YtDyzUser> queryByOpenid(@RequestParam("openid") String openid){
         return appUserMapper.queryByOpenid(openid);
     }

+ 6 - 91
yt-app/app-service/src/main/java/com/ytpm/controller/WxController.java

@@ -22,11 +22,13 @@ import com.ytpm.handle.CustomerException;
 import com.ytpm.app.model.YtDyzLoginRecord;
 import com.ytpm.app.model.YtDyzPowerRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.service.AppUserService;
 import com.ytpm.util.RedisService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -47,20 +49,16 @@ import java.util.Objects;
 @RequestMapping("/wx")
 public class WxController {
     private final static String GRANT_TYPE = "authorization_code";
-    @Resource
-    private RedisService redisService;
     @Autowired
     private AppUserMapper appUserMapper;
     @Autowired
-    private LoginRecordMapper loginRecordMapper;
-    @Autowired
-    private QuestionMapper questionMapper;
-    @Autowired
     private RiskFeign riskFeign;
+    @Autowired
+    private AppUserService appUserService;
 
     @PostMapping("/login")
     @ApiOperation("微信登录")
-    @Transactional(rollbackFor = Exception.class)
+    @Transactional
     public Result<YtDyzUser> wxLogin(@RequestBody WxLoginParam param) {
         //根据应用获取配置调用微信接口登录
         WxDefaultConfig defaultConfig = appUserMapper.getDefaultConfig(param.getAppType());
@@ -76,43 +74,16 @@ public class WxController {
         if(Objects.isNull(wxUserInfo)) {
             throw new CustomerException("微信用户登录失败");
         }
-        //处理用户注册或登录更新信息
-        YtDyzUser old = appUserMapper.getYtAppUser(loginResult.getOpenid(), param.getDitchId());
-        if(Objects.isNull(old)) {
-            old = new YtDyzUser();
-            registryUser(param,wxUserInfo,loginResult, old);
-        }else{
-            deadWithUserCrud(old,wxUserInfo,param);
-        }
-        //设置最后一次答题问题ID、今日答题数、历史答题数
-        setExtInfo(old,wxUserInfo.getHeadimgurl());
+        YtDyzUser old = appUserService.crudForNewTrans(param,wxUserInfo,loginResult);
         //调用风控服务校验默认风控配置
         old.setRiskCode("313");
         Result<?> result = riskFeign.checkRisk(old);
         if(result.getCode()!=200){
             throw new CustomerException(result.getMessage());
         }
-        // 添加用户登录记录
-        addLoginRecord(param,old.getUserId());
         return Result.resultOk(RepMessage.LOGIN_SUCCESS, old);
     }
 
-    /**
-     * 处理用户数据
-     */
-    private void deadWithUserCrud(YtDyzUser old, WxUserInfo wxUserInfo, WxLoginParam param) {
-            //处于风控状态的用户不允许登录
-            if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())){
-                throw new CustomerException("当前用户处于"+UserStatusEnum.getByCode(old.getUserStatus())+"中,无法登录");
-            }
-            YtDyzUser newUser = new YtDyzUser();
-            newUser.setNickName(wxUserInfo.getNickname());
-            newUser.setHeadImg(wxUserInfo.getHeadimgurl());
-            newUser.setLastLoginTime(new Date());
-            newUser.setLastLoginIp(param.getLoginIp());
-            newUser.setLoginDays(old.getLoginDays()+1);
-            appUserMapper.updateUser(newUser);
-    }
 
     /**
      * 获取微信用户信息
@@ -146,62 +117,6 @@ public class WxController {
         return loginResult;
     }
 
-    /**
-     * 设置扩展信息
-     */
-    private void setExtInfo(YtDyzUser old, String headimgurl) {
-        old.setHeadImg(headimgurl);
-        old.setLastQuestionId(questionMapper.getLastQuestionId(old.getUserId()));
-        old.setTodayAnswerCount(questionMapper.getAnswerCount(old.getUserId(),1));
-        old.setHistoryAnswerCount(questionMapper.getAnswerCount(old.getUserId(),2));
-        old.setAnswerRecordList(questionMapper.getAnswerRecords(old.getUserId()));
-        old.setLoginRecordList(loginRecordMapper.getLoginRecords(old.getUserId()));
-    }
-
-    /**
-     * 增加用户登录记录
-     */
-    private void addLoginRecord(WxLoginParam param,String userId) {
-        YtDyzLoginRecord loginRecord = new YtDyzLoginRecord();
-        loginRecord.setRecordId(IdUtil.fastSimpleUUID());
-        loginRecord.setUserId(userId);
-        loginRecord.setLoginTime(new Date());
-        loginRecord.setDeviceBrand(param.getBrand());
-        loginRecord.setDeviceModel(param.getModel());
-        loginRecord.setLoginIp(param.getLoginIp());
-        loginRecord.setOperator(param.getIpOperator());
-        loginRecord.setIpAddr(param.getLoginIp());
-        loginRecordMapper.insertOne(loginRecord);
-    }
-
-    /**
-     * 注册用户
-     */
-    private void registryUser(WxLoginParam param,WxUserInfo wxUserInfo,WxLoginResult loginResult, YtDyzUser old) {
-        old.setUserId(redisService.getAppUserId());
-        old.setNickName(wxUserInfo.getNickname());
-        old.setLastLoginTime(new Date());
-        old.setRegistryTime(new Date());
-        old.setLastLoginIp(param.getLoginIp());
-        old.setLoginDays(1);
-        old.setPower(0);
-        old.setTotalVideo(0);
-        old.setTotalIncome(BigDecimal.ZERO);
-        old.setRedPacketAmount(BigDecimal.ZERO);
-        old.setRedPacketBalance(BigDecimal.ZERO);
-        old.setPointsBalance(BigDecimal.ZERO);
-        old.setPointsTotal(BigDecimal.ZERO);
-        old.setWithdrawTotal(BigDecimal.ZERO);
-        old.setDitchId(param.getDitchId());
-        old.setSignDays(0);
-        old.setAppId(param.getAppId());
-        old.setUserStatus(UserStatusEnum.NORMAL.getCode());
-        old.setWxOpenId(loginResult.getOpenid());
-        old.setHeadImg(wxUserInfo.getHeadimgurl());
-        old.setPlatformId(StrConstant.PLATFORM_ID_PREFIX + IdUtil.getSnowflakeNextIdStr());
-        appUserMapper.addOne(old);
-    }
-
     @ApiOperation("获取微信默认配置项")
     @GetMapping("/defaultConfig")
     public Result<String> getWxDefaultConfig(int appType) {

+ 8 - 0
yt-app/app-service/src/main/java/com/ytpm/service/AppUserService.java

@@ -1,10 +1,18 @@
 package com.ytpm.service;
 
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
 
 public interface AppUserService {
     /**
      * openid查询用户信息
      */
     YtDyzUser selectByOpenid(String openid, Long ditchId);
+
+    /**
+     * 子事务处理用户crud
+     */
+    YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult);
 }

+ 116 - 0
yt-app/app-service/src/main/java/com/ytpm/service/impl/AppUserServiceImpl.java

@@ -1,16 +1,40 @@
 package com.ytpm.service.impl;
 
+import cn.hutool.core.util.IdUtil;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.constant.StrConstant;
 import com.ytpm.dao.AppUserMapper;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.dao.LoginRecordMapper;
+import com.ytpm.dao.QuestionMapper;
+import com.ytpm.handle.CustomerException;
 import com.ytpm.service.AppUserService;
+import com.ytpm.util.RedisService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
 
 @Service
 public class AppUserServiceImpl implements AppUserService {
 
     @Autowired
     private AppUserMapper appUserMapper;
+    @Autowired
+    private LoginRecordMapper loginRecordMapper;
+    @Autowired
+    private QuestionMapper questionMapper;
+    @Resource
+    private RedisService redisService;
 
     /**
      * openid查询用户信息
@@ -19,4 +43,96 @@ public class AppUserServiceImpl implements AppUserService {
     public YtDyzUser selectByOpenid(String openid,Long ditchId) {
         return appUserMapper.getYtAppUser(openid,ditchId);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult) {
+        //处理用户注册或登录更新信息
+        YtDyzUser old = appUserMapper.getYtAppUser(loginResult.getOpenid(), param.getDitchId());
+        if(Objects.isNull(old)) {
+            old = new YtDyzUser();
+            registryUser(param,wxUserInfo,loginResult, old);
+        }else{
+            deadWithUserCrud(old,wxUserInfo,param);
+        }
+        //设置最后一次答题问题ID、今日答题数、历史答题数
+        setExtInfo(old,wxUserInfo.getHeadimgurl());
+        // 添加用户登录记录
+        addLoginRecord(param,old.getUserId());
+        return old;
+    }
+    /**
+     * 设置扩展信息
+     */
+    private void setExtInfo(YtDyzUser old, String headimgurl) {
+        old.setHeadImg(headimgurl);
+        old.setLastQuestionId(questionMapper.getLastQuestionId(old.getUserId()));
+        old.setTodayAnswerCount(questionMapper.getAnswerCount(old.getUserId(),1));
+        old.setHistoryAnswerCount(questionMapper.getAnswerCount(old.getUserId(),2));
+        old.setAnswerRecordList(questionMapper.getAnswerRecords(old.getUserId()));
+        old.setLoginRecordList(loginRecordMapper.getLoginRecords(old.getUserId()));
+    }
+
+    /**
+     * 增加用户登录记录
+     */
+    private void addLoginRecord(WxLoginParam param,String userId) {
+        YtDyzLoginRecord loginRecord = new YtDyzLoginRecord();
+        loginRecord.setRecordId(IdUtil.fastSimpleUUID());
+        loginRecord.setUserId(userId);
+        loginRecord.setLoginTime(new Date());
+        loginRecord.setDeviceBrand(param.getBrand());
+        loginRecord.setDeviceModel(param.getModel());
+        loginRecord.setLoginIp(param.getLoginIp());
+        loginRecord.setOperator(param.getIpOperator());
+        loginRecord.setIpAddr(param.getLoginIp());
+        loginRecordMapper.insertOne(loginRecord);
+    }
+
+    /**
+     * 处理用户数据
+     */
+    private void deadWithUserCrud(YtDyzUser old, WxUserInfo wxUserInfo, WxLoginParam param) {
+        //处于风控状态的用户不允许登录
+        if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())){
+            throw new CustomerException("当前用户处于"+UserStatusEnum.getByCode(old.getUserStatus())+"中,无法登录");
+        }
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setNickName(wxUserInfo.getNickname());
+        newUser.setHeadImg(wxUserInfo.getHeadimgurl());
+        newUser.setLastLoginTime(new Date());
+        newUser.setLastLoginIp(param.getLoginIp());
+        newUser.setLoginDays(old.getLoginDays()+1);
+        appUserMapper.updateUser(newUser);
+    }
+
+
+
+    /**
+     * 注册用户
+     */
+    private void registryUser(WxLoginParam param,WxUserInfo wxUserInfo,WxLoginResult loginResult, YtDyzUser old) {
+        old.setUserId(redisService.getAppUserId());
+        old.setNickName(wxUserInfo.getNickname());
+        old.setLastLoginTime(new Date());
+        old.setRegistryTime(new Date());
+        old.setLastLoginIp(param.getLoginIp());
+        old.setLoginDays(1);
+        old.setPower(0);
+        old.setTotalVideo(0);
+        old.setTotalIncome(BigDecimal.ZERO);
+        old.setRedPacketAmount(BigDecimal.ZERO);
+        old.setRedPacketBalance(BigDecimal.ZERO);
+        old.setPointsBalance(BigDecimal.ZERO);
+        old.setPointsTotal(BigDecimal.ZERO);
+        old.setWithdrawTotal(BigDecimal.ZERO);
+        old.setDitchId(param.getDitchId());
+        old.setSignDays(0);
+        old.setAppId(param.getAppId());
+        old.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        old.setWxOpenId(loginResult.getOpenid());
+        old.setHeadImg(wxUserInfo.getHeadimgurl());
+        old.setPlatformId(StrConstant.PLATFORM_ID_PREFIX + IdUtil.getSnowflakeNextIdStr());
+        appUserMapper.addOne(old);
+    }
 }