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;
}
}