mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-18 09:35:29 +08:00
saas-system dubbo服务实现
This commit is contained in:
parent
8699c104a5
commit
61cf5833ce
7
pom.xml
7
pom.xml
@ -396,6 +396,13 @@
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- system dubbo 远程调用模块 -->
|
||||
<dependency>
|
||||
<groupId>org.dromara</groupId>
|
||||
<artifactId>ruoyi-api-system</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Apache Dubbo 配置 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.dubbo</groupId>
|
||||
|
||||
@ -5,9 +5,9 @@ import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
|
||||
import cn.dev33.satoken.stp.StpInterface;
|
||||
import cn.dev33.satoken.stp.StpLogic;
|
||||
import org.dromara.common.core.factory.YmlPropertySourceFactory;
|
||||
import org.dromara.common.satoken.core.dao.PlusSaTokenDao;
|
||||
import org.dromara.common.satoken.core.service.SaPermissionImpl;
|
||||
import org.dromara.common.satoken.handler.SaTokenExceptionHandler;
|
||||
import org.dromara.common.tenant.core.TenantSaTokenDao;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
@ -41,11 +41,12 @@ public class SaTokenConfig {
|
||||
*/
|
||||
@Bean
|
||||
@Primary
|
||||
public SaTokenDao saTokenDao() {
|
||||
return new PlusSaTokenDao();
|
||||
public SaTokenDao tenantSaTokenDao() {
|
||||
return new TenantSaTokenDao();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* 异常处理器
|
||||
*/
|
||||
@Bean
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
package org.dromara.system.api.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 当前在线会话
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class SysUserOnline implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 会话编号
|
||||
*/
|
||||
private String tokenId;
|
||||
|
||||
/**
|
||||
* 部门名称
|
||||
*/
|
||||
private String deptName;
|
||||
|
||||
/**
|
||||
* 用户名称
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 客户端
|
||||
*/
|
||||
private String clientKey;
|
||||
|
||||
/**
|
||||
* 设备类型
|
||||
*/
|
||||
private String deviceType;
|
||||
|
||||
/**
|
||||
* 登录IP地址
|
||||
*/
|
||||
private String ipaddr;
|
||||
|
||||
/**
|
||||
* 登录地址
|
||||
*/
|
||||
private String loginLocation;
|
||||
|
||||
/**
|
||||
* 浏览器类型
|
||||
*/
|
||||
private String browser;
|
||||
|
||||
/**
|
||||
* 操作系统
|
||||
*/
|
||||
private String os;
|
||||
|
||||
/**
|
||||
* 登录时间
|
||||
*/
|
||||
private Long loginTime;
|
||||
|
||||
}
|
||||
@ -14,7 +14,7 @@
|
||||
<module>ruoyi-generator</module>
|
||||
<module>ruoyi-job</module>
|
||||
<module>ruoyi-system</module>
|
||||
<!-- <module>ruoyi-system-saas</module>-->
|
||||
<module>ruoyi-system-saas</module>
|
||||
<module>ruoyi-workflow</module>
|
||||
<module>ruoyi-sso-server</module>
|
||||
</modules>
|
||||
|
||||
@ -84,7 +84,6 @@
|
||||
<dependency>
|
||||
<groupId>org.dromara</groupId>
|
||||
<artifactId>ruoyi-api-system</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Sa-Token 插件:整合SSO -->
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.system.api.RemoteClientService;
|
||||
import org.dromara.system.api.domain.vo.RemoteClientVo;
|
||||
import org.dromara.system.saas.domain.vo.SysSaasClientVo;
|
||||
import org.dromara.system.saas.service.ISysSaasClientService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 客户端服务
|
||||
*
|
||||
* @author Michelle.Chung
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteClientServiceImpl implements RemoteClientService {
|
||||
|
||||
private final ISysSaasClientService sysSaasClientService;
|
||||
|
||||
/**
|
||||
* 根据客户端id获取客户端详情
|
||||
*/
|
||||
@Override
|
||||
public RemoteClientVo queryByClientId(String clientId) {
|
||||
SysSaasClientVo vo = sysSaasClientService.queryByClientId(clientId);
|
||||
return MapstructUtils.convert(vo, RemoteClientVo.class);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.system.api.RemoteConfigService;
|
||||
import org.dromara.system.saas.service.ISysSaasConfigService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 配置服务
|
||||
*
|
||||
* @author Michelle.Chung
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteConfigServiceImpl implements RemoteConfigService {
|
||||
|
||||
private final ISysSaasConfigService sysSaasConfigService;
|
||||
|
||||
/**
|
||||
* 获取注册开关
|
||||
*/
|
||||
@Override
|
||||
public boolean selectRegisterEnabled(String tenantId) {
|
||||
return sysSaasConfigService.selectRegisterEnabled(tenantId);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.convert.Convert;
|
||||
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.utils.StreamUtils;
|
||||
import org.dromara.common.mybatis.helper.DataBaseHelper;
|
||||
import org.dromara.system.api.RemoteDataScopeService;
|
||||
import org.dromara.system.saas.domain.SysSaasDept;
|
||||
import org.dromara.system.saas.domain.SysSaasRoleDept;
|
||||
import org.dromara.system.saas.mapper.SysSaasDeptMapper;
|
||||
import org.dromara.system.saas.mapper.SysSaasRoleDeptMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 数据权限 实现
|
||||
* <p>
|
||||
* 注意: 此Service内不允许调用标注`数据权限`注解的方法
|
||||
* 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteDataScopeServiceImpl implements RemoteDataScopeService {
|
||||
|
||||
private final SysSaasRoleDeptMapper roleDeptMapper;
|
||||
private final SysSaasDeptMapper deptMapper;
|
||||
|
||||
/**
|
||||
* 获取角色自定义权限语句
|
||||
*
|
||||
* @param roleId 角色ID
|
||||
* @return 返回角色的自定义权限语句,如果没有找到则返回 null
|
||||
*/
|
||||
@Override
|
||||
public String getRoleCustom(Long roleId) {
|
||||
if (ObjectUtil.isNull(roleId)) {
|
||||
return "-1";
|
||||
}
|
||||
List<SysSaasRoleDept> list = roleDeptMapper.selectList(
|
||||
new LambdaQueryWrapper<SysSaasRoleDept>()
|
||||
.select(SysSaasRoleDept::getDeptId)
|
||||
.eq(SysSaasRoleDept::getRoleId, roleId));
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId()));
|
||||
}
|
||||
return "-1";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取部门和下级权限语句
|
||||
*
|
||||
* @param deptId 部门ID
|
||||
* @return 返回部门及其下级的权限语句,如果没有找到则返回 null
|
||||
*/
|
||||
@Override
|
||||
public String getDeptAndChild(Long deptId) {
|
||||
if (ObjectUtil.isNull(deptId)) {
|
||||
return "-1";
|
||||
}
|
||||
List<SysSaasDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysSaasDept>()
|
||||
.select(SysSaasDept::getDeptId)
|
||||
.apply(DataBaseHelper.findInSet(deptId, "ancestors")));
|
||||
List<Long> ids = StreamUtils.toList(deptList, SysSaasDept::getDeptId);
|
||||
ids.add(deptId);
|
||||
if (CollUtil.isNotEmpty(ids)) {
|
||||
return StreamUtils.join(ids, Convert::toStr);
|
||||
}
|
||||
return "-1";
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.service.SaasDeptService;
|
||||
import org.dromara.system.api.RemoteDeptService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 部门服务
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteDeptServiceImpl implements RemoteDeptService {
|
||||
|
||||
private final SaasDeptService saasDeptService;
|
||||
|
||||
/**
|
||||
* 通过部门ID查询部门名称
|
||||
*
|
||||
* @param deptIds 部门ID串逗号分隔
|
||||
* @return 部门名称串逗号分隔
|
||||
*/
|
||||
@Override
|
||||
public String selectDeptNameByIds(String deptIds) {
|
||||
return saasDeptService.selectDeptNameByIds(deptIds);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,38 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.system.api.RemoteDictService;
|
||||
import org.dromara.system.api.domain.vo.RemoteDictDataVo;
|
||||
import org.dromara.system.saas.domain.vo.SysSaasDictDataVo;
|
||||
import org.dromara.system.saas.service.ISysSaasDictTypeService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 字典服务
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteDictServiceImpl implements RemoteDictService {
|
||||
|
||||
private final ISysSaasDictTypeService sysSaasDictTypeService;
|
||||
|
||||
/**
|
||||
* 根据字典类型查询字典数据
|
||||
*
|
||||
* @param dictType 字典类型
|
||||
* @return 字典数据集合信息
|
||||
*/
|
||||
@Override
|
||||
public List<RemoteDictDataVo> selectDictDataByType(String dictType) {
|
||||
List<SysSaasDictDataVo> list = sysSaasDictTypeService.selectDictDataByType(dictType);
|
||||
return MapstructUtils.convert(list, RemoteDictDataVo.class);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.system.api.RemoteLogService;
|
||||
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
|
||||
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
|
||||
import org.dromara.system.saas.domain.bo.SysSaasLogininforBo;
|
||||
import org.dromara.system.saas.domain.bo.SysSaasOperLogBo;
|
||||
import org.dromara.system.saas.service.ISysSaasLogininforService;
|
||||
import org.dromara.system.saas.service.ISysSaasOperLogService;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 操作日志记录
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteLogServiceImpl implements RemoteLogService {
|
||||
|
||||
private final ISysSaasOperLogService operLogService;
|
||||
private final ISysSaasLogininforService logininforService;
|
||||
|
||||
/**
|
||||
* 保存系统日志
|
||||
*
|
||||
* @param remoteOperLogBo 日志实体
|
||||
*/
|
||||
@Async
|
||||
@Override
|
||||
public void saveLog(RemoteOperLogBo remoteOperLogBo) {
|
||||
SysSaasOperLogBo sysOperLogBo = MapstructUtils.convert(remoteOperLogBo, SysSaasOperLogBo.class);
|
||||
operLogService.insertOperlog(sysOperLogBo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存访问记录
|
||||
*
|
||||
* @param remoteLogininforBo 访问实体
|
||||
*/
|
||||
@Async
|
||||
@Override
|
||||
public void saveLogininfor(RemoteLogininforBo remoteLogininforBo) {
|
||||
SysSaasLogininforBo sysLogininforBo = MapstructUtils.convert(remoteLogininforBo, SysSaasLogininforBo.class);
|
||||
logininforService.insertLogininfor(sysLogininforBo);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,83 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.system.api.RemoteSocialService;
|
||||
import org.dromara.system.api.domain.bo.RemoteSocialBo;
|
||||
import org.dromara.system.api.domain.vo.RemoteSocialVo;
|
||||
import org.dromara.system.saas.domain.bo.SysSaasSocialBo;
|
||||
import org.dromara.system.saas.domain.vo.SysSaasSocialVo;
|
||||
import org.dromara.system.saas.service.ISysSaasSocialService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 社会化关系服务
|
||||
*
|
||||
* @author Michelle.Chung
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteSocialServiceImpl implements RemoteSocialService {
|
||||
|
||||
private final ISysSaasSocialService sysSocialService;
|
||||
|
||||
/**
|
||||
* 根据 authId 查询用户授权信息
|
||||
*
|
||||
* @param authId 认证id
|
||||
* @return 授权信息
|
||||
*/
|
||||
@Override
|
||||
public List<RemoteSocialVo> selectByAuthId(String authId) {
|
||||
List<SysSaasSocialVo> list = sysSocialService.selectByAuthId(authId);
|
||||
return MapstructUtils.convert(list, RemoteSocialVo.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询列表
|
||||
*
|
||||
* @param bo 社会化关系业务对象
|
||||
*/
|
||||
@Override
|
||||
public List<RemoteSocialVo> queryList(RemoteSocialBo bo) {
|
||||
SysSaasSocialBo params = MapstructUtils.convert(bo, SysSaasSocialBo.class);
|
||||
List<SysSaasSocialVo> list = sysSocialService.queryList(params);
|
||||
return MapstructUtils.convert(list, RemoteSocialVo.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存社会化关系
|
||||
*
|
||||
* @param bo 社会化关系业务对象
|
||||
*/
|
||||
@Override
|
||||
public void insertByBo(RemoteSocialBo bo) {
|
||||
sysSocialService.insertByBo(MapstructUtils.convert(bo, SysSaasSocialBo.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新社会化关系
|
||||
*
|
||||
* @param bo 社会化关系业务对象
|
||||
*/
|
||||
@Override
|
||||
public void updateByBo(RemoteSocialBo bo) {
|
||||
sysSocialService.updateByBo(MapstructUtils.convert(bo, SysSaasSocialBo.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除社会化关系
|
||||
*
|
||||
* @param socialId 社会化关系ID
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidById(Long socialId) {
|
||||
return sysSocialService.deleteWithValidById(socialId);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.system.api.RemoteTenantService;
|
||||
import org.dromara.system.api.domain.vo.RemoteTenantVo;
|
||||
import org.dromara.system.saas.domain.bo.SysSaasTenantBo;
|
||||
import org.dromara.system.saas.domain.vo.SysSaasTenantVo;
|
||||
import org.dromara.system.saas.service.ISysSaasTenantService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author zhujie
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteTenantServiceImpl implements RemoteTenantService {
|
||||
|
||||
private final ISysSaasTenantService tenantSaasService;
|
||||
|
||||
/**
|
||||
* 根据租户id获取租户详情
|
||||
*/
|
||||
@Override
|
||||
public RemoteTenantVo queryByTenantId(String tenantId) {
|
||||
SysSaasTenantVo vo = tenantSaasService.queryByTenantId(tenantId);
|
||||
return MapstructUtils.convert(vo, RemoteTenantVo.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取租户列表
|
||||
*/
|
||||
@Override
|
||||
public List<RemoteTenantVo> queryList() {
|
||||
List<SysSaasTenantVo> list = tenantSaasService.queryList(new SysSaasTenantBo());
|
||||
return MapstructUtils.convert(list, RemoteTenantVo.class);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,311 +1,313 @@
|
||||
package org.dromara.system.saas.remote;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.lang.Opt;
|
||||
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.core.utils.StringUtils;
|
||||
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.domain.vo.RemoteUserVo;
|
||||
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.SysDeptVo;
|
||||
import org.dromara.system.domain.vo.SysRoleVo;
|
||||
import org.dromara.system.domain.vo.SysUserVo;
|
||||
import org.dromara.system.mapper.SysUserMapper;
|
||||
import org.dromara.system.service.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户服务 fegin实现
|
||||
*
|
||||
* @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 ISysRoleService roleService;
|
||||
private final ISysDeptService deptService;
|
||||
private final SysUserMapper userMapper;
|
||||
|
||||
/**
|
||||
* 通过用户名查询用户信息
|
||||
*
|
||||
* @param username 用户名
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfo(String username, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().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(sysUser);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户id查询用户信息
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfo(Long userId, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysUserVo sysUser = userMapper.selectVoById(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(sysUser);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过手机号查询用户信息
|
||||
*
|
||||
* @param phonenumber 手机号
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().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(sysUser);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过邮箱查询用户信息
|
||||
*
|
||||
* @param email 邮箱
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().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(user);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过openid查询用户信息
|
||||
*
|
||||
* @param openid openid
|
||||
* @return 结果
|
||||
*/
|
||||
@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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册用户信息
|
||||
*
|
||||
* @param remoteUserBo 用户信息
|
||||
* @return 结果
|
||||
*/
|
||||
@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()));
|
||||
});
|
||||
if (exist) {
|
||||
throw new UserException("user.register.save.error", username);
|
||||
}
|
||||
return userService.registerUser(sysUserBo, remoteUserBo.getTenantId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户账户
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return 用户账户
|
||||
*/
|
||||
@Override
|
||||
public String selectUserNameById(Long userId) {
|
||||
return userService.selectUserNameById(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户昵称
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return 用户昵称
|
||||
*/
|
||||
@Override
|
||||
public String selectNicknameById(Long userId) {
|
||||
return userService.selectNicknameById(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户账户
|
||||
*
|
||||
* @param userIds 用户ID 多个用逗号隔开
|
||||
* @return 用户账户
|
||||
*/
|
||||
@Override
|
||||
public String selectNicknameByIds(String userIds) {
|
||||
return userService.selectNicknameByIds(userIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户手机号
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @return 用户手机号
|
||||
*/
|
||||
@Override
|
||||
public String selectPhonenumberById(Long userId) {
|
||||
return userService.selectPhonenumberById(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户邮箱
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @return 用户邮箱
|
||||
*/
|
||||
@Override
|
||||
public String selectEmailById(Long userId) {
|
||||
return userService.selectEmailById(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()));
|
||||
if (ObjectUtil.isNotNull(userVo.getDeptId())) {
|
||||
Opt<SysDeptVo> deptOpt = Opt.of(userVo.getDeptId()).map(deptService::selectDeptById);
|
||||
loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY));
|
||||
loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY));
|
||||
}
|
||||
List<SysRoleVo> roles = roleService.selectRolesByUserId(userVo.getUserId());
|
||||
loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
|
||||
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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户列表
|
||||
*
|
||||
* @param userIds 用户ids
|
||||
* @return 用户列表
|
||||
*/
|
||||
@Override
|
||||
public List<RemoteUserVo> selectListByIds(List<Long> userIds) {
|
||||
List<SysUserVo> sysUserVos = userService.selectUserByIds(userIds, null);
|
||||
return MapstructUtils.convert(sysUserVos, RemoteUserVo.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过角色ID查询用户ID
|
||||
*
|
||||
* @param roleIds 角色ids
|
||||
* @return 用户ids
|
||||
*/
|
||||
@Override
|
||||
public List<Long> selectUserIdsByRoleIds(List<Long> roleIds) {
|
||||
return userService.selectUserIdsByRoleIds(roleIds);
|
||||
}
|
||||
|
||||
}
|
||||
package org.dromara.system.saas.dubbo;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.lang.Opt;
|
||||
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.service.SaasUserService;
|
||||
import org.dromara.common.core.utils.DateUtils;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
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.domain.vo.RemoteUserVo;
|
||||
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.saas.domain.SysSaasUser;
|
||||
import org.dromara.system.saas.domain.bo.SysSaasUserBo;
|
||||
import org.dromara.system.saas.domain.vo.SysSaasDeptVo;
|
||||
import org.dromara.system.saas.domain.vo.SysSaasRoleVo;
|
||||
import org.dromara.system.saas.domain.vo.SysSaasUserVo;
|
||||
import org.dromara.system.saas.mapper.SysSaasUserMapper;
|
||||
import org.dromara.system.saas.service.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户服务
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class RemoteUserServiceImpl implements RemoteUserService {
|
||||
|
||||
private final ISysSaasUserService userService;
|
||||
private final SaasUserService saasUserService;
|
||||
private final ISysSaasPermissionService permissionService;
|
||||
private final ISysSaasConfigService configService;
|
||||
private final ISysSaasRoleService roleService;
|
||||
private final ISysSaasDeptService deptService;
|
||||
private final SysSaasUserMapper userMapper;
|
||||
|
||||
/**
|
||||
* 通过用户名查询用户信息
|
||||
*
|
||||
* @param username 用户名
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfo(String username, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysSaasUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysSaasUser>().eq(SysSaasUser::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(sysUser);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户id查询用户信息
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfo(Long userId, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysSaasUserVo sysUser = userMapper.selectVoById(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(sysUser);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过手机号查询用户信息
|
||||
*
|
||||
* @param phonenumber 手机号
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysSaasUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysSaasUser>().eq(SysSaasUser::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(sysUser);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过邮箱查询用户信息
|
||||
*
|
||||
* @param email 邮箱
|
||||
* @param tenantId 租户id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException {
|
||||
return TenantHelper.dynamic(tenantId, () -> {
|
||||
SysSaasUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysSaasUser>().eq(SysSaasUser::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(user);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过openid查询用户信息
|
||||
*
|
||||
* @param openid openid
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException {
|
||||
// todo 自行实现 userService.selectUserByOpenid(openid);
|
||||
SysSaasUser sysUser = new SysSaasUser();
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册用户信息
|
||||
*
|
||||
* @param remoteUserBo 用户信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException {
|
||||
SysSaasUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysSaasUserBo.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<SysSaasUser>()
|
||||
.eq(SysSaasUser::getUserName, sysUserBo.getUserName()));
|
||||
});
|
||||
if (exist) {
|
||||
throw new UserException("user.register.save.error", username);
|
||||
}
|
||||
return userService.registerUser(sysUserBo, remoteUserBo.getTenantId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户账户
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return 用户账户
|
||||
*/
|
||||
@Override
|
||||
public String selectUserNameById(Long userId) {
|
||||
return saasUserService.selectUserNameById(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户昵称
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return 用户昵称
|
||||
*/
|
||||
@Override
|
||||
public String selectNicknameById(Long userId) {
|
||||
return saasUserService.selectNicknameById(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户账户
|
||||
*
|
||||
* @param userIds 用户ID 多个用逗号隔开
|
||||
* @return 用户账户
|
||||
*/
|
||||
@Override
|
||||
public String selectNicknameByIds(String userIds) {
|
||||
return saasUserService.selectNicknameByIds(userIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户手机号
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @return 用户手机号
|
||||
*/
|
||||
@Override
|
||||
public String selectPhonenumberById(Long userId) {
|
||||
return saasUserService.selectPhonenumberById(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户邮箱
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @return 用户邮箱
|
||||
*/
|
||||
@Override
|
||||
public String selectEmailById(Long userId) {
|
||||
return saasUserService.selectEmailById(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建登录用户
|
||||
*/
|
||||
private LoginUser buildLoginUser(SysSaasUserVo 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()));
|
||||
if (ObjectUtil.isNotNull(userVo.getDeptId())) {
|
||||
Opt<SysSaasDeptVo> deptOpt = Opt.of(userVo.getDeptId()).map(deptService::selectDeptById);
|
||||
loginUser.setDeptName(deptOpt.map(SysSaasDeptVo::getDeptName).orElse(StringUtils.EMPTY));
|
||||
loginUser.setDeptCategory(deptOpt.map(SysSaasDeptVo::getDeptCategory).orElse(StringUtils.EMPTY));
|
||||
}
|
||||
List<SysSaasRoleVo> roles = roleService.selectRolesByUserId(userVo.getUserId());
|
||||
loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
|
||||
return loginUser;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户信息
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param ip IP地址
|
||||
*/
|
||||
@Override
|
||||
public void recordLoginInfo(Long userId, String ip) {
|
||||
SysSaasUser sysUser = new SysSaasUser();
|
||||
sysUser.setUserId(userId);
|
||||
sysUser.setLoginIp(ip);
|
||||
sysUser.setLoginDate(DateUtils.getNowDate());
|
||||
sysUser.setUpdateBy(userId);
|
||||
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID查询用户列表
|
||||
*
|
||||
* @param userIds 用户ids
|
||||
* @return 用户列表
|
||||
*/
|
||||
@Override
|
||||
public List<RemoteUserVo> selectListByIds(List<Long> userIds) {
|
||||
List<SysSaasUserVo> sysUserVos = userService.selectUserByIds(userIds, null);
|
||||
return MapstructUtils.convert(sysUserVos, RemoteUserVo.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过角色ID查询用户ID
|
||||
*
|
||||
* @param roleIds 角色ids
|
||||
* @return 用户ids
|
||||
*/
|
||||
@Override
|
||||
public List<Long> selectUserIdsByRoleIds(List<Long> roleIds) {
|
||||
return saasUserService.selectUserIdsByRoleIds(roleIds);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user