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