saas-system dubbo服务实现

This commit is contained in:
Github_lizhw 2024-11-06 22:06:10 +08:00
parent 8699c104a5
commit 61cf5833ce
14 changed files with 713 additions and 387 deletions

View File

@ -396,6 +396,13 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- system dubbo 远程调用模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-system</artifactId>
<version>${revision}</version>
</dependency>
<!-- Apache Dubbo 配置 --> <!-- Apache Dubbo 配置 -->
<dependency> <dependency>
<groupId>org.apache.dubbo</groupId> <groupId>org.apache.dubbo</groupId>

View File

@ -5,9 +5,9 @@ import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
import org.dromara.common.core.factory.YmlPropertySourceFactory; 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.core.service.SaPermissionImpl;
import org.dromara.common.satoken.handler.SaTokenExceptionHandler; 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.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
@ -41,11 +41,12 @@ public class SaTokenConfig {
*/ */
@Bean @Bean
@Primary @Primary
public SaTokenDao saTokenDao() { public SaTokenDao tenantSaTokenDao() {
return new PlusSaTokenDao(); return new TenantSaTokenDao();
} }
/** /**
*
* 异常处理器 * 异常处理器
*/ */
@Bean @Bean

View File

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

View File

@ -14,7 +14,7 @@
<module>ruoyi-generator</module> <module>ruoyi-generator</module>
<module>ruoyi-job</module> <module>ruoyi-job</module>
<module>ruoyi-system</module> <module>ruoyi-system</module>
<!-- <module>ruoyi-system-saas</module>--> <module>ruoyi-system-saas</module>
<module>ruoyi-workflow</module> <module>ruoyi-workflow</module>
<module>ruoyi-sso-server</module> <module>ruoyi-sso-server</module>
</modules> </modules>

View File

@ -84,7 +84,6 @@
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-api-system</artifactId> <artifactId>ruoyi-api-system</artifactId>
<version>${revision}</version>
</dependency> </dependency>
<!-- Sa-Token 插件整合SSO --> <!-- Sa-Token 插件整合SSO -->

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,311 +1,313 @@
package org.dromara.system.saas.remote; package org.dromara.system.saas.dubbo;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.enums.UserStatus;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.service.SaasUserService;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.mybatis.helper.DataPermissionHelper;
import org.dromara.system.api.RemoteUserService; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.api.domain.bo.RemoteUserBo; import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.system.api.domain.bo.RemoteUserBo;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.model.RoleDTO; import org.dromara.system.api.model.LoginUser;
import org.dromara.system.api.model.XcxLoginUser; import org.dromara.system.api.model.RoleDTO;
import org.dromara.system.domain.SysUser; import org.dromara.system.api.model.XcxLoginUser;
import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.saas.domain.SysSaasUser;
import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.saas.domain.bo.SysSaasUserBo;
import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.saas.domain.vo.SysSaasDeptVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.saas.domain.vo.SysSaasRoleVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.saas.domain.vo.SysSaasUserVo;
import org.dromara.system.service.*; import org.dromara.system.saas.mapper.SysSaasUserMapper;
import org.springframework.stereotype.Service; import org.dromara.system.saas.service.*;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.List;
/**
* 用户服务 fegin实现 /**
* * 用户服务
* @author Lion Li *
*/ * @author Lion Li
@RequiredArgsConstructor */
@Service @RequiredArgsConstructor
@DubboService @Service
public class RemoteUserServiceImpl implements RemoteUserService { @DubboService
public class RemoteUserServiceImpl implements RemoteUserService {
private final ISysUserService userService;
private final ISysPermissionService permissionService; private final ISysSaasUserService userService;
private final ISysConfigService configService; private final SaasUserService saasUserService;
private final ISysRoleService roleService; private final ISysSaasPermissionService permissionService;
private final ISysDeptService deptService; private final ISysSaasConfigService configService;
private final SysUserMapper userMapper; private final ISysSaasRoleService roleService;
private final ISysSaasDeptService deptService;
/** private final SysSaasUserMapper userMapper;
* 通过用户名查询用户信息
* /**
* @param username 用户名 * 通过用户名查询用户信息
* @param tenantId 租户id *
* @return 结果 * @param username 用户名
*/ * @param tenantId 租户id
@Override * @return 结果
public LoginUser getUserInfo(String username, String tenantId) throws UserException { */
return TenantHelper.dynamic(tenantId, () -> { @Override
SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username)); public LoginUser getUserInfo(String username, String tenantId) throws UserException {
if (ObjectUtil.isNull(sysUser)) { return TenantHelper.dynamic(tenantId, () -> {
throw new UserException("user.not.exists", username); SysSaasUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysSaasUser>().eq(SysSaasUser::getUserName, username));
} if (ObjectUtil.isNull(sysUser)) {
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { throw new UserException("user.not.exists", username);
throw new UserException("user.blocked", username); }
} if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 throw new UserException("user.blocked", username);
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 }
return buildLoginUser(sysUser); // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
}); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
} return buildLoginUser(sysUser);
});
/** }
* 通过用户id查询用户信息
* /**
* @param userId 用户id * 通过用户id查询用户信息
* @param tenantId 租户id *
* @return 结果 * @param userId 用户id
*/ * @param tenantId 租户id
@Override * @return 结果
public LoginUser getUserInfo(Long userId, String tenantId) throws UserException { */
return TenantHelper.dynamic(tenantId, () -> { @Override
SysUserVo sysUser = userMapper.selectVoById(userId); public LoginUser getUserInfo(Long userId, String tenantId) throws UserException {
if (ObjectUtil.isNull(sysUser)) { return TenantHelper.dynamic(tenantId, () -> {
throw new UserException("user.not.exists", ""); SysSaasUserVo sysUser = userMapper.selectVoById(userId);
} if (ObjectUtil.isNull(sysUser)) {
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { throw new UserException("user.not.exists", "");
throw new UserException("user.blocked", sysUser.getUserName()); }
} if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 throw new UserException("user.blocked", sysUser.getUserName());
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 }
return buildLoginUser(sysUser); // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
}); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
} return buildLoginUser(sysUser);
});
/** }
* 通过手机号查询用户信息
* /**
* @param phonenumber 手机号 * 通过手机号查询用户信息
* @param tenantId 租户id *
* @return 结果 * @param phonenumber 手机号
*/ * @param tenantId 租户id
@Override * @return 结果
public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException { */
return TenantHelper.dynamic(tenantId, () -> { @Override
SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, phonenumber)); public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException {
if (ObjectUtil.isNull(sysUser)) { return TenantHelper.dynamic(tenantId, () -> {
throw new UserException("user.not.exists", phonenumber); SysSaasUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysSaasUser>().eq(SysSaasUser::getPhonenumber, phonenumber));
} if (ObjectUtil.isNull(sysUser)) {
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { throw new UserException("user.not.exists", phonenumber);
throw new UserException("user.blocked", phonenumber); }
} if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 throw new UserException("user.blocked", phonenumber);
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 }
return buildLoginUser(sysUser); // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
}); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
} return buildLoginUser(sysUser);
});
/** }
* 通过邮箱查询用户信息
* /**
* @param email 邮箱 * 通过邮箱查询用户信息
* @param tenantId 租户id *
* @return 结果 * @param email 邮箱
*/ * @param tenantId 租户id
@Override * @return 结果
public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException { */
return TenantHelper.dynamic(tenantId, () -> { @Override
SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getEmail, email)); public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException {
if (ObjectUtil.isNull(user)) { return TenantHelper.dynamic(tenantId, () -> {
throw new UserException("user.not.exists", email); SysSaasUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysSaasUser>().eq(SysSaasUser::getEmail, email));
} if (ObjectUtil.isNull(user)) {
if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { throw new UserException("user.not.exists", email);
throw new UserException("user.blocked", email); }
} if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 throw new UserException("user.blocked", email);
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 }
return buildLoginUser(user); // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
}); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
} return buildLoginUser(user);
});
/** }
* 通过openid查询用户信息
* /**
* @param openid openid * 通过openid查询用户信息
* @return 结果 *
*/ * @param openid openid
@Override * @return 结果
public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException { */
// todo 自行实现 userService.selectUserByOpenid(openid); @Override
SysUser sysUser = new SysUser(); public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException {
if (ObjectUtil.isNull(sysUser)) { // todo 自行实现 userService.selectUserByOpenid(openid);
// todo 用户不存在 业务逻辑自行实现 SysSaasUser sysUser = new SysSaasUser();
} if (ObjectUtil.isNull(sysUser)) {
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { // todo 用户不存在 业务逻辑自行实现
// todo 用户已被停用 业务逻辑自行实现 }
} if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 // todo 用户已被停用 业务逻辑自行实现
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 }
XcxLoginUser loginUser = new XcxLoginUser(); // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
loginUser.setUserId(sysUser.getUserId()); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
loginUser.setUsername(sysUser.getUserName()); XcxLoginUser loginUser = new XcxLoginUser();
loginUser.setNickname(sysUser.getNickName()); loginUser.setUserId(sysUser.getUserId());
loginUser.setUserType(sysUser.getUserType()); loginUser.setUsername(sysUser.getUserName());
loginUser.setOpenid(openid); loginUser.setNickname(sysUser.getNickName());
return loginUser; loginUser.setUserType(sysUser.getUserType());
} loginUser.setOpenid(openid);
return loginUser;
/** }
* 注册用户信息
* /**
* @param remoteUserBo 用户信息 * 注册用户信息
* @return 结果 *
*/ * @param remoteUserBo 用户信息
@Override * @return 结果
public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException { */
SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class); @Override
String username = sysUserBo.getUserName(); public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException {
boolean exist = TenantHelper.dynamic(remoteUserBo.getTenantId(), () -> { SysSaasUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysSaasUserBo.class);
if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { String username = sysUserBo.getUserName();
throw new ServiceException("当前系统没有开启注册功能"); boolean exist = TenantHelper.dynamic(remoteUserBo.getTenantId(), () -> {
} if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
return userMapper.exists(new LambdaQueryWrapper<SysUser>() throw new ServiceException("当前系统没有开启注册功能");
.eq(SysUser::getUserName, sysUserBo.getUserName())); }
}); return userMapper.exists(new LambdaQueryWrapper<SysSaasUser>()
if (exist) { .eq(SysSaasUser::getUserName, sysUserBo.getUserName()));
throw new UserException("user.register.save.error", username); });
} if (exist) {
return userService.registerUser(sysUserBo, remoteUserBo.getTenantId()); throw new UserException("user.register.save.error", username);
} }
return userService.registerUser(sysUserBo, remoteUserBo.getTenantId());
/** }
* 通过用户ID查询用户账户
* /**
* @param userId 用户ID * 通过用户ID查询用户账户
* @return 用户账户 *
*/ * @param userId 用户ID
@Override * @return 用户账户
public String selectUserNameById(Long userId) { */
return userService.selectUserNameById(userId); @Override
} public String selectUserNameById(Long userId) {
return saasUserService.selectUserNameById(userId);
/** }
* 通过用户ID查询用户昵称
* /**
* @param userId 用户ID * 通过用户ID查询用户昵称
* @return 用户昵称 *
*/ * @param userId 用户ID
@Override * @return 用户昵称
public String selectNicknameById(Long userId) { */
return userService.selectNicknameById(userId); @Override
} public String selectNicknameById(Long userId) {
return saasUserService.selectNicknameById(userId);
/** }
* 通过用户ID查询用户账户
* /**
* @param userIds 用户ID 多个用逗号隔开 * 通过用户ID查询用户账户
* @return 用户账户 *
*/ * @param userIds 用户ID 多个用逗号隔开
@Override * @return 用户账户
public String selectNicknameByIds(String userIds) { */
return userService.selectNicknameByIds(userIds); @Override
} public String selectNicknameByIds(String userIds) {
return saasUserService.selectNicknameByIds(userIds);
/** }
* 通过用户ID查询用户手机号
* /**
* @param userId 用户id * 通过用户ID查询用户手机号
* @return 用户手机号 *
*/ * @param userId 用户id
@Override * @return 用户手机号
public String selectPhonenumberById(Long userId) { */
return userService.selectPhonenumberById(userId); @Override
} public String selectPhonenumberById(Long userId) {
return saasUserService.selectPhonenumberById(userId);
/** }
* 通过用户ID查询用户邮箱
* /**
* @param userId 用户id * 通过用户ID查询用户邮箱
* @return 用户邮箱 *
*/ * @param userId 用户id
@Override * @return 用户邮箱
public String selectEmailById(Long userId) { */
return userService.selectEmailById(userId); @Override
} public String selectEmailById(Long userId) {
return saasUserService.selectEmailById(userId);
/** }
* 构建登录用户
*/ /**
private LoginUser buildLoginUser(SysUserVo userVo) { * 构建登录用户
LoginUser loginUser = new LoginUser(); */
loginUser.setTenantId(userVo.getTenantId()); private LoginUser buildLoginUser(SysSaasUserVo userVo) {
loginUser.setUserId(userVo.getUserId()); LoginUser loginUser = new LoginUser();
loginUser.setDeptId(userVo.getDeptId()); loginUser.setTenantId(userVo.getTenantId());
loginUser.setUsername(userVo.getUserName()); loginUser.setUserId(userVo.getUserId());
loginUser.setNickname(userVo.getNickName()); loginUser.setDeptId(userVo.getDeptId());
loginUser.setPassword(userVo.getPassword()); loginUser.setUsername(userVo.getUserName());
loginUser.setUserType(userVo.getUserType()); loginUser.setNickname(userVo.getNickName());
loginUser.setMenuPermission(permissionService.getMenuPermission(userVo.getUserId())); loginUser.setPassword(userVo.getPassword());
loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId())); loginUser.setUserType(userVo.getUserType());
if (ObjectUtil.isNotNull(userVo.getDeptId())) { loginUser.setMenuPermission(permissionService.getMenuPermission(userVo.getUserId()));
Opt<SysDeptVo> deptOpt = Opt.of(userVo.getDeptId()).map(deptService::selectDeptById); loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId()));
loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); if (ObjectUtil.isNotNull(userVo.getDeptId())) {
loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); Opt<SysSaasDeptVo> deptOpt = Opt.of(userVo.getDeptId()).map(deptService::selectDeptById);
} loginUser.setDeptName(deptOpt.map(SysSaasDeptVo::getDeptName).orElse(StringUtils.EMPTY));
List<SysRoleVo> roles = roleService.selectRolesByUserId(userVo.getUserId()); loginUser.setDeptCategory(deptOpt.map(SysSaasDeptVo::getDeptCategory).orElse(StringUtils.EMPTY));
loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); }
return loginUser; List<SysSaasRoleVo> roles = roleService.selectRolesByUserId(userVo.getUserId());
} loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
return loginUser;
/** }
* 更新用户信息
* /**
* @param userId 用户ID * 更新用户信息
* @param ip IP地址 *
*/ * @param userId 用户ID
@Override * @param ip IP地址
public void recordLoginInfo(Long userId, String ip) { */
SysUser sysUser = new SysUser(); @Override
sysUser.setUserId(userId); public void recordLoginInfo(Long userId, String ip) {
sysUser.setLoginIp(ip); SysSaasUser sysUser = new SysSaasUser();
sysUser.setLoginDate(DateUtils.getNowDate()); sysUser.setUserId(userId);
sysUser.setUpdateBy(userId); sysUser.setLoginIp(ip);
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); sysUser.setLoginDate(DateUtils.getNowDate());
} sysUser.setUpdateBy(userId);
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser));
/** }
* 通过用户ID查询用户列表
* /**
* @param userIds 用户ids * 通过用户ID查询用户列表
* @return 用户列表 *
*/ * @param userIds 用户ids
@Override * @return 用户列表
public List<RemoteUserVo> selectListByIds(List<Long> userIds) { */
List<SysUserVo> sysUserVos = userService.selectUserByIds(userIds, null); @Override
return MapstructUtils.convert(sysUserVos, RemoteUserVo.class); 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 * 通过角色ID查询用户ID
* @return 用户ids *
*/ * @param roleIds 角色ids
@Override * @return 用户ids
public List<Long> selectUserIdsByRoleIds(List<Long> roleIds) { */
return userService.selectUserIdsByRoleIds(roleIds); @Override
} public List<Long> selectUserIdsByRoleIds(List<Long> roleIds) {
return saasUserService.selectUserIdsByRoleIds(roleIds);
} }
}