mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-04-06 02:33:15 +08:00
[重大更改] 移除多租户相关功能
This commit is contained in:
@@ -1,10 +1,7 @@
|
|||||||
package org.dromara.web.controller;
|
package org.dromara.web.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaIgnore;
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
import cn.dev33.satoken.exception.NotLoginException;
|
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.codec.Base64;
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -18,7 +15,10 @@ import org.dromara.common.core.domain.R;
|
|||||||
import org.dromara.common.core.domain.model.LoginBody;
|
import org.dromara.common.core.domain.model.LoginBody;
|
||||||
import org.dromara.common.core.domain.model.RegisterBody;
|
import org.dromara.common.core.domain.model.RegisterBody;
|
||||||
import org.dromara.common.core.domain.model.SocialLoginBody;
|
import org.dromara.common.core.domain.model.SocialLoginBody;
|
||||||
import org.dromara.common.core.utils.*;
|
import org.dromara.common.core.utils.DateUtils;
|
||||||
|
import org.dromara.common.core.utils.MessageUtils;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.common.core.utils.ValidatorUtils;
|
||||||
import org.dromara.common.encrypt.annotation.ApiEncrypt;
|
import org.dromara.common.encrypt.annotation.ApiEncrypt;
|
||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
import org.dromara.common.ratelimiter.annotation.RateLimiter;
|
import org.dromara.common.ratelimiter.annotation.RateLimiter;
|
||||||
@@ -29,29 +29,20 @@ import org.dromara.common.social.config.properties.SocialProperties;
|
|||||||
import org.dromara.common.social.utils.SocialUtils;
|
import org.dromara.common.social.utils.SocialUtils;
|
||||||
import org.dromara.common.sse.dto.SseMessageDto;
|
import org.dromara.common.sse.dto.SseMessageDto;
|
||||||
import org.dromara.common.sse.utils.SseMessageUtils;
|
import org.dromara.common.sse.utils.SseMessageUtils;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.system.domain.bo.SysTenantBo;
|
|
||||||
import org.dromara.system.domain.vo.SysClientVo;
|
import org.dromara.system.domain.vo.SysClientVo;
|
||||||
import org.dromara.system.domain.vo.SysTenantVo;
|
|
||||||
import org.dromara.system.service.ISysClientService;
|
import org.dromara.system.service.ISysClientService;
|
||||||
import org.dromara.system.service.ISysConfigService;
|
import org.dromara.system.service.ISysConfigService;
|
||||||
import org.dromara.system.service.ISysSocialService;
|
import org.dromara.system.service.ISysSocialService;
|
||||||
import org.dromara.system.service.ISysTenantService;
|
|
||||||
import org.dromara.web.domain.vo.LoginTenantVo;
|
import org.dromara.web.domain.vo.LoginTenantVo;
|
||||||
import org.dromara.web.domain.vo.LoginVo;
|
import org.dromara.web.domain.vo.LoginVo;
|
||||||
import org.dromara.web.domain.vo.TenantListVo;
|
|
||||||
import org.dromara.web.service.IAuthStrategy;
|
import org.dromara.web.service.IAuthStrategy;
|
||||||
import org.dromara.web.service.SysLoginService;
|
import org.dromara.web.service.SysLoginService;
|
||||||
import org.dromara.web.service.SysRegisterService;
|
import org.dromara.web.service.SysRegisterService;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@@ -71,7 +62,6 @@ public class AuthController {
|
|||||||
private final SysLoginService loginService;
|
private final SysLoginService loginService;
|
||||||
private final SysRegisterService registerService;
|
private final SysRegisterService registerService;
|
||||||
private final ISysConfigService configService;
|
private final ISysConfigService configService;
|
||||||
private final ISysTenantService tenantService;
|
|
||||||
private final ISysSocialService socialUserService;
|
private final ISysSocialService socialUserService;
|
||||||
private final ISysClientService clientService;
|
private final ISysClientService clientService;
|
||||||
private final ScheduledExecutorService scheduledExecutorService;
|
private final ScheduledExecutorService scheduledExecutorService;
|
||||||
@@ -99,8 +89,6 @@ public class AuthController {
|
|||||||
} else if (!SystemConstants.NORMAL.equals(client.getStatus())) {
|
} else if (!SystemConstants.NORMAL.equals(client.getStatus())) {
|
||||||
return R.fail(MessageUtils.message("auth.grant.type.blocked"));
|
return R.fail(MessageUtils.message("auth.grant.type.blocked"));
|
||||||
}
|
}
|
||||||
// 校验租户
|
|
||||||
loginService.checkTenant(loginBody.getTenantId());
|
|
||||||
// 登录
|
// 登录
|
||||||
LoginVo loginVo = IAuthStrategy.login(body, client, grantType);
|
LoginVo loginVo = IAuthStrategy.login(body, client, grantType);
|
||||||
|
|
||||||
@@ -121,18 +109,13 @@ public class AuthController {
|
|||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
@GetMapping("/binding/{source}")
|
@GetMapping("/binding/{source}")
|
||||||
public R<String> authBinding(@PathVariable("source") String source,
|
public R<String> authBinding(@PathVariable("source") String source) {
|
||||||
@RequestParam String tenantId, @RequestParam String domain) {
|
|
||||||
SocialLoginConfigProperties obj = socialProperties.getType().get(source);
|
SocialLoginConfigProperties obj = socialProperties.getType().get(source);
|
||||||
if (ObjectUtil.isNull(obj)) {
|
if (ObjectUtil.isNull(obj)) {
|
||||||
return R.fail(source + "平台账号暂不支持");
|
return R.fail(source + "平台账号暂不支持");
|
||||||
}
|
}
|
||||||
AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties);
|
AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties);
|
||||||
Map<String, String> map = new HashMap<>();
|
String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
|
||||||
map.put("tenantId", tenantId);
|
|
||||||
map.put("domain", domain);
|
|
||||||
map.put("state", AuthStateUtils.createState());
|
|
||||||
String authorizeUrl = authRequest.authorize(Base64.encode(JsonUtils.toJsonString(map), StandardCharsets.UTF_8));
|
|
||||||
return R.ok("操作成功", authorizeUrl);
|
return R.ok("操作成功", authorizeUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,7 +172,7 @@ public class AuthController {
|
|||||||
@ApiEncrypt
|
@ApiEncrypt
|
||||||
@PostMapping("/register")
|
@PostMapping("/register")
|
||||||
public R<Void> register(@Validated @RequestBody RegisterBody user) {
|
public R<Void> register(@Validated @RequestBody RegisterBody user) {
|
||||||
if (!configService.selectRegisterEnabled(user.getTenantId())) {
|
if (!configService.selectRegisterEnabled()) {
|
||||||
return R.fail("当前系统没有开启注册功能!");
|
return R.fail("当前系统没有开启注册功能!");
|
||||||
}
|
}
|
||||||
registerService.register(user);
|
registerService.register(user);
|
||||||
@@ -204,39 +187,9 @@ public class AuthController {
|
|||||||
@RateLimiter(time = 60, count = 20, limitType = LimitType.IP)
|
@RateLimiter(time = 60, count = 20, limitType = LimitType.IP)
|
||||||
@GetMapping("/tenant/list")
|
@GetMapping("/tenant/list")
|
||||||
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
|
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
|
||||||
// 返回对象
|
// 暂时预留给前端使用 后续删除
|
||||||
LoginTenantVo result = new LoginTenantVo();
|
LoginTenantVo result = new LoginTenantVo();
|
||||||
boolean enable = TenantHelper.isEnable();
|
result.setTenantEnabled(false);
|
||||||
result.setTenantEnabled(enable);
|
|
||||||
// 如果未开启租户这直接返回
|
|
||||||
if (!enable) {
|
|
||||||
return R.ok(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
|
|
||||||
List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
|
|
||||||
try {
|
|
||||||
// 如果只超管返回所有租户
|
|
||||||
if (LoginHelper.isSuperAdmin()) {
|
|
||||||
result.setVoList(voList);
|
|
||||||
return R.ok(result);
|
|
||||||
}
|
|
||||||
} catch (NotLoginException ignored) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取域名
|
|
||||||
String host;
|
|
||||||
String referer = request.getHeader("referer");
|
|
||||||
if (StringUtils.isNotBlank(referer)) {
|
|
||||||
// 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试
|
|
||||||
host = referer.split("//")[1].split("/")[0];
|
|
||||||
} else {
|
|
||||||
host = new URL(request.getRequestURL().toString()).getHost();
|
|
||||||
}
|
|
||||||
// 根据域名进行筛选
|
|
||||||
List<TenantListVo> list = StreamUtils.filter(voList, vo ->
|
|
||||||
StringUtils.equalsIgnoreCase(vo.getDomain(), host));
|
|
||||||
result.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
|
|
||||||
return R.ok(result);
|
return R.ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ package org.dromara.web.domain.vo;
|
|||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 登录租户对象
|
* 登录租户对象
|
||||||
*
|
*
|
||||||
@@ -17,9 +15,4 @@ public class LoginTenantVo {
|
|||||||
*/
|
*/
|
||||||
private Boolean tenantEnabled;
|
private Boolean tenantEnabled;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户对象列表
|
|
||||||
*/
|
|
||||||
private List<TenantListVo> voList;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
package org.dromara.web.domain.vo;
|
|
||||||
|
|
||||||
import org.dromara.system.domain.vo.SysTenantVo;
|
|
||||||
import io.github.linpeilie.annotations.AutoMapper;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户列表
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@AutoMapper(target = SysTenantVo.class)
|
|
||||||
public class TenantListVo {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业名称
|
|
||||||
*/
|
|
||||||
private String companyName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 域名
|
|
||||||
*/
|
|
||||||
private String domain;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
package org.dromara.web.listener;
|
package org.dromara.web.listener;
|
||||||
|
|
||||||
import cn.dev33.satoken.listener.SaTokenListener;
|
import cn.dev33.satoken.listener.SaTokenListener;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
|
||||||
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
|
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
|
||||||
import cn.hutool.core.convert.Convert;
|
|
||||||
import cn.hutool.http.useragent.UserAgent;
|
import cn.hutool.http.useragent.UserAgent;
|
||||||
import cn.hutool.http.useragent.UserAgentUtil;
|
import cn.hutool.http.useragent.UserAgentUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -18,7 +16,6 @@ import org.dromara.common.core.utils.ip.AddressUtils;
|
|||||||
import org.dromara.common.log.event.LogininforEvent;
|
import org.dromara.common.log.event.LogininforEvent;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.web.service.SysLoginService;
|
import org.dromara.web.service.SysLoginService;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -51,21 +48,18 @@ public class UserActionListener implements SaTokenListener {
|
|||||||
dto.setLoginTime(System.currentTimeMillis());
|
dto.setLoginTime(System.currentTimeMillis());
|
||||||
dto.setTokenId(tokenValue);
|
dto.setTokenId(tokenValue);
|
||||||
String username = (String) loginParameter.getExtra(LoginHelper.USER_NAME_KEY);
|
String username = (String) loginParameter.getExtra(LoginHelper.USER_NAME_KEY);
|
||||||
String tenantId = (String) loginParameter.getExtra(LoginHelper.TENANT_KEY);
|
|
||||||
dto.setUserName(username);
|
dto.setUserName(username);
|
||||||
dto.setClientKey((String) loginParameter.getExtra(LoginHelper.CLIENT_KEY));
|
dto.setClientKey((String) loginParameter.getExtra(LoginHelper.CLIENT_KEY));
|
||||||
dto.setDeviceType(loginParameter.getDeviceType());
|
dto.setDeviceType(loginParameter.getDeviceType());
|
||||||
dto.setDeptName((String) loginParameter.getExtra(LoginHelper.DEPT_NAME_KEY));
|
dto.setDeptName((String) loginParameter.getExtra(LoginHelper.DEPT_NAME_KEY));
|
||||||
TenantHelper.dynamic(tenantId, () -> {
|
if (loginParameter.getTimeout() == -1) {
|
||||||
if(loginParameter.getTimeout() == -1) {
|
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
|
||||||
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
|
} else {
|
||||||
} else {
|
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginParameter.getTimeout()));
|
||||||
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginParameter.getTimeout()));
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
// 记录登录日志
|
// 记录登录日志
|
||||||
LogininforEvent logininforEvent = new LogininforEvent();
|
LogininforEvent logininforEvent = new LogininforEvent();
|
||||||
logininforEvent.setTenantId(tenantId);
|
|
||||||
logininforEvent.setUsername(username);
|
logininforEvent.setUsername(username);
|
||||||
logininforEvent.setStatus(Constants.LOGIN_SUCCESS);
|
logininforEvent.setStatus(Constants.LOGIN_SUCCESS);
|
||||||
logininforEvent.setMessage(MessageUtils.message("user.login.success"));
|
logininforEvent.setMessage(MessageUtils.message("user.login.success"));
|
||||||
@@ -81,10 +75,7 @@ public class UserActionListener implements SaTokenListener {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doLogout(String loginType, Object loginId, String tokenValue) {
|
public void doLogout(String loginType, Object loginId, String tokenValue) {
|
||||||
String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY));
|
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
|
||||||
TenantHelper.dynamic(tenantId, () -> {
|
|
||||||
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
|
|
||||||
});
|
|
||||||
log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue);
|
log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,10 +84,7 @@ public class UserActionListener implements SaTokenListener {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doKickout(String loginType, Object loginId, String tokenValue) {
|
public void doKickout(String loginType, Object loginId, String tokenValue) {
|
||||||
String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY));
|
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
|
||||||
TenantHelper.dynamic(tenantId, () -> {
|
|
||||||
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
|
|
||||||
});
|
|
||||||
log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue);
|
log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,10 +93,7 @@ public class UserActionListener implements SaTokenListener {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void doReplaced(String loginType, Object loginId, String tokenValue) {
|
public void doReplaced(String loginType, Object loginId, String tokenValue) {
|
||||||
String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY));
|
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
|
||||||
TenantHelper.dynamic(tenantId, () -> {
|
|
||||||
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
|
|
||||||
});
|
|
||||||
log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue);
|
log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import me.zhyd.oauth.model.AuthUser;
|
import me.zhyd.oauth.model.AuthUser;
|
||||||
import org.dromara.common.core.constant.CacheConstants;
|
import org.dromara.common.core.constant.CacheConstants;
|
||||||
import org.dromara.common.core.constant.Constants;
|
import org.dromara.common.core.constant.Constants;
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
|
||||||
import org.dromara.common.core.domain.dto.PostDTO;
|
import org.dromara.common.core.domain.dto.PostDTO;
|
||||||
import org.dromara.common.core.domain.dto.RoleDTO;
|
import org.dromara.common.core.domain.dto.RoleDTO;
|
||||||
import org.dromara.common.core.domain.model.LoginUser;
|
import org.dromara.common.core.domain.model.LoginUser;
|
||||||
@@ -25,8 +23,6 @@ import org.dromara.common.log.event.LogininforEvent;
|
|||||||
import org.dromara.common.mybatis.helper.DataPermissionHelper;
|
import org.dromara.common.mybatis.helper.DataPermissionHelper;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.exception.TenantException;
|
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.system.domain.SysUser;
|
import org.dromara.system.domain.SysUser;
|
||||||
import org.dromara.system.domain.bo.SysSocialBo;
|
import org.dromara.system.domain.bo.SysSocialBo;
|
||||||
import org.dromara.system.domain.vo.*;
|
import org.dromara.system.domain.vo.*;
|
||||||
@@ -36,7 +32,6 @@ import org.springframework.beans.factory.annotation.Value;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
@@ -56,7 +51,6 @@ public class SysLoginService {
|
|||||||
@Value("${user.password.lockTime}")
|
@Value("${user.password.lockTime}")
|
||||||
private Integer lockTime;
|
private Integer lockTime;
|
||||||
|
|
||||||
private final ISysTenantService tenantService;
|
|
||||||
private final ISysPermissionService permissionService;
|
private final ISysPermissionService permissionService;
|
||||||
private final ISysSocialService sysSocialService;
|
private final ISysSocialService sysSocialService;
|
||||||
private final ISysRoleService roleService;
|
private final ISysRoleService roleService;
|
||||||
@@ -113,11 +107,7 @@ public class SysLoginService {
|
|||||||
if (ObjectUtil.isNull(loginUser)) {
|
if (ObjectUtil.isNull(loginUser)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) {
|
recordLogininfor(loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"));
|
||||||
// 超级管理员 登出清除动态租户
|
|
||||||
TenantHelper.clearDynamic();
|
|
||||||
}
|
|
||||||
recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"));
|
|
||||||
} catch (NotLoginException ignored) {
|
} catch (NotLoginException ignored) {
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
@@ -130,14 +120,12 @@ public class SysLoginService {
|
|||||||
/**
|
/**
|
||||||
* 记录登录信息
|
* 记录登录信息
|
||||||
*
|
*
|
||||||
* @param tenantId 租户ID
|
|
||||||
* @param username 用户名
|
* @param username 用户名
|
||||||
* @param status 状态
|
* @param status 状态
|
||||||
* @param message 消息内容
|
* @param message 消息内容
|
||||||
*/
|
*/
|
||||||
public void recordLogininfor(String tenantId, String username, String status, String message) {
|
public void recordLogininfor(String username, String status, String message) {
|
||||||
LogininforEvent logininforEvent = new LogininforEvent();
|
LogininforEvent logininforEvent = new LogininforEvent();
|
||||||
logininforEvent.setTenantId(tenantId);
|
|
||||||
logininforEvent.setUsername(username);
|
logininforEvent.setUsername(username);
|
||||||
logininforEvent.setStatus(status);
|
logininforEvent.setStatus(status);
|
||||||
logininforEvent.setMessage(message);
|
logininforEvent.setMessage(message);
|
||||||
@@ -151,7 +139,6 @@ public class SysLoginService {
|
|||||||
public LoginUser buildLoginUser(SysUserVo user) {
|
public LoginUser buildLoginUser(SysUserVo user) {
|
||||||
LoginUser loginUser = new LoginUser();
|
LoginUser loginUser = new LoginUser();
|
||||||
Long userId = user.getUserId();
|
Long userId = user.getUserId();
|
||||||
loginUser.setTenantId(user.getTenantId());
|
|
||||||
loginUser.setUserId(userId);
|
loginUser.setUserId(userId);
|
||||||
loginUser.setDeptId(user.getDeptId());
|
loginUser.setDeptId(user.getDeptId());
|
||||||
loginUser.setUsername(user.getUserName());
|
loginUser.setUsername(user.getUserName());
|
||||||
@@ -188,7 +175,7 @@ public class SysLoginService {
|
|||||||
/**
|
/**
|
||||||
* 登录校验
|
* 登录校验
|
||||||
*/
|
*/
|
||||||
public void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) {
|
public void checkLogin(LoginType loginType, String username, Supplier<Boolean> supplier) {
|
||||||
String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
|
String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
|
||||||
String loginFail = Constants.LOGIN_FAIL;
|
String loginFail = Constants.LOGIN_FAIL;
|
||||||
|
|
||||||
@@ -196,7 +183,7 @@ public class SysLoginService {
|
|||||||
int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
|
int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
|
||||||
// 锁定时间内登录 则踢出
|
// 锁定时间内登录 则踢出
|
||||||
if (errorNumber >= maxRetryCount) {
|
if (errorNumber >= maxRetryCount) {
|
||||||
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
|
recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
|
||||||
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
|
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,11 +193,11 @@ public class SysLoginService {
|
|||||||
RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
|
RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
|
||||||
// 达到规定错误次数 则锁定登录
|
// 达到规定错误次数 则锁定登录
|
||||||
if (errorNumber >= maxRetryCount) {
|
if (errorNumber >= maxRetryCount) {
|
||||||
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
|
recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
|
||||||
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
|
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
|
||||||
} else {
|
} else {
|
||||||
// 未达到规定错误次数
|
// 未达到规定错误次数
|
||||||
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
|
recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
|
||||||
throw new UserException(loginType.getRetryLimitCount(), errorNumber);
|
throw new UserException(loginType.getRetryLimitCount(), errorNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -219,33 +206,4 @@ public class SysLoginService {
|
|||||||
RedisUtils.deleteObject(errorKey);
|
RedisUtils.deleteObject(errorKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验租户
|
|
||||||
*
|
|
||||||
* @param tenantId 租户ID
|
|
||||||
*/
|
|
||||||
public void checkTenant(String tenantId) {
|
|
||||||
if (!TenantHelper.isEnable()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (StringUtils.isBlank(tenantId)) {
|
|
||||||
throw new TenantException("tenant.number.not.blank");
|
|
||||||
}
|
|
||||||
if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SysTenantVo tenant = tenantService.queryByTenantId(tenantId);
|
|
||||||
if (ObjectUtil.isNull(tenant)) {
|
|
||||||
log.info("登录租户:{} 不存在.", tenantId);
|
|
||||||
throw new TenantException("tenant.not.exists");
|
|
||||||
} else if (SystemConstants.DISABLE.equals(tenant.getStatus())) {
|
|
||||||
log.info("登录租户:{} 已被停用.", tenantId);
|
|
||||||
throw new TenantException("tenant.blocked");
|
|
||||||
} else if (ObjectUtil.isNotNull(tenant.getExpireTime())
|
|
||||||
&& new Date().after(tenant.getExpireTime())) {
|
|
||||||
log.info("登录租户:{} 已超过有效期.", tenantId);
|
|
||||||
throw new TenantException("tenant.expired");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import org.dromara.common.core.utils.SpringUtils;
|
|||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.log.event.LogininforEvent;
|
import org.dromara.common.log.event.LogininforEvent;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.common.web.config.properties.CaptchaProperties;
|
import org.dromara.common.web.config.properties.CaptchaProperties;
|
||||||
import org.dromara.system.domain.SysUser;
|
import org.dromara.system.domain.SysUser;
|
||||||
import org.dromara.system.domain.bo.SysUserBo;
|
import org.dromara.system.domain.bo.SysUserBo;
|
||||||
@@ -41,7 +40,6 @@ public class SysRegisterService {
|
|||||||
* 注册
|
* 注册
|
||||||
*/
|
*/
|
||||||
public void register(RegisterBody registerBody) {
|
public void register(RegisterBody registerBody) {
|
||||||
String tenantId = registerBody.getTenantId();
|
|
||||||
String username = registerBody.getUsername();
|
String username = registerBody.getUsername();
|
||||||
String password = registerBody.getPassword();
|
String password = registerBody.getPassword();
|
||||||
// 校验用户类型是否存在
|
// 校验用户类型是否存在
|
||||||
@@ -50,7 +48,7 @@ public class SysRegisterService {
|
|||||||
boolean captchaEnabled = captchaProperties.getEnable();
|
boolean captchaEnabled = captchaProperties.getEnable();
|
||||||
// 验证码开关
|
// 验证码开关
|
||||||
if (captchaEnabled) {
|
if (captchaEnabled) {
|
||||||
validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid());
|
validateCaptcha(username, registerBody.getCode(), registerBody.getUuid());
|
||||||
}
|
}
|
||||||
SysUserBo sysUser = new SysUserBo();
|
SysUserBo sysUser = new SysUserBo();
|
||||||
sysUser.setUserName(username);
|
sysUser.setUserName(username);
|
||||||
@@ -58,18 +56,16 @@ public class SysRegisterService {
|
|||||||
sysUser.setPassword(BCrypt.hashpw(password));
|
sysUser.setPassword(BCrypt.hashpw(password));
|
||||||
sysUser.setUserType(userType);
|
sysUser.setUserType(userType);
|
||||||
|
|
||||||
boolean exist = TenantHelper.dynamic(tenantId, () -> {
|
boolean exist = userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
||||||
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
.eq(SysUser::getUserName, sysUser.getUserName()));
|
||||||
.eq(SysUser::getUserName, sysUser.getUserName()));
|
|
||||||
});
|
|
||||||
if (exist) {
|
if (exist) {
|
||||||
throw new UserException("user.register.save.error", username);
|
throw new UserException("user.register.save.error", username);
|
||||||
}
|
}
|
||||||
boolean regFlag = userService.registerUser(sysUser, tenantId);
|
boolean regFlag = userService.registerUser(sysUser);
|
||||||
if (!regFlag) {
|
if (!regFlag) {
|
||||||
throw new UserException("user.register.error");
|
throw new UserException("user.register.error");
|
||||||
}
|
}
|
||||||
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
|
recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,16 +75,16 @@ public class SysRegisterService {
|
|||||||
* @param code 验证码
|
* @param code 验证码
|
||||||
* @param uuid 唯一标识
|
* @param uuid 唯一标识
|
||||||
*/
|
*/
|
||||||
public void validateCaptcha(String tenantId, String username, String code, String uuid) {
|
public void validateCaptcha(String username, String code, String uuid) {
|
||||||
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
|
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
|
||||||
String captcha = RedisUtils.getCacheObject(verifyKey);
|
String captcha = RedisUtils.getCacheObject(verifyKey);
|
||||||
RedisUtils.deleteObject(verifyKey);
|
RedisUtils.deleteObject(verifyKey);
|
||||||
if (captcha == null) {
|
if (captcha == null) {
|
||||||
recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
||||||
throw new CaptchaExpireException();
|
throw new CaptchaExpireException();
|
||||||
}
|
}
|
||||||
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
|
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
|
||||||
recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
|
recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
|
||||||
throw new CaptchaException();
|
throw new CaptchaException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -96,15 +92,13 @@ public class SysRegisterService {
|
|||||||
/**
|
/**
|
||||||
* 记录登录信息
|
* 记录登录信息
|
||||||
*
|
*
|
||||||
* @param tenantId 租户ID
|
|
||||||
* @param username 用户名
|
* @param username 用户名
|
||||||
* @param status 状态
|
* @param status 状态
|
||||||
* @param message 消息内容
|
* @param message 消息内容
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private void recordLogininfor(String tenantId, String username, String status, String message) {
|
private void recordLogininfor(String username, String status, String message) {
|
||||||
LogininforEvent logininforEvent = new LogininforEvent();
|
LogininforEvent logininforEvent = new LogininforEvent();
|
||||||
logininforEvent.setTenantId(tenantId);
|
|
||||||
logininforEvent.setUsername(username);
|
logininforEvent.setUsername(username);
|
||||||
logininforEvent.setStatus(status);
|
logininforEvent.setStatus(status);
|
||||||
logininforEvent.setMessage(message);
|
logininforEvent.setMessage(message);
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import org.dromara.common.core.utils.ValidatorUtils;
|
|||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.system.domain.SysUser;
|
import org.dromara.system.domain.SysUser;
|
||||||
import org.dromara.system.domain.vo.SysClientVo;
|
import org.dromara.system.domain.vo.SysClientVo;
|
||||||
import org.dromara.system.domain.vo.SysUserVo;
|
import org.dromara.system.domain.vo.SysUserVo;
|
||||||
@@ -47,15 +46,12 @@ public class EmailAuthStrategy implements IAuthStrategy {
|
|||||||
public LoginVo login(String body, SysClientVo client) {
|
public LoginVo login(String body, SysClientVo client) {
|
||||||
EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class);
|
EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class);
|
||||||
ValidatorUtils.validate(loginBody);
|
ValidatorUtils.validate(loginBody);
|
||||||
String tenantId = loginBody.getTenantId();
|
|
||||||
String email = loginBody.getEmail();
|
String email = loginBody.getEmail();
|
||||||
String emailCode = loginBody.getEmailCode();
|
String emailCode = loginBody.getEmailCode();
|
||||||
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
|
SysUserVo user = loadUserByEmail(email);
|
||||||
SysUserVo user = loadUserByEmail(email);
|
loginService.checkLogin(LoginType.EMAIL, user.getUserName(), () -> !validateEmailCode(email, emailCode));
|
||||||
loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
||||||
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
LoginUser loginUser = loginService.buildLoginUser(user);
|
||||||
return loginService.buildLoginUser(user);
|
|
||||||
});
|
|
||||||
loginUser.setClientKey(client.getClientKey());
|
loginUser.setClientKey(client.getClientKey());
|
||||||
loginUser.setDeviceType(client.getDeviceType());
|
loginUser.setDeviceType(client.getDeviceType());
|
||||||
SaLoginParameter model = new SaLoginParameter();
|
SaLoginParameter model = new SaLoginParameter();
|
||||||
@@ -78,10 +74,10 @@ public class EmailAuthStrategy implements IAuthStrategy {
|
|||||||
/**
|
/**
|
||||||
* 校验邮箱验证码
|
* 校验邮箱验证码
|
||||||
*/
|
*/
|
||||||
private boolean validateEmailCode(String tenantId, String email, String emailCode) {
|
private boolean validateEmailCode(String email, String emailCode) {
|
||||||
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
|
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
|
||||||
if (StringUtils.isBlank(code)) {
|
if (StringUtils.isBlank(code)) {
|
||||||
loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
loginService.recordLogininfor(email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
||||||
throw new CaptchaExpireException();
|
throw new CaptchaExpireException();
|
||||||
}
|
}
|
||||||
return code.equals(emailCode);
|
return code.equals(emailCode);
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import org.dromara.common.core.utils.ValidatorUtils;
|
|||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.common.web.config.properties.CaptchaProperties;
|
import org.dromara.common.web.config.properties.CaptchaProperties;
|
||||||
import org.dromara.system.domain.SysUser;
|
import org.dromara.system.domain.SysUser;
|
||||||
import org.dromara.system.domain.vo.SysClientVo;
|
import org.dromara.system.domain.vo.SysClientVo;
|
||||||
@@ -51,7 +50,6 @@ public class PasswordAuthStrategy implements IAuthStrategy {
|
|||||||
public LoginVo login(String body, SysClientVo client) {
|
public LoginVo login(String body, SysClientVo client) {
|
||||||
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
|
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
|
||||||
ValidatorUtils.validate(loginBody);
|
ValidatorUtils.validate(loginBody);
|
||||||
String tenantId = loginBody.getTenantId();
|
|
||||||
String username = loginBody.getUsername();
|
String username = loginBody.getUsername();
|
||||||
String password = loginBody.getPassword();
|
String password = loginBody.getPassword();
|
||||||
String code = loginBody.getCode();
|
String code = loginBody.getCode();
|
||||||
@@ -60,14 +58,12 @@ public class PasswordAuthStrategy implements IAuthStrategy {
|
|||||||
boolean captchaEnabled = captchaProperties.getEnable();
|
boolean captchaEnabled = captchaProperties.getEnable();
|
||||||
// 验证码开关
|
// 验证码开关
|
||||||
if (captchaEnabled) {
|
if (captchaEnabled) {
|
||||||
validateCaptcha(tenantId, username, code, uuid);
|
validateCaptcha(username, code, uuid);
|
||||||
}
|
}
|
||||||
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
|
SysUserVo user = loadUserByUsername(username);
|
||||||
SysUserVo user = loadUserByUsername(username);
|
loginService.checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword()));
|
||||||
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
|
// 此处可根据登录用户的数据不同 自行创建 loginUser
|
||||||
// 此处可根据登录用户的数据不同 自行创建 loginUser
|
LoginUser loginUser = loginService.buildLoginUser(user);
|
||||||
return loginService.buildLoginUser(user);
|
|
||||||
});
|
|
||||||
loginUser.setClientKey(client.getClientKey());
|
loginUser.setClientKey(client.getClientKey());
|
||||||
loginUser.setDeviceType(client.getDeviceType());
|
loginUser.setDeviceType(client.getDeviceType());
|
||||||
SaLoginParameter model = new SaLoginParameter();
|
SaLoginParameter model = new SaLoginParameter();
|
||||||
@@ -94,16 +90,16 @@ public class PasswordAuthStrategy implements IAuthStrategy {
|
|||||||
* @param code 验证码
|
* @param code 验证码
|
||||||
* @param uuid 唯一标识
|
* @param uuid 唯一标识
|
||||||
*/
|
*/
|
||||||
private void validateCaptcha(String tenantId, String username, String code, String uuid) {
|
private void validateCaptcha(String username, String code, String uuid) {
|
||||||
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
|
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
|
||||||
String captcha = RedisUtils.getCacheObject(verifyKey);
|
String captcha = RedisUtils.getCacheObject(verifyKey);
|
||||||
RedisUtils.deleteObject(verifyKey);
|
RedisUtils.deleteObject(verifyKey);
|
||||||
if (captcha == null) {
|
if (captcha == null) {
|
||||||
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
loginService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
||||||
throw new CaptchaExpireException();
|
throw new CaptchaExpireException();
|
||||||
}
|
}
|
||||||
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
|
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
|
||||||
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
|
loginService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
|
||||||
throw new CaptchaException();
|
throw new CaptchaException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import org.dromara.common.core.utils.ValidatorUtils;
|
|||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.system.domain.SysUser;
|
import org.dromara.system.domain.SysUser;
|
||||||
import org.dromara.system.domain.vo.SysClientVo;
|
import org.dromara.system.domain.vo.SysClientVo;
|
||||||
import org.dromara.system.domain.vo.SysUserVo;
|
import org.dromara.system.domain.vo.SysUserVo;
|
||||||
@@ -47,15 +46,12 @@ public class SmsAuthStrategy implements IAuthStrategy {
|
|||||||
public LoginVo login(String body, SysClientVo client) {
|
public LoginVo login(String body, SysClientVo client) {
|
||||||
SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class);
|
SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class);
|
||||||
ValidatorUtils.validate(loginBody);
|
ValidatorUtils.validate(loginBody);
|
||||||
String tenantId = loginBody.getTenantId();
|
|
||||||
String phonenumber = loginBody.getPhonenumber();
|
String phonenumber = loginBody.getPhonenumber();
|
||||||
String smsCode = loginBody.getSmsCode();
|
String smsCode = loginBody.getSmsCode();
|
||||||
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
|
SysUserVo user = loadUserByPhonenumber(phonenumber);
|
||||||
SysUserVo user = loadUserByPhonenumber(phonenumber);
|
loginService.checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phonenumber, smsCode));
|
||||||
loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
||||||
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
LoginUser loginUser = loginService.buildLoginUser(user);
|
||||||
return loginService.buildLoginUser(user);
|
|
||||||
});
|
|
||||||
loginUser.setClientKey(client.getClientKey());
|
loginUser.setClientKey(client.getClientKey());
|
||||||
loginUser.setDeviceType(client.getDeviceType());
|
loginUser.setDeviceType(client.getDeviceType());
|
||||||
SaLoginParameter model = new SaLoginParameter();
|
SaLoginParameter model = new SaLoginParameter();
|
||||||
@@ -78,10 +74,10 @@ public class SmsAuthStrategy implements IAuthStrategy {
|
|||||||
/**
|
/**
|
||||||
* 校验短信验证码
|
* 校验短信验证码
|
||||||
*/
|
*/
|
||||||
private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) {
|
private boolean validateSmsCode(String phonenumber, String smsCode) {
|
||||||
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
|
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
|
||||||
if (StringUtils.isBlank(code)) {
|
if (StringUtils.isBlank(code)) {
|
||||||
loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
loginService.recordLogininfor(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
|
||||||
throw new CaptchaExpireException();
|
throw new CaptchaExpireException();
|
||||||
}
|
}
|
||||||
return code.equals(smsCode);
|
return code.equals(smsCode);
|
||||||
|
|||||||
@@ -13,13 +13,11 @@ import org.dromara.common.core.domain.model.LoginUser;
|
|||||||
import org.dromara.common.core.domain.model.SocialLoginBody;
|
import org.dromara.common.core.domain.model.SocialLoginBody;
|
||||||
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.StreamUtils;
|
|
||||||
import org.dromara.common.core.utils.ValidatorUtils;
|
import org.dromara.common.core.utils.ValidatorUtils;
|
||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.social.config.properties.SocialProperties;
|
import org.dromara.common.social.config.properties.SocialProperties;
|
||||||
import org.dromara.common.social.utils.SocialUtils;
|
import org.dromara.common.social.utils.SocialUtils;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.system.domain.vo.SysClientVo;
|
import org.dromara.system.domain.vo.SysClientVo;
|
||||||
import org.dromara.system.domain.vo.SysSocialVo;
|
import org.dromara.system.domain.vo.SysSocialVo;
|
||||||
import org.dromara.system.domain.vo.SysUserVo;
|
import org.dromara.system.domain.vo.SysUserVo;
|
||||||
@@ -31,7 +29,6 @@ import org.dromara.web.service.SysLoginService;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 第三方授权策略
|
* 第三方授权策略
|
||||||
@@ -70,21 +67,9 @@ public class SocialAuthStrategy implements IAuthStrategy {
|
|||||||
if (CollUtil.isEmpty(list)) {
|
if (CollUtil.isEmpty(list)) {
|
||||||
throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
|
throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
|
||||||
}
|
}
|
||||||
SysSocialVo social;
|
SysUserVo user = loadUser(list.get(0).getUserId());
|
||||||
if (TenantHelper.isEnable()) {
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
||||||
Optional<SysSocialVo> opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId()));
|
LoginUser loginUser = loginService.buildLoginUser(user);
|
||||||
if (opt.isEmpty()) {
|
|
||||||
throw new ServiceException("对不起,你没有权限登录当前租户!");
|
|
||||||
}
|
|
||||||
social = opt.get();
|
|
||||||
} else {
|
|
||||||
social = list.get(0);
|
|
||||||
}
|
|
||||||
LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> {
|
|
||||||
SysUserVo user = loadUser(social.getUserId());
|
|
||||||
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
|
||||||
return loginService.buildLoginUser(user);
|
|
||||||
});
|
|
||||||
loginUser.setClientKey(client.getClientKey());
|
loginUser.setClientKey(client.getClientKey());
|
||||||
loginUser.setDeviceType(client.getDeviceType());
|
loginUser.setDeviceType(client.getDeviceType());
|
||||||
SaLoginParameter model = new SaLoginParameter();
|
SaLoginParameter model = new SaLoginParameter();
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ public class XcxAuthStrategy implements IAuthStrategy {
|
|||||||
SysUserVo user = loadUserByOpenid(openid);
|
SysUserVo user = loadUserByOpenid(openid);
|
||||||
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
|
||||||
XcxLoginUser loginUser = new XcxLoginUser();
|
XcxLoginUser loginUser = new XcxLoginUser();
|
||||||
loginUser.setTenantId(user.getTenantId());
|
|
||||||
loginUser.setUserId(user.getUserId());
|
loginUser.setUserId(user.getUserId());
|
||||||
loginUser.setUsername(user.getUserName());
|
loginUser.setUsername(user.getUserName());
|
||||||
loginUser.setNickname(user.getNickName());
|
loginUser.setNickname(user.getNickName());
|
||||||
|
|||||||
@@ -114,23 +114,6 @@ security:
|
|||||||
- /*/api-docs/**
|
- /*/api-docs/**
|
||||||
- /warm-flow-ui/config
|
- /warm-flow-ui/config
|
||||||
|
|
||||||
# 多租户配置
|
|
||||||
tenant:
|
|
||||||
# 是否开启
|
|
||||||
enable: true
|
|
||||||
# 排除表
|
|
||||||
excludes:
|
|
||||||
- sys_menu
|
|
||||||
- sys_tenant
|
|
||||||
- sys_tenant_package
|
|
||||||
- sys_role_dept
|
|
||||||
- sys_role_menu
|
|
||||||
- sys_user_post
|
|
||||||
- sys_user_role
|
|
||||||
- sys_client
|
|
||||||
- sys_oss_config
|
|
||||||
- flow_spel
|
|
||||||
|
|
||||||
# MyBatisPlus配置
|
# MyBatisPlus配置
|
||||||
# https://baomidou.com/config/
|
# https://baomidou.com/config/
|
||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
|
|||||||
@@ -55,8 +55,4 @@ xcx.code.not.blank=小程序[code]不能为空
|
|||||||
social.source.not.blank=第三方登录平台[source]不能为空
|
social.source.not.blank=第三方登录平台[source]不能为空
|
||||||
social.code.not.blank=第三方登录平台[code]不能为空
|
social.code.not.blank=第三方登录平台[code]不能为空
|
||||||
social.state.not.blank=第三方登录平台[state]不能为空
|
social.state.not.blank=第三方登录平台[state]不能为空
|
||||||
##租户
|
|
||||||
tenant.number.not.blank=租户编号不能为空
|
|
||||||
tenant.not.exists=对不起, 您的租户不存在,请联系管理员
|
|
||||||
tenant.blocked=对不起,您的租户已禁用,请联系管理员
|
|
||||||
tenant.expired=对不起,您的租户已过期,请联系管理员
|
|
||||||
|
|||||||
@@ -55,8 +55,4 @@ xcx.code.not.blank=Mini program [code] cannot be blank
|
|||||||
social.source.not.blank=Social login platform [source] cannot be blank
|
social.source.not.blank=Social login platform [source] cannot be blank
|
||||||
social.code.not.blank=Social login platform [code] cannot be blank
|
social.code.not.blank=Social login platform [code] cannot be blank
|
||||||
social.state.not.blank=Social login platform [state] cannot be blank
|
social.state.not.blank=Social login platform [state] cannot be blank
|
||||||
##租户
|
|
||||||
tenant.number.not.blank=Tenant number cannot be blank
|
|
||||||
tenant.not.exists=Sorry, your tenant does not exist. Please contact the administrator
|
|
||||||
tenant.blocked=Sorry, your tenant is disabled. Please contact the administrator
|
|
||||||
tenant.expired=Sorry, your tenant has expired. Please contact the administrator.
|
|
||||||
|
|||||||
@@ -55,8 +55,4 @@ xcx.code.not.blank=小程序[code]不能为空
|
|||||||
social.source.not.blank=第三方登录平台[source]不能为空
|
social.source.not.blank=第三方登录平台[source]不能为空
|
||||||
social.code.not.blank=第三方登录平台[code]不能为空
|
social.code.not.blank=第三方登录平台[code]不能为空
|
||||||
social.state.not.blank=第三方登录平台[state]不能为空
|
social.state.not.blank=第三方登录平台[state]不能为空
|
||||||
##租户
|
|
||||||
tenant.number.not.blank=租户编号不能为空
|
|
||||||
tenant.not.exists=对不起, 您的租户不存在,请联系管理员
|
|
||||||
tenant.blocked=对不起,您的租户已禁用,请联系管理员
|
|
||||||
tenant.expired=对不起,您的租户已过期,请联系管理员
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
<module>ruoyi-common-sensitive</module>
|
<module>ruoyi-common-sensitive</module>
|
||||||
<module>ruoyi-common-json</module>
|
<module>ruoyi-common-json</module>
|
||||||
<module>ruoyi-common-encrypt</module>
|
<module>ruoyi-common-encrypt</module>
|
||||||
<module>ruoyi-common-tenant</module>
|
|
||||||
<module>ruoyi-common-websocket</module>
|
<module>ruoyi-common-websocket</module>
|
||||||
<module>ruoyi-common-sse</module>
|
<module>ruoyi-common-sse</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|||||||
@@ -158,13 +158,6 @@
|
|||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 租户模块 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-tenant</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- WebSocket模块 -->
|
<!-- WebSocket模块 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
|
|||||||
@@ -36,11 +36,6 @@ public interface CacheNames {
|
|||||||
*/
|
*/
|
||||||
String SYS_DICT_TYPE = "sys_dict_type";
|
String SYS_DICT_TYPE = "sys_dict_type";
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户
|
|
||||||
*/
|
|
||||||
String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 客户端
|
* 客户端
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -72,6 +72,11 @@ public interface SystemConstants {
|
|||||||
*/
|
*/
|
||||||
Long SUPER_ADMIN_ID = 1L;
|
Long SUPER_ADMIN_ID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 超级管理员角色 roleKey
|
||||||
|
*/
|
||||||
|
String SUPER_ADMIN_ROLE_KEY = "superadmin";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根部门祖级列表
|
* 根部门祖级列表
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
package org.dromara.common.core.constant;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户常量信息
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
public interface TenantConstants {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 超级管理员ID
|
|
||||||
*/
|
|
||||||
Long SUPER_ADMIN_ID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 超级管理员角色 roleKey
|
|
||||||
*/
|
|
||||||
String SUPER_ADMIN_ROLE_KEY = "superadmin";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户管理员角色 roleKey
|
|
||||||
*/
|
|
||||||
String TENANT_ADMIN_ROLE_KEY = "admin";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户管理员角色名称
|
|
||||||
*/
|
|
||||||
String TENANT_ADMIN_ROLE_NAME = "管理员";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 默认租户ID
|
|
||||||
*/
|
|
||||||
String DEFAULT_TENANT_ID = "000000";
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -16,11 +16,6 @@ public class ProcessDeleteEvent implements Serializable {
|
|||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程定义编码
|
* 流程定义编码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -17,11 +17,6 @@ public class ProcessEvent implements Serializable {
|
|||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程定义编码
|
* 流程定义编码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -17,11 +17,6 @@ public class ProcessTaskEvent implements Serializable {
|
|||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程定义编码
|
* 流程定义编码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -30,11 +30,6 @@ public class LoginBody implements Serializable {
|
|||||||
@NotBlank(message = "{auth.grant.type.not.blank}")
|
@NotBlank(message = "{auth.grant.type.not.blank}")
|
||||||
private String grantType;
|
private String grantType;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证码
|
* 验证码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -22,11 +22,6 @@ public class LoginUser implements Serializable {
|
|||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户ID
|
* 用户ID
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -61,13 +61,6 @@ public interface WorkflowService {
|
|||||||
*/
|
*/
|
||||||
Long getInstanceIdByBusinessId(String businessId);
|
Long getInstanceIdByBusinessId(String businessId);
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增租户流程定义
|
|
||||||
*
|
|
||||||
* @param tenantId 租户id
|
|
||||||
*/
|
|
||||||
void syncDef(String tenantId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动流程
|
* 启动流程
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -81,7 +81,6 @@ public class LogAspect {
|
|||||||
|
|
||||||
// *========数据库日志=========*//
|
// *========数据库日志=========*//
|
||||||
OperLogEvent operLog = new OperLogEvent();
|
OperLogEvent operLog = new OperLogEvent();
|
||||||
operLog.setTenantId(LoginHelper.getTenantId());
|
|
||||||
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
|
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
|
||||||
// 请求的地址
|
// 请求的地址
|
||||||
String ip = ServletUtils.getClientIP();
|
String ip = ServletUtils.getClientIP();
|
||||||
|
|||||||
@@ -19,11 +19,6 @@ public class LogininforEvent implements Serializable {
|
|||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户账号
|
* 用户账号
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -23,11 +23,6 @@ public class OperLogEvent implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Long operId;
|
private Long operId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作模块
|
* 操作模块
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -8,16 +8,13 @@ import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
|
|
||||||
import org.dromara.common.core.factory.YmlPropertySourceFactory;
|
import org.dromara.common.core.factory.YmlPropertySourceFactory;
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
|
||||||
import org.dromara.common.mybatis.aspect.DataPermissionPointcutAdvisor;
|
import org.dromara.common.mybatis.aspect.DataPermissionPointcutAdvisor;
|
||||||
import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler;
|
import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler;
|
||||||
import org.dromara.common.mybatis.handler.MybatisExceptionHandler;
|
import org.dromara.common.mybatis.handler.MybatisExceptionHandler;
|
||||||
import org.dromara.common.mybatis.handler.PlusPostInitTableInfoHandler;
|
import org.dromara.common.mybatis.handler.PlusPostInitTableInfoHandler;
|
||||||
import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor;
|
import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor;
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.beans.BeansException;
|
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.PropertySource;
|
import org.springframework.context.annotation.PropertySource;
|
||||||
@@ -38,12 +35,6 @@ public class MybatisPlusConfig {
|
|||||||
@Bean
|
@Bean
|
||||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||||
// 多租户插件 必须放到第一位
|
|
||||||
try {
|
|
||||||
TenantLineInnerInterceptor tenant = SpringUtils.getBean(TenantLineInnerInterceptor.class);
|
|
||||||
interceptor.addInnerInterceptor(tenant);
|
|
||||||
} catch (BeansException ignore) {
|
|
||||||
}
|
|
||||||
// 数据权限处理
|
// 数据权限处理
|
||||||
interceptor.addInnerInterceptor(dataPermissionInterceptor());
|
interceptor.addInnerInterceptor(dataPermissionInterceptor());
|
||||||
// 分页插件
|
// 分页插件
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public class PlusDataPermissionHandler {
|
|||||||
DataPermissionHelper.setVariable("user", currentUser);
|
DataPermissionHelper.setVariable("user", currentUser);
|
||||||
}
|
}
|
||||||
// 如果是超级管理员或租户管理员,则不过滤数据
|
// 如果是超级管理员或租户管理员,则不过滤数据
|
||||||
if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) {
|
if (LoginHelper.isSuperAdmin()) {
|
||||||
return where;
|
return where;
|
||||||
}
|
}
|
||||||
// 构造数据过滤条件的 SQL 片段
|
// 构造数据过滤条件的 SQL 片段
|
||||||
|
|||||||
@@ -48,20 +48,16 @@ public class OssFactory {
|
|||||||
}
|
}
|
||||||
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
|
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
|
||||||
// 使用租户标识避免多个租户相同key实例覆盖
|
// 使用租户标识避免多个租户相同key实例覆盖
|
||||||
String key = configKey;
|
OssClient client = CLIENT_CACHE.get(configKey);
|
||||||
if (StringUtils.isNotBlank(properties.getTenantId())) {
|
|
||||||
key = properties.getTenantId() + ":" + configKey;
|
|
||||||
}
|
|
||||||
OssClient client = CLIENT_CACHE.get(key);
|
|
||||||
// 客户端不存在或配置不相同则重新构建
|
// 客户端不存在或配置不相同则重新构建
|
||||||
if (client == null || !client.checkPropertiesSame(properties)) {
|
if (client == null || !client.checkPropertiesSame(properties)) {
|
||||||
LOCK.lock();
|
LOCK.lock();
|
||||||
try {
|
try {
|
||||||
client = CLIENT_CACHE.get(key);
|
client = CLIENT_CACHE.get(configKey);
|
||||||
if (client == null || !client.checkPropertiesSame(properties)) {
|
if (client == null || !client.checkPropertiesSame(properties)) {
|
||||||
CLIENT_CACHE.put(key, new OssClient(configKey, properties));
|
CLIENT_CACHE.put(configKey, new OssClient(configKey, properties));
|
||||||
log.info("创建OSS实例 key => {}", configKey);
|
log.info("创建OSS实例 key => {}", configKey);
|
||||||
return CLIENT_CACHE.get(key);
|
return CLIENT_CACHE.get(configKey);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
LOCK.unlock();
|
LOCK.unlock();
|
||||||
|
|||||||
@@ -10,11 +10,6 @@ import lombok.Data;
|
|||||||
@Data
|
@Data
|
||||||
public class OssProperties {
|
public class OssProperties {
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户id
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 访问站点
|
* 访问站点
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,18 +3,14 @@ package org.dromara.common.satoken.utils;
|
|||||||
import cn.dev33.satoken.session.SaSession;
|
import cn.dev33.satoken.session.SaSession;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
|
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
import org.dromara.common.core.constant.SystemConstants;
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
|
||||||
import org.dromara.common.core.domain.model.LoginUser;
|
import org.dromara.common.core.domain.model.LoginUser;
|
||||||
import org.dromara.common.core.enums.UserType;
|
import org.dromara.common.core.enums.UserType;
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 登录鉴权助手
|
* 登录鉴权助手
|
||||||
@@ -32,7 +28,6 @@ import java.util.Set;
|
|||||||
public class LoginHelper {
|
public class LoginHelper {
|
||||||
|
|
||||||
public static final String LOGIN_USER_KEY = "loginUser";
|
public static final String LOGIN_USER_KEY = "loginUser";
|
||||||
public static final String TENANT_KEY = "tenantId";
|
|
||||||
public static final String USER_KEY = "userId";
|
public static final String USER_KEY = "userId";
|
||||||
public static final String USER_NAME_KEY = "userName";
|
public static final String USER_NAME_KEY = "userName";
|
||||||
public static final String DEPT_KEY = "deptId";
|
public static final String DEPT_KEY = "deptId";
|
||||||
@@ -50,8 +45,7 @@ public class LoginHelper {
|
|||||||
public static void login(LoginUser loginUser, SaLoginParameter model) {
|
public static void login(LoginUser loginUser, SaLoginParameter model) {
|
||||||
model = ObjectUtil.defaultIfNull(model, new SaLoginParameter());
|
model = ObjectUtil.defaultIfNull(model, new SaLoginParameter());
|
||||||
StpUtil.login(loginUser.getLoginId(),
|
StpUtil.login(loginUser.getLoginId(),
|
||||||
model.setExtra(TENANT_KEY, loginUser.getTenantId())
|
model.setExtra(USER_KEY, loginUser.getUserId())
|
||||||
.setExtra(USER_KEY, loginUser.getUserId())
|
|
||||||
.setExtra(USER_NAME_KEY, loginUser.getUsername())
|
.setExtra(USER_NAME_KEY, loginUser.getUsername())
|
||||||
.setExtra(DEPT_KEY, loginUser.getDeptId())
|
.setExtra(DEPT_KEY, loginUser.getDeptId())
|
||||||
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
|
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
|
||||||
@@ -105,13 +99,6 @@ public class LoginHelper {
|
|||||||
return Convert.toStr(getExtra(USER_NAME_KEY));
|
return Convert.toStr(getExtra(USER_NAME_KEY));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取租户ID
|
|
||||||
*/
|
|
||||||
public static String getTenantId() {
|
|
||||||
return Convert.toStr(getExtra(TENANT_KEY));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取部门ID
|
* 获取部门ID
|
||||||
*/
|
*/
|
||||||
@@ -174,32 +161,6 @@ public class LoginHelper {
|
|||||||
return isSuperAdmin(getUserId());
|
return isSuperAdmin(getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否为租户管理员
|
|
||||||
*
|
|
||||||
* @param rolePermission 角色权限标识组
|
|
||||||
* @return 结果
|
|
||||||
*/
|
|
||||||
public static boolean isTenantAdmin(Set<String> rolePermission) {
|
|
||||||
if (CollUtil.isEmpty(rolePermission)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否为租户管理员
|
|
||||||
*
|
|
||||||
* @return 结果
|
|
||||||
*/
|
|
||||||
public static boolean isTenantAdmin() {
|
|
||||||
LoginUser loginUser = getLoginUser();
|
|
||||||
if (loginUser == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return Convert.toBool(isTenantAdmin(loginUser.getRolePermission()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查当前用户是否已登录
|
* 检查当前用户是否已登录
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>ruoyi-common-tenant</artifactId>
|
|
||||||
|
|
||||||
<description>
|
|
||||||
ruoyi-common-tenant 租户模块
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-mybatis</artifactId>
|
|
||||||
<optional>true</optional>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-redis</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
package org.dromara.common.tenant.config;
|
|
||||||
|
|
||||||
import cn.dev33.satoken.dao.SaTokenDao;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
|
|
||||||
import org.dromara.common.redis.config.RedisConfig;
|
|
||||||
import org.dromara.common.redis.config.properties.RedissonProperties;
|
|
||||||
import org.dromara.common.tenant.core.TenantSaTokenDao;
|
|
||||||
import org.dromara.common.tenant.handle.PlusTenantLineHandler;
|
|
||||||
import org.dromara.common.tenant.handle.TenantKeyPrefixHandler;
|
|
||||||
import org.dromara.common.tenant.manager.TenantSpringCacheManager;
|
|
||||||
import org.dromara.common.tenant.properties.TenantProperties;
|
|
||||||
import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
||||||
import org.springframework.cache.CacheManager;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Primary;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户配置类
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@EnableConfigurationProperties(TenantProperties.class)
|
|
||||||
@AutoConfiguration(after = {RedisConfig.class})
|
|
||||||
@ConditionalOnProperty(value = "tenant.enable", havingValue = "true")
|
|
||||||
public class TenantConfig {
|
|
||||||
|
|
||||||
@ConditionalOnClass(TenantLineInnerInterceptor.class)
|
|
||||||
@AutoConfiguration
|
|
||||||
static class MybatisPlusConfiguration {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 多租户插件
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) {
|
|
||||||
return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) {
|
|
||||||
return config -> {
|
|
||||||
// 设置多租户 redis key前缀
|
|
||||||
config.setNameMapper(new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix()));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 多租户缓存管理器
|
|
||||||
*/
|
|
||||||
@Primary
|
|
||||||
@Bean
|
|
||||||
public CacheManager tenantCacheManager() {
|
|
||||||
return new TenantSpringCacheManager();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 多租户鉴权dao实现
|
|
||||||
*/
|
|
||||||
@Primary
|
|
||||||
@Bean
|
|
||||||
public SaTokenDao tenantSaTokenDao() {
|
|
||||||
return new TenantSaTokenDao();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package org.dromara.common.tenant.core;
|
|
||||||
|
|
||||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户基类
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
public class TenantEntity extends BaseEntity {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
package org.dromara.common.tenant.core;
|
|
||||||
|
|
||||||
import org.dromara.common.core.constant.GlobalConstants;
|
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
|
||||||
import org.dromara.common.satoken.core.dao.PlusSaTokenDao;
|
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SaToken 认证数据持久层 适配多租户
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
public class TenantSaTokenDao extends PlusSaTokenDao {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String get(String key) {
|
|
||||||
return super.get(GlobalConstants.GLOBAL_REDIS_KEY + key);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void set(String key, String value, long timeout) {
|
|
||||||
super.set(GlobalConstants.GLOBAL_REDIS_KEY + key, value, timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修修改指定key-value键值对 (过期时间不变)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void update(String key, String value) {
|
|
||||||
long expire = getTimeout(key);
|
|
||||||
// -2 = 无此键
|
|
||||||
if (expire == NOT_VALUE_EXPIRE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.set(key, value, expire);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除Value
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void delete(String key) {
|
|
||||||
super.delete(GlobalConstants.GLOBAL_REDIS_KEY + key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取Value的剩余存活时间 (单位: 秒)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public long getTimeout(String key) {
|
|
||||||
return super.getTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改Value的剩余存活时间 (单位: 秒)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateTimeout(String key, long timeout) {
|
|
||||||
// 判断是否想要设置为永久
|
|
||||||
if (timeout == NEVER_EXPIRE) {
|
|
||||||
long expire = getTimeout(key);
|
|
||||||
if (expire == NEVER_EXPIRE) {
|
|
||||||
// 如果其已经被设置为永久,则不作任何处理
|
|
||||||
} else {
|
|
||||||
// 如果尚未被设置为永久,那么再次set一次
|
|
||||||
this.set(key, this.get(key), timeout);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取Object,如无返空
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Object getObject(String key) {
|
|
||||||
return super.getObject(GlobalConstants.GLOBAL_REDIS_KEY + key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取 Object (指定反序列化类型),如无返空
|
|
||||||
*
|
|
||||||
* @param key 键名称
|
|
||||||
* @return object
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public <T> T getObject(String key, Class<T> classType) {
|
|
||||||
return super.getObject(GlobalConstants.GLOBAL_REDIS_KEY + key, classType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 写入Object,并设定存活时间 (单位: 秒)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setObject(String key, Object object, long timeout) {
|
|
||||||
super.setObject(GlobalConstants.GLOBAL_REDIS_KEY + key, object, timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新Object (过期时间不变)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateObject(String key, Object object) {
|
|
||||||
long expire = getObjectTimeout(key);
|
|
||||||
// -2 = 无此键
|
|
||||||
if (expire == NOT_VALUE_EXPIRE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.setObject(key, object, expire);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除Object
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void deleteObject(String key) {
|
|
||||||
super.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取Object的剩余存活时间 (单位: 秒)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public long getObjectTimeout(String key) {
|
|
||||||
return super.getObjectTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改Object的剩余存活时间 (单位: 秒)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateObjectTimeout(String key, long timeout) {
|
|
||||||
// 判断是否想要设置为永久
|
|
||||||
if (timeout == NEVER_EXPIRE) {
|
|
||||||
long expire = getObjectTimeout(key);
|
|
||||||
if (expire == NEVER_EXPIRE) {
|
|
||||||
// 如果其已经被设置为永久,则不作任何处理
|
|
||||||
} else {
|
|
||||||
// 如果尚未被设置为永久,那么再次set一次
|
|
||||||
this.setObject(key, this.getObject(key), timeout);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 搜索数据
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<String> searchData(String prefix, String keyword, int start, int size, boolean sortType) {
|
|
||||||
return super.searchData(GlobalConstants.GLOBAL_REDIS_KEY + prefix, keyword, start, size, sortType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package org.dromara.common.tenant.exception;
|
|
||||||
|
|
||||||
import org.dromara.common.core.exception.base.BaseException;
|
|
||||||
|
|
||||||
import java.io.Serial;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户异常类
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
public class TenantException extends BaseException {
|
|
||||||
|
|
||||||
@Serial
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
public TenantException(String code, Object... args) {
|
|
||||||
super("tenant", code, args, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
package org.dromara.common.tenant.handle;
|
|
||||||
|
|
||||||
import cn.hutool.core.collection.ListUtil;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import net.sf.jsqlparser.expression.Expression;
|
|
||||||
import net.sf.jsqlparser.expression.NullValue;
|
|
||||||
import net.sf.jsqlparser.expression.StringValue;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.common.tenant.properties.TenantProperties;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自定义租户处理器
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class PlusTenantLineHandler implements TenantLineHandler {
|
|
||||||
|
|
||||||
private final TenantProperties tenantProperties;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Expression getTenantId() {
|
|
||||||
String tenantId = TenantHelper.getTenantId();
|
|
||||||
if (StringUtils.isBlank(tenantId)) {
|
|
||||||
log.error("无法获取有效的租户id -> Null");
|
|
||||||
return new NullValue();
|
|
||||||
}
|
|
||||||
// 返回固定租户
|
|
||||||
return new StringValue(tenantId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean ignoreTable(String tableName) {
|
|
||||||
String tenantId = TenantHelper.getTenantId();
|
|
||||||
// 判断是否有租户
|
|
||||||
if (StringUtils.isNotBlank(tenantId)) {
|
|
||||||
// 不需要过滤租户的表
|
|
||||||
List<String> excludes = tenantProperties.getExcludes();
|
|
||||||
// 非业务表
|
|
||||||
List<String> tables = ListUtil.toList(
|
|
||||||
"gen_table",
|
|
||||||
"gen_table_column"
|
|
||||||
);
|
|
||||||
tables.addAll(excludes);
|
|
||||||
return StringUtils.equalsAnyIgnoreCase(tableName, tables.toArray(new String[0]));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
package org.dromara.common.tenant.handle;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.dromara.common.core.constant.GlobalConstants;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.common.redis.handler.KeyPrefixHandler;
|
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 多租户redis缓存key前缀处理
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
public class TenantKeyPrefixHandler extends KeyPrefixHandler {
|
|
||||||
|
|
||||||
public TenantKeyPrefixHandler(String keyPrefix) {
|
|
||||||
super(keyPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 增加前缀
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String map(String name) {
|
|
||||||
if (StringUtils.isBlank(name)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) {
|
|
||||||
return super.map(name);
|
|
||||||
}
|
|
||||||
} catch (NoClassDefFoundError ignore) {
|
|
||||||
// 有些服务不需要mp导致类不存在 忽略即可
|
|
||||||
}
|
|
||||||
if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
|
||||||
return super.map(name);
|
|
||||||
}
|
|
||||||
String tenantId = TenantHelper.getTenantId();
|
|
||||||
if (StringUtils.isBlank(tenantId)) {
|
|
||||||
log.debug("无法获取有效的租户id -> Null");
|
|
||||||
return super.map(name);
|
|
||||||
}
|
|
||||||
if (StringUtils.startsWith(name, tenantId + "")) {
|
|
||||||
// 如果存在则直接返回
|
|
||||||
return super.map(name);
|
|
||||||
}
|
|
||||||
return super.map(tenantId + ":" + name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 去除前缀
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String unmap(String name) {
|
|
||||||
String unmap = super.unmap(name);
|
|
||||||
if (StringUtils.isBlank(unmap)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) {
|
|
||||||
return unmap;
|
|
||||||
}
|
|
||||||
} catch (NoClassDefFoundError ignore) {
|
|
||||||
// 有些服务不需要mp导致类不存在 忽略即可
|
|
||||||
}
|
|
||||||
if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
|
||||||
return unmap;
|
|
||||||
}
|
|
||||||
String tenantId = TenantHelper.getTenantId();
|
|
||||||
if (StringUtils.isBlank(tenantId)) {
|
|
||||||
log.debug("无法获取有效的租户id -> Null");
|
|
||||||
return unmap;
|
|
||||||
}
|
|
||||||
if (StringUtils.startsWith(unmap, tenantId + "")) {
|
|
||||||
// 如果存在则删除
|
|
||||||
return unmap.substring((tenantId + ":").length());
|
|
||||||
}
|
|
||||||
return unmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
package org.dromara.common.tenant.helper;
|
|
||||||
|
|
||||||
import cn.dev33.satoken.context.SaHolder;
|
|
||||||
import cn.dev33.satoken.context.model.SaStorage;
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
|
||||||
import cn.hutool.core.convert.Convert;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
|
|
||||||
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
|
|
||||||
import lombok.AccessLevel;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.dromara.common.core.constant.GlobalConstants;
|
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.common.core.utils.reflect.ReflectUtils;
|
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
|
||||||
|
|
||||||
import java.util.Stack;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户助手
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
|
||||||
public class TenantHelper {
|
|
||||||
|
|
||||||
private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant";
|
|
||||||
|
|
||||||
private static final ThreadLocal<String> TEMP_DYNAMIC_TENANT = new ThreadLocal<>();
|
|
||||||
|
|
||||||
private static final ThreadLocal<Stack<Integer>> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户功能是否启用
|
|
||||||
*/
|
|
||||||
public static boolean isEnable() {
|
|
||||||
return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IgnoreStrategy getIgnoreStrategy() {
|
|
||||||
Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL"));
|
|
||||||
if (ignoreStrategyLocal instanceof ThreadLocal<?> IGNORE_STRATEGY_LOCAL) {
|
|
||||||
if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) {
|
|
||||||
return ignoreStrategy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭)
|
|
||||||
*/
|
|
||||||
private static void enableIgnore() {
|
|
||||||
IgnoreStrategy ignoreStrategy = getIgnoreStrategy();
|
|
||||||
if (ObjectUtil.isNull(ignoreStrategy)) {
|
|
||||||
InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
|
|
||||||
} else {
|
|
||||||
ignoreStrategy.setTenantLine(true);
|
|
||||||
}
|
|
||||||
Stack<Integer> reentrantStack = REENTRANT_IGNORE.get();
|
|
||||||
reentrantStack.push(reentrantStack.size() + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 关闭忽略租户
|
|
||||||
*/
|
|
||||||
private static void disableIgnore() {
|
|
||||||
IgnoreStrategy ignoreStrategy = getIgnoreStrategy();
|
|
||||||
if (ObjectUtil.isNotNull(ignoreStrategy)) {
|
|
||||||
boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName())
|
|
||||||
&& !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack())
|
|
||||||
&& !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql())
|
|
||||||
&& !Boolean.TRUE.equals(ignoreStrategy.getDataPermission())
|
|
||||||
&& CollectionUtil.isEmpty(ignoreStrategy.getOthers());
|
|
||||||
Stack<Integer> reentrantStack = REENTRANT_IGNORE.get();
|
|
||||||
boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1;
|
|
||||||
if (noOtherIgnoreStrategy && empty) {
|
|
||||||
InterceptorIgnoreHelper.clearIgnoreStrategy();
|
|
||||||
} else if (empty) {
|
|
||||||
ignoreStrategy.setTenantLine(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 在忽略租户中执行
|
|
||||||
*
|
|
||||||
* @param handle 处理执行方法
|
|
||||||
*/
|
|
||||||
public static void ignore(Runnable handle) {
|
|
||||||
enableIgnore();
|
|
||||||
try {
|
|
||||||
handle.run();
|
|
||||||
} finally {
|
|
||||||
disableIgnore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 在忽略租户中执行
|
|
||||||
*
|
|
||||||
* @param handle 处理执行方法
|
|
||||||
*/
|
|
||||||
public static <T> T ignore(Supplier<T> handle) {
|
|
||||||
enableIgnore();
|
|
||||||
try {
|
|
||||||
return handle.get();
|
|
||||||
} finally {
|
|
||||||
disableIgnore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setDynamic(String tenantId) {
|
|
||||||
setDynamic(tenantId, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置动态租户(一直有效 需要手动清理)
|
|
||||||
* <p>
|
|
||||||
* 如果为未登录状态下 那么只在当前线程内生效
|
|
||||||
*
|
|
||||||
* @param tenantId 租户id
|
|
||||||
* @param global 是否全局生效
|
|
||||||
*/
|
|
||||||
public static void setDynamic(String tenantId, boolean global) {
|
|
||||||
if (!isEnable()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!LoginHelper.isLogin() || !global) {
|
|
||||||
TEMP_DYNAMIC_TENANT.set(tenantId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
|
||||||
RedisUtils.setCacheObject(cacheKey, tenantId);
|
|
||||||
SaHolder.getStorage().set(cacheKey, tenantId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取动态租户(一直有效 需要手动清理)
|
|
||||||
* <p>
|
|
||||||
* 如果为未登录状态下 那么只在当前线程内生效
|
|
||||||
*/
|
|
||||||
public static String getDynamic() {
|
|
||||||
if (!isEnable()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (!LoginHelper.isLogin()) {
|
|
||||||
return TEMP_DYNAMIC_TENANT.get();
|
|
||||||
}
|
|
||||||
// 如果线程内有值 优先返回
|
|
||||||
String tenantId = TEMP_DYNAMIC_TENANT.get();
|
|
||||||
if (StringUtils.isNotBlank(tenantId)) {
|
|
||||||
return tenantId;
|
|
||||||
}
|
|
||||||
SaStorage storage = SaHolder.getStorage();
|
|
||||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
|
||||||
tenantId = storage.getString(cacheKey);
|
|
||||||
// 如果为 -1 说明已经查过redis并且不存在值 则直接返回null
|
|
||||||
if (StringUtils.isNotBlank(tenantId)) {
|
|
||||||
return tenantId.equals("-1") ? null : tenantId;
|
|
||||||
}
|
|
||||||
tenantId = RedisUtils.getCacheObject(cacheKey);
|
|
||||||
storage.set(cacheKey, StringUtils.isBlank(tenantId) ? "-1" : tenantId);
|
|
||||||
return tenantId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 清除动态租户
|
|
||||||
*/
|
|
||||||
public static void clearDynamic() {
|
|
||||||
if (!isEnable()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!LoginHelper.isLogin()) {
|
|
||||||
TEMP_DYNAMIC_TENANT.remove();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TEMP_DYNAMIC_TENANT.remove();
|
|
||||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
|
||||||
RedisUtils.deleteObject(cacheKey);
|
|
||||||
SaHolder.getStorage().delete(cacheKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 在动态租户中执行
|
|
||||||
*
|
|
||||||
* @param handle 处理执行方法
|
|
||||||
*/
|
|
||||||
public static void dynamic(String tenantId, Runnable handle) {
|
|
||||||
setDynamic(tenantId);
|
|
||||||
try {
|
|
||||||
handle.run();
|
|
||||||
} finally {
|
|
||||||
clearDynamic();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 在动态租户中执行
|
|
||||||
*
|
|
||||||
* @param handle 处理执行方法
|
|
||||||
*/
|
|
||||||
public static <T> T dynamic(String tenantId, Supplier<T> handle) {
|
|
||||||
setDynamic(tenantId);
|
|
||||||
try {
|
|
||||||
return handle.get();
|
|
||||||
} finally {
|
|
||||||
clearDynamic();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前租户id(动态租户优先)
|
|
||||||
*/
|
|
||||||
public static String getTenantId() {
|
|
||||||
if (!isEnable()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String tenantId = TenantHelper.getDynamic();
|
|
||||||
if (StringUtils.isBlank(tenantId)) {
|
|
||||||
tenantId = LoginHelper.getTenantId();
|
|
||||||
}
|
|
||||||
return tenantId;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
package org.dromara.common.tenant.manager;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.dromara.common.core.constant.GlobalConstants;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.common.redis.manager.PlusSpringCacheManager;
|
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.springframework.cache.Cache;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 重写 cacheName 处理方法 支持多租户
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
public class TenantSpringCacheManager extends PlusSpringCacheManager {
|
|
||||||
|
|
||||||
public TenantSpringCacheManager() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Cache getCache(String name) {
|
|
||||||
if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) {
|
|
||||||
return super.getCache(name);
|
|
||||||
}
|
|
||||||
if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
|
|
||||||
return super.getCache(name);
|
|
||||||
}
|
|
||||||
String tenantId = TenantHelper.getTenantId();
|
|
||||||
if (StringUtils.isBlank(tenantId)) {
|
|
||||||
log.error("无法获取有效的租户id -> Null");
|
|
||||||
}
|
|
||||||
if (StringUtils.startsWith(name, tenantId)) {
|
|
||||||
// 如果存在则直接返回
|
|
||||||
return super.getCache(name);
|
|
||||||
}
|
|
||||||
return super.getCache(tenantId + ":" + name);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
package org.dromara.common.tenant.properties;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户 配置属性
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@ConfigurationProperties(prefix = "tenant")
|
|
||||||
public class TenantProperties {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否启用
|
|
||||||
*/
|
|
||||||
private Boolean enable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 排除表
|
|
||||||
*/
|
|
||||||
private List<String> excludes;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
org.dromara.common.tenant.config.TenantConfig
|
|
||||||
@@ -93,11 +93,6 @@
|
|||||||
<artifactId>ruoyi-common-encrypt</artifactId>
|
<artifactId>ruoyi-common-encrypt</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-tenant</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>ruoyi-common-websocket</artifactId>
|
<artifactId>ruoyi-common-websocket</artifactId>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.dromara.demo.domain;
|
package org.dromara.demo.domain;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ import java.io.Serial;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("test_demo")
|
@TableName("test_demo")
|
||||||
public class TestDemo extends TenantEntity {
|
public class TestDemo extends BaseEntity {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.baomidou.mybatisplus.annotation.Version;
|
import com.baomidou.mybatisplus.annotation.Version;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ import java.io.Serial;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("test_tree")
|
@TableName("test_tree")
|
||||||
public class TestTree extends TenantEntity {
|
public class TestTree extends BaseEntity {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|||||||
@@ -1,15 +1,6 @@
|
|||||||
package ${packageName}.domain;
|
package ${packageName}.domain;
|
||||||
|
|
||||||
#foreach ($column in $columns)
|
|
||||||
#if($column.javaField=='tenantId')
|
|
||||||
#set($IsTenant=1)
|
|
||||||
#end
|
|
||||||
#end
|
|
||||||
#if($IsTenant==1)
|
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
#else
|
|
||||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
#end
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
@@ -25,11 +16,7 @@ import java.io.Serial;
|
|||||||
* @author ${author}
|
* @author ${author}
|
||||||
* @date ${datetime}
|
* @date ${datetime}
|
||||||
*/
|
*/
|
||||||
#if($IsTenant==1)
|
|
||||||
#set($Entity="TenantEntity")
|
|
||||||
#else
|
|
||||||
#set($Entity="BaseEntity")
|
#set($Entity="BaseEntity")
|
||||||
#end
|
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("${tableName}")
|
@TableName("${tableName}")
|
||||||
|
|||||||
@@ -60,11 +60,6 @@
|
|||||||
<artifactId>ruoyi-common-sms</artifactId>
|
<artifactId>ruoyi-common-sms</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-tenant</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>ruoyi-common-security</artifactId>
|
<artifactId>ruoyi-common-security</artifactId>
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import cn.dev33.satoken.annotation.SaMode;
|
|||||||
import cn.hutool.core.lang.tree.Tree;
|
import cn.hutool.core.lang.tree.Tree;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
import org.dromara.common.core.constant.SystemConstants;
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
@@ -22,7 +21,6 @@ import org.dromara.system.service.ISysMenuService;
|
|||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,8 +51,7 @@ public class SysMenuController extends BaseController {
|
|||||||
* 获取菜单列表
|
* 获取菜单列表
|
||||||
*/
|
*/
|
||||||
@SaCheckRole(value = {
|
@SaCheckRole(value = {
|
||||||
TenantConstants.SUPER_ADMIN_ROLE_KEY,
|
SystemConstants.SUPER_ADMIN_ROLE_KEY,
|
||||||
TenantConstants.TENANT_ADMIN_ROLE_KEY
|
|
||||||
}, mode = SaMode.OR)
|
}, mode = SaMode.OR)
|
||||||
@SaCheckPermission("system:menu:list")
|
@SaCheckPermission("system:menu:list")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
@@ -69,8 +66,7 @@ public class SysMenuController extends BaseController {
|
|||||||
* @param menuId 菜单ID
|
* @param menuId 菜单ID
|
||||||
*/
|
*/
|
||||||
@SaCheckRole(value = {
|
@SaCheckRole(value = {
|
||||||
TenantConstants.SUPER_ADMIN_ROLE_KEY,
|
SystemConstants.SUPER_ADMIN_ROLE_KEY,
|
||||||
TenantConstants.TENANT_ADMIN_ROLE_KEY
|
|
||||||
}, mode = SaMode.OR)
|
}, mode = SaMode.OR)
|
||||||
@SaCheckPermission("system:menu:query")
|
@SaCheckPermission("system:menu:query")
|
||||||
@GetMapping(value = "/{menuId}")
|
@GetMapping(value = "/{menuId}")
|
||||||
@@ -103,31 +99,10 @@ public class SysMenuController extends BaseController {
|
|||||||
return R.ok(selectVo);
|
return R.ok(selectVo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 加载对应租户套餐菜单列表树
|
|
||||||
*
|
|
||||||
* @param packageId 租户套餐ID
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:menu:query")
|
|
||||||
@GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}")
|
|
||||||
public R<MenuTreeSelectVo> tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) {
|
|
||||||
List<SysMenuVo> menus = menuService.selectMenuList(LoginHelper.getUserId());
|
|
||||||
List<Tree<Long>> list = menuService.buildMenuTreeSelect(menus);
|
|
||||||
// 删除租户管理菜单
|
|
||||||
list.removeIf(menu -> menu.getId() == 6L);
|
|
||||||
List<Long> ids = new ArrayList<>();
|
|
||||||
if (packageId > 0L) {
|
|
||||||
ids = menuService.selectMenuListByPackageId(packageId);
|
|
||||||
}
|
|
||||||
MenuTreeSelectVo selectVo = new MenuTreeSelectVo(ids, list);
|
|
||||||
return R.ok(selectVo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增菜单
|
* 新增菜单
|
||||||
*/
|
*/
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
@SaCheckRole(SystemConstants.SUPER_ADMIN_ROLE_KEY)
|
||||||
@SaCheckPermission("system:menu:add")
|
@SaCheckPermission("system:menu:add")
|
||||||
@Log(title = "菜单管理", businessType = BusinessType.INSERT)
|
@Log(title = "菜单管理", businessType = BusinessType.INSERT)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@@ -146,7 +121,7 @@ public class SysMenuController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 修改菜单
|
* 修改菜单
|
||||||
*/
|
*/
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
@SaCheckRole(SystemConstants.SUPER_ADMIN_ROLE_KEY)
|
||||||
@SaCheckPermission("system:menu:edit")
|
@SaCheckPermission("system:menu:edit")
|
||||||
@Log(title = "菜单管理", businessType = BusinessType.UPDATE)
|
@Log(title = "菜单管理", businessType = BusinessType.UPDATE)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@@ -169,7 +144,7 @@ public class SysMenuController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param menuId 菜单ID
|
* @param menuId 菜单ID
|
||||||
*/
|
*/
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
@SaCheckRole(SystemConstants.SUPER_ADMIN_ROLE_KEY)
|
||||||
@SaCheckPermission("system:menu:remove")
|
@SaCheckPermission("system:menu:remove")
|
||||||
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
|
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/{menuId}")
|
@DeleteMapping("/{menuId}")
|
||||||
@@ -197,7 +172,7 @@ public class SysMenuController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param menuIds 菜单ID串
|
* @param menuIds 菜单ID串
|
||||||
*/
|
*/
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
@SaCheckRole(SystemConstants.SUPER_ADMIN_ROLE_KEY)
|
||||||
@SaCheckPermission("system:menu:remove")
|
@SaCheckPermission("system:menu:remove")
|
||||||
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
|
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/cascade/{menuIds}")
|
@DeleteMapping("/cascade/{menuIds}")
|
||||||
|
|||||||
@@ -1,211 +0,0 @@
|
|||||||
package org.dromara.system.controller.system;
|
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckRole;
|
|
||||||
import com.baomidou.lock.annotation.Lock4j;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import jakarta.validation.constraints.NotBlank;
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
|
||||||
import org.dromara.common.core.domain.R;
|
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
|
||||||
import org.dromara.common.encrypt.annotation.ApiEncrypt;
|
|
||||||
import org.dromara.common.excel.utils.ExcelUtil;
|
|
||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
|
||||||
import org.dromara.common.log.annotation.Log;
|
|
||||||
import org.dromara.common.log.enums.BusinessType;
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.common.web.core.BaseController;
|
|
||||||
import org.dromara.system.domain.bo.SysTenantBo;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantVo;
|
|
||||||
import org.dromara.system.service.ISysTenantService;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户管理
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@Validated
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/system/tenant")
|
|
||||||
@ConditionalOnProperty(value = "tenant.enable", havingValue = "true")
|
|
||||||
public class SysTenantController extends BaseController {
|
|
||||||
|
|
||||||
private final ISysTenantService tenantService;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户列表
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:list")
|
|
||||||
@GetMapping("/list")
|
|
||||||
public TableDataInfo<SysTenantVo> list(SysTenantBo bo, PageQuery pageQuery) {
|
|
||||||
return tenantService.queryPageList(bo, pageQuery);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导出租户列表
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:export")
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.EXPORT)
|
|
||||||
@PostMapping("/export")
|
|
||||||
public void export(SysTenantBo bo, HttpServletResponse response) {
|
|
||||||
List<SysTenantVo> list = tenantService.queryList(bo);
|
|
||||||
ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取租户详细信息
|
|
||||||
*
|
|
||||||
* @param id 主键
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:query")
|
|
||||||
@GetMapping("/{id}")
|
|
||||||
public R<SysTenantVo> getInfo(@NotNull(message = "主键不能为空")
|
|
||||||
@PathVariable Long id) {
|
|
||||||
return R.ok(tenantService.queryById(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增租户
|
|
||||||
*/
|
|
||||||
@ApiEncrypt
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:add")
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.INSERT)
|
|
||||||
@Lock4j
|
|
||||||
@RepeatSubmit()
|
|
||||||
@PostMapping()
|
|
||||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) {
|
|
||||||
if (!tenantService.checkCompanyNameUnique(bo)) {
|
|
||||||
return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在");
|
|
||||||
}
|
|
||||||
return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:edit")
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.UPDATE)
|
|
||||||
@RepeatSubmit()
|
|
||||||
@PutMapping()
|
|
||||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) {
|
|
||||||
tenantService.checkTenantAllowed(bo.getTenantId());
|
|
||||||
if (!tenantService.checkCompanyNameUnique(bo)) {
|
|
||||||
return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在");
|
|
||||||
}
|
|
||||||
return toAjax(tenantService.updateByBo(bo));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 状态修改
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:edit")
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.UPDATE)
|
|
||||||
@RepeatSubmit()
|
|
||||||
@PutMapping("/changeStatus")
|
|
||||||
public R<Void> changeStatus(@RequestBody SysTenantBo bo) {
|
|
||||||
tenantService.checkTenantAllowed(bo.getTenantId());
|
|
||||||
return toAjax(tenantService.updateTenantStatus(bo));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除租户
|
|
||||||
*
|
|
||||||
* @param ids 主键串
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:remove")
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.DELETE)
|
|
||||||
@DeleteMapping("/{ids}")
|
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
|
||||||
@PathVariable Long[] ids) {
|
|
||||||
return toAjax(tenantService.deleteWithValidByIds(List.of(ids), true));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 动态切换租户
|
|
||||||
*
|
|
||||||
* @param tenantId 租户ID
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@GetMapping("/dynamic/{tenantId}")
|
|
||||||
public R<Void> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
|
|
||||||
TenantHelper.setDynamic(tenantId, true);
|
|
||||||
return R.ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 清除动态租户
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@GetMapping("/dynamic/clear")
|
|
||||||
public R<Void> dynamicClear() {
|
|
||||||
TenantHelper.clearDynamic();
|
|
||||||
return R.ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户套餐
|
|
||||||
*
|
|
||||||
* @param tenantId 租户id
|
|
||||||
* @param packageId 套餐id
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenant:edit")
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.UPDATE)
|
|
||||||
@Lock4j
|
|
||||||
@GetMapping("/syncTenantPackage")
|
|
||||||
public R<Void> syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId,
|
|
||||||
@NotNull(message = "套餐ID不能为空") Long packageId) {
|
|
||||||
return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户字典
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.INSERT)
|
|
||||||
@Lock4j
|
|
||||||
@GetMapping("/syncTenantDict")
|
|
||||||
public R<Void> syncTenantDict() {
|
|
||||||
if (!TenantHelper.isEnable()) {
|
|
||||||
return R.fail("当前未开启租户模式");
|
|
||||||
}
|
|
||||||
tenantService.syncTenantDict();
|
|
||||||
return R.ok("同步租户字典成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户参数配置
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@Log(title = "租户管理", businessType = BusinessType.INSERT)
|
|
||||||
@Lock4j
|
|
||||||
@GetMapping("/syncTenantConfig")
|
|
||||||
public R<Void> syncTenantConfig() {
|
|
||||||
if (!TenantHelper.isEnable()) {
|
|
||||||
return R.fail("当前未开启租户模式");
|
|
||||||
}
|
|
||||||
tenantService.syncTenantConfig();
|
|
||||||
return R.ok("同步租户参数配置成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
package org.dromara.system.controller.system;
|
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckRole;
|
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
|
||||||
import org.dromara.common.core.domain.R;
|
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
|
||||||
import org.dromara.common.excel.utils.ExcelUtil;
|
|
||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
|
||||||
import org.dromara.common.log.annotation.Log;
|
|
||||||
import org.dromara.common.log.enums.BusinessType;
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import org.dromara.common.web.core.BaseController;
|
|
||||||
import org.dromara.system.domain.bo.SysTenantPackageBo;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantPackageVo;
|
|
||||||
import org.dromara.system.service.ISysTenantPackageService;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐管理
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@Validated
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/system/tenant/package")
|
|
||||||
@ConditionalOnProperty(value = "tenant.enable", havingValue = "true")
|
|
||||||
public class SysTenantPackageController extends BaseController {
|
|
||||||
|
|
||||||
private final ISysTenantPackageService tenantPackageService;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐列表
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:list")
|
|
||||||
@GetMapping("/list")
|
|
||||||
public TableDataInfo<SysTenantPackageVo> list(SysTenantPackageBo bo, PageQuery pageQuery) {
|
|
||||||
return tenantPackageService.queryPageList(bo, pageQuery);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐下拉选列表
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:list")
|
|
||||||
@GetMapping("/selectList")
|
|
||||||
public R<List<SysTenantPackageVo>> selectList() {
|
|
||||||
return R.ok(tenantPackageService.selectList());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导出租户套餐列表
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:export")
|
|
||||||
@Log(title = "租户套餐", businessType = BusinessType.EXPORT)
|
|
||||||
@PostMapping("/export")
|
|
||||||
public void export(SysTenantPackageBo bo, HttpServletResponse response) {
|
|
||||||
List<SysTenantPackageVo> list = tenantPackageService.queryList(bo);
|
|
||||||
ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取租户套餐详细信息
|
|
||||||
*
|
|
||||||
* @param packageId 主键
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:query")
|
|
||||||
@GetMapping("/{packageId}")
|
|
||||||
public R<SysTenantPackageVo> getInfo(@NotNull(message = "主键不能为空")
|
|
||||||
@PathVariable Long packageId) {
|
|
||||||
return R.ok(tenantPackageService.queryById(packageId));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增租户套餐
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:add")
|
|
||||||
@Log(title = "租户套餐", businessType = BusinessType.INSERT)
|
|
||||||
@RepeatSubmit()
|
|
||||||
@PostMapping()
|
|
||||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) {
|
|
||||||
if (!tenantPackageService.checkPackageNameUnique(bo)) {
|
|
||||||
return R.fail("新增套餐'" + bo.getPackageName() + "'失败,套餐名称已存在");
|
|
||||||
}
|
|
||||||
return toAjax(tenantPackageService.insertByBo(bo));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户套餐
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:edit")
|
|
||||||
@Log(title = "租户套餐", businessType = BusinessType.UPDATE)
|
|
||||||
@RepeatSubmit()
|
|
||||||
@PutMapping()
|
|
||||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) {
|
|
||||||
if (!tenantPackageService.checkPackageNameUnique(bo)) {
|
|
||||||
return R.fail("修改套餐'" + bo.getPackageName() + "'失败,套餐名称已存在");
|
|
||||||
}
|
|
||||||
return toAjax(tenantPackageService.updateByBo(bo));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 状态修改
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:edit")
|
|
||||||
@Log(title = "租户套餐", businessType = BusinessType.UPDATE)
|
|
||||||
@RepeatSubmit()
|
|
||||||
@PutMapping("/changeStatus")
|
|
||||||
public R<Void> changeStatus(@RequestBody SysTenantPackageBo bo) {
|
|
||||||
return toAjax(tenantPackageService.updatePackageStatus(bo));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除租户套餐
|
|
||||||
*
|
|
||||||
* @param packageIds 主键串
|
|
||||||
*/
|
|
||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
|
||||||
@SaCheckPermission("system:tenantPackage:remove")
|
|
||||||
@Log(title = "租户套餐", businessType = BusinessType.DELETE)
|
|
||||||
@DeleteMapping("/{packageIds}")
|
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
|
||||||
@PathVariable Long[] packageIds) {
|
|
||||||
return toAjax(tenantPackageService.deleteWithValidByIds(List.of(packageIds), true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -23,7 +23,6 @@ import org.dromara.common.mybatis.core.page.PageQuery;
|
|||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.mybatis.helper.DataPermissionHelper;
|
import org.dromara.common.mybatis.helper.DataPermissionHelper;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.common.web.core.BaseController;
|
import org.dromara.common.web.core.BaseController;
|
||||||
import org.dromara.system.domain.bo.SysDeptBo;
|
import org.dromara.system.domain.bo.SysDeptBo;
|
||||||
import org.dromara.system.domain.bo.SysPostBo;
|
import org.dromara.system.domain.bo.SysPostBo;
|
||||||
@@ -31,7 +30,10 @@ import org.dromara.system.domain.bo.SysRoleBo;
|
|||||||
import org.dromara.system.domain.bo.SysUserBo;
|
import org.dromara.system.domain.bo.SysUserBo;
|
||||||
import org.dromara.system.domain.vo.*;
|
import org.dromara.system.domain.vo.*;
|
||||||
import org.dromara.system.listener.SysUserImportListener;
|
import org.dromara.system.listener.SysUserImportListener;
|
||||||
import org.dromara.system.service.*;
|
import org.dromara.system.service.ISysDeptService;
|
||||||
|
import org.dromara.system.service.ISysPostService;
|
||||||
|
import org.dromara.system.service.ISysRoleService;
|
||||||
|
import org.dromara.system.service.ISysUserService;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
@@ -55,7 +57,6 @@ public class SysUserController extends BaseController {
|
|||||||
private final ISysRoleService roleService;
|
private final ISysRoleService roleService;
|
||||||
private final ISysPostService postService;
|
private final ISysPostService postService;
|
||||||
private final ISysDeptService deptService;
|
private final ISysDeptService deptService;
|
||||||
private final ISysTenantService tenantService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取用户列表
|
* 获取用户列表
|
||||||
@@ -108,10 +109,6 @@ public class SysUserController extends BaseController {
|
|||||||
public R<UserInfoVo> getInfo() {
|
public R<UserInfoVo> getInfo() {
|
||||||
UserInfoVo userInfoVo = new UserInfoVo();
|
UserInfoVo userInfoVo = new UserInfoVo();
|
||||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||||
if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) {
|
|
||||||
// 超级管理员 如果重新加载用户信息需清除动态租户
|
|
||||||
TenantHelper.clearDynamic();
|
|
||||||
}
|
|
||||||
|
|
||||||
SysUserVo user = DataPermissionHelper.ignore(() -> userService.selectUserById(loginUser.getUserId()));
|
SysUserVo user = DataPermissionHelper.ignore(() -> userService.selectUserById(loginUser.getUserId()));
|
||||||
if (ObjectUtil.isNull(user)) {
|
if (ObjectUtil.isNull(user)) {
|
||||||
@@ -168,11 +165,6 @@ public class SysUserController extends BaseController {
|
|||||||
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
|
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
|
||||||
return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
|
return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
|
||||||
}
|
}
|
||||||
if (TenantHelper.isEnable()) {
|
|
||||||
if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) {
|
|
||||||
return R.fail("当前租户下用户名额不足,请联系管理员");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
user.setPassword(BCrypt.hashpw(user.getPassword()));
|
user.setPassword(BCrypt.hashpw(user.getPassword()));
|
||||||
return toAjax(userService.insertUser(user));
|
return toAjax(userService.insertUser(user));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package org.dromara.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 参数配置表 sys_config
|
* 参数配置表 sys_config
|
||||||
@@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_config")
|
@TableName("sys_config")
|
||||||
public class SysConfig extends TenantEntity {
|
public class SysConfig extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 参数主键
|
* 参数主键
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -21,7 +21,7 @@ import java.util.List;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_dept")
|
@TableName("sys_dept")
|
||||||
public class SysDept extends TenantEntity {
|
public class SysDept extends BaseEntity {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
import org.dromara.common.core.constant.SystemConstants;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典数据表 sys_dict_data
|
* 字典数据表 sys_dict_data
|
||||||
@@ -16,7 +16,7 @@ import org.dromara.common.tenant.core.TenantEntity;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_dict_data")
|
@TableName("sys_dict_data")
|
||||||
public class SysDictData extends TenantEntity {
|
public class SysDictData extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典编码
|
* 字典编码
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package org.dromara.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典类型表 sys_dict_type
|
* 字典类型表 sys_dict_type
|
||||||
@@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_dict_type")
|
@TableName("sys_dict_type")
|
||||||
public class SysDictType extends TenantEntity {
|
public class SysDictType extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典主键
|
* 字典主键
|
||||||
|
|||||||
@@ -27,11 +27,6 @@ public class SysLogininfor implements Serializable {
|
|||||||
@TableId(value = "info_id")
|
@TableId(value = "info_id")
|
||||||
private Long infoId;
|
private Long infoId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户账号
|
* 用户账号
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package org.dromara.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_notice")
|
@TableName("sys_notice")
|
||||||
public class SysNotice extends TenantEntity {
|
public class SysNotice extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 公告ID
|
* 公告ID
|
||||||
|
|||||||
@@ -27,11 +27,6 @@ public class SysOperLog implements Serializable {
|
|||||||
@TableId(value = "oper_id")
|
@TableId(value = "oper_id")
|
||||||
private Long operId;
|
private Long operId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作模块
|
* 操作模块
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package org.dromara.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OSS对象存储对象
|
* OSS对象存储对象
|
||||||
@@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_oss")
|
@TableName("sys_oss")
|
||||||
public class SysOss extends TenantEntity {
|
public class SysOss extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对象存储主键
|
* 对象存储主键
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package org.dromara.system.domain;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 岗位表 sys_post
|
* 岗位表 sys_post
|
||||||
@@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_post")
|
@TableName("sys_post")
|
||||||
public class SysPost extends TenantEntity {
|
public class SysPost extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 岗位序号
|
* 岗位序号
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package org.dromara.system.domain;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色表 sys_role
|
* 角色表 sys_role
|
||||||
@@ -18,7 +18,7 @@ import lombok.NoArgsConstructor;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_role")
|
@TableName("sys_role")
|
||||||
public class SysRole extends TenantEntity {
|
public class SysRole extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色ID
|
* 角色ID
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ import java.io.Serial;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_social")
|
@TableName("sys_social")
|
||||||
public class SysSocial extends TenantEntity {
|
public class SysSocial extends BaseEntity {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|||||||
@@ -1,103 +0,0 @@
|
|||||||
package org.dromara.system.domain;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
|
||||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
import java.io.Serial;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户对象 sys_tenant
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@TableName("sys_tenant")
|
|
||||||
public class SysTenant extends BaseEntity {
|
|
||||||
|
|
||||||
@Serial
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* id
|
|
||||||
*/
|
|
||||||
@TableId(value = "id")
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 联系人
|
|
||||||
*/
|
|
||||||
private String contactUserName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 联系电话
|
|
||||||
*/
|
|
||||||
private String contactPhone;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业名称
|
|
||||||
*/
|
|
||||||
private String companyName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 统一社会信用代码
|
|
||||||
*/
|
|
||||||
private String licenseNumber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 地址
|
|
||||||
*/
|
|
||||||
private String address;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 域名
|
|
||||||
*/
|
|
||||||
private String domain;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业简介
|
|
||||||
*/
|
|
||||||
private String intro;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备注
|
|
||||||
*/
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐编号
|
|
||||||
*/
|
|
||||||
private Long packageId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 过期时间
|
|
||||||
*/
|
|
||||||
private Date expireTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户数量(-1不限制)
|
|
||||||
*/
|
|
||||||
private Long accountCount;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户状态(0正常 1停用)
|
|
||||||
*/
|
|
||||||
private String status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除标志(0代表存在 1代表删除)
|
|
||||||
*/
|
|
||||||
@TableLogic
|
|
||||||
private String delFlag;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
package org.dromara.system.domain;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import java.io.Serial;
|
|
||||||
|
|
||||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐对象 sys_tenant_package
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@TableName("sys_tenant_package")
|
|
||||||
public class SysTenantPackage extends BaseEntity {
|
|
||||||
|
|
||||||
@Serial
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐id
|
|
||||||
*/
|
|
||||||
@TableId(value = "package_id")
|
|
||||||
private Long packageId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 套餐名称
|
|
||||||
*/
|
|
||||||
private String packageName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 关联菜单id
|
|
||||||
*/
|
|
||||||
private String menuIds;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备注
|
|
||||||
*/
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
|
|
||||||
*/
|
|
||||||
private Boolean menuCheckStrictly;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 状态(0正常 1停用)
|
|
||||||
*/
|
|
||||||
private String status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除标志(0代表存在 1代表删除)
|
|
||||||
*/
|
|
||||||
@TableLogic
|
|
||||||
private String delFlag;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@ import lombok.Data;
|
|||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
import org.dromara.common.core.constant.SystemConstants;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ import java.util.Date;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("sys_user")
|
@TableName("sys_user")
|
||||||
public class SysUser extends TenantEntity {
|
public class SysUser extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户ID
|
* 用户ID
|
||||||
|
|||||||
@@ -23,11 +23,6 @@ public class SysLogininforBo {
|
|||||||
*/
|
*/
|
||||||
private Long infoId;
|
private Long infoId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户账号
|
* 用户账号
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -29,11 +29,6 @@ public class SysOperLogBo {
|
|||||||
*/
|
*/
|
||||||
private Long operId;
|
private Long operId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模块标题
|
* 模块标题
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
import org.dromara.system.domain.SysSocial;
|
import org.dromara.system.domain.SysSocial;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,7 +20,7 @@ import org.dromara.system.domain.SysSocial;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@AutoMapper(target = SysSocial.class, reverseConvertGenerate = false)
|
@AutoMapper(target = SysSocial.class, reverseConvertGenerate = false)
|
||||||
public class SysSocialBo extends TenantEntity {
|
public class SysSocialBo extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主键
|
* 主键
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
package org.dromara.system.domain.bo;
|
|
||||||
|
|
||||||
import io.github.linpeilie.annotations.AutoMapper;
|
|
||||||
import jakarta.validation.constraints.NotBlank;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
|
||||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
|
||||||
import org.dromara.system.domain.SysTenant;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户业务对象 sys_tenant
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@AutoMapper(target = SysTenant.class, reverseConvertGenerate = false)
|
|
||||||
public class SysTenantBo extends BaseEntity {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* id
|
|
||||||
*/
|
|
||||||
@NotNull(message = "id不能为空", groups = { EditGroup.class })
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 联系人
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class })
|
|
||||||
private String contactUserName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 联系电话
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
|
|
||||||
private String contactPhone;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业名称
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
|
||||||
private String companyName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户名(创建系统用户)
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "用户名不能为空", groups = { AddGroup.class })
|
|
||||||
private String username;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 密码(创建系统用户)
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "密码不能为空", groups = { AddGroup.class })
|
|
||||||
// @Pattern(regexp = RegexConstants.PASSWORD, message = "{user.password.format.valid}", groups = { AddGroup.class })
|
|
||||||
private String password;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 统一社会信用代码
|
|
||||||
*/
|
|
||||||
private String licenseNumber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 地址
|
|
||||||
*/
|
|
||||||
private String address;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 域名
|
|
||||||
*/
|
|
||||||
private String domain;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业简介
|
|
||||||
*/
|
|
||||||
private String intro;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备注
|
|
||||||
*/
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐编号
|
|
||||||
*/
|
|
||||||
@NotNull(message = "租户套餐不能为空", groups = { AddGroup.class })
|
|
||||||
private Long packageId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 过期时间
|
|
||||||
*/
|
|
||||||
private Date expireTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户数量(-1不限制)
|
|
||||||
*/
|
|
||||||
private Long accountCount;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户状态(0正常 1停用)
|
|
||||||
*/
|
|
||||||
private String status;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
package org.dromara.system.domain.bo;
|
|
||||||
|
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
|
||||||
import org.dromara.system.domain.SysTenantPackage;
|
|
||||||
import io.github.linpeilie.annotations.AutoMapper;
|
|
||||||
import io.github.linpeilie.annotations.AutoMapping;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import jakarta.validation.constraints.*;
|
|
||||||
|
|
||||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐业务对象 sys_tenant_package
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@AutoMapper(target = SysTenantPackage.class, reverseConvertGenerate = false)
|
|
||||||
public class SysTenantPackageBo extends BaseEntity {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐id
|
|
||||||
*/
|
|
||||||
@NotNull(message = "租户套餐id不能为空", groups = { EditGroup.class })
|
|
||||||
private Long packageId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 套餐名称
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
|
||||||
private String packageName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 关联菜单id
|
|
||||||
*/
|
|
||||||
@AutoMapping(target = "menuIds", expression = "java(org.dromara.common.core.utils.StringUtils.joinComma(source.getMenuIds()))")
|
|
||||||
private Long[] menuIds;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备注
|
|
||||||
*/
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 菜单树选择项是否关联显示
|
|
||||||
*/
|
|
||||||
private Boolean menuCheckStrictly;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 状态(0正常 1停用)
|
|
||||||
*/
|
|
||||||
private String status;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -25,11 +25,6 @@ public class ProfileUserVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部门ID
|
* 部门ID
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -34,11 +34,6 @@ public class SysLogininforVo implements Serializable {
|
|||||||
@ExcelProperty(value = "序号")
|
@ExcelProperty(value = "序号")
|
||||||
private Long infoId;
|
private Long infoId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户账号
|
* 用户账号
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -33,11 +33,6 @@ public class SysOperLogVo implements Serializable {
|
|||||||
@ExcelProperty(value = "日志主键")
|
@ExcelProperty(value = "日志主键")
|
||||||
private Long operId;
|
private Long operId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模块标题
|
* 模块标题
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -31,11 +31,6 @@ public class SysSocialVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 的唯一ID
|
* 的唯一ID
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
package org.dromara.system.domain.vo;
|
|
||||||
|
|
||||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
|
||||||
import cn.idev.excel.annotation.ExcelProperty;
|
|
||||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
|
||||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
|
||||||
import org.dromara.system.domain.SysTenantPackage;
|
|
||||||
import io.github.linpeilie.annotations.AutoMapper;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.io.Serial;
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐视图对象 sys_tenant_package
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@ExcelIgnoreUnannotated
|
|
||||||
@AutoMapper(target = SysTenantPackage.class)
|
|
||||||
public class SysTenantPackageVo implements Serializable {
|
|
||||||
|
|
||||||
@Serial
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐id
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "租户套餐id")
|
|
||||||
private Long packageId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 套餐名称
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "套餐名称")
|
|
||||||
private String packageName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 关联菜单id
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "关联菜单id")
|
|
||||||
private String menuIds;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备注
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "备注")
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 菜单树选择项是否关联显示
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "菜单树选择项是否关联显示")
|
|
||||||
private Boolean menuCheckStrictly;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 状态(0正常 1停用)
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
|
|
||||||
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
|
|
||||||
private String status;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
package org.dromara.system.domain.vo;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
|
||||||
import cn.idev.excel.annotation.ExcelProperty;
|
|
||||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
|
||||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
|
||||||
import org.dromara.system.domain.SysTenant;
|
|
||||||
import io.github.linpeilie.annotations.AutoMapper;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.io.Serial;
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户视图对象 sys_tenant
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@ExcelIgnoreUnannotated
|
|
||||||
@AutoMapper(target = SysTenant.class)
|
|
||||||
public class SysTenantVo implements Serializable {
|
|
||||||
|
|
||||||
@Serial
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* id
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "id")
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户编号
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "租户编号")
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 联系人
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "联系人")
|
|
||||||
private String contactUserName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 联系电话
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "联系电话")
|
|
||||||
private String contactPhone;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业名称
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "企业名称")
|
|
||||||
private String companyName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 统一社会信用代码
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "统一社会信用代码")
|
|
||||||
private String licenseNumber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 地址
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "地址")
|
|
||||||
private String address;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 域名
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "域名")
|
|
||||||
private String domain;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业简介
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "企业简介")
|
|
||||||
private String intro;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备注
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "备注")
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐编号
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "租户套餐编号")
|
|
||||||
private Long packageId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 过期时间
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "过期时间")
|
|
||||||
private Date expireTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户数量(-1不限制)
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "用户数量")
|
|
||||||
private Long accountCount;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户状态(0正常 1停用)
|
|
||||||
*/
|
|
||||||
@ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class)
|
|
||||||
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
|
|
||||||
private String status;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -33,11 +33,6 @@ public class SysUserVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户ID
|
|
||||||
*/
|
|
||||||
private String tenantId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部门ID
|
* 部门ID
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
package org.dromara.system.mapper;
|
|
||||||
|
|
||||||
import org.dromara.system.domain.SysTenant;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantVo;
|
|
||||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户Mapper接口
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
public interface SysTenantMapper extends BaseMapperPlus<SysTenant, SysTenantVo> {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package org.dromara.system.mapper;
|
|
||||||
|
|
||||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
|
||||||
import org.dromara.system.domain.SysTenantPackage;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantPackageVo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐Mapper接口
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
public interface SysTenantPackageMapper extends BaseMapperPlus<SysTenantPackage, SysTenantPackageVo> {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -41,10 +41,10 @@ public interface ISysConfigService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取注册开关
|
* 获取注册开关
|
||||||
* @param tenantId 租户id
|
*
|
||||||
* @return true开启,false关闭
|
* @return true开启,false关闭
|
||||||
*/
|
*/
|
||||||
boolean selectRegisterEnabled(String tenantId);
|
boolean selectRegisterEnabled();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询参数配置列表
|
* 查询参数配置列表
|
||||||
|
|||||||
@@ -65,14 +65,6 @@ public interface ISysMenuService {
|
|||||||
*/
|
*/
|
||||||
List<Long> selectMenuListByRoleId(Long roleId);
|
List<Long> selectMenuListByRoleId(Long roleId);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据租户套餐ID查询菜单树信息
|
|
||||||
*
|
|
||||||
* @param packageId 租户套餐ID
|
|
||||||
* @return 选中菜单列表
|
|
||||||
*/
|
|
||||||
List<Long> selectMenuListByPackageId(Long packageId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建前端路由所需要的菜单
|
* 构建前端路由所需要的菜单
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
package org.dromara.system.service;
|
|
||||||
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import org.dromara.system.domain.bo.SysTenantPackageBo;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantPackageVo;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐Service接口
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
public interface ISysTenantPackageService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐
|
|
||||||
*/
|
|
||||||
SysTenantPackageVo queryById(Long packageId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐列表
|
|
||||||
*/
|
|
||||||
TableDataInfo<SysTenantPackageVo> queryPageList(SysTenantPackageBo bo, PageQuery pageQuery);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐已启用列表
|
|
||||||
*/
|
|
||||||
List<SysTenantPackageVo> selectList();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐列表
|
|
||||||
*/
|
|
||||||
List<SysTenantPackageVo> queryList(SysTenantPackageBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增租户套餐
|
|
||||||
*/
|
|
||||||
Boolean insertByBo(SysTenantPackageBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户套餐
|
|
||||||
*/
|
|
||||||
Boolean updateByBo(SysTenantPackageBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验套餐名称是否唯一
|
|
||||||
*/
|
|
||||||
boolean checkPackageNameUnique(SysTenantPackageBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改套餐状态
|
|
||||||
*/
|
|
||||||
int updatePackageStatus(SysTenantPackageBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验并批量删除租户套餐信息
|
|
||||||
*/
|
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
package org.dromara.system.service;
|
|
||||||
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import org.dromara.system.domain.bo.SysTenantBo;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantVo;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户Service接口
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
public interface ISysTenantService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户
|
|
||||||
*/
|
|
||||||
SysTenantVo queryById(Long id);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 基于租户ID查询租户
|
|
||||||
*/
|
|
||||||
SysTenantVo queryByTenantId(String tenantId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户列表
|
|
||||||
*/
|
|
||||||
TableDataInfo<SysTenantVo> queryPageList(SysTenantBo bo, PageQuery pageQuery);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户列表
|
|
||||||
*/
|
|
||||||
List<SysTenantVo> queryList(SysTenantBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增租户
|
|
||||||
*/
|
|
||||||
Boolean insertByBo(SysTenantBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户
|
|
||||||
*/
|
|
||||||
Boolean updateByBo(SysTenantBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户状态
|
|
||||||
*/
|
|
||||||
int updateTenantStatus(SysTenantBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验租户是否允许操作
|
|
||||||
*/
|
|
||||||
void checkTenantAllowed(String tenantId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验并批量删除租户信息
|
|
||||||
*/
|
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验企业名称是否唯一
|
|
||||||
*/
|
|
||||||
boolean checkCompanyNameUnique(SysTenantBo bo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验账号余额
|
|
||||||
*/
|
|
||||||
boolean checkAccountBalance(String tenantId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验有效期
|
|
||||||
*/
|
|
||||||
boolean checkExpireTime(String tenantId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户套餐
|
|
||||||
*/
|
|
||||||
Boolean syncTenantPackage(String tenantId, Long packageId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户字典
|
|
||||||
*/
|
|
||||||
void syncTenantDict();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户参数配置
|
|
||||||
*/
|
|
||||||
void syncTenantConfig();
|
|
||||||
}
|
|
||||||
@@ -152,7 +152,7 @@ public interface ISysUserService {
|
|||||||
* @param user 用户信息
|
* @param user 用户信息
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
boolean registerUser(SysUserBo user, String tenantId);
|
boolean registerUser(SysUserBo user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改用户信息
|
* 修改用户信息
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.dromara.common.json.utils.JsonUtils;
|
|||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.redis.utils.CacheUtils;
|
import org.dromara.common.redis.utils.CacheUtils;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.system.domain.SysConfig;
|
import org.dromara.system.domain.SysConfig;
|
||||||
import org.dromara.system.domain.bo.SysConfigBo;
|
import org.dromara.system.domain.bo.SysConfigBo;
|
||||||
import org.dromara.system.domain.vo.SysConfigVo;
|
import org.dromara.system.domain.vo.SysConfigVo;
|
||||||
@@ -85,15 +84,11 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService {
|
|||||||
/**
|
/**
|
||||||
* 获取注册开关
|
* 获取注册开关
|
||||||
*
|
*
|
||||||
* @param tenantId 租户id
|
|
||||||
* @return true开启,false关闭
|
* @return true开启,false关闭
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean selectRegisterEnabled(String tenantId) {
|
public boolean selectRegisterEnabled() {
|
||||||
String configValue = TenantHelper.dynamic(tenantId, () ->
|
return Convert.toBool(this.selectConfigByKey("sys.account.registerUser"));
|
||||||
this.selectConfigByKey("sys.account.registerUser")
|
|
||||||
);
|
|
||||||
return Convert.toBool(configValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ public class SysLogininforServiceImpl implements ISysLogininforService {
|
|||||||
String browser = userAgent.getBrowser().getName();
|
String browser = userAgent.getBrowser().getName();
|
||||||
// 封装对象
|
// 封装对象
|
||||||
SysLogininforBo logininfor = new SysLogininforBo();
|
SysLogininforBo logininfor = new SysLogininforBo();
|
||||||
logininfor.setTenantId(logininforEvent.getTenantId());
|
|
||||||
logininfor.setUserName(logininforEvent.getUsername());
|
logininfor.setUserName(logininforEvent.getUsername());
|
||||||
if (ObjectUtil.isNotNull(client)) {
|
if (ObjectUtil.isNotNull(client)) {
|
||||||
logininfor.setClientKey(client.getClientKey());
|
logininfor.setClientKey(client.getClientKey());
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.dromara.system.service.impl;
|
package org.dromara.system.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.convert.Convert;
|
|
||||||
import cn.hutool.core.lang.tree.Tree;
|
import cn.hutool.core.lang.tree.Tree;
|
||||||
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;
|
||||||
@@ -17,7 +16,6 @@ import org.dromara.common.satoken.utils.LoginHelper;
|
|||||||
import org.dromara.system.domain.SysMenu;
|
import org.dromara.system.domain.SysMenu;
|
||||||
import org.dromara.system.domain.SysRole;
|
import org.dromara.system.domain.SysRole;
|
||||||
import org.dromara.system.domain.SysRoleMenu;
|
import org.dromara.system.domain.SysRoleMenu;
|
||||||
import org.dromara.system.domain.SysTenantPackage;
|
|
||||||
import org.dromara.system.domain.bo.SysMenuBo;
|
import org.dromara.system.domain.bo.SysMenuBo;
|
||||||
import org.dromara.system.domain.vo.MetaVo;
|
import org.dromara.system.domain.vo.MetaVo;
|
||||||
import org.dromara.system.domain.vo.RouterVo;
|
import org.dromara.system.domain.vo.RouterVo;
|
||||||
@@ -25,7 +23,6 @@ import org.dromara.system.domain.vo.SysMenuVo;
|
|||||||
import org.dromara.system.mapper.SysMenuMapper;
|
import org.dromara.system.mapper.SysMenuMapper;
|
||||||
import org.dromara.system.mapper.SysRoleMapper;
|
import org.dromara.system.mapper.SysRoleMapper;
|
||||||
import org.dromara.system.mapper.SysRoleMenuMapper;
|
import org.dromara.system.mapper.SysRoleMenuMapper;
|
||||||
import org.dromara.system.mapper.SysTenantPackageMapper;
|
|
||||||
import org.dromara.system.service.ISysMenuService;
|
import org.dromara.system.service.ISysMenuService;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@@ -48,7 +45,6 @@ public class SysMenuServiceImpl implements ISysMenuService {
|
|||||||
private final SysMenuMapper baseMapper;
|
private final SysMenuMapper baseMapper;
|
||||||
private final SysRoleMapper roleMapper;
|
private final SysRoleMapper roleMapper;
|
||||||
private final SysRoleMenuMapper roleMenuMapper;
|
private final SysRoleMenuMapper roleMenuMapper;
|
||||||
private final SysTenantPackageMapper tenantPackageMapper;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据用户查询系统菜单列表
|
* 根据用户查询系统菜单列表
|
||||||
@@ -144,35 +140,6 @@ public class SysMenuServiceImpl implements ISysMenuService {
|
|||||||
return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly());
|
return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据租户套餐ID查询菜单树信息
|
|
||||||
*
|
|
||||||
* @param packageId 租户套餐ID
|
|
||||||
* @return 选中菜单列表
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<Long> selectMenuListByPackageId(Long packageId) {
|
|
||||||
SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
|
|
||||||
List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
|
|
||||||
if (CollUtil.isEmpty(menuIds)) {
|
|
||||||
return List.of();
|
|
||||||
}
|
|
||||||
List<Long> parentIds = null;
|
|
||||||
if (tenantPackage.getMenuCheckStrictly()) {
|
|
||||||
parentIds = baseMapper.selectObjs(new LambdaQueryWrapper<SysMenu>()
|
|
||||||
.select(SysMenu::getParentId)
|
|
||||||
.in(SysMenu::getMenuId, menuIds), x -> {
|
|
||||||
return Convert.toLong(x);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return baseMapper.selectObjs(new LambdaQueryWrapper<SysMenu>()
|
|
||||||
.select(SysMenu::getMenuId)
|
|
||||||
.in(SysMenu::getMenuId, menuIds)
|
|
||||||
.notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {
|
|
||||||
return Convert.toLong(x);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建前端路由所需要的菜单
|
* 构建前端路由所需要的菜单
|
||||||
* 路由name命名规则 path首字母转大写 + id
|
* 路由name命名规则 path首字母转大写 + id
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.dromara.system.service.impl;
|
package org.dromara.system.service.impl;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
import org.dromara.common.core.constant.SystemConstants;
|
||||||
import org.dromara.common.core.service.PermissionService;
|
import org.dromara.common.core.service.PermissionService;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.system.service.ISysMenuService;
|
import org.dromara.system.service.ISysMenuService;
|
||||||
@@ -35,7 +35,7 @@ public class SysPermissionServiceImpl implements ISysPermissionService, Permissi
|
|||||||
Set<String> roles = new HashSet<>();
|
Set<String> roles = new HashSet<>();
|
||||||
// 管理员拥有所有权限
|
// 管理员拥有所有权限
|
||||||
if (LoginHelper.isSuperAdmin(userId)) {
|
if (LoginHelper.isSuperAdmin(userId)) {
|
||||||
roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY);
|
roles.add(SystemConstants.SUPER_ADMIN_ROLE_KEY);
|
||||||
} else {
|
} else {
|
||||||
roles.addAll(roleService.selectRolePermissionByUserId(userId));
|
roles.addAll(roleService.selectRolePermissionByUserId(userId));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.constant.CacheNames;
|
import org.dromara.common.core.constant.CacheNames;
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
import org.dromara.common.core.constant.SystemConstants;
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
|
||||||
import org.dromara.common.core.domain.model.LoginUser;
|
import org.dromara.common.core.domain.model.LoginUser;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
import org.dromara.common.core.service.RoleService;
|
import org.dromara.common.core.service.RoleService;
|
||||||
@@ -224,7 +223,7 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
|
|||||||
if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) {
|
if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) {
|
||||||
throw new ServiceException("不允许操作超级管理员角色");
|
throw new ServiceException("不允许操作超级管理员角色");
|
||||||
}
|
}
|
||||||
String[] keys = new String[]{TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY};
|
String[] keys = new String[]{SystemConstants.SUPER_ADMIN_ROLE_KEY};
|
||||||
// 新增不允许使用 管理员标识符
|
// 新增不允许使用 管理员标识符
|
||||||
if (ObjectUtil.isNull(role.getRoleId())
|
if (ObjectUtil.isNull(role.getRoleId())
|
||||||
&& StringUtils.equalsAny(role.getRoleKey(), keys)) {
|
&& StringUtils.equalsAny(role.getRoleKey(), keys)) {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import cn.dev33.satoken.stp.StpUtil;
|
|||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.sensitive.core.SensitiveService;
|
import org.dromara.common.sensitive.core.SensitiveService;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,9 +37,6 @@ public class SysSensitiveServiceImpl implements SensitiveService {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TenantHelper.isEnable()) {
|
|
||||||
return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin();
|
|
||||||
}
|
|
||||||
return !LoginHelper.isSuperAdmin();
|
return !LoginHelper.isSuperAdmin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,149 +0,0 @@
|
|||||||
package org.dromara.system.service.impl;
|
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import org.dromara.system.domain.SysTenant;
|
|
||||||
import org.dromara.system.domain.SysTenantPackage;
|
|
||||||
import org.dromara.system.domain.bo.SysTenantPackageBo;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantPackageVo;
|
|
||||||
import org.dromara.system.mapper.SysTenantMapper;
|
|
||||||
import org.dromara.system.mapper.SysTenantPackageMapper;
|
|
||||||
import org.dromara.system.service.ISysTenantPackageService;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户套餐Service业务层处理
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Service
|
|
||||||
public class SysTenantPackageServiceImpl implements ISysTenantPackageService {
|
|
||||||
|
|
||||||
private final SysTenantPackageMapper baseMapper;
|
|
||||||
private final SysTenantMapper tenantMapper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public SysTenantPackageVo queryById(Long packageId){
|
|
||||||
return baseMapper.selectVoById(packageId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐列表
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public TableDataInfo<SysTenantPackageVo> queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) {
|
|
||||||
LambdaQueryWrapper<SysTenantPackage> lqw = buildQueryWrapper(bo);
|
|
||||||
Page<SysTenantPackageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
||||||
return TableDataInfo.build(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<SysTenantPackageVo> selectList() {
|
|
||||||
return baseMapper.selectVoList(new LambdaQueryWrapper<SysTenantPackage>()
|
|
||||||
.eq(SysTenantPackage::getStatus, SystemConstants.NORMAL));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户套餐列表
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<SysTenantPackageVo> queryList(SysTenantPackageBo bo) {
|
|
||||||
LambdaQueryWrapper<SysTenantPackage> lqw = buildQueryWrapper(bo);
|
|
||||||
return baseMapper.selectVoList(lqw);
|
|
||||||
}
|
|
||||||
|
|
||||||
private LambdaQueryWrapper<SysTenantPackage> buildQueryWrapper(SysTenantPackageBo bo) {
|
|
||||||
LambdaQueryWrapper<SysTenantPackage> lqw = Wrappers.lambdaQuery();
|
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus());
|
|
||||||
lqw.orderByAsc(SysTenantPackage::getPackageId);
|
|
||||||
return lqw;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增租户套餐
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public Boolean insertByBo(SysTenantPackageBo bo) {
|
|
||||||
SysTenantPackage add = MapstructUtils.convert(bo, SysTenantPackage.class);
|
|
||||||
// 保存菜单id
|
|
||||||
List<Long> menuIds = Arrays.asList(bo.getMenuIds());
|
|
||||||
add.setMenuIds(CollUtil.isNotEmpty(menuIds) ? StringUtils.joinComma(menuIds) : "");
|
|
||||||
boolean flag = baseMapper.insert(add) > 0;
|
|
||||||
if (flag) {
|
|
||||||
bo.setPackageId(add.getPackageId());
|
|
||||||
}
|
|
||||||
return flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户套餐
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public Boolean updateByBo(SysTenantPackageBo bo) {
|
|
||||||
SysTenantPackage update = MapstructUtils.convert(bo, SysTenantPackage.class);
|
|
||||||
// 保存菜单id
|
|
||||||
List<Long> menuIds = Arrays.asList(bo.getMenuIds());
|
|
||||||
update.setMenuIds(CollUtil.isNotEmpty(menuIds) ? StringUtils.joinComma(menuIds) : "");
|
|
||||||
return baseMapper.updateById(update) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验套餐名称是否唯一
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean checkPackageNameUnique(SysTenantPackageBo bo) {
|
|
||||||
boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysTenantPackage>()
|
|
||||||
.eq(SysTenantPackage::getPackageName, bo.getPackageName())
|
|
||||||
.ne(ObjectUtil.isNotNull(bo.getPackageId()), SysTenantPackage::getPackageId, bo.getPackageId()));
|
|
||||||
return !exist;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改套餐状态
|
|
||||||
*
|
|
||||||
* @param bo 套餐信息
|
|
||||||
* @return 结果
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int updatePackageStatus(SysTenantPackageBo bo) {
|
|
||||||
SysTenantPackage tenantPackage = MapstructUtils.convert(bo, SysTenantPackage.class);
|
|
||||||
return baseMapper.updateById(tenantPackage);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量删除租户套餐
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
||||||
if(isValid){
|
|
||||||
boolean exists = tenantMapper.exists(new LambdaQueryWrapper<SysTenant>().in(SysTenant::getPackageId, ids));
|
|
||||||
if (exists) {
|
|
||||||
throw new ServiceException("租户套餐已被使用");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return baseMapper.deleteByIds(ids) > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,567 +0,0 @@
|
|||||||
package org.dromara.system.service.impl;
|
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.hutool.core.convert.Convert;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import cn.hutool.core.util.RandomUtil;
|
|
||||||
import cn.hutool.crypto.digest.BCrypt;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.dromara.common.core.constant.CacheNames;
|
|
||||||
import org.dromara.common.core.constant.Constants;
|
|
||||||
import org.dromara.common.core.constant.SystemConstants;
|
|
||||||
import org.dromara.common.core.constant.TenantConstants;
|
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
|
||||||
import org.dromara.common.core.service.WorkflowService;
|
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import org.dromara.common.redis.utils.CacheUtils;
|
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
|
||||||
import org.dromara.system.domain.*;
|
|
||||||
import org.dromara.system.domain.bo.SysTenantBo;
|
|
||||||
import org.dromara.system.domain.vo.SysTenantVo;
|
|
||||||
import org.dromara.system.mapper.*;
|
|
||||||
import org.dromara.system.service.ISysTenantService;
|
|
||||||
import org.springframework.cache.annotation.CacheEvict;
|
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户Service业务层处理
|
|
||||||
*
|
|
||||||
* @author Michelle.Chung
|
|
||||||
*/
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Service
|
|
||||||
public class SysTenantServiceImpl implements ISysTenantService {
|
|
||||||
|
|
||||||
private final SysTenantMapper baseMapper;
|
|
||||||
private final SysTenantPackageMapper tenantPackageMapper;
|
|
||||||
private final SysUserMapper userMapper;
|
|
||||||
private final SysDeptMapper deptMapper;
|
|
||||||
private final SysRoleMapper roleMapper;
|
|
||||||
private final SysRoleMenuMapper roleMenuMapper;
|
|
||||||
private final SysRoleDeptMapper roleDeptMapper;
|
|
||||||
private final SysUserRoleMapper userRoleMapper;
|
|
||||||
private final SysDictTypeMapper dictTypeMapper;
|
|
||||||
private final SysDictDataMapper dictDataMapper;
|
|
||||||
private final SysConfigMapper configMapper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public SysTenantVo queryById(Long id) {
|
|
||||||
return baseMapper.selectVoById(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 基于租户ID查询租户
|
|
||||||
*/
|
|
||||||
@Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId")
|
|
||||||
@Override
|
|
||||||
public SysTenantVo queryByTenantId(String tenantId) {
|
|
||||||
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysTenant>().eq(SysTenant::getTenantId, tenantId));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户列表
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public TableDataInfo<SysTenantVo> queryPageList(SysTenantBo bo, PageQuery pageQuery) {
|
|
||||||
LambdaQueryWrapper<SysTenant> lqw = buildQueryWrapper(bo);
|
|
||||||
Page<SysTenantVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
||||||
return TableDataInfo.build(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询租户列表
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<SysTenantVo> queryList(SysTenantBo bo) {
|
|
||||||
LambdaQueryWrapper<SysTenant> lqw = buildQueryWrapper(bo);
|
|
||||||
return baseMapper.selectVoList(lqw);
|
|
||||||
}
|
|
||||||
|
|
||||||
private LambdaQueryWrapper<SysTenant> buildQueryWrapper(SysTenantBo bo) {
|
|
||||||
LambdaQueryWrapper<SysTenant> lqw = Wrappers.lambdaQuery();
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId());
|
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone());
|
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro());
|
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain());
|
|
||||||
lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId());
|
|
||||||
lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime());
|
|
||||||
lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus());
|
|
||||||
lqw.orderByAsc(SysTenant::getId);
|
|
||||||
return lqw;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增租户
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public Boolean insertByBo(SysTenantBo bo) {
|
|
||||||
SysTenant add = MapstructUtils.convert(bo, SysTenant.class);
|
|
||||||
|
|
||||||
// 获取所有租户编号
|
|
||||||
List<String> tenantIds = baseMapper.selectObjs(
|
|
||||||
new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), x -> {
|
|
||||||
return Convert.toStr(x);
|
|
||||||
});
|
|
||||||
String tenantId = generateTenantId(tenantIds);
|
|
||||||
add.setTenantId(tenantId);
|
|
||||||
boolean flag = baseMapper.insert(add) > 0;
|
|
||||||
if (!flag) {
|
|
||||||
throw new ServiceException("创建租户失败");
|
|
||||||
}
|
|
||||||
bo.setId(add.getId());
|
|
||||||
|
|
||||||
// 根据套餐创建角色
|
|
||||||
Long roleId = createTenantRole(tenantId, bo.getPackageId());
|
|
||||||
|
|
||||||
// 创建部门: 公司名是部门名称
|
|
||||||
SysDept dept = new SysDept();
|
|
||||||
dept.setTenantId(tenantId);
|
|
||||||
dept.setDeptName(bo.getCompanyName());
|
|
||||||
dept.setParentId(Constants.TOP_PARENT_ID);
|
|
||||||
dept.setAncestors(Constants.TOP_PARENT_ID.toString());
|
|
||||||
deptMapper.insert(dept);
|
|
||||||
Long deptId = dept.getDeptId();
|
|
||||||
|
|
||||||
// 角色和部门关联表
|
|
||||||
SysRoleDept roleDept = new SysRoleDept();
|
|
||||||
roleDept.setRoleId(roleId);
|
|
||||||
roleDept.setDeptId(deptId);
|
|
||||||
roleDeptMapper.insert(roleDept);
|
|
||||||
|
|
||||||
// 创建系统用户
|
|
||||||
SysUser user = new SysUser();
|
|
||||||
user.setTenantId(tenantId);
|
|
||||||
user.setUserName(bo.getUsername());
|
|
||||||
user.setNickName(bo.getUsername());
|
|
||||||
user.setPassword(BCrypt.hashpw(bo.getPassword()));
|
|
||||||
user.setDeptId(deptId);
|
|
||||||
userMapper.insert(user);
|
|
||||||
//新增系统用户后,默认当前用户为部门的负责人
|
|
||||||
SysDept sd = new SysDept();
|
|
||||||
sd.setLeader(user.getUserId());
|
|
||||||
sd.setDeptId(deptId);
|
|
||||||
deptMapper.updateById(sd);
|
|
||||||
|
|
||||||
// 用户和角色关联表
|
|
||||||
SysUserRole userRole = new SysUserRole();
|
|
||||||
userRole.setUserId(user.getUserId());
|
|
||||||
userRole.setRoleId(roleId);
|
|
||||||
userRoleMapper.insert(userRole);
|
|
||||||
|
|
||||||
String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
|
|
||||||
List<SysDictType> dictTypeList = dictTypeMapper.selectList(
|
|
||||||
new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId));
|
|
||||||
List<SysDictData> dictDataList = dictDataMapper.selectList(
|
|
||||||
new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId));
|
|
||||||
for (SysDictType dictType : dictTypeList) {
|
|
||||||
dictType.setDictId(null);
|
|
||||||
dictType.setTenantId(tenantId);
|
|
||||||
dictType.setCreateDept(null);
|
|
||||||
dictType.setCreateBy(null);
|
|
||||||
dictType.setCreateTime(null);
|
|
||||||
dictType.setUpdateBy(null);
|
|
||||||
dictType.setUpdateTime(null);
|
|
||||||
}
|
|
||||||
for (SysDictData dictData : dictDataList) {
|
|
||||||
dictData.setDictCode(null);
|
|
||||||
dictData.setTenantId(tenantId);
|
|
||||||
dictData.setCreateDept(null);
|
|
||||||
dictData.setCreateBy(null);
|
|
||||||
dictData.setCreateTime(null);
|
|
||||||
dictData.setUpdateBy(null);
|
|
||||||
dictData.setUpdateTime(null);
|
|
||||||
}
|
|
||||||
dictTypeMapper.insertBatch(dictTypeList);
|
|
||||||
dictDataMapper.insertBatch(dictDataList);
|
|
||||||
|
|
||||||
List<SysConfig> sysConfigList = configMapper.selectList(
|
|
||||||
new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId));
|
|
||||||
for (SysConfig config : sysConfigList) {
|
|
||||||
config.setConfigId(null);
|
|
||||||
config.setTenantId(tenantId);
|
|
||||||
config.setCreateDept(null);
|
|
||||||
config.setCreateBy(null);
|
|
||||||
config.setCreateTime(null);
|
|
||||||
config.setUpdateBy(null);
|
|
||||||
config.setUpdateTime(null);
|
|
||||||
}
|
|
||||||
configMapper.insertBatch(sysConfigList);
|
|
||||||
|
|
||||||
// 未开启工作流不执行下方操作
|
|
||||||
if (SpringUtils.getProperty("warm-flow.enabled", Boolean.class, false)) {
|
|
||||||
WorkflowService workflowService = SpringUtils.getBean(WorkflowService.class);
|
|
||||||
// 新增租户流程定义
|
|
||||||
workflowService.syncDef(tenantId);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生成租户id
|
|
||||||
*
|
|
||||||
* @param tenantIds 已有租户id列表
|
|
||||||
* @return 租户id
|
|
||||||
*/
|
|
||||||
private String generateTenantId(List<String> tenantIds) {
|
|
||||||
// 随机生成6位
|
|
||||||
String numbers = RandomUtil.randomNumbers(6);
|
|
||||||
// 判断是否存在,如果存在则重新生成
|
|
||||||
if (tenantIds.contains(numbers)) {
|
|
||||||
return generateTenantId(tenantIds);
|
|
||||||
}
|
|
||||||
return numbers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据租户菜单创建租户角色
|
|
||||||
*
|
|
||||||
* @param tenantId 租户编号
|
|
||||||
* @param packageId 租户套餐id
|
|
||||||
* @return 角色id
|
|
||||||
*/
|
|
||||||
private Long createTenantRole(String tenantId, Long packageId) {
|
|
||||||
// 获取租户套餐
|
|
||||||
SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
|
|
||||||
if (ObjectUtil.isNull(tenantPackage)) {
|
|
||||||
throw new ServiceException("套餐不存在");
|
|
||||||
}
|
|
||||||
// 获取套餐菜单id
|
|
||||||
List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
|
|
||||||
|
|
||||||
// 创建角色
|
|
||||||
SysRole role = new SysRole();
|
|
||||||
role.setTenantId(tenantId);
|
|
||||||
role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME);
|
|
||||||
role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY);
|
|
||||||
role.setRoleSort(1);
|
|
||||||
role.setStatus(SystemConstants.NORMAL);
|
|
||||||
roleMapper.insert(role);
|
|
||||||
Long roleId = role.getRoleId();
|
|
||||||
|
|
||||||
// 创建角色菜单
|
|
||||||
List<SysRoleMenu> roleMenus = new ArrayList<>(menuIds.size());
|
|
||||||
menuIds.forEach(menuId -> {
|
|
||||||
SysRoleMenu roleMenu = new SysRoleMenu();
|
|
||||||
roleMenu.setRoleId(roleId);
|
|
||||||
roleMenu.setMenuId(menuId);
|
|
||||||
roleMenus.add(roleMenu);
|
|
||||||
});
|
|
||||||
roleMenuMapper.insertBatch(roleMenus);
|
|
||||||
|
|
||||||
return roleId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户
|
|
||||||
*/
|
|
||||||
@CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId")
|
|
||||||
@Override
|
|
||||||
public Boolean updateByBo(SysTenantBo bo) {
|
|
||||||
SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class);
|
|
||||||
tenant.setTenantId(null);
|
|
||||||
tenant.setPackageId(null);
|
|
||||||
return baseMapper.updateById(tenant) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改租户状态
|
|
||||||
*
|
|
||||||
* @param bo 租户信息
|
|
||||||
* @return 结果
|
|
||||||
*/
|
|
||||||
@CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId")
|
|
||||||
@Override
|
|
||||||
public int updateTenantStatus(SysTenantBo bo) {
|
|
||||||
SysTenant tenant = new SysTenant();
|
|
||||||
tenant.setId(bo.getId());
|
|
||||||
tenant.setStatus(bo.getStatus());
|
|
||||||
return baseMapper.updateById(tenant);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验租户是否允许操作
|
|
||||||
*
|
|
||||||
* @param tenantId 租户ID
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void checkTenantAllowed(String tenantId) {
|
|
||||||
if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
|
|
||||||
throw new ServiceException("不允许操作管理租户");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量删除租户
|
|
||||||
*/
|
|
||||||
@CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true)
|
|
||||||
@Override
|
|
||||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
||||||
if (isValid) {
|
|
||||||
// 做一些业务上的校验,判断是否需要校验
|
|
||||||
if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) {
|
|
||||||
throw new ServiceException("超管租户不能删除");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return baseMapper.deleteByIds(ids) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验企业名称是否唯一
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean checkCompanyNameUnique(SysTenantBo bo) {
|
|
||||||
boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysTenant>()
|
|
||||||
.eq(SysTenant::getCompanyName, bo.getCompanyName())
|
|
||||||
.ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()));
|
|
||||||
return !exist;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验账号余额
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean checkAccountBalance(String tenantId) {
|
|
||||||
SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId);
|
|
||||||
// 如果余额为-1代表不限制
|
|
||||||
if (tenant.getAccountCount() == -1) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>());
|
|
||||||
// 如果余额大于0代表还有可用名额
|
|
||||||
return tenant.getAccountCount() - userNumber > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验有效期
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean checkExpireTime(String tenantId) {
|
|
||||||
SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId);
|
|
||||||
// 如果未设置过期时间代表不限制
|
|
||||||
if (ObjectUtil.isNull(tenant.getExpireTime())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// 如果当前时间在过期时间之前则通过
|
|
||||||
return new Date().before(tenant.getExpireTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户套餐
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public Boolean syncTenantPackage(String tenantId, Long packageId) {
|
|
||||||
SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
|
|
||||||
List<SysRole> roles = roleMapper.selectList(
|
|
||||||
new LambdaQueryWrapper<SysRole>().eq(SysRole::getTenantId, tenantId));
|
|
||||||
List<Long> roleIds = new ArrayList<>(roles.size() - 1);
|
|
||||||
List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
|
|
||||||
roles.forEach(item -> {
|
|
||||||
if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) {
|
|
||||||
List<SysRoleMenu> roleMenus = new ArrayList<>(menuIds.size());
|
|
||||||
menuIds.forEach(menuId -> {
|
|
||||||
SysRoleMenu roleMenu = new SysRoleMenu();
|
|
||||||
roleMenu.setRoleId(item.getRoleId());
|
|
||||||
roleMenu.setMenuId(menuId);
|
|
||||||
roleMenus.add(roleMenu);
|
|
||||||
});
|
|
||||||
roleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, item.getRoleId()));
|
|
||||||
roleMenuMapper.insertBatch(roleMenus);
|
|
||||||
} else {
|
|
||||||
roleIds.add(item.getRoleId());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (!roleIds.isEmpty()) {
|
|
||||||
roleMenuMapper.delete(
|
|
||||||
new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户字典
|
|
||||||
*/
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
@Override
|
|
||||||
public void syncTenantDict() {
|
|
||||||
// 查询超管 所有字典数据
|
|
||||||
List<SysDictType> dictTypeList = new ArrayList<>();
|
|
||||||
List<SysDictData> dictDataList = new ArrayList<>();
|
|
||||||
TenantHelper.ignore(() -> {
|
|
||||||
dictTypeList.addAll(dictTypeMapper.selectList());
|
|
||||||
dictDataList.addAll(dictDataMapper.selectList());
|
|
||||||
});
|
|
||||||
// 所有租户字典类型
|
|
||||||
Map<String, List<SysDictType>> dictTypeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId);
|
|
||||||
// 所有租户字典数据
|
|
||||||
Map<String, Map<String, List<SysDictData>>> dictDataMap = StreamUtils.groupBy2Key(dictDataList, TenantEntity::getTenantId, SysDictData::getDictType);
|
|
||||||
|
|
||||||
// 默认租户字典类型列表
|
|
||||||
List<SysDictType> defaultDictTypeList = dictTypeMap.get(TenantConstants.DEFAULT_TENANT_ID);
|
|
||||||
// 默认租户字典数据
|
|
||||||
Map<String, List<SysDictData>> defaultDictDataMap = dictDataMap.get(TenantConstants.DEFAULT_TENANT_ID);
|
|
||||||
|
|
||||||
// 获取所有租户编号
|
|
||||||
List<String> tenantIds = baseMapper.selectObjs(
|
|
||||||
new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId)
|
|
||||||
.eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> {
|
|
||||||
return Convert.toStr(x);
|
|
||||||
});
|
|
||||||
// 待入库的字典类型和字典数据
|
|
||||||
List<SysDictType> saveTypeList = new ArrayList<>();
|
|
||||||
List<SysDictData> saveDataList = new ArrayList<>();
|
|
||||||
// 待同步的租户编号(用于清除对于租户的字典缓存)
|
|
||||||
Set<String> syncTenantIds = new HashSet<>();
|
|
||||||
// 循环所有租户,处理需要同步的数据
|
|
||||||
for (String tenantId : tenantIds) {
|
|
||||||
// 排除默认租户
|
|
||||||
if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// 根据默认租户的字典类型进行数据同步
|
|
||||||
for (SysDictType dictType : defaultDictTypeList) {
|
|
||||||
// 获取当前租户的字典类型列表
|
|
||||||
List<String> typeList = StreamUtils.toList(dictTypeMap.get(tenantId), SysDictType::getDictType);
|
|
||||||
// 根据字典类型获取默认租户的字典数据
|
|
||||||
List<SysDictData> defaultDictDataList = defaultDictDataMap.get(dictType.getDictType());
|
|
||||||
// 排除不需要同步的字典数据
|
|
||||||
Set<String> excludeDictDataSet = CollUtil.newHashSet();
|
|
||||||
// 处理 存在type不存在data 的情况
|
|
||||||
if (typeList.contains(dictType.getDictType())) {
|
|
||||||
// 获取租户字典数据
|
|
||||||
Optional.ofNullable(dictDataMap.get(tenantId))
|
|
||||||
// 获取租户当前字典类型的字典数据
|
|
||||||
.map(tenantDictDataMap -> tenantDictDataMap.get(dictType.getDictType()))
|
|
||||||
// 保存字典数据项的字典键值,用于判断数据是否需要同步
|
|
||||||
.map(data -> StreamUtils.toSet(data, SysDictData::getDictValue))
|
|
||||||
// 添加到排除集合中
|
|
||||||
.ifPresent(excludeDictDataSet::addAll);
|
|
||||||
} else {
|
|
||||||
// 同步字典类型
|
|
||||||
SysDictType type = BeanUtil.toBean(dictType, SysDictType.class);
|
|
||||||
type.setDictId(null);
|
|
||||||
type.setTenantId(tenantId);
|
|
||||||
type.setCreateTime(null);
|
|
||||||
type.setUpdateTime(null);
|
|
||||||
syncTenantIds.add(tenantId);
|
|
||||||
saveTypeList.add(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 默认租户字典数据不为空再去处理
|
|
||||||
if (CollUtil.isNotEmpty(defaultDictDataList)) {
|
|
||||||
// 提前优化排除判断if条件语句,对于 && 并联条件,该优化可以避免不必要的 excludeDictDataSet.contains() 函数调用
|
|
||||||
boolean isExclude = CollUtil.isNotEmpty(excludeDictDataSet);
|
|
||||||
// 筛选出 dictType 对应的 data
|
|
||||||
for (SysDictData dictData : defaultDictDataList) {
|
|
||||||
// 排除不需要同步的字典数据
|
|
||||||
if (isExclude && excludeDictDataSet.contains(dictData.getDictValue())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SysDictData data = BeanUtil.toBean(dictData, SysDictData.class);
|
|
||||||
// 设置字典编码为 null
|
|
||||||
data.setDictCode(null);
|
|
||||||
data.setTenantId(tenantId);
|
|
||||||
data.setCreateTime(null);
|
|
||||||
data.setUpdateTime(null);
|
|
||||||
data.setCreateDept(null);
|
|
||||||
data.setCreateBy(null);
|
|
||||||
data.setUpdateBy(null);
|
|
||||||
syncTenantIds.add(tenantId);
|
|
||||||
saveDataList.add(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TenantHelper.ignore(() -> {
|
|
||||||
if (CollUtil.isNotEmpty(saveTypeList)) {
|
|
||||||
dictTypeMapper.insertBatch(saveTypeList);
|
|
||||||
}
|
|
||||||
if (CollUtil.isNotEmpty(saveDataList)) {
|
|
||||||
dictDataMapper.insertBatch(saveDataList);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (String tenantId : syncTenantIds) {
|
|
||||||
TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 同步租户参数配置
|
|
||||||
*/
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
@Override
|
|
||||||
public void syncTenantConfig() {
|
|
||||||
// 查询超管 所有参数配置
|
|
||||||
List<SysConfig> configList = TenantHelper.ignore(() -> configMapper.selectList());
|
|
||||||
|
|
||||||
// 所有租户参数配置
|
|
||||||
Map<String, List<SysConfig>> configMap = StreamUtils.groupByKey(configList, TenantEntity::getTenantId);
|
|
||||||
|
|
||||||
// 默认租户字典类型列表
|
|
||||||
List<SysConfig> defaultConfigList = configMap.get(TenantConstants.DEFAULT_TENANT_ID);
|
|
||||||
|
|
||||||
// 获取所有租户编号
|
|
||||||
List<String> tenantIds = baseMapper.selectObjs(
|
|
||||||
new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId)
|
|
||||||
.eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> {
|
|
||||||
return Convert.toStr(x);
|
|
||||||
});
|
|
||||||
// 待入库的字典类型和字典数据
|
|
||||||
List<SysConfig> saveConfigList = new ArrayList<>();
|
|
||||||
// 待同步的租户编号(用于清除对于租户的字典缓存)
|
|
||||||
Set<String> syncTenantIds = new HashSet<>();
|
|
||||||
// 循环所有租户,处理需要同步的数据
|
|
||||||
for (String tenantId : tenantIds) {
|
|
||||||
// 排除默认租户
|
|
||||||
if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// 根据默认租户的字典类型进行数据同步
|
|
||||||
for (SysConfig config : defaultConfigList) {
|
|
||||||
// 获取当前租户的字典类型列表
|
|
||||||
List<String> typeList = StreamUtils.toList(configMap.get(tenantId), SysConfig::getConfigKey);
|
|
||||||
if (!typeList.contains(config.getConfigKey())) {
|
|
||||||
SysConfig type = BeanUtil.toBean(config, SysConfig.class);
|
|
||||||
type.setConfigId(null);
|
|
||||||
type.setTenantId(tenantId);
|
|
||||||
type.setCreateTime(null);
|
|
||||||
type.setUpdateTime(null);
|
|
||||||
syncTenantIds.add(tenantId);
|
|
||||||
saveConfigList.add(type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TenantHelper.ignore(() -> {
|
|
||||||
if (CollUtil.isNotEmpty(saveConfigList)) {
|
|
||||||
configMapper.insertBatch(saveConfigList);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (String tenantId : syncTenantIds) {
|
|
||||||
TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_CONFIG));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -328,11 +328,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
|
|||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean registerUser(SysUserBo user, String tenantId) {
|
public boolean registerUser(SysUserBo user) {
|
||||||
user.setCreateBy(0L);
|
user.setCreateBy(0L);
|
||||||
user.setUpdateBy(0L);
|
user.setUpdateBy(0L);
|
||||||
SysUser sysUser = MapstructUtils.convert(user, SysUser.class);
|
SysUser sysUser = MapstructUtils.convert(user, SysUser.class);
|
||||||
sysUser.setTenantId(tenantId);
|
|
||||||
return baseMapper.insert(sysUser) > 0;
|
return baseMapper.insert(sysUser) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<!DOCTYPE mapper
|
|
||||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
||||||
<mapper namespace="org.dromara.system.mapper.SysTenantMapper">
|
|
||||||
|
|
||||||
</mapper>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<!DOCTYPE mapper
|
|
||||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
||||||
<mapper namespace="org.dromara.system.mapper.SysTenantPackageMapper">
|
|
||||||
|
|
||||||
</mapper>
|
|
||||||
@@ -62,10 +62,6 @@
|
|||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>ruoyi-common-translation</artifactId>
|
<artifactId>ruoyi-common-translation</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-tenant</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>ruoyi-common-security</artifactId>
|
<artifactId>ruoyi-common-security</artifactId>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -21,7 +21,7 @@ import java.util.List;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@TableName("flow_category")
|
@TableName("flow_category")
|
||||||
public class FlowCategory extends TenantEntity {
|
public class FlowCategory extends BaseEntity {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user