|
@@ -2,6 +2,7 @@ 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.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.zanxiang.common.domain.ResultVo;
|
|
|
import com.zanxiang.common.enums.HttpStatusEnum;
|
|
@@ -13,20 +14,19 @@ import com.zanxiang.sdk.domain.dto.UserDTO;
|
|
|
import com.zanxiang.sdk.domain.entity.User;
|
|
|
import com.zanxiang.sdk.domain.enums.AccountStatusEnum;
|
|
|
import com.zanxiang.sdk.domain.enums.CmfSaltEnum;
|
|
|
-import com.zanxiang.sdk.domain.params.LoginMobileParam;
|
|
|
-import com.zanxiang.sdk.domain.params.LoginPasswordParam;
|
|
|
+import com.zanxiang.sdk.domain.params.*;
|
|
|
import com.zanxiang.sdk.domain.vo.UserLoginVO;
|
|
|
import com.zanxiang.sdk.mapper.UserMapper;
|
|
|
-import com.zanxiang.sdk.service.ISmsService;
|
|
|
-import com.zanxiang.sdk.service.IUserLoginLogService;
|
|
|
-import com.zanxiang.sdk.service.IUserService;
|
|
|
-import com.zanxiang.sdk.service.IUserTokenService;
|
|
|
+import com.zanxiang.sdk.service.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.logging.log4j.util.Strings;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.util.Objects;
|
|
|
|
|
|
/**
|
|
@@ -47,11 +47,167 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
|
|
|
@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 = new User(registerPasswordParam, this.cmfPassword(password));
|
|
|
+ super.save(user);
|
|
|
+ //登录的ip
|
|
|
+ String realIp = IpUtils.getRealIp(request);
|
|
|
+ //插入用户登录记录
|
|
|
+ userLoginLogService.addUserLoginLog(realIp, user, registerPasswordParam.getGameId());
|
|
|
+ //获取token
|
|
|
+ String userToken = userTokenService.getUserToken(user.getId(), user.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 = new User(registerMobileParam, this.cmfPassword(password));
|
|
|
+ super.save(user);
|
|
|
+ //获取token
|
|
|
+ String userToken = userTokenService.getUserToken(user.getId(), user.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;
|
|
|
+ }
|
|
|
+ //合规验证
|
|
|
+ if (username.matches("/\\s/") || username.matches("/^ZN/i") || !username.matches("/^[a-zA-Z0-9]+$/i")) {
|
|
|
+ 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
|
|
|
+ * @param request : HttpServletRequest
|
|
|
* @return : 返回登录token
|
|
|
*/
|
|
|
@Override
|
|
@@ -95,7 +251,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
|
|
|
* 手机号登录
|
|
|
*
|
|
|
* @param loginMobileParam : 手机号登录参数
|
|
|
- * @param request : HttpServletRequest
|
|
|
+ * @param request : HttpServletRequest
|
|
|
* @return : 返回登录信息
|
|
|
*/
|
|
|
@Override
|
|
@@ -129,6 +285,44 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
|
|
|
return new ResultVo<>(new UserLoginVO(userToken));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 用户重置密码
|
|
|
+ *
|
|
|
+ * @param updatePasswordParam : 修改密码的参数
|
|
|
+ * @return : 返回修改结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public ResultVo updatePassword(UpdatePasswordParam updatePasswordParam) {
|
|
|
+ String mobile = updatePasswordParam.getMobile();
|
|
|
+ Integer type = updatePasswordParam.getType();
|
|
|
+ String code = updatePasswordParam.getCode();
|
|
|
+ String username = updatePasswordParam.getUsername();
|
|
|
+ String password = updatePasswordParam.getPassword();
|
|
|
+ //根据用户名查询用户信息
|
|
|
+ User user = super.getOne(new LambdaQueryWrapper<User>().eq(User::getUsername, username));
|
|
|
+ if (user == null) {
|
|
|
+ return new ResultVo<>(HttpStatusEnum.USERNAME_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ //短信验证码校验
|
|
|
+ HttpStatusEnum httpStatusEnum = smsService.smsCheck(type, mobile, code);
|
|
|
+ if (!Objects.equals(httpStatusEnum, HttpStatusEnum.SUCCESS)) {
|
|
|
+ return new ResultVo<>(httpStatusEnum);
|
|
|
+ }
|
|
|
+ //密码校验
|
|
|
+ HttpStatusEnum checkPasswordEnum = this.checkPassword(password);
|
|
|
+ if (!Objects.equals(checkPasswordEnum, HttpStatusEnum.SUCCESS)) {
|
|
|
+ return new ResultVo<>(checkPasswordEnum);
|
|
|
+ }
|
|
|
+ //修改用户密码
|
|
|
+ super.update(new LambdaUpdateWrapper<User>()
|
|
|
+ .set(User::getPassword, this.cmfPassword(password))
|
|
|
+ .set(User::getUpdateTime, LocalDateTime.now())
|
|
|
+ .eq(User::getId, user.getId()));
|
|
|
+ //返回修改成功
|
|
|
+ return new ResultVo(HttpStatusEnum.SUCCESS);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 密码cfm加密
|
|
|
*
|