فهرست منبع

feat : 解决前端调试跨域问题

bilingfeng 2 سال پیش
والد
کامیت
901e2b8ae9

+ 132 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/RegisterUtils.java

@@ -0,0 +1,132 @@
+package com.zanxiang.sdk.common.util;
+
+import com.alibaba.nacos.common.utils.MD5Utils;
+import com.zanxiang.common.enums.HttpStatusEnum;
+import com.zanxiang.common.exception.BaseException;
+import org.apache.logging.log4j.util.Strings;
+
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description : 用户注册工具类
+ */
+public class RegisterUtils {
+
+    /**
+     * 密码加密盐值
+     */
+    private static final String CMF_PASSWORD_SALT = "ZX_PASSWORD_SALT";
+
+    /**
+     * 用户名最小长度
+     */
+    private static final int USER_NAME_LENGTH_MIN = 4;
+
+    /**
+     * 用户名最大长度
+     */
+    private static final int USER_NAME_LENGTH_MAX = 32;
+
+    /**
+     * 密码最小长度
+     */
+    private static final int PASSWORD_LENGTH_MIN = 6;
+
+    /**
+     * 密码最大长度
+     */
+    private static final int PASSWORD_LENGTH_MAX = 32;
+
+    /**
+     * 用户名合规检测
+     *
+     * @param userName : 用户名验证
+     * @return : 返回验证结果
+     */
+    public static HttpStatusEnum checkUserName(String userName) {
+        if (Strings.isBlank(userName)) {
+            return HttpStatusEnum.USERNAME_EMPTY;
+        }
+        //用户名长度验证
+        if (userName.length() < USER_NAME_LENGTH_MIN) {
+            return HttpStatusEnum.USERNAME_TOO_SHORT;
+        }
+        if (userName.length() > USER_NAME_LENGTH_MAX) {
+            return HttpStatusEnum.USERNAME_TOO_LONG;
+        }
+//        boolean matches = username.matches("[\\s]");
+//        if (!username.matches("/^[a-zA-Z0-9]+$/i")){
+//            return HttpStatusEnum.USERNAME_BAD_CHAR;
+//        }
+//        //合规验证
+//        if (username.matches("/\\s/") || username.matches("/^ZN/i") || !username.matches("^[a-zA-Z0-9]+$")) {
+//            return HttpStatusEnum.USERNAME_BAD_CHAR;
+//        }
+//        //用户名不是手机号, 用户名只能是数字和字母
+//        if (!StringUtils.checkPhone(username) && !username.matches("/^(?![^a-zA-Z]+$).{4,32}$/")) {
+//            return HttpStatusEnum.USERNAME_BAD_CHAR;
+//        }
+        //密码验证
+        return HttpStatusEnum.SUCCESS;
+    }
+
+    /**
+     * 密码合规检测
+     *
+     * @param password : 密码验证
+     * @return : 返回验证结果
+     */
+    public static HttpStatusEnum checkPassword(String password) {
+        if (Strings.isBlank(password)) {
+            return HttpStatusEnum.PASSWORD_EMPTY;
+        }
+        if (password.length() < PASSWORD_LENGTH_MIN) {
+            return HttpStatusEnum.PASSWORD_TOO_SHORT;
+        }
+        if (password.length() > PASSWORD_LENGTH_MAX) {
+            return HttpStatusEnum.PASSWORD_TOO_LONG;
+        }
+//        if (password.matches("/\\s/") || !password.matches("A([a-zA-Z0-9~`#$%^&*!@.,()\\\\{}|:;?<>]){6,32}$")) {
+//            return HttpStatusEnum.PASSWORD_BAD_CHAR;
+//        }
+        return HttpStatusEnum.SUCCESS;
+    }
+
+    /**
+     * 用户昵称合规检测
+     *
+     * @param nickname : 用户昵称
+     * @return : 检测结果
+     */
+    private HttpStatusEnum checkNickname(String nickname) {
+        if (Strings.isBlank(nickname)) {
+            return HttpStatusEnum.NICKNAME_EMPTY;
+        }
+        if (nickname.length() < 4) {
+            return HttpStatusEnum.NICKNAME_TOO_SHORT;
+        }
+        if (nickname.length() > 32) {
+            return HttpStatusEnum.NICKNAME_TOO_LONG;
+        }
+        //敏感词检测
+        return HttpStatusEnum.SUCCESS;
+    }
+
+    /**
+     * 密码cfm加密
+     *
+     * @param password : 密码
+     * @return : 返回加密完的密码
+     */
+    public static String cmfPassword(String password) {
+        String passwordSalt = password + CMF_PASSWORD_SALT;
+        try {
+            return "###" + MD5Utils.md5Hex(MD5Utils.md5Hex(passwordSalt.getBytes()).getBytes());
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            throw new BaseException("密码加密异常");
+        }
+    }
+}

+ 11 - 15
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/UserLoginController.java → game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/RegisterLoginController.java

@@ -3,8 +3,7 @@ package com.zanxiang.sdk.controller;
 import com.zanxiang.common.domain.ResultVo;
 import com.zanxiang.common.domain.ResultVo;
 import com.zanxiang.sdk.domain.params.*;
 import com.zanxiang.sdk.domain.params.*;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
-import com.zanxiang.sdk.service.IUserAuthService;
-import com.zanxiang.sdk.service.IUserService;
+import com.zanxiang.sdk.service.IRegisterLoginService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponse;
@@ -25,20 +24,17 @@ import javax.servlet.http.HttpServletResponse;
 @CrossOrigin
 @CrossOrigin
 @RestController
 @RestController
 @RequestMapping(value = "/api/user")
 @RequestMapping(value = "/api/user")
-public class UserLoginController {
+public class RegisterLoginController {
 
 
     @Autowired
     @Autowired
-    private IUserAuthService userAuthService;
-
-    @Autowired
-    private IUserService userService;
+    private IRegisterLoginService registerPassword;
 
 
     @ApiOperation(value = "用户普通注册")
     @ApiOperation(value = "用户普通注册")
     @PostMapping("/register/password")
     @PostMapping("/register/password")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo<UserLoginVO> registerPassword(@Validated @RequestBody RegisterPasswordParam registerPasswordParam,
     public ResultVo<UserLoginVO> registerPassword(@Validated @RequestBody RegisterPasswordParam registerPasswordParam,
                                                   HttpServletRequest request) {
                                                   HttpServletRequest request) {
-        return userService.registerPassword(registerPasswordParam, request);
+        return registerPassword.registerPassword(registerPasswordParam, request);
     }
     }
 
 
     @ApiOperation(value = "用户手机注册")
     @ApiOperation(value = "用户手机注册")
@@ -46,28 +42,28 @@ public class UserLoginController {
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo<UserLoginVO> registerMobile(@Validated @RequestBody RegisterMobileParam registerMobileParam,
     public ResultVo<UserLoginVO> registerMobile(@Validated @RequestBody RegisterMobileParam registerMobileParam,
                                                 HttpServletRequest request) {
                                                 HttpServletRequest request) {
-        return userService.registerMobile(registerMobileParam, request);
+        return registerPassword.registerMobile(registerMobileParam, request);
     }
     }
 
 
     @ApiOperation(value = "用户名密码登录")
     @ApiOperation(value = "用户名密码登录")
     @PostMapping("/login/password")
     @PostMapping("/login/password")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo<UserLoginVO> loginPassword(@Validated @RequestBody LoginPasswordParam userLoginParam, HttpServletRequest request) {
     public ResultVo<UserLoginVO> loginPassword(@Validated @RequestBody LoginPasswordParam userLoginParam, HttpServletRequest request) {
-        return userService.loginPassword(userLoginParam, request);
+        return registerPassword.loginPassword(userLoginParam, request);
     }
     }
 
 
     @ApiOperation(value = "用户手机号登录")
     @ApiOperation(value = "用户手机号登录")
     @PostMapping("/login/mobile")
     @PostMapping("/login/mobile")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo<UserLoginVO> loginMobile(@Validated @RequestBody LoginMobileParam loginMobileParam, HttpServletRequest request) {
     public ResultVo<UserLoginVO> loginMobile(@Validated @RequestBody LoginMobileParam loginMobileParam, HttpServletRequest request) {
-        return userService.loginMobile(loginMobileParam, request);
+        return registerPassword.loginMobile(loginMobileParam, request);
     }
     }
 
 
     @ApiOperation(value = "用户QQ授权登录")
     @ApiOperation(value = "用户QQ授权登录")
     @GetMapping("/register/login/qq")
     @GetMapping("/register/login/qq")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo qqLoginAuth(HttpServletResponse response) {
     public ResultVo qqLoginAuth(HttpServletResponse response) {
-        userAuthService.qqLoginAuth(response);
+        registerPassword.qqLoginAuth(response);
         return ResultVo.ok();
         return ResultVo.ok();
     }
     }
 
 
@@ -75,14 +71,14 @@ public class UserLoginController {
     @PostMapping("/register/login/qq/call/back")
     @PostMapping("/register/login/qq/call/back")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo<UserLoginVO> qqLoginCallback(@Validated @RequestBody QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
     public ResultVo<UserLoginVO> qqLoginCallback(@Validated @RequestBody QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
-        return userAuthService.qqLoginCallback(qqLoginCallbackParam, request);
+        return registerPassword.qqLoginCallback(qqLoginCallbackParam, request);
     }
     }
 
 
     @ApiOperation(value = "用户微信授权登录")
     @ApiOperation(value = "用户微信授权登录")
     @GetMapping("/register/login/vx")
     @GetMapping("/register/login/vx")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo getUserDetail(HttpServletResponse response) {
     public ResultVo getUserDetail(HttpServletResponse response) {
-        userAuthService.vxLoginAuth(response);
+        registerPassword.vxLoginAuth(response);
         return ResultVo.ok();
         return ResultVo.ok();
     }
     }
 
 
@@ -90,6 +86,6 @@ public class UserLoginController {
     @PostMapping("/register/login/vx/call/back")
     @PostMapping("/register/login/vx/call/back")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     public ResultVo<UserLoginVO> vxLoginCallback(@Validated @RequestBody QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
     public ResultVo<UserLoginVO> vxLoginCallback(@Validated @RequestBody QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
-        return userAuthService.vxLoginCallback(qqLoginCallbackParam, request);
+        return registerPassword.vxLoginCallback(qqLoginCallbackParam, request);
     }
     }
 }
 }

+ 4 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/filter/CORSFilter.java

@@ -4,6 +4,7 @@ import org.springframework.context.annotation.Configuration;
 
 
 import javax.servlet.*;
 import javax.servlet.*;
 import javax.servlet.annotation.WebFilter;
 import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
 
 
@@ -19,11 +20,12 @@ public class CORSFilter implements Filter {
     @Override
     @Override
     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
         HttpServletResponse response = (HttpServletResponse) res;
         HttpServletResponse response = (HttpServletResponse) res;
-        response.setHeader("Access-Control-Allow-Origin", "*");
+        HttpServletRequest request = (HttpServletRequest) req;
+        response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
         response.setHeader("Access-Control-Allow-Credentials", "true");
         response.setHeader("Access-Control-Allow-Credentials", "true");
         response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT, OPTION");
         response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT, OPTION");
         response.setHeader("Access-Control-Max-Age", "3600");
         response.setHeader("Access-Control-Max-Age", "3600");
-        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, cookie, token");
         chain.doFilter(req, res);
         chain.doFilter(req, res);
     }
     }
 
 

+ 84 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IRegisterLoginService.java

@@ -0,0 +1,84 @@
+package com.zanxiang.sdk.service;
+
+import com.zanxiang.common.domain.ResultVo;
+import com.zanxiang.sdk.domain.params.*;
+import com.zanxiang.sdk.domain.vo.UserLoginVO;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description :
+ */
+public interface IRegisterLoginService {
+
+    /**
+     * QQ授权登录
+     *
+     * @param response : 返回体
+     */
+    void qqLoginAuth(HttpServletResponse response);
+
+    /**
+     * QQ授权登录回调
+     *
+     * @param qqLoginCallbackParam : 回调参数
+     * @param request              : request
+     * @return : 返回登录token
+     */
+    ResultVo<UserLoginVO> qqLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request);
+
+    /**
+     * 微信授权登录
+     *
+     * @param response : 返回体
+     */
+    void vxLoginAuth(HttpServletResponse response);
+
+    /**
+     * 微信回调方法
+     *
+     * @param qqLoginCallbackParam : 回调参数
+     * @param request              : request
+     * @return : 返回登录token
+     */
+    ResultVo<UserLoginVO> vxLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request);
+
+    /**
+     * 用户名密码注册
+     *
+     * @param registerPasswordParam : 用户名密码注册参数
+     * @param request               : request
+     * @return : 返回注册结果
+     */
+    ResultVo<UserLoginVO> registerPassword(RegisterPasswordParam registerPasswordParam, HttpServletRequest request);
+
+    /**
+     * 手机注册
+     *
+     * @param registerMobileParam : 手机注册参数
+     * @param request             : HttpServletRequest
+     * @return : 返回注册结果
+     */
+    ResultVo<UserLoginVO> registerMobile(RegisterMobileParam registerMobileParam, HttpServletRequest request);
+
+    /**
+     * 用户名密码登录
+     *
+     * @param userLoginParam : 登录参数
+     * @param request        : HttpServletRequest
+     * @return : 返回登录token
+     */
+    ResultVo<UserLoginVO> loginPassword(LoginPasswordParam userLoginParam, HttpServletRequest request);
+
+    /**
+     * 手机号登录
+     *
+     * @param loginMobileParam : 手机号登录参数
+     * @param request          : HttpServletRequest
+     * @return : 返回登录信息
+     */
+    ResultVo<UserLoginVO> loginMobile(LoginMobileParam loginMobileParam, HttpServletRequest request);
+}

+ 0 - 48
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IUserAuthService.java

@@ -1,48 +0,0 @@
-package com.zanxiang.sdk.service;
-
-import com.zanxiang.common.domain.ResultVo;
-import com.zanxiang.sdk.domain.params.QqLoginCallbackParam;
-import com.zanxiang.sdk.domain.vo.UserLoginVO;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-21
- * @description : 用户第三方授权
- */
-public interface IUserAuthService {
-
-    /**
-     * QQ授权登录
-     *
-     * @param response : 返回体
-     */
-    void qqLoginAuth(HttpServletResponse response);
-
-    /**
-     * QQ授权登录回调
-     *
-     * @param qqLoginCallbackParam : 回调参数
-     * @param request              : request
-     * @return : 返回登录token
-     */
-    ResultVo<UserLoginVO> qqLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request);
-
-    /**
-     * 微信授权登录
-     *
-     * @param response : 返回体
-     */
-    void vxLoginAuth(HttpServletResponse response);
-
-    /**
-     * 微信回调方法
-     *
-     * @param qqLoginCallbackParam : 回调参数
-     * @param request              : request
-     * @return : 返回登录token
-     */
-    ResultVo<UserLoginVO> vxLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request);
-}

+ 3 - 40
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IUserService.java

@@ -4,12 +4,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.common.domain.ResultVo;
 import com.zanxiang.common.domain.ResultVo;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.sdk.domain.dto.UserDTO;
 import com.zanxiang.sdk.domain.dto.UserDTO;
-import com.zanxiang.sdk.domain.params.*;
-import com.zanxiang.sdk.domain.vo.UserLoginVO;
+import com.zanxiang.sdk.domain.params.UpdatePasswordParam;
+import com.zanxiang.sdk.domain.params.UserDetailParam;
 import com.zanxiang.sdk.domain.vo.UserVO;
 import com.zanxiang.sdk.domain.vo.UserVO;
 
 
-import javax.servlet.http.HttpServletRequest;
-
 /**
 /**
  * @author : lingfeng
  * @author : lingfeng
  * @time : 2022-06-08
  * @time : 2022-06-08
@@ -17,41 +15,6 @@ import javax.servlet.http.HttpServletRequest;
  */
  */
 public interface IUserService extends IService<User> {
 public interface IUserService extends IService<User> {
 
 
-    /**
-     * 普通注册
-     *
-     * @param registerPasswordParam : 用户名密码注册参数
-     * @return : 返回注册结果
-     */
-    ResultVo<UserLoginVO> registerPassword(RegisterPasswordParam registerPasswordParam, HttpServletRequest request);
-
-    /**
-     * 手机注册
-     *
-     * @param registerMobileParam : 手机注册参数
-     * @param request             : HttpServletRequest
-     * @return : 返回注册结果
-     */
-    ResultVo<UserLoginVO> registerMobile(RegisterMobileParam registerMobileParam, HttpServletRequest request);
-
-    /**
-     * 用户名密码登录
-     *
-     * @param userLoginParam : 登录参数
-     * @param request        : HttpServletRequest
-     * @return : 返回登录token
-     */
-    ResultVo<UserLoginVO> loginPassword(LoginPasswordParam userLoginParam, HttpServletRequest request);
-
-    /**
-     * 手机号登录
-     *
-     * @param loginMobileParam : 手机号登录参数
-     * @param request          : HttpServletRequest
-     * @return : 返回登录信息
-     */
-    ResultVo<UserLoginVO> loginMobile(LoginMobileParam loginMobileParam, HttpServletRequest request);
-
     /**
     /**
      * 用户重置密码
      * 用户重置密码
      *
      *
@@ -69,7 +32,7 @@ public interface IUserService extends IService<User> {
     ResultVo<UserVO> getUserDetail(UserDetailParam userDetailParam);
     ResultVo<UserVO> getUserDetail(UserDetailParam userDetailParam);
 
 
     /**
     /**
-     * 检查用户手机号是否存在
+     * 根据手机号获取用户信息
      *
      *
      * @param mobile : 用户手机号
      * @param mobile : 用户手机号
      * @return : 返回用户信息
      * @return : 返回用户信息

+ 443 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/RegisterLoginServiceImpl.java

@@ -0,0 +1,443 @@
+package com.zanxiang.sdk.service.Impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zanxiang.common.domain.ResultVo;
+import com.zanxiang.common.enums.AccountStatusEnum;
+import com.zanxiang.common.enums.HttpStatusEnum;
+import com.zanxiang.common.exception.BaseException;
+import com.zanxiang.common.text.UUID;
+import com.zanxiang.common.utils.IpUtils;
+import com.zanxiang.common.utils.JsonUtil;
+import com.zanxiang.common.utils.StringUtils;
+import com.zanxiang.common.utils.URIUtil;
+import com.zanxiang.mybatis.entity.User;
+import com.zanxiang.sdk.common.constant.ApiUrlConstant;
+import com.zanxiang.sdk.common.constant.RedisKeyConstant;
+import com.zanxiang.sdk.common.util.RedisUtils;
+import com.zanxiang.sdk.common.util.RegisterUtils;
+import com.zanxiang.sdk.domain.dto.UserOauthDTO;
+import com.zanxiang.sdk.domain.params.*;
+import com.zanxiang.sdk.domain.vo.UserLoginVO;
+import com.zanxiang.sdk.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description : 注册登录逻辑
+ */
+@Slf4j
+@Service
+public class RegisterLoginServiceImpl implements IRegisterLoginService {
+
+    @Autowired
+    private RedisUtils<String> redisUtils;
+
+    @Autowired
+    private IQqApiService qqApiService;
+
+    @Autowired
+    private IVxApiService vxApiService;
+
+    @Autowired
+    private IUserOauthService userOauthService;
+
+    @Autowired
+    private IUserTokenService userTokenService;
+
+    @Autowired
+    private IUserLoginLogService userLoginLogService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private ISmsService smsService;
+
+    @Autowired
+    private IWordCheckService wordCheckService;
+
+    /**
+     * QQ开发者应用id
+     */
+    @Value("${auth.qq-appId}")
+    private String qqAppId;
+
+    /**
+     * 微信开发者应用id
+     */
+    @Value("${auth.vx-appId}")
+    private String vxAppId;
+
+    /**
+     * QQ授权注册登录
+     *
+     * @param response : 返回体
+     */
+    @Override
+    public void qqLoginAuth(HttpServletResponse response) {
+        //获取state
+        String state = this.getState();
+        //传递参数
+        Map<String, String> paramMap = new HashMap<>(4);
+        paramMap.put("response_type", "code");
+        paramMap.put("client_id", qqAppId);
+        paramMap.put("state", state);
+        paramMap.put("redirect_uri", ApiUrlConstant.QQ_REDIRECT_URL);
+        //重定向到QQ授权页面
+        try {
+            response.sendRedirect(URIUtil.fillUrlParams(ApiUrlConstant.QQ_AUTH_URL, paramMap, Boolean.TRUE));
+        } catch (Exception e) {
+            log.error("QQ授权登录重定向跳转异常");
+            throw new BaseException("QQ授权登录重定向跳转异常");
+        }
+    }
+
+    /**
+     * QQ授权注册登录回调
+     *
+     * @param qqLoginCallbackParam : 回调参数
+     * @param request              : request
+     * @return : 返回登录token
+     */
+    @Override
+    public ResultVo<UserLoginVO> qqLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
+        String code = qqLoginCallbackParam.getCode();
+        String state = qqLoginCallbackParam.getState();
+        String deviceType = qqLoginCallbackParam.getDeviceType();
+        //验证state,如果不一致,可能被CSRF攻击
+        this.checkState(state);
+        //获取用户信息
+        Map<String, String> userInfoMap = qqApiService.qqAuthUserInfo(code);
+        //查询用户授权信息是否存在
+        UserOauthDTO userOauthDTO = userOauthService.getUserOauthByOpenId(userInfoMap.get("openId"));
+        //获取用户信息
+        User user = this.getUserByUserOauth(deviceType, userInfoMap, userOauthDTO);
+        //用户登录成功
+        String userToken = userTokenService.getUserToken(userOauthDTO.getId(), deviceType);
+        //登录的ip
+        String realIp = IpUtils.getRealIp(request);
+        //插入用户登录记录
+        userLoginLogService.addUserLoginLog(realIp, user, qqLoginCallbackParam.getGameId());
+        //移出state
+        redisUtils.removeOfSet(RedisKeyConstant.AUTH_STATE_KEY, state);
+        //构造返回
+        return new ResultVo<>(new UserLoginVO(userToken));
+    }
+
+    /**
+     * 微信授权注册登录
+     *
+     * @param response : 返回体
+     */
+    @Override
+    public void vxLoginAuth(HttpServletResponse response) {
+        //获取state
+        String state = this.getState();
+        //传递参数
+        Map<String, String> paramMap = new HashMap<>(6);
+        paramMap.put("appid", qqAppId);
+        paramMap.put("redirect_uri", URIUtil.encodeURIComponent(ApiUrlConstant.VX_REDIRECT_URL));
+        paramMap.put("response_type", "code");
+        paramMap.put("scope", "snsapi_login");
+        paramMap.put("state", state);
+        paramMap.put("lang", "cn");
+        //重定向到QQ授权页面
+        try {
+            response.sendRedirect(URIUtil.fillUrlParams(ApiUrlConstant.VX_AUTH_URL, paramMap, Boolean.TRUE));
+        } catch (Exception e) {
+            log.error("微信授权登录重定向跳转异常");
+            throw new BaseException("微信授权登录重定向跳转异常");
+        }
+    }
+
+    /**
+     * 微信授权注册登录回调
+     *
+     * @param qqLoginCallbackParam : 回调参数
+     * @param request              : request
+     * @return : 返回登录token
+     */
+    @Override
+    public ResultVo<UserLoginVO> vxLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
+        String deviceType = qqLoginCallbackParam.getDeviceType();
+        String code = qqLoginCallbackParam.getCode();
+        String state = qqLoginCallbackParam.getState();
+        //验证state,如果不一致,可能被CSRF攻击
+        this.checkState(state);
+        //获取用户信息
+        Map<String, String> userInfoMap = vxApiService.vxAuthUserInfo(code);
+        //查询用户授权信息是否存在
+        UserOauthDTO userOauthDTO = userOauthService.getUserOauthByOpenId(userInfoMap.get("openId"));
+        //获取用户信息
+        User user = this.getUserByUserOauth(deviceType, userInfoMap, userOauthDTO);
+        //登录的ip
+        String realIp = IpUtils.getRealIp(request);
+        //用户登录成功
+        String userToken = userTokenService.getUserToken(userOauthDTO.getId(), deviceType);
+        //插入用户登录记录
+        userLoginLogService.addUserLoginLog(realIp, user, qqLoginCallbackParam.getGameId());
+        //移出state
+        redisUtils.removeOfSet(RedisKeyConstant.AUTH_STATE_KEY, state);
+        //构造返回
+        return new ResultVo<>(new UserLoginVO(userToken));
+    }
+
+
+    /**
+     * 用户名密码注册
+     *
+     * @param registerPasswordParam : 用户名密码注册参数
+     * @param request               : request
+     * @return : 返回注册结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResultVo<UserLoginVO> registerPassword(RegisterPasswordParam registerPasswordParam, HttpServletRequest request) {
+        String username = registerPasswordParam.getUsername();
+        String password = registerPasswordParam.getPassword();
+        //用户名密码校验
+        HttpStatusEnum checkRegisterEnum = this.checkRegister(username, password);
+        if (!Objects.equals(checkRegisterEnum, HttpStatusEnum.SUCCESS)) {
+            return new ResultVo<>(checkRegisterEnum);
+        }
+        //创建用户信息
+        User user = User.builder()
+                .username(registerPasswordParam.getUsername())
+                .password(RegisterUtils.cmfPassword(password))
+                .deviceId(registerPasswordParam.getDeviceId())
+                .deviceType(registerPasswordParam.getDeviceType())
+                .status(AccountStatusEnum.NORMAL_STATUS.getStatus())
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .build();
+        userService.save(user);
+        //登录的ip
+        String realIp = IpUtils.getRealIp(request);
+        //插入用户登录记录
+        userLoginLogService.addUserLoginLog(realIp, user, registerPasswordParam.getGameId());
+        //获取token
+        String userToken = userTokenService.getUserToken(user.getId(), registerPasswordParam.getDeviceType());
+        //返回用户token
+        return new ResultVo<>(new UserLoginVO(userToken));
+    }
+
+    /**
+     * 手机号注册
+     *
+     * @param registerMobileParam : 手机注册参数
+     * @param request             : HttpServletRequest
+     * @return : 返回注册结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResultVo<UserLoginVO> registerMobile(RegisterMobileParam registerMobileParam, HttpServletRequest request) {
+        Integer type = registerMobileParam.getType();
+        String mobile = registerMobileParam.getMobile();
+        String code = registerMobileParam.getCode();
+        String password = registerMobileParam.getPassword();
+        //校验手机验证码
+        HttpStatusEnum codeCheckEnum = smsService.smsCheck(type, mobile, code);
+        if (!Objects.equals(codeCheckEnum, HttpStatusEnum.SUCCESS)) {
+            return new ResultVo<>(codeCheckEnum);
+        }
+        //判断手机号是否已经注册
+        if (userService.count(new LambdaQueryWrapper<User>().eq(User::getMobile, mobile)) > 0) {
+            return new ResultVo<>(HttpStatusEnum.PHONE_IS_REG);
+        }
+        //验证密码是否合规
+        HttpStatusEnum passwordCheckEnum = RegisterUtils.checkPassword(password);
+        if (!Objects.equals(passwordCheckEnum, HttpStatusEnum.SUCCESS)) {
+            return new ResultVo<>(passwordCheckEnum);
+        }
+        //创建用户信息
+        User user = User.builder()
+                .username(mobile)
+                .regMobile(mobile)
+                .mobile(mobile)
+                .password(RegisterUtils.cmfPassword(password))
+                .deviceId(registerMobileParam.getDeviceId())
+                .deviceType(registerMobileParam.getDeviceType())
+                .status(AccountStatusEnum.NORMAL_STATUS.getStatus())
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .build();
+        userService.save(user);
+        //获取token
+        String userToken = userTokenService.getUserToken(user.getId(), registerMobileParam.getDeviceType());
+        //登录的ip
+        String realIp = IpUtils.getRealIp(request);
+        //插入用户登录记录
+        userLoginLogService.addUserLoginLog(realIp, user, registerMobileParam.getGameId());
+        //返回用户token
+        return new ResultVo<>(new UserLoginVO(userToken));
+    }
+
+    /**
+     * 用户名密码登录
+     *
+     * @param userLoginParam : 登录参数
+     * @param request        : HttpServletRequest
+     * @return : 返回登录token
+     */
+    @Override
+    public ResultVo<UserLoginVO> loginPassword(LoginPasswordParam userLoginParam, HttpServletRequest request) {
+        //用户名
+        String username = userLoginParam.getUsername();
+        //密码
+        String password = userLoginParam.getPassword();
+        //用户信息
+        User user;
+        //验证用户名是否为手机号
+        if (StringUtils.checkPhone(username)) {
+            user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getMobile, username));
+        } else {
+            user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUsername, username));
+        }
+        //用户信息不存在
+        if (user == null) {
+            return new ResultVo<>(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR);
+        }
+        //判断账号是否停用
+        if (Objects.equals(AccountStatusEnum.FROZEN_STATUS.getStatus(), user.getStatus())) {
+            return new ResultVo<>(HttpStatusEnum.ACCOUNT_HALT);
+        }
+        //验证密码
+        if (!Objects.equals(RegisterUtils.cmfPassword(password), user.getPassword())) {
+            return new ResultVo<>(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR);
+        }
+        //验证通过, 获取token
+        String userToken = userTokenService.getUserToken(user.getId(), userLoginParam.getDeviceType());
+        //登录的ip
+        String realIp = IpUtils.getRealIp(request);
+        //插入用户登录记录
+        userLoginLogService.addUserLoginLog(realIp, user, userLoginParam.getGameId());
+        //构造返回
+        return new ResultVo<>(new UserLoginVO(userToken));
+    }
+
+
+    /**
+     * 手机号登录
+     *
+     * @param loginMobileParam : 手机号登录参数
+     * @param request          : HttpServletRequest
+     * @return : 返回登录信息
+     */
+    @Override
+    public ResultVo<UserLoginVO> loginMobile(LoginMobileParam loginMobileParam, HttpServletRequest request) {
+        Integer type = loginMobileParam.getType();
+        String mobile = loginMobileParam.getMobile();
+        String code = loginMobileParam.getCode();
+        //验证码校验
+        HttpStatusEnum httpStatusEnum = smsService.smsCheck(type, mobile, code);
+        //验证不通过, 返回
+        if (!Objects.equals(httpStatusEnum, HttpStatusEnum.SUCCESS)) {
+            return new ResultVo<>(httpStatusEnum);
+        }
+        //获取用户信息
+        User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getMobile, mobile));
+        //用户信息不存在
+        if (user == null) {
+            return new ResultVo<>(HttpStatusEnum.PHONE_NOT_REG);
+        }
+        //判断账号是否停用
+        if (Objects.equals(AccountStatusEnum.FROZEN_STATUS.getStatus(), user.getStatus())) {
+            return new ResultVo<>(HttpStatusEnum.ACCOUNT_HALT);
+        }
+        //验证通过, 获取token
+        String userToken = userTokenService.getUserToken(user.getId(), loginMobileParam.getDeviceType());
+        //登录的ip
+        String realIp = IpUtils.getRealIp(request);
+        //插入用户登录记录
+        userLoginLogService.addUserLoginLog(realIp, user, loginMobileParam.getGameId());
+        //构造返回
+        return new ResultVo<>(new UserLoginVO(userToken));
+    }
+
+    /**
+     * 根据用户授权信息获取用户
+     *
+     * @param deviceType   : 设备类型
+     * @param userInfoMap  : 第三方用户信息
+     * @param userOauthDTO : 用户授权信息
+     * @return : 返回应用用户信息
+     */
+    private User getUserByUserOauth(String deviceType, Map<String, String> userInfoMap, UserOauthDTO userOauthDTO) {
+        if (userOauthDTO != null) {
+            return userService.getById(userOauthDTO.getUserId());
+        }
+        //创建用户信息
+        User user = User.builder()
+                .nickname(userInfoMap.get("nickname"))
+                .avatar(userInfoMap.get("avatar"))
+                .deviceType(deviceType)
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .build();
+        userService.save(user);
+        //创建用户授权信息
+        userOauthDTO = userOauthService.createUserOauth(user, userInfoMap);
+        log.info("用户授权信息, userOauthDTO : {}", JsonUtil.toString(userOauthDTO));
+        //返回用户信息
+        return user;
+    }
+
+    /**
+     * 登录用户名密码合规检测
+     *
+     * @param username : 用户名验证
+     * @param password : 密码验证
+     * @return : 返回验证结果
+     */
+    private HttpStatusEnum checkRegister(String username, String password) {
+        //用户名合规检测
+        HttpStatusEnum checkUserNameEnum = RegisterUtils.checkUserName(username);
+        if (Objects.equals(checkUserNameEnum, HttpStatusEnum.SUCCESS)) {
+            return checkUserNameEnum;
+        }
+        //判断用户名是否存在敏感词
+        if (wordCheckService.hasWord(username)) {
+            return HttpStatusEnum.USERNAME_SENSITIVE;
+        }
+        //判断用户名是否已存在
+        if (userService.count(new LambdaQueryWrapper<User>().eq(User::getUsername, username)) > 0) {
+            return HttpStatusEnum.USERNAME_EXISTS;
+        }
+        //密码验证
+        return RegisterUtils.checkPassword(password);
+    }
+
+    /**
+     * 生成随机密钥并添加到redis中
+     *
+     * @return : 返回随机密钥
+     */
+    private String getState() {
+        String state = UUID.randomUUID().toString();
+        redisUtils.addToSet(RedisKeyConstant.AUTH_STATE_KEY, state);
+        return state;
+    }
+
+    /**
+     * state参数检测
+     *
+     * @param state : 随机密钥
+     */
+    private void checkState(String state) {
+        if (!redisUtils.isMemberInSet(RedisKeyConstant.AUTH_STATE_KEY, state)) {
+            throw new BaseException("State验证失败");
+        }
+    }
+}

+ 0 - 233
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserAuthServiceImpl.java

@@ -1,233 +0,0 @@
-package com.zanxiang.sdk.service.Impl;
-
-import com.zanxiang.common.domain.ResultVo;
-import com.zanxiang.common.exception.BaseException;
-import com.zanxiang.common.text.UUID;
-import com.zanxiang.common.utils.IpUtils;
-import com.zanxiang.common.utils.JsonUtil;
-import com.zanxiang.common.utils.URIUtil;
-import com.zanxiang.mybatis.entity.User;
-import com.zanxiang.sdk.common.constant.ApiUrlConstant;
-import com.zanxiang.sdk.common.constant.RedisKeyConstant;
-import com.zanxiang.sdk.common.util.RedisUtils;
-import com.zanxiang.sdk.domain.dto.UserOauthDTO;
-import com.zanxiang.sdk.domain.params.QqLoginCallbackParam;
-import com.zanxiang.sdk.domain.vo.UserLoginVO;
-import com.zanxiang.sdk.service.*;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-20
- * @description : 用户第三方授权
- */
-@Slf4j
-@Service
-public class UserAuthServiceImpl implements IUserAuthService {
-
-    @Autowired
-    private RedisUtils<String> redisUtils;
-
-    @Autowired
-    private IQqApiService qqApiService;
-
-    @Autowired
-    private IVxApiService vxApiService;
-
-    @Autowired
-    private IUserOauthService userOauthService;
-
-    @Autowired
-    private IUserTokenService userTokenService;
-
-    @Autowired
-    private IUserLoginLogService userLoginLogService;
-
-    @Autowired
-    private IUserService userService;
-
-    /**
-     * QQ开发者应用id
-     */
-    @Value("${auth.qq-appId}")
-    private String qqAppId;
-
-    /**
-     * QQ开发者应用id
-     */
-    @Value("${auth.vx-appId}")
-    private String vxAppId;
-
-    /**
-     * QQ授权登录
-     *
-     * @param response : 返回体
-     */
-    @Override
-    public void qqLoginAuth(HttpServletResponse response) {
-        //获取state
-        String state = this.getState();
-        //传递参数
-        Map<String, String> paramMap = new HashMap<>(4);
-        paramMap.put("response_type", "code");
-        paramMap.put("client_id", qqAppId);
-        paramMap.put("state", state);
-        paramMap.put("redirect_uri", ApiUrlConstant.QQ_REDIRECT_URL);
-        //重定向到QQ授权页面
-        try {
-            response.sendRedirect(URIUtil.fillUrlParams(ApiUrlConstant.QQ_AUTH_URL, paramMap, Boolean.TRUE));
-        } catch (Exception e) {
-            log.error("QQ授权登录重定向跳转异常");
-            throw new BaseException("QQ授权登录重定向跳转异常");
-        }
-    }
-
-    /**
-     * QQ授权登录回调
-     *
-     * @param qqLoginCallbackParam : 回调参数
-     * @param request              : request
-     * @return : 返回登录token
-     */
-    @Override
-    public ResultVo<UserLoginVO> qqLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
-        String code = qqLoginCallbackParam.getCode();
-        String state = qqLoginCallbackParam.getState();
-        String deviceType = qqLoginCallbackParam.getDeviceType();
-        //验证state,如果不一致,可能被CSRF攻击
-        this.checkState(state);
-        //获取用户信息
-        Map<String, String> userInfoMap = qqApiService.qqAuthUserInfo(code);
-        //查询用户授权信息是否存在
-        UserOauthDTO userOauthDTO = userOauthService.getUserOauthByOpenId(userInfoMap.get("openId"));
-        //获取用户信息
-        User user = this.getUserByUserOauth(deviceType, userInfoMap, userOauthDTO);
-        //用户登录成功
-        String userToken = userTokenService.getUserToken(userOauthDTO.getId(), deviceType);
-        //登录的ip
-        String realIp = IpUtils.getRealIp(request);
-        //插入用户登录记录
-        userLoginLogService.addUserLoginLog(realIp, user, qqLoginCallbackParam.getGameId());
-        //移出state
-        redisUtils.removeOfSet(RedisKeyConstant.AUTH_STATE_KEY, state);
-        //构造返回
-        return new ResultVo<>(new UserLoginVO(userToken));
-    }
-
-    /**
-     * 微信授权登录
-     *
-     * @param response : 返回体
-     */
-    @Override
-    public void vxLoginAuth(HttpServletResponse response) {
-        //获取state
-        String state = this.getState();
-        //传递参数
-        Map<String, String> paramMap = new HashMap<>(6);
-        paramMap.put("appid", qqAppId);
-        paramMap.put("redirect_uri", URIUtil.encodeURIComponent(ApiUrlConstant.VX_REDIRECT_URL));
-        paramMap.put("response_type", "code");
-        paramMap.put("scope", "snsapi_login");
-        paramMap.put("state", state);
-        paramMap.put("lang", "cn");
-        //重定向到QQ授权页面
-        try {
-            response.sendRedirect(URIUtil.fillUrlParams(ApiUrlConstant.VX_AUTH_URL, paramMap, Boolean.TRUE));
-        } catch (Exception e) {
-            log.error("微信授权登录重定向跳转异常");
-            throw new BaseException("微信授权登录重定向跳转异常");
-        }
-    }
-
-    /**
-     * 微信回调方法
-     *
-     * @param qqLoginCallbackParam : 回调参数
-     * @param request              : request
-     * @return : 返回登录token
-     */
-    @Override
-    public ResultVo<UserLoginVO> vxLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request) {
-        String deviceType = qqLoginCallbackParam.getDeviceType();
-        String code = qqLoginCallbackParam.getCode();
-        String state = qqLoginCallbackParam.getState();
-        //验证state,如果不一致,可能被CSRF攻击
-        this.checkState(state);
-        //获取用户信息
-        Map<String, String> userInfoMap = vxApiService.vxAuthUserInfo(code);
-        //查询用户授权信息是否存在
-        UserOauthDTO userOauthDTO = userOauthService.getUserOauthByOpenId(userInfoMap.get("openId"));
-        //获取用户信息
-        User user = this.getUserByUserOauth(deviceType, userInfoMap, userOauthDTO);
-        //登录的ip
-        String realIp = IpUtils.getRealIp(request);
-        //用户登录成功
-        String userToken = userTokenService.getUserToken(userOauthDTO.getId(), deviceType);
-        //插入用户登录记录
-        userLoginLogService.addUserLoginLog(realIp, user, qqLoginCallbackParam.getGameId());
-        //移出state
-        redisUtils.removeOfSet(RedisKeyConstant.AUTH_STATE_KEY, state);
-        //构造返回
-        return new ResultVo<>(new UserLoginVO(userToken));
-    }
-
-    /**
-     * 格局用户授权信息获取用户
-     *
-     * @param deviceType   : 设备类型
-     * @param userInfoMap  : 第三方用户信息
-     * @param userOauthDTO : 用户授权信息
-     * @return : 返回应用用户信息
-     */
-    private User getUserByUserOauth(String deviceType, Map<String, String> userInfoMap, UserOauthDTO userOauthDTO) {
-        if (userOauthDTO != null) {
-            return userService.getById(userOauthDTO.getUserId());
-        }
-        //创建用户信息
-        User user = User.builder()
-                .nickname(userInfoMap.get("nickname"))
-                .avatar(userInfoMap.get("avatar"))
-                .deviceType(deviceType)
-                .createTime(LocalDateTime.now())
-                .updateTime(LocalDateTime.now())
-                .build();
-        userService.save(user);
-        //创建用户授权信息
-        userOauthDTO = userOauthService.createUserOauth(user, userInfoMap);
-        log.info("用户授权信息, userOauthDTO : {}", JsonUtil.toString(userOauthDTO));
-        //返回用户信息
-        return user;
-    }
-
-    /**
-     * 生成随机密钥并添加到redis中
-     *
-     * @return : 返回随机密钥
-     */
-    private String getState() {
-        String state = UUID.randomUUID().toString();
-        redisUtils.addToSet(RedisKeyConstant.AUTH_STATE_KEY, state);
-        return state;
-    }
-
-    /**
-     * state参数检测
-     *
-     * @param state : 随机密钥
-     */
-    private void checkState(String state) {
-        if (!redisUtils.isMemberInSet(RedisKeyConstant.AUTH_STATE_KEY, state)) {
-            throw new BaseException("State验证失败");
-        }
-    }
-}

+ 8 - 296
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserServiceImpl.java

@@ -1,33 +1,27 @@
 package com.zanxiang.sdk.service.Impl;
 package com.zanxiang.sdk.service.Impl;
 
 
-import com.alibaba.nacos.common.utils.MD5Utils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.domain.ResultVo;
 import com.zanxiang.common.domain.ResultVo;
-import com.zanxiang.common.enums.AccountStatusEnum;
-import com.zanxiang.common.enums.CmfSaltEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
-import com.zanxiang.common.exception.BaseException;
-import com.zanxiang.common.utils.IpUtils;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.mapper.UserMapper;
 import com.zanxiang.mybatis.mapper.UserMapper;
+import com.zanxiang.sdk.common.util.RegisterUtils;
 import com.zanxiang.sdk.domain.dto.UserDTO;
 import com.zanxiang.sdk.domain.dto.UserDTO;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
-import com.zanxiang.sdk.domain.params.*;
-import com.zanxiang.sdk.domain.vo.UserLoginVO;
+import com.zanxiang.sdk.domain.params.UpdatePasswordParam;
+import com.zanxiang.sdk.domain.params.UserDetailParam;
 import com.zanxiang.sdk.domain.vo.UserVO;
 import com.zanxiang.sdk.domain.vo.UserVO;
-import com.zanxiang.sdk.service.*;
+import com.zanxiang.sdk.service.IUserService;
+import com.zanxiang.sdk.service.IUserTokenService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
-import javax.servlet.http.HttpServletRequest;
-import java.security.NoSuchAlgorithmException;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.Objects;
 import java.util.Objects;
 
 
@@ -43,272 +37,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @Autowired
     @Autowired
     private IUserTokenService userTokenService;
     private IUserTokenService userTokenService;
 
 
-    @Autowired
-    private ISmsService smsService;
-
-    @Autowired
-    private IUserLoginLogService userLoginLogService;
-
-    @Autowired
-    private IWordCheckService wordCheckService;
-
-    /**
-     * 普通注册
-     *
-     * @param registerPasswordParam : 用户名密码注册参数
-     * @return : 返回注册结果
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public ResultVo<UserLoginVO> registerPassword(RegisterPasswordParam registerPasswordParam, HttpServletRequest request) {
-        String username = registerPasswordParam.getUsername();
-        String password = registerPasswordParam.getPassword();
-        //用户名密码校验
-        HttpStatusEnum checkRegisterEnum = this.checkRegister(username, password);
-        if (!Objects.equals(checkRegisterEnum, HttpStatusEnum.SUCCESS)) {
-            return new ResultVo<>(checkRegisterEnum);
-        }
-        //创建用户信息
-        User user = User.builder()
-                .username(registerPasswordParam.getUsername())
-                .password(this.cmfPassword(password))
-                .deviceId(registerPasswordParam.getDeviceId())
-                .deviceType(registerPasswordParam.getDeviceType())
-                .status(AccountStatusEnum.NORMAL_STATUS.getStatus())
-                .createTime(LocalDateTime.now())
-                .updateTime(LocalDateTime.now())
-                .build();
-        super.save(user);
-        //登录的ip
-        String realIp = IpUtils.getRealIp(request);
-        //插入用户登录记录
-        userLoginLogService.addUserLoginLog(realIp, user, registerPasswordParam.getGameId());
-        //获取token
-        String userToken = userTokenService.getUserToken(user.getId(), registerPasswordParam.getDeviceType());
-        //返回用户token
-        return new ResultVo<>(new UserLoginVO(userToken));
-    }
-
-    /**
-     * 手机注册
-     *
-     * @param registerMobileParam : 手机注册参数
-     * @param request             : HttpServletRequest
-     * @return : 返回注册结果
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public ResultVo<UserLoginVO> registerMobile(RegisterMobileParam registerMobileParam, HttpServletRequest request) {
-        Integer type = registerMobileParam.getType();
-        String mobile = registerMobileParam.getMobile();
-        String code = registerMobileParam.getCode();
-        String password = registerMobileParam.getPassword();
-        //校验手机验证码
-        HttpStatusEnum codeCheckEnum = smsService.smsCheck(type, mobile, code);
-        if (!Objects.equals(codeCheckEnum, HttpStatusEnum.SUCCESS)) {
-            return new ResultVo<>(codeCheckEnum);
-        }
-        //判断手机号是否已经注册
-        if (super.count(new LambdaQueryWrapper<User>().eq(User::getMobile, mobile)) > 0) {
-            return new ResultVo<>(HttpStatusEnum.PHONE_IS_REG);
-        }
-        //验证密码是否合规
-        HttpStatusEnum passwordCheckEnum = this.checkPassword(password);
-        if (!Objects.equals(passwordCheckEnum, HttpStatusEnum.SUCCESS)) {
-            return new ResultVo<>(passwordCheckEnum);
-        }
-        //创建用户信息
-        User user = User.builder()
-                .username(mobile)
-                .regMobile(mobile)
-                .mobile(mobile)
-                .password(this.cmfPassword(password))
-                .deviceId(registerMobileParam.getDeviceId())
-                .deviceType(registerMobileParam.getDeviceType())
-                .status(AccountStatusEnum.NORMAL_STATUS.getStatus())
-                .createTime(LocalDateTime.now())
-                .updateTime(LocalDateTime.now())
-                .build();
-        super.save(user);
-        //获取token
-        String userToken = userTokenService.getUserToken(user.getId(), registerMobileParam.getDeviceType());
-        //登录的ip
-        String realIp = IpUtils.getRealIp(request);
-        //插入用户登录记录
-        userLoginLogService.addUserLoginLog(realIp, user, registerMobileParam.getGameId());
-        //返回用户token
-        return new ResultVo<>(new UserLoginVO(userToken));
-    }
-
-    /**
-     * 登录用户名密码合规检测
-     *
-     * @param username : 用户名验证
-     * @param password : 密码验证
-     * @return : 返回验证结果
-     */
-    private HttpStatusEnum checkRegister(String username, String password) {
-        if (Strings.isBlank(username)) {
-            return HttpStatusEnum.USERNAME_EMPTY;
-        }
-        //用户名长度验证
-        if (username.length() < 4) {
-            return HttpStatusEnum.USERNAME_TOO_SHORT;
-        }
-        if (username.length() > 32) {
-            return HttpStatusEnum.USERNAME_TOO_LONG;
-        }
-//        boolean matches = username.matches("[\\s]");
-//        if (!username.matches("/^[a-zA-Z0-9]+$/i")){
-//            return HttpStatusEnum.USERNAME_BAD_CHAR;
-//        }
-//        //合规验证
-//        if (username.matches("/\\s/") || username.matches("/^ZN/i") || !username.matches("^[a-zA-Z0-9]+$")) {
-//            return HttpStatusEnum.USERNAME_BAD_CHAR;
-//        }
-//        //用户名不是手机号, 用户名只能是数字和字母
-//        if (!StringUtils.checkPhone(username) && !username.matches("/^(?![^a-zA-Z]+$).{4,32}$/")) {
-//            return HttpStatusEnum.USERNAME_BAD_CHAR;
-//        }
-        //判断用户名是否存在敏感词
-        if (wordCheckService.hasWord(username)) {
-            return HttpStatusEnum.USERNAME_SENSITIVE;
-        }
-        //判断用户名是否已存在
-        if (super.count(new LambdaQueryWrapper<User>().eq(User::getUsername, username)) > 0) {
-            return HttpStatusEnum.USERNAME_EXISTS;
-        }
-        //密码验证
-        return this.checkPassword(password);
-    }
-
-    /**
-     * 密码合规检测
-     *
-     * @param password : 密码验证
-     * @return : 返回验证结果
-     */
-    private HttpStatusEnum checkPassword(String password) {
-        if (Strings.isBlank(password)) {
-            return HttpStatusEnum.PASSWORD_EMPTY;
-        }
-        if (password.length() < 6) {
-            return HttpStatusEnum.PASSWORD_TOO_SHORT;
-        }
-        if (password.length() > 32) {
-            return HttpStatusEnum.PASSWORD_TOO_LONG;
-        }
-//        if (password.matches("/\\s/") || !password.matches("A([a-zA-Z0-9~`#$%^&*!@.,()\\\\{}|:;?<>]){6,32}$")) {
-//            return HttpStatusEnum.PASSWORD_BAD_CHAR;
-//        }
-        return HttpStatusEnum.SUCCESS;
-    }
-
-    /**
-     * 用户昵称合规检测
-     *
-     * @param nickname : 用户昵称
-     * @return : 检测结果
-     */
-    private HttpStatusEnum checkNickname(String nickname) {
-        if (Strings.isBlank(nickname)) {
-            return HttpStatusEnum.NICKNAME_EMPTY;
-        }
-        if (nickname.length() < 4) {
-            return HttpStatusEnum.NICKNAME_TOO_SHORT;
-        }
-        if (nickname.length() > 32) {
-            return HttpStatusEnum.NICKNAME_TOO_LONG;
-        }
-        //判断昵称是否存在敏感词
-        if (wordCheckService.hasWord(nickname)) {
-            return HttpStatusEnum.NICKNAME_SENSITIVE;
-        }
-        return HttpStatusEnum.SUCCESS;
-    }
-
-    /**
-     * 用户名密码登录
-     *
-     * @param userLoginParam : 登录参数
-     * @param request        : HttpServletRequest
-     * @return : 返回登录token
-     */
-    @Override
-    public ResultVo<UserLoginVO> loginPassword(LoginPasswordParam userLoginParam, HttpServletRequest request) {
-        //用户名
-        String username = userLoginParam.getUsername();
-        //密码
-        String password = userLoginParam.getPassword();
-        //用户信息
-        User user;
-        //验证用户名是否为手机号
-        if (StringUtils.checkPhone(username)) {
-            user = super.getOne(new LambdaQueryWrapper<User>().eq(User::getMobile, username));
-        } else {
-            user = super.getOne(new LambdaQueryWrapper<User>().eq(User::getUsername, username));
-        }
-        //用户信息不存在
-        if (user == null) {
-            return new ResultVo<>(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR);
-        }
-        //判断账号是否停用
-        if (Objects.equals(AccountStatusEnum.FROZEN_STATUS.getStatus(), user.getStatus())) {
-            return new ResultVo<>(HttpStatusEnum.ACCOUNT_HALT);
-        }
-        //验证密码
-        if (!Objects.equals(this.cmfPassword(password), user.getPassword())) {
-            return new ResultVo<>(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR);
-        }
-        //验证通过, 获取token
-        String userToken = userTokenService.getUserToken(user.getId(), userLoginParam.getDeviceType());
-        //登录的ip
-        String realIp = IpUtils.getRealIp(request);
-        //插入用户登录记录
-        userLoginLogService.addUserLoginLog(realIp, user, userLoginParam.getGameId());
-        //构造返回
-        return new ResultVo<>(new UserLoginVO(userToken));
-    }
-
-
-    /**
-     * 手机号登录
-     *
-     * @param loginMobileParam : 手机号登录参数
-     * @param request          : HttpServletRequest
-     * @return : 返回登录信息
-     */
-    @Override
-    public ResultVo<UserLoginVO> loginMobile(LoginMobileParam loginMobileParam, HttpServletRequest request) {
-        Integer type = loginMobileParam.getType();
-        String mobile = loginMobileParam.getMobile();
-        String code = loginMobileParam.getCode();
-        //验证码校验
-        HttpStatusEnum httpStatusEnum = smsService.smsCheck(type, mobile, code);
-        //验证不通过, 返回
-        if (!Objects.equals(httpStatusEnum, HttpStatusEnum.SUCCESS)) {
-            return new ResultVo<>(httpStatusEnum);
-        }
-        //获取用户信息
-        User user = super.getOne(new LambdaQueryWrapper<User>().eq(User::getMobile, mobile));
-        //用户信息不存在
-        if (user == null) {
-            return new ResultVo<>(HttpStatusEnum.PHONE_NOT_REG);
-        }
-        //判断账号是否停用
-        if (Objects.equals(AccountStatusEnum.FROZEN_STATUS.getStatus(), user.getStatus())) {
-            return new ResultVo<>(HttpStatusEnum.ACCOUNT_HALT);
-        }
-        //验证通过, 获取token
-        String userToken = userTokenService.getUserToken(user.getId(), loginMobileParam.getDeviceType());
-        //登录的ip
-        String realIp = IpUtils.getRealIp(request);
-        //插入用户登录记录
-        userLoginLogService.addUserLoginLog(realIp, user, loginMobileParam.getGameId());
-        //构造返回
-        return new ResultVo<>(new UserLoginVO(userToken));
-    }
-
     /**
     /**
      * 用户重置密码
      * 用户重置密码
      *
      *
@@ -338,13 +66,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             return new ResultVo<>(checkUserTokenEnum);
             return new ResultVo<>(checkUserTokenEnum);
         }
         }
         //密码校验
         //密码校验
-        HttpStatusEnum checkPasswordEnum = this.checkPassword(password);
+        HttpStatusEnum checkPasswordEnum = RegisterUtils.checkPassword(password);
         if (!Objects.equals(checkPasswordEnum, HttpStatusEnum.SUCCESS)) {
         if (!Objects.equals(checkPasswordEnum, HttpStatusEnum.SUCCESS)) {
             return new ResultVo<>(checkPasswordEnum);
             return new ResultVo<>(checkPasswordEnum);
         }
         }
         //修改用户密码
         //修改用户密码
         super.update(new LambdaUpdateWrapper<User>()
         super.update(new LambdaUpdateWrapper<User>()
-                .set(User::getPassword, this.cmfPassword(password))
+                .set(User::getPassword, RegisterUtils.cmfPassword(password))
                 .set(User::getUpdateTime, LocalDateTime.now())
                 .set(User::getUpdateTime, LocalDateTime.now())
                 .eq(User::getUsername, username));
                 .eq(User::getUsername, username));
         //返回修改成功
         //返回修改成功
@@ -375,23 +103,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     }
     }
 
 
     /**
     /**
-     * 密码cfm加密
-     *
-     * @param password : 密码
-     * @return : 返回加密完的密码
-     */
-    private String cmfPassword(String password) {
-        String passwordSalt = password + CmfSaltEnum.CMF_PASSWORD.getSalt();
-        try {
-            return "###" + MD5Utils.md5Hex(MD5Utils.md5Hex(passwordSalt.getBytes()).getBytes());
-        } catch (NoSuchAlgorithmException e) {
-            e.printStackTrace();
-            throw new BaseException("密码加密异常");
-        }
-    }
-
-    /**
-     * 检查用户手机号是否存在
+     * 根据手机号获取用户信息
      *
      *
      * @param mobile : 用户手机号
      * @param mobile : 用户手机号
      * @return : 返回用户信息
      * @return : 返回用户信息