package org.dromara.system.dubbo;
|
|
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.dubbo.config.annotation.DubboService;
|
import org.dromara.common.core.enums.UserStatus;
|
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.user.UserException;
|
import org.dromara.common.core.utils.DateUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.mybatis.helper.DataPermissionHelper;
|
import org.dromara.common.tenant.helper.TenantHelper;
|
import org.dromara.system.api.RemoteUserService;
|
import org.dromara.system.api.domain.bo.RemoteUserBo;
|
import org.dromara.system.api.model.LoginUser;
|
import org.dromara.system.api.model.RoleDTO;
|
import org.dromara.system.api.model.XcxLoginUser;
|
import org.dromara.system.domain.SysUser;
|
import org.dromara.system.domain.bo.SysUserBo;
|
import org.dromara.system.domain.vo.SysUserVo;
|
import org.dromara.system.mapper.SysUserMapper;
|
import org.dromara.system.service.ISysConfigService;
|
import org.dromara.system.service.ISysPermissionService;
|
import org.dromara.system.service.ISysUserService;
|
import org.springframework.stereotype.Service;
|
|
import java.util.List;
|
|
/**
|
* 用户服务
|
*
|
* @author Lion Li
|
*/
|
@RequiredArgsConstructor
|
@Service
|
@DubboService
|
public class RemoteUserServiceImpl implements RemoteUserService {
|
|
private final ISysUserService userService;
|
private final ISysPermissionService permissionService;
|
private final ISysConfigService configService;
|
private final SysUserMapper userMapper;
|
|
@Override
|
public LoginUser getUserInfo(String username, String tenantId) throws UserException {
|
return TenantHelper.dynamic(tenantId, () -> {
|
SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
|
.select(SysUser::getUserName, SysUser::getStatus)
|
.eq(SysUser::getUserName, username));
|
if (ObjectUtil.isNull(sysUser)) {
|
throw new UserException("user.not.exists", username);
|
}
|
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
|
throw new UserException("user.blocked", username);
|
}
|
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
return buildLoginUser(userMapper.selectUserByUserName(username));
|
});
|
}
|
|
@Override
|
public LoginUser getUserInfo(Long userId, String tenantId) throws UserException {
|
return TenantHelper.dynamic(tenantId, () -> {
|
SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
|
.select(SysUser::getUserName, SysUser::getStatus)
|
.eq(SysUser::getUserId, userId));
|
if (ObjectUtil.isNull(sysUser)) {
|
throw new UserException("user.not.exists", "");
|
}
|
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
|
throw new UserException("user.blocked", sysUser.getUserName());
|
}
|
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
return buildLoginUser(userMapper.selectUserByUserName(sysUser.getUserName()));
|
});
|
}
|
|
@Override
|
public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException {
|
return TenantHelper.dynamic(tenantId, () -> {
|
SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
|
.select(SysUser::getPhonenumber, SysUser::getStatus)
|
.eq(SysUser::getPhonenumber, phonenumber));
|
if (ObjectUtil.isNull(sysUser)) {
|
throw new UserException("user.not.exists", phonenumber);
|
}
|
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
|
throw new UserException("user.blocked", phonenumber);
|
}
|
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
return buildLoginUser(userMapper.selectUserByPhonenumber(phonenumber));
|
});
|
}
|
|
@Override
|
public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException {
|
return TenantHelper.dynamic(tenantId, () -> {
|
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
|
.select(SysUser::getEmail, SysUser::getStatus)
|
.eq(SysUser::getEmail, email));
|
if (ObjectUtil.isNull(user)) {
|
throw new UserException("user.not.exists", email);
|
}
|
if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
|
throw new UserException("user.blocked", email);
|
}
|
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
return buildLoginUser(userMapper.selectUserByEmail(email));
|
});
|
}
|
|
@Override
|
public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException {
|
// todo 自行实现 userService.selectUserByOpenid(openid);
|
SysUser sysUser = new SysUser();
|
if (ObjectUtil.isNull(sysUser)) {
|
// todo 用户不存在 业务逻辑自行实现
|
}
|
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
|
// todo 用户已被停用 业务逻辑自行实现
|
}
|
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
XcxLoginUser loginUser = new XcxLoginUser();
|
loginUser.setUserId(sysUser.getUserId());
|
loginUser.setUsername(sysUser.getUserName());
|
loginUser.setNickname(sysUser.getNickName());
|
loginUser.setUserType(sysUser.getUserType());
|
loginUser.setOpenid(openid);
|
return loginUser;
|
}
|
|
@Override
|
public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException {
|
SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class);
|
String username = sysUserBo.getUserName();
|
boolean exist = TenantHelper.dynamic(remoteUserBo.getTenantId(), () -> {
|
if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
|
throw new ServiceException("当前系统没有开启注册功能");
|
}
|
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
.eq(SysUser::getUserName, sysUserBo.getUserName())
|
.ne(ObjectUtil.isNotNull(sysUserBo.getUserId()), SysUser::getUserId, sysUserBo.getUserId()));
|
});
|
if (exist) {
|
throw new UserException("user.register.save.error", username);
|
}
|
return userService.registerUser(sysUserBo, remoteUserBo.getTenantId());
|
}
|
|
@Override
|
public String selectUserNameById(Long userId) {
|
return userService.selectUserNameById(userId);
|
}
|
|
@Override
|
public String selectNicknameById(Long userId) {
|
return userService.selectNicknameById(userId);
|
}
|
|
/**
|
* 构建登录用户
|
*/
|
private LoginUser buildLoginUser(SysUserVo userVo) {
|
LoginUser loginUser = new LoginUser();
|
loginUser.setTenantId(userVo.getTenantId());
|
loginUser.setUserId(userVo.getUserId());
|
loginUser.setDeptId(userVo.getDeptId());
|
loginUser.setUsername(userVo.getUserName());
|
loginUser.setNickname(userVo.getNickName());
|
loginUser.setPassword(userVo.getPassword());
|
loginUser.setUserType(userVo.getUserType());
|
loginUser.setMenuPermission(permissionService.getMenuPermission(userVo.getUserId()));
|
loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId()));
|
loginUser.setDeptName(ObjectUtil.isNull(userVo.getDept()) ? "" : userVo.getDept().getDeptName());
|
List<RoleDTO> roles = BeanUtil.copyToList(userVo.getRoles(), RoleDTO.class);
|
loginUser.setRoles(roles);
|
return loginUser;
|
}
|
|
/**
|
* 更新用户信息
|
*
|
* @param userId 用户ID
|
* @param ip IP地址
|
*/
|
@Override
|
public void recordLoginInfo(Long userId, String ip) {
|
SysUser sysUser = new SysUser();
|
sysUser.setUserId(userId);
|
sysUser.setLoginIp(ip);
|
sysUser.setLoginDate(DateUtils.getNowDate());
|
sysUser.setUpdateBy(userId);
|
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser));
|
}
|
|
}
|