From 61cf5833ce9f164b0b174268f1f8e578e868bea4 Mon Sep 17 00:00:00 2001 From: Github_lizhw <171332584@qq.com> Date: Wed, 6 Nov 2024 22:06:10 +0800 Subject: [PATCH] =?UTF-8?q?saas-system=20dubbo=E6=9C=8D=E5=8A=A1=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 + .../org/dromara/web/config/SaTokenConfig.java | 7 +- .../system/api/domain/SysUserOnline.java | 71 -- ruoyi-modules/pom.xml | 2 +- ruoyi-modules/ruoyi-sso-server/pom.xml | 1 - .../saas/dubbo/RemoteClientServiceImpl.java | 33 + .../saas/dubbo/RemoteConfigServiceImpl.java | 29 + .../dubbo/RemoteDataScopeServiceImpl.java | 79 +++ .../saas/dubbo/RemoteDeptServiceImpl.java | 31 + .../saas/dubbo/RemoteDictServiceImpl.java | 38 ++ .../saas/dubbo/RemoteLogServiceImpl.java | 52 ++ .../saas/dubbo/RemoteSocialServiceImpl.java | 83 +++ .../saas/dubbo/RemoteTenantServiceImpl.java | 43 ++ .../RemoteUserServiceImpl.java | 624 +++++++++--------- 14 files changed, 713 insertions(+), 387 deletions(-) delete mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteClientServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDataScopeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDeptServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDictServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteSocialServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteTenantServiceImpl.java rename ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/{remote => dubbo}/RemoteUserServiceImpl.java (78%) diff --git a/pom.xml b/pom.xml index c04e1f8f9..ddb686a52 100644 --- a/pom.xml +++ b/pom.xml @@ -396,6 +396,13 @@ ${revision} + + + org.dromara + ruoyi-api-system + ${revision} + + org.apache.dubbo diff --git a/ruoyi-admin/src/main/java/org/dromara/web/config/SaTokenConfig.java b/ruoyi-admin/src/main/java/org/dromara/web/config/SaTokenConfig.java index c56b8b55d..0ee1fc1bc 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/config/SaTokenConfig.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/config/SaTokenConfig.java @@ -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 diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java deleted file mode 100644 index 25c985ad6..000000000 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java +++ /dev/null @@ -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; - -} diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index 3aa393736..38321f176 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -14,7 +14,7 @@ ruoyi-generator ruoyi-job ruoyi-system - + ruoyi-system-saas ruoyi-workflow ruoyi-sso-server diff --git a/ruoyi-modules/ruoyi-sso-server/pom.xml b/ruoyi-modules/ruoyi-sso-server/pom.xml index f82c1abd8..544a2e9b8 100644 --- a/ruoyi-modules/ruoyi-sso-server/pom.xml +++ b/ruoyi-modules/ruoyi-sso-server/pom.xml @@ -84,7 +84,6 @@ org.dromara ruoyi-api-system - ${revision} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteClientServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteClientServiceImpl.java new file mode 100644 index 000000000..b9646c7b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteClientServiceImpl.java @@ -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); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteConfigServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteConfigServiceImpl.java new file mode 100644 index 000000000..137d85bb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteConfigServiceImpl.java @@ -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); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDataScopeServiceImpl.java new file mode 100644 index 000000000..521c32ac5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDataScopeServiceImpl.java @@ -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; + +/** + * 数据权限 实现 + *

+ * 注意: 此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 list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .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 deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysSaasDept::getDeptId) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List ids = StreamUtils.toList(deptList, SysSaasDept::getDeptId); + ids.add(deptId); + if (CollUtil.isNotEmpty(ids)) { + return StreamUtils.join(ids, Convert::toStr); + } + return "-1"; + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDeptServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDeptServiceImpl.java new file mode 100644 index 000000000..f3d9d0d92 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDeptServiceImpl.java @@ -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); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDictServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDictServiceImpl.java new file mode 100644 index 000000000..942aa2a0b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteDictServiceImpl.java @@ -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 selectDictDataByType(String dictType) { + List list = sysSaasDictTypeService.selectDictDataByType(dictType); + return MapstructUtils.convert(list, RemoteDictDataVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteLogServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteLogServiceImpl.java new file mode 100644 index 000000000..4fe75268c --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteLogServiceImpl.java @@ -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); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteSocialServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteSocialServiceImpl.java new file mode 100644 index 000000000..ff8a20268 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteSocialServiceImpl.java @@ -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 selectByAuthId(String authId) { + List list = sysSocialService.selectByAuthId(authId); + return MapstructUtils.convert(list, RemoteSocialVo.class); + } + + /** + * 查询列表 + * + * @param bo 社会化关系业务对象 + */ + @Override + public List queryList(RemoteSocialBo bo) { + SysSaasSocialBo params = MapstructUtils.convert(bo, SysSaasSocialBo.class); + List 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); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteTenantServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteTenantServiceImpl.java new file mode 100644 index 000000000..2224f18b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteTenantServiceImpl.java @@ -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 queryList() { + List list = tenantSaasService.queryList(new SysSaasTenantBo()); + return MapstructUtils.convert(list, RemoteTenantVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/remote/RemoteUserServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteUserServiceImpl.java similarity index 78% rename from ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/remote/RemoteUserServiceImpl.java rename to ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteUserServiceImpl.java index 0ebf3563b..026333171 100644 --- a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/remote/RemoteUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/dubbo/RemoteUserServiceImpl.java @@ -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().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().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().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() - .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 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 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 selectListByIds(List userIds) { - List sysUserVos = userService.selectUserByIds(userIds, null); - return MapstructUtils.convert(sysUserVos, RemoteUserVo.class); - } - - /** - * 通过角色ID查询用户ID - * - * @param roleIds 角色ids - * @return 用户ids - */ - @Override - public List selectUserIdsByRoleIds(List 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().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().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().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() + .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 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 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 selectListByIds(List userIds) { + List sysUserVos = userService.selectUserByIds(userIds, null); + return MapstructUtils.convert(sysUserVos, RemoteUserVo.class); + } + + /** + * 通过角色ID查询用户ID + * + * @param roleIds 角色ids + * @return 用户ids + */ + @Override + public List selectUserIdsByRoleIds(List roleIds) { + return saasUserService.selectUserIdsByRoleIds(roleIds); + } + +}