package org.ruoyi.service;
|
|
import cn.dev33.satoken.secure.BCrypt;
|
import cn.dev33.satoken.stp.StpUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.math.NumberUtils;
|
import org.ruoyi.common.core.constant.Constants;
|
import org.ruoyi.common.core.domain.model.VisitorLoginUser;
|
import org.ruoyi.common.core.enums.DeviceType;
|
import org.ruoyi.common.core.enums.UserType;
|
import org.ruoyi.common.core.service.ConfigService;
|
import org.ruoyi.common.core.utils.MessageUtils;
|
import org.ruoyi.common.core.utils.ServletUtils;
|
import org.ruoyi.common.core.utils.SpringUtils;
|
import org.ruoyi.common.log.event.LogininforEvent;
|
import org.ruoyi.common.satoken.utils.LoginHelper;
|
import org.ruoyi.system.domain.SysUser;
|
import org.ruoyi.system.domain.bo.SysUserBo;
|
import org.ruoyi.system.domain.vo.LoginVo;
|
import org.ruoyi.system.domain.vo.SysUserVo;
|
import org.ruoyi.system.service.ISysUserService;
|
import org.springframework.stereotype.Service;
|
|
import java.util.UUID;
|
|
/**
|
* 描述:微信公众号登录
|
*
|
* @author ageerle@163.com
|
* date 2025/4/30
|
*/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class VxLoginService {
|
|
private final ISysUserService userService;
|
|
private final ConfigService configService;
|
|
public LoginVo mpLogin(String openid) {
|
// 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户
|
SysUserVo user = userService.selectUserByOpenId(openid);
|
VisitorLoginUser loginUser = new VisitorLoginUser();
|
if (ObjectUtil.isNull(user)) {
|
SysUserBo sysUser = new SysUserBo();
|
String name = "用户" + UUID.randomUUID().toString().replace("-", "");
|
// 设置默认用户名
|
sysUser.setUserName(name);
|
// 设置默认昵称
|
sysUser.setNickName(name);
|
// 设置默认密码
|
sysUser.setPassword(BCrypt.hashpw("123456"));
|
// 设置微信openId
|
sysUser.setOpenId(openid);
|
String configValue = configService.getConfigValue("mail", "amount");
|
// 设置默认余额
|
sysUser.setUserBalance(NumberUtils.toDouble(configValue, 1));
|
// 注册用户,设置默认租户为0
|
SysUser registerUser = userService.registerUser(sysUser, "0");
|
|
// 构建登录用户信息
|
loginUser.setTenantId("0");
|
loginUser.setUserId(registerUser.getUserId());
|
loginUser.setUsername(registerUser.getUserName());
|
loginUser.setUserType(UserType.APP_USER.getUserType());
|
loginUser.setOpenid(openid);
|
loginUser.setNickName(registerUser.getNickName());
|
} else {
|
// 此处可根据登录用户的数据不同 自行创建 loginUser
|
loginUser.setTenantId(user.getTenantId());
|
loginUser.setUserId(user.getUserId());
|
loginUser.setUsername(user.getUserName());
|
loginUser.setUserType(user.getUserType());
|
loginUser.setNickName(user.getNickName());
|
loginUser.setAvatar(user.getWxAvatar());
|
loginUser.setOpenid(openid);
|
}
|
// 生成token
|
LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
|
recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
|
LoginVo loginVo = new LoginVo();
|
// 生成令牌
|
loginVo.setToken(StpUtil.getTokenValue());
|
loginVo.setUserInfo(loginUser);
|
return loginVo;
|
}
|
|
/**
|
* 记录登录信息
|
*
|
* @param tenantId 租户ID
|
* @param username 用户名
|
* @param status 状态
|
* @param message 消息内容
|
*/
|
private void recordLogininfor(String tenantId, String username, String status, String message) {
|
LogininforEvent logininforEvent = new LogininforEvent();
|
logininforEvent.setTenantId(tenantId);
|
logininforEvent.setUsername(username);
|
logininforEvent.setStatus(status);
|
logininforEvent.setMessage(message);
|
logininforEvent.setRequest(ServletUtils.getRequest());
|
SpringUtils.context().publishEvent(logininforEvent);
|
}
|
}
|