This commit is contained in:
dute7liang
2024-01-01 01:38:23 +08:00
parent d85e855cbc
commit eb53b78ab5
18 changed files with 334 additions and 49 deletions

View File

@@ -1,12 +1,18 @@
package com.ruoyi.cai.auth;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.domain.UserInfo;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.enums.CodeEnum;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.executor.ExecutorConstant;
import com.ruoyi.cai.service.UserInfoService;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.cai.manager.CodeManager;
import com.ruoyi.cai.manager.LockManager;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.service.*;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserType;
@@ -17,11 +23,18 @@ import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
import com.ruoyi.system.service.SysLoginService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.client.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
@@ -31,6 +44,26 @@ public class CaiLoginManager {
private UserService userService;
@Autowired
private SysLoginService sysLoginService;
@Autowired
private CodeManager codeManager;
@Autowired
private UserCodeGenService userCodeGenService;
@Autowired
private UserInfoService userInfoService;
@Autowired
private SystemConfigManager systemConfigManager;
@Autowired
private AccountService accountService;
@Autowired
private UserOnlineService userOnlineService;
@Autowired
private RedissonClient redissonClient;
@Autowired
private UserInviteService userInviteService;
@Autowired
private UnionService unionService;
@Autowired
private UnionUserService unionUserService;
public String login(String username,String password){
@@ -41,35 +74,111 @@ public class CaiLoginManager {
if(user.getStatus() != 0){
throw new ServiceException("用户已封禁,请联系客服");
}
/*if(!BCrypt.checkpw(password, caiUser.getPassword())){
if(!BCrypt.checkpw(password, user.getPassword())){
throw new ServiceException("用户不存在或密码错误");
}*/
LoginUser loginUser = new LoginUser();
loginUser.setDeptId(null);
loginUser.setDeptName(null);
// loginUser.setToken(caiUser.getToken());
// loginUser.setLoginTime();
// loginUser.setExpireTime();
// loginUser.setIpaddr();
// loginUser.setLoginLocation();
// loginUser.setBrowser();
// loginUser.setOs();
loginUser.setMenuPermission(Collections.emptySet());
loginUser.setRolePermission(Collections.emptySet());
loginUser.setUsername(user.getMobile());
loginUser.setRoles(Collections.emptyList());
loginUser.setRoleId(null);
loginUser.setUserId(user.getId());
loginUser.setUserType(UserType.APP_USER.getUserType());
LoginHelper.login(loginUser);
sysLoginService.recordLogininfor(loginUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
String clientIP = ServletUtils.getClientIP();
ExecutorConstant.COMMON_EXECUTOR.execute(() -> recordLoginInfo(user,clientIP));
return StpUtil.getTokenValue();
}
return login(user);
}
public String register(CaiRegisterUser caiUser) {
User user = userService.getByUsername(caiUser.getUsername());
if(user == null){
throw new ServiceException("手机号已存在");
}
if(!caiUser.getPassword().equals(caiUser.getPasswordCheck())){
throw new ServiceException("两次输入密码不一致,请检查");
}
boolean check = codeManager.check(CodeEnum.REGISTER, caiUser.getUsername(), caiUser.getCode());
if(!check){
throw new ServiceException("验证码错误");
}
// 加锁
String lockKey = LockManager.getRegisterLockKey(caiUser.getUsername());
RLock lock = redissonClient.getLock(lockKey);
if(lock.isLocked()){
throw new ServiceException("您点击太快了");
}
lock.lock(5, TimeUnit.SECONDS);
try {
CaiLoginManager bean = SpringUtil.getBean(CaiLoginManager.class);
user = bean.registerUser(caiUser);
}finally {
lock.unlock();
}
if(user.getInviteId() != null){
User finalUser = user;
ExecutorConstant.COMMON_EXECUTOR.execute(() -> dealInviteId(finalUser));
}
return login(user);
}
public void dealInviteId(User user){
Long inviteId = user.getInviteId();
if(inviteId == null){
return;
}
User inviteUser = userService.getById(inviteId);
if(inviteUser == null){
return;
}
String key = LockManager.getDealInviteLockKey(inviteId);
RLock lock = redissonClient.getLock(key);
if(!lock.isLocked()){
log.warn("点击太快了等一等dealInviteId");
return;
}
lock.lock(5,TimeUnit.SECONDS);
try {
UserInvite check = userInviteService.getByUserId(user.getId());
if(check == null){
UserInfo userInfo = userInfoService.getByUserId(user.getId());
UserInvite userInvite = new UserInvite();
userInvite.setUserId(user.getId());
userInvite.setInviteId(user.getInviteId());
userInvite.setVideoIncomeRate(userInfo.getVideoIncomeRate());
userInvite.setGuardIncomeRate(userInfo.getGuardIncomeRate());
userInvite.setGiftIncomeRate(userInfo.getGiftIncomeRate());
userInvite.setPayIncomeRate(userInfo.getPayIncomeRate());
if(inviteUser.getIsUnion() == 1){
BigDecimal unionOneRate = systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_ONE_INCOME_RATE);
BigDecimal videoIncome = NumberUtil.add(userInfo.getVideoIncomeRate(), unionOneRate);
userInvite.setVideoIncomeRate(videoIncome);
}
userInviteService.save(userInvite);
}
// 处理工会
Union union = null; //
if(inviteUser.getIsUnion() == 1){
union = unionService.getByUserId(inviteUser.getId());
} else {
UnionUser unionUser = unionUserService.getByUserId(inviteUser.getId());
if(unionUser != null){
union = unionService.getById(unionUser);
}
}
if(union == null){
log.info("邀请人没有工会,无法入会 inviteId={}",inviteId);
return;
}
UnionUser checkUnionUser = unionUserService.getByUserId(user.getId());
if(checkUnionUser != null){
UnionUser unionUser = new UnionUser();
unionUser.setUnionId(union.getId());
unionUser.setUserId(user.getId());
unionUser.setVideoDivide(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_VIDEO_INCOME_RATE));
unionUser.setGiftDivide(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_VIDEO_INCOME_RATE));
unionUser.setVipDivide(BigDecimal.ZERO);
unionUser.setEnableRate(true);
unionUserService.save(unionUser);
}
}finally {
lock.unlock();
}
}
@Autowired
private UserInfoService userInfoService;
public void recordLoginInfo(User user, String ip) {
String address = AddressUtils.getRealAddressByIP(ip);
@@ -100,5 +209,61 @@ public class CaiLoginManager {
}
}
private String login(User user){
LoginUser loginUser = new LoginUser();
loginUser.setDeptId(null);
loginUser.setDeptName(null);
loginUser.setMenuPermission(Collections.emptySet());
loginUser.setRolePermission(Collections.emptySet());
loginUser.setUsername(user.getMobile());
loginUser.setRoles(Collections.emptyList());
loginUser.setRoleId(null);
loginUser.setUserId(user.getId());
loginUser.setUserType(UserType.APP_USER.getUserType());
LoginHelper.login(loginUser);
sysLoginService.recordLogininfor(loginUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
String clientIP = ServletUtils.getClientIP();
ExecutorConstant.COMMON_EXECUTOR.execute(() -> recordLoginInfo(user,clientIP));
return StpUtil.getTokenValue();
}
@Transactional(rollbackFor = Exception.class)
public User registerUser(CaiRegisterUser user){
String usercode = userCodeGenService.getCodeGen();
User add = new User();
add.setUsercode(usercode);
add.setNickname("蜜瓜"+usercode);
add.setType(0);
add.setPassword(BCrypt.hashpw(user.getPassword()));
add.setMobile(user.getUsername());
add.setMobileStatus(1);
add.setAvatar(null);
add.setGender(user.getGender());
add.setCity(user.getCity());
add.setInviteId(user.getInviteId());
userService.save(add);
String clientIP = ServletUtils.getClientIP();
UserInfo userInfo = new UserInfo();
userInfo.setUserId(add.getId());
userInfo.setVideoIncomeRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_VIDEO_INCOME_RATE));
userInfo.setGuardIncomeRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_GUARD_INCOME_RATE));
userInfo.setGiftIncomeRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_GIFT_INCOME_RATE));
userInfo.setPayIncomeRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_PAY_INCOME_RATE));
userInfo.setLoginCount(1);
userInfo.setLastLoginIp(clientIP);
userInfo.setLastLoginTime(LocalDateTime.now());
userInfo.setRegIp(clientIP);
userInfo.setRegTime(LocalDateTime.now());
userInfoService.save(userInfo);
Account account = new Account();
account.setUserId(add.getId());
accountService.save(account);
UserOnline userOnline = new UserOnline();
userOnline.setUserId(add.getId());
userOnlineService.save(userOnline);
return add;
}
}

View File

@@ -0,0 +1,23 @@
package com.ruoyi.cai.auth;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "注册模型")
public class CaiRegisterUser {
@Schema(description = "手机号登录名")
private String username;
@Schema(description = "密码")
private String password;
@Schema(description = "密码确认")
private String passwordCheck;
@Schema(description = "验证码")
private String code;
@Schema(description = "邀请人ID")
private Long inviteId;
@Schema(description = "性别")
private Integer gender;
@Schema(description = "城市")
private Long city;
}

View File

@@ -5,4 +5,5 @@ public class RedisConstant {
public static final String SYSTEM_CONFIG = REDIS_P + "system-config";
public static final String CITY_CACHE_REDIS = REDIS_P + "city";
public static final String DYNAMIC_TOTAL_CACHE_REDIS = REDIS_P + "synamicTotal:%s:%s";
public static final String CODE_REDIS = REDIS_P + "code:%s:%s";
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.cai.controller.app;
import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.cai.auth.CaiLoginManager;
import com.ruoyi.cai.auth.CaiRegisterUser;
import com.ruoyi.cai.auth.LoginCaiUser;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.common.core.domain.R;
@@ -29,7 +30,14 @@ public class AuthAppController {
@PostMapping("/register")
@Operation(summary = "注册")
public R<Void> register(@RequestBody LoginCaiUser caiUser){
public R<Void> register(@RequestBody CaiRegisterUser caiUser){
userService.register(caiUser);
return R.ok();
}
@PostMapping("/register/code")
@Operation(summary = "获取注册验证码")
public R<Map<String,String>> registerCode(@RequestBody CaiRegisterUser caiUser){
userService.register(caiUser);
return R.ok();
}

View File

@@ -40,6 +40,7 @@ public class Union implements Serializable {
/**
* 工会默认二级支付奖励比例
*/
@Deprecated
private BigDecimal defaultIncomeRate;
/**
* 全部人数

View File

@@ -44,6 +44,7 @@ public class UnionUser implements Serializable {
/**
* vip分成
*/
@Deprecated
private BigDecimal vipDivide;
/**
* 是否开启提成

View File

@@ -116,7 +116,7 @@ public class User implements Serializable {
/**
* 邀请人
*/
private Integer inviteId;
private Long inviteId;
/**
* 终端 0 默认接口 1 安卓 2 ios 3 网页 4小程序
*/

View File

@@ -43,14 +43,6 @@ public class UserInfo {
* 登录次数
*/
private Integer loginCount;
/**
* 连续登录天数
*/
private Long continueLoginCount;
/**
* 最大连续登录天数
*/
private Long maxLoginCount;
/**
* 最后登录IP
*/

View File

@@ -19,11 +19,11 @@ public class UserOnline implements Serializable {
private static final long serialVersionUID=1L;
private Long id;
/**
* 用户ID
*/
@TableId(value = "user_id")
private Integer userId;
private Long userId;
/**
* 在线状态:0=离线,1=在线
*/

View File

@@ -0,0 +1,15 @@
package com.ruoyi.cai.enums;
import lombok.Getter;
@Getter
public enum CodeEnum {
REGISTER("注册短信")
;
private final String name;
CodeEnum(String name) {
this.name = name;
}
}

View File

@@ -11,6 +11,13 @@ import lombok.Getter;
public enum SystemConfigEnum {
GUARD_PRICE("1314", "守护价格"),
DAY_MAX_DYNAMIC("10", "每日运行发布的最大动态数"),
DEFAULT_VIDEO_INCOME_RATE("0.07", "默认分销好友视频提成"),
DEFAULT_GIFT_INCOME_RATE("0.07", "默认分销好友礼物提成"),
DEFAULT_GUARD_INCOME_RATE("0.07", "默认分销好友守护提成"),
DEFAULT_PAY_INCOME_RATE("0.07", "默认分销好友充值提成"),
DEFAULT_UNION_GIFT_INCOME_RATE("0.01", "默认工会礼物提成"),
DEFAULT_UNION_VIDEO_INCOME_RATE("0.01", "默认工会视频提成"),
DEFAULT_UNION_ONE_INCOME_RATE("0.07", "默认工会一级提成"),
;

View File

@@ -0,0 +1,38 @@
package com.ruoyi.cai.manager;
import cn.hutool.core.util.RandomUtil;
import com.ruoyi.cai.constant.RedisConstant;
import com.ruoyi.cai.enums.CodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class CodeManager {
@Autowired
private StringRedisTemplate redisTemplate;
public String getKey(CodeEnum codeEnum,String phone){
return String.format(RedisConstant.CODE_REDIS,codeEnum.name(),phone);
}
public String put(CodeEnum codeEnum,String phone){
String code = RandomUtil.randomNumbers(6);
String key = getKey(codeEnum, phone);
redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);
return code;
}
public boolean check(CodeEnum codeEnum,String phone,String code){
String key = getKey(codeEnum, phone);
String val = redisTemplate.opsForValue().get(key);
if(val == null){
return false;
}
return val.equals(code);
}
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.cai.manager;
import com.ruoyi.cai.constant.RedisConstant;
public class LockManager {
public static final String LOCK_REGISTER_REDIS = RedisConstant.REDIS_P + "lock:register:%s";
public static final String LOCK_DEAL_INVITE_REDIS = RedisConstant.REDIS_P + "lock:dealInvite:%s";
public static String getRegisterLockKey(String mobile){
return String.format(LOCK_REGISTER_REDIS,mobile);
}
public static String getDealInviteLockKey(Long userId){
return String.format(LOCK_DEAL_INVITE_REDIS,userId);
}
}

View File

@@ -8,6 +8,7 @@ import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -35,6 +36,11 @@ public class SystemConfigManager {
return "1".equals(value);
}
public BigDecimal getSystemConfigOfBigDecimal(SystemConfigEnum systemConfig){
String value = getSystemConfig(systemConfig);
return new BigDecimal(value);
}
/**
* 获取配置信息返回Integer
* @param systemConfig

View File

@@ -11,4 +11,5 @@ import com.ruoyi.cai.domain.UserCodeGen;
*/
public interface UserCodeGenService extends IService<UserCodeGen> {
String getCodeGen();
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.auth.CaiRegisterUser;
import com.ruoyi.cai.auth.LoginCaiUser;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.dto.admin.vo.UserAdminVo;
@@ -20,8 +21,6 @@ public interface UserService extends IService<User> {
User getByUsername(String username);
void register(LoginCaiUser caiUser);
Page<UserAdminVo> pageAdmin(PageQuery pageQuery, User query);
Page<UserListVo> pageApp(PageQuery page, UserQuery query);

View File

@@ -15,4 +15,10 @@ import org.springframework.stereotype.Service;
@Service
public class UserCodeGenServiceImpl extends ServiceImpl<UserCodeGenMapper, UserCodeGen> implements UserCodeGenService {
@Override
public String getCodeGen(){
UserCodeGen gen = new UserCodeGen();
this.save(gen);
return gen.getId()+"";
}
}

View File

@@ -1,24 +1,34 @@
package com.ruoyi.cai.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.auth.CaiRegisterUser;
import com.ruoyi.cai.auth.LoginCaiUser;
import com.ruoyi.cai.domain.Anchor;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.domain.UserInfo;
import com.ruoyi.cai.dto.admin.vo.UserAdminVo;
import com.ruoyi.cai.dto.app.query.UserQuery;
import com.ruoyi.cai.dto.app.vo.user.UserInfoVo;
import com.ruoyi.cai.dto.app.vo.user.UserListVo;
import com.ruoyi.cai.dto.app.vo.user.OnlineStatusVo;
import com.ruoyi.cai.enums.CodeEnum;
import com.ruoyi.cai.manager.CodeManager;
import com.ruoyi.cai.mapper.UserMapper;
import com.ruoyi.cai.service.*;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.ServletUtils;
import io.swagger.v3.oas.annotations.media.Schema;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* 用户Service业务层处理
*
@@ -48,11 +58,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
.eq(User::getMobile,username));
}
@Override
public void register(LoginCaiUser caiUser) {
}
@Override
public Page<UserAdminVo> pageAdmin(PageQuery pageQuery, User query) {
return baseMapper.pageAdmin(pageQuery.build(),query);