Просмотр исходного кода

fix(租户套餐):
修复租户登录、租户新增、修改、删除
修复租户套餐
docs:
新增技术栈文档

18339543638 2 лет назад
Родитель
Сommit
91622118b3
50 измененных файлов с 563 добавлено и 100 удалено
  1. 24 0
      README.md
  2. 2 0
      tr-framework/src/main/java/cn/tr/core/exception/TRExcCode.java
  3. 2 2
      tr-modules/tr-module-quartz/pom.xml
  4. 18 0
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/QuartzMqConfig.java
  5. 45 0
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/consumer/QuartzConsumer.java
  6. 22 0
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzDelMessage.java
  7. 24 0
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobChangeStatusMessage.java
  8. 6 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobRefreshMessage.java
  9. 39 0
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/producer/QuartzProducer.java
  10. 12 0
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/ISysJobService.java
  11. 16 2
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/impl/SysJobServiceImpl.java
  12. 15 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/SysMqConfig.java
  13. 16 10
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/monitor/controller/SysUserOnlineController.java
  14. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CurrentUserController.java
  15. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/operator/OAuth2UserOperator.java
  16. 15 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/LoginOAuth2PswUserOperator.java
  17. 3 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java
  18. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantController.java
  19. 5 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantPackageController.java
  20. 5 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantAddDTO.java
  21. 15 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantCommonDTO.java
  22. 1 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageDTO.java
  23. 0 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageQueryDTO.java
  24. 13 14
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/po/SysTenantPO.java
  25. 0 6
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/po/SysTenantPackagePO.java
  26. 6 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/repository/SysTenantRepository.java
  27. 0 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageServiceImpl.java
  28. 57 23
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java
  29. 16 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysUserController.java
  30. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/OnlineSessionQueryDTO.java
  31. 25 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/OnlineTokenQueryDTO.java
  32. 5 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/OnlineUserSessionDTO.java
  33. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalDTO.java
  34. 23 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserPortalListDTO.java
  35. 21 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysValidateUsernameDTO.java
  36. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysPortalPO.java
  37. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserPortalRepository.java
  38. 7 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPortalService.java
  39. 6 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleService.java
  40. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserPortalService.java
  41. 7 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserService.java
  42. 5 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysPortalServiceImpl.java
  43. 5 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysRoleServiceImpl.java
  44. 3 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserPortalServiceImpl.java
  45. 9 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserServiceImpl.java
  46. 45 0
      tr-modules/tr-module-system/src/main/resources/mapper/tenant/SysTenantMapper.xml
  47. 9 2
      tr-modules/tr-module-system/src/main/resources/mapper/user/SysUserPortalMapper.xml
  48. 2 1
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantCreateAndUpdateMetaObjectHandler.java
  49. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantDatabaseInterceptor.java
  50. 0 1
      tr-test/src/main/resources/application.yml

+ 24 - 0
README.md

@@ -0,0 +1,24 @@
+|  框架   | 说明  |  版本 | 学习指南|
+|  ----  | ----  | ---- | ---- |
+| SpringBoot  | 基础手脚架 | 2.7.8 | [文档](https://spring.io/projects/spring-boot/) |
+| SaToken  | 权限框架 | 1.34.0 | [文档](https://sa-token.cc/index.html) |
+| MapStruct  | Bean转换器 | 1.5.3.Final | [文档](https://spring.io/projects/spring-boot/) |
+| Lombok  | 代码插件 | 1.18.20 | [文档](https://projectlombok.org/) |
+| Hutool  | 基础工具类 | 5.8.12 | [文档](https://hutool.mydoc.io/) |
+| Log4j2  | 日志框架 | 2.7.8 | [文档](https://logging.apache.org/log4j/2.x/) |
+|Druid| JDBC连接工具| 1.2.8 ||
+|Knife4j|Swagger 增强 UI 实现| 4.0.0|
+|Javassist|字节码增强| 3.25.0-GA|
+|Jackson| Json工具库|2.13.4 |
+| Mybatis-Plus  | MyBatis 增强工具包 | 3.5.3.1 | [文档](https://www.baomidou.com/pages/24112f/) |
+| PageHelper  | 分页插件 | 1.4.5 | [文档](https://pagehelper.github.io/) |
+| Mockito  | mock框架 | 4.11.0 | [文档](https://site.mockito.org/) |
+| JUnit  | 单元测试框架 | 4.11.0 | |
+| Redisson  | redis连接工具 | 3.17.7 | [文档](https://github.com/redisson/redisson) |
+| Tio  | 网络编程框架 | 3.6.0.v20200315-RELEASE | [文档](https://www.tiocloud.com/tio/) |
+|Quartz|任务调度框架| 2.3.2 |
+| SpringCloudStream  | 生产消费模型 | 3.2.6 |  |
+| SpringCloudBus  | 消息总线 | 3.1.2 |  |
+| RabbitMq  | 消息队列 | 3.8.5 | |
+| Mysql  | 基础手脚架 | 5.7/8.0+ |  |
+| Redis  | 基础手脚架 | 6.0.1 | |

+ 2 - 0
tr-framework/src/main/java/cn/tr/core/exception/TRExcCode.java

@@ -55,6 +55,8 @@ public enum TRExcCode implements BaseCode {
     USER_ERROR_A0242("A0242", "用户未登录"),
     USER_ERROR_A0242("A0242", "用户未登录"),
 
 
     USER_ERROR_A0243("A0243", "OAuth2 认证失败"),
     USER_ERROR_A0243("A0243", "OAuth2 认证失败"),
+    USER_ERROR_A0204("A0244", "租户被禁用"),
+    USER_ERROR_A0205("A0245", "租户已被删除"),
     /**** 权限 **/
     /**** 权限 **/
     USER_ERROR_A0300("A0300", "访问权限异常"),
     USER_ERROR_A0300("A0300", "访问权限异常"),
     USER_ERROR_A0301("A0301", "访问未授权"),
     USER_ERROR_A0301("A0301", "访问未授权"),

+ 2 - 2
tr-modules/tr-module-quartz/pom.xml

@@ -52,8 +52,8 @@
         </dependency>
         </dependency>
 
 
         <dependency>
         <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-bus</artifactId>
         </dependency>
         </dependency>
 
 
         <!-- 定时任务 -->
         <!-- 定时任务 -->

+ 18 - 0
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/QuartzMqConfig.java

@@ -0,0 +1,18 @@
+package cn.tr.module.quartz.core.mq;
+
+import cn.tr.module.quartz.core.mq.message.job.QuartzDelMessage;
+import cn.tr.module.quartz.core.mq.message.job.QuartzJobChangeStatusMessage;
+import cn.tr.module.quartz.core.mq.message.job.QuartzJobRefreshMessage;
+import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @ClassName : QuartzMqConfig
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月06日
+ */
+@Configuration
+@RemoteApplicationEventScan(basePackageClasses = {QuartzDelMessage.class, QuartzJobRefreshMessage.class, QuartzJobChangeStatusMessage.class})
+public class QuartzMqConfig {
+}

+ 45 - 0
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/consumer/QuartzConsumer.java

@@ -0,0 +1,45 @@
+package cn.tr.module.quartz.core.mq.consumer;
+
+import cn.tr.module.quartz.core.mq.message.job.QuartzDelMessage;
+import cn.tr.module.quartz.core.mq.message.job.QuartzJobChangeStatusMessage;
+import cn.tr.module.quartz.core.mq.message.job.QuartzJobRefreshMessage;
+import cn.tr.module.quartz.exception.TaskException;
+import cn.tr.module.quartz.job.dto.SysJobDTO;
+import cn.tr.module.quartz.job.service.ISysJobService;
+import lombok.AllArgsConstructor;
+import org.quartz.SchedulerException;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.EventListener;
+
+import java.util.Collection;
+
+/**
+ * @ClassName : QuartzConsumer
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月06日
+ */
+@Configuration
+@AllArgsConstructor
+public class QuartzConsumer {
+    private final ISysJobService jobService;
+    @EventListener
+    public void quartzDelListener(QuartzDelMessage message) throws SchedulerException {
+        Collection<SysJobDTO> jobs = message.getJobs();
+        for (SysJobDTO job : jobs) {
+            jobService.delCacheJob(job);
+        }
+
+    }
+
+    @EventListener
+    public void quartRefreshListener(QuartzJobRefreshMessage message) throws TaskException, SchedulerException {
+        String jobId = message.getJobId();
+        jobService.refreshCacheJob(jobId);
+    }
+
+    @EventListener
+    public void quartChangeStatusListener(QuartzJobChangeStatusMessage message) throws SchedulerException {
+        jobService.changeStatus(message.getJobId(),message.getStatus());
+    }
+}

+ 22 - 0
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzDelMessage.java

@@ -0,0 +1,22 @@
+package cn.tr.module.quartz.core.mq.message.job;
+
+import cn.tr.module.quartz.job.dto.SysJobDTO;
+import lombok.Getter;
+import org.springframework.cloud.bus.event.RemoteApplicationEvent;
+import java.util.*;
+/**
+ * @ClassName : QuartzJobRefreshMessage
+ * @Description : 任务调度刷新
+ * @Author : LF
+ * @Date: 2023年05月06日
+ */
+
+public class QuartzDelMessage extends RemoteApplicationEvent {
+    @Getter
+    private Collection<SysJobDTO> jobs;
+
+    public QuartzDelMessage(Object source,Collection<SysJobDTO> jobs, String originService, String destinationService) {
+        super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
+        this.jobs=jobs;
+    }
+}

+ 24 - 0
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobChangeStatusMessage.java

@@ -0,0 +1,24 @@
+package cn.tr.module.quartz.core.mq.message.job;
+
+import lombok.Getter;
+import org.springframework.cloud.bus.event.RemoteApplicationEvent;
+
+/**
+ * @ClassName : QuartzJobRefreshMessage
+ * @Description : 任务调度刷新
+ * @Author : LF
+ * @Date: 2023年05月06日
+ */
+
+public class QuartzJobChangeStatusMessage extends RemoteApplicationEvent {
+    @Getter
+    private String jobId;
+    @Getter
+    private String status;
+
+    public QuartzJobChangeStatusMessage(Object source, String jobId, String status,String originService, String destinationService) {
+        super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
+        this.jobId=jobId;
+        this.status=status;
+    }
+}

+ 6 - 3
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobRefreshMessage.java

@@ -1,5 +1,6 @@
 package cn.tr.module.quartz.core.mq.message.job;
 package cn.tr.module.quartz.core.mq.message.job;
 
 
+import lombok.Getter;
 import org.springframework.cloud.bus.event.RemoteApplicationEvent;
 import org.springframework.cloud.bus.event.RemoteApplicationEvent;
 
 
 /**
 /**
@@ -10,9 +11,11 @@ import org.springframework.cloud.bus.event.RemoteApplicationEvent;
  */
  */
 
 
 public class QuartzJobRefreshMessage extends RemoteApplicationEvent {
 public class QuartzJobRefreshMessage extends RemoteApplicationEvent {
-    public QuartzJobRefreshMessage() {
-    }
-    public QuartzJobRefreshMessage(Object source, String originService, String destinationService) {
+    @Getter
+    private String jobId;
+
+    public QuartzJobRefreshMessage(Object source,String jobId, String originService, String destinationService) {
         super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
         super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
+        this.jobId=jobId;
     }
     }
 }
 }

+ 39 - 0
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/producer/QuartzProducer.java

@@ -0,0 +1,39 @@
+package cn.tr.module.quartz.core.mq.producer;
+
+import cn.tr.module.quartz.core.mq.message.job.QuartzDelMessage;
+import cn.tr.module.quartz.core.mq.message.job.QuartzJobChangeStatusMessage;
+import cn.tr.module.quartz.core.mq.message.job.QuartzJobRefreshMessage;
+import cn.tr.module.quartz.job.dto.SysJobDTO;
+import cn.tr.plugin.bus.AbstractBusProducer;
+import org.springframework.stereotype.Component;
+import java.util.*;
+/**
+ * @ClassName : SmsProducer
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月25日
+ */
+@Component
+public class QuartzProducer extends AbstractBusProducer {
+
+    /**
+     * 发送 {@link QuartzJobRefreshMessage} 消息
+     */
+    public void sendQuartzJobChangeStatusMessage(String jobId,String status) {
+        publishEvent(new QuartzJobChangeStatusMessage(this,jobId,status, getBusId(), selfDestinationService()));
+    }
+
+    /**
+     * 发送 {@link QuartzJobRefreshMessage} 消息
+     */
+    public void sendQuartzJobRefreshMessage(String jobId) {
+        publishEvent(new QuartzJobRefreshMessage(this,jobId, getBusId(), selfDestinationService()));
+    }
+
+    /**
+     * 发送 {@link QuartzDelMessage} 消息
+     */
+    public void sendQuartzDelMessage(Collection<SysJobDTO> jobs) {
+        publishEvent(new QuartzDelMessage(this,jobs, getBusId(), selfDestinationService()));
+    }
+}

+ 12 - 0
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/ISysJobService.java

@@ -81,6 +81,18 @@ public interface ISysJobService{
      */
      */
     boolean changeStatus(String id, String status) throws SchedulerException;
     boolean changeStatus(String id, String status) throws SchedulerException;
 
 
+    /**
+     * 删除缓存中调度任务
+     * @param job 任务
+     */
+    void delCacheJob(SysJobDTO job) throws SchedulerException;
+
+    /**
+     * 更新缓存中调度任务
+     * @param jobId 任务id
+     */
+    void refreshCacheJob(String jobId) throws TaskException, SchedulerException;
+
     /**
     /**
      * 恢复任务
      * 恢复任务
      * @param jobId 任务id
      * @param jobId 任务id

+ 16 - 2
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/impl/SysJobServiceImpl.java

@@ -3,6 +3,7 @@ package cn.tr.module.quartz.job.service.impl;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.quartz.constant.ScheduleConstants;
 import cn.tr.module.quartz.constant.ScheduleConstants;
+import cn.tr.module.quartz.core.mq.producer.QuartzProducer;
 import cn.tr.module.quartz.exception.TaskException;
 import cn.tr.module.quartz.exception.TaskException;
 import cn.tr.module.quartz.utils.CronUtils;
 import cn.tr.module.quartz.utils.CronUtils;
 import cn.tr.module.quartz.utils.ScheduleUtils;
 import cn.tr.module.quartz.utils.ScheduleUtils;
@@ -13,7 +14,6 @@ import org.quartz.JobDataMap;
 import org.quartz.JobKey;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.SchedulerException;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -39,7 +39,7 @@ import javax.annotation.PostConstruct;
 @AllArgsConstructor
 @AllArgsConstructor
 public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> implements ISysJobService {
 public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> implements ISysJobService {
     private final Scheduler scheduler;
     private final Scheduler scheduler;
-
+    private final QuartzProducer quartzProducer;
     @PostConstruct
     @PostConstruct
     @Override
     @Override
     public void initLocal() throws TaskException, SchedulerException {
     public void initLocal() throws TaskException, SchedulerException {
@@ -155,6 +155,7 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public boolean changeStatus(String id, String status) throws SchedulerException {
     public boolean changeStatus(String id, String status) throws SchedulerException {
+        quartzProducer.sendQuartzJobChangeStatusMessage(id,status);
         if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) {
         if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) {
             return resumeJob(id);
             return resumeJob(id);
         }
         }
@@ -164,6 +165,17 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
         return false;
         return false;
     }
     }
 
 
+    @Override
+    public void delCacheJob(SysJobDTO job) throws SchedulerException {
+        removeJobs(Collections.singleton(job));
+    }
+
+    @Override
+    public void refreshCacheJob(String jobId) throws TaskException, SchedulerException {
+        SysJobDTO job = selectSysJobById(jobId);
+        updateSchedulerJob(job,job.getJobGroup());
+    }
+
 
 
     /**
     /**
      * 删除调度器中的任务
      * 删除调度器中的任务
@@ -176,6 +188,7 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
             String jobGroup = job.getJobGroup();
             String jobGroup = job.getJobGroup();
             scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
             scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
         }
         }
+        quartzProducer.sendQuartzDelMessage(jobs);
     }
     }
 
 
     /**
     /**
@@ -193,6 +206,7 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
             scheduler.deleteJob(jobKey);
             scheduler.deleteJob(jobKey);
         }
         }
         ScheduleUtils.createScheduleJob(scheduler, job);
         ScheduleUtils.createScheduleJob(scheduler, job);
+        quartzProducer.sendQuartzJobRefreshMessage(jobId);
     }
     }
 
 
     /**
     /**

+ 15 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/SysMqConfig.java

@@ -0,0 +1,15 @@
+package cn.tr.module.sys.core.mq;
+
+import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @ClassName : QuartzMqConfig
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月06日
+ */
+@Configuration
+@RemoteApplicationEventScan(basePackages = {"cn.tr.module.sys.core.mq.message.*"})
+public class SysMqConfig {
+}

+ 16 - 10
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/monitor/controller/SysUserOnlineController.java

@@ -11,10 +11,7 @@ import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.PageInfo;
 import cn.tr.core.pojo.PageInfo;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.strategy.PageStrategy;
 import cn.tr.core.strategy.PageStrategy;
-import cn.tr.module.sys.user.dto.OnlineUserOperationDTO;
-import cn.tr.module.sys.user.dto.OnlineUserQueryDTO;
-import cn.tr.module.sys.user.dto.OnlineUserSessionDTO;
-import cn.tr.module.sys.user.dto.OnlineUserTokenSessionDTO;
+import cn.tr.module.sys.user.dto.*;
 import cn.tr.plugin.mybatis.base.BaseController;
 import cn.tr.plugin.mybatis.base.BaseController;
 import cn.tr.plugin.security.constant.SecurityConstant;
 import cn.tr.plugin.security.constant.SecurityConstant;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 import cn.tr.plugin.security.utils.SaTokenUtils;
@@ -24,12 +21,8 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -49,7 +42,7 @@ public class SysUserOnlineController extends BaseController {
     @ApiImplicitParams(
     @ApiImplicitParams(
             @ApiImplicitParam(name = "name",example = "用户名或昵称查询")
             @ApiImplicitParam(name = "name",example = "用户名或昵称查询")
     )
     )
-    public TableDataInfo<OnlineUserSessionDTO> list(@RequestBody@Validated OnlineUserQueryDTO query) {
+    public TableDataInfo<OnlineUserSessionDTO> list(@RequestBody@Validated OnlineSessionQueryDTO query) {
         startPage();
         startPage();
         StpLogic stpUtil = SaTokenUtils.getStpUtil(query.getLoginType());
         StpLogic stpUtil = SaTokenUtils.getStpUtil(query.getLoginType());
         Page<?> page = PageStrategy.tr.getPage.get();
         Page<?> page = PageStrategy.tr.getPage.get();
@@ -63,6 +56,19 @@ public class SysUserOnlineController extends BaseController {
         return new TableDataInfo<>(PageInfo.of(Integer.valueOf(total).longValue(), page.getPageNum(), pageSize,result));
         return new TableDataInfo<>(PageInfo.of(Integer.valueOf(total).longValue(), page.getPageNum(), pageSize,result));
     }
     }
 
 
+    @SaCheckPermission("monitor:online:query")
+    @PostMapping("/query/token/list")
+    @ApiOperation(value = "查询会话下的所有token信息",notes = "权限 - monitor:online:query")
+    public CommonResult<List<OnlineUserTokenSessionDTO>> tokenListBySessionId(@RequestBody@Validated OnlineTokenQueryDTO query) {
+        StpLogic stpUtil = SaTokenUtils.getStpUtil(query.getLoginType());
+        SaSession session = stpUtil.getSessionBySessionId(query.getSessionId());
+        if(session==null){
+            return CommonResult.success();
+        }
+        OnlineUserSessionDTO userSession = SaTokenUtils.getValue(session, SecurityConstant.SESSION_USER, OnlineUserSessionDTO.class);
+        return CommonResult.success(userSession.getTokenSessionList());
+    }
+
     /**
     /**
      * 强退用户
      * 强退用户
      */
      */

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CurrentUserController.java

@@ -8,6 +8,7 @@ import cn.tr.module.sys.oauth2.psw.operator.AbstractOAuth2PswUserOperator;
 import cn.tr.module.sys.oauth2.psw.operator.OAuth2PswUserOperatorManager;
 import cn.tr.module.sys.oauth2.psw.operator.OAuth2PswUserOperatorManager;
 import cn.tr.module.sys.oauth2.service.CurrentUserService;
 import cn.tr.module.sys.oauth2.service.CurrentUserService;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
+import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.vo.RouteItemVO;
 import cn.tr.module.sys.user.vo.RouteItemVO;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 import cn.tr.plugin.security.utils.SaTokenUtils;
@@ -61,7 +62,7 @@ public class CurrentUserController {
 
 
     @GetMapping("/listPortal")
     @GetMapping("/listPortal")
     @ApiOperation("获取登录用户的门户列表")
     @ApiOperation("获取登录用户的门户列表")
-    public CommonResult<List<SysPortalDTO>> getPortals() {
+    public CommonResult<List<SysUserPortalListDTO>> getPortals() {
         SaTokenUtils.getStpUtil().checkLogin();
         SaTokenUtils.getStpUtil().checkLogin();
         return CommonResult.success(currentUserService.currentUserPortals());
         return CommonResult.success(currentUserService.currentUserPortals());
     }
     }

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/operator/OAuth2UserOperator.java

@@ -90,6 +90,8 @@ public interface OAuth2UserOperator extends LoginTypeMatcher {
 		userSession.setLastLoginLocation(loginInfo.getLoginLocation());
 		userSession.setLastLoginLocation(loginInfo.getLoginLocation());
 		userSession.setLastLoginIp(loginInfo.getLoginIp());
 		userSession.setLastLoginIp(loginInfo.getLoginIp());
 		userSession.setLastLoginTime(loginInfo.getLoginTime());
 		userSession.setLastLoginTime(loginInfo.getLoginTime());
+		userSession.setLastBrowser(loginInfo.getBrowser());
+		userSession.setLastOs(loginInfo.getOs());
 		List<OnlineUserTokenSessionDTO> tokenSessions = Optional.ofNullable(userSession.getTokenSessionList()).orElse(new ArrayList<>());
 		List<OnlineUserTokenSessionDTO> tokenSessions = Optional.ofNullable(userSession.getTokenSessionList()).orElse(new ArrayList<>());
 		tokenSessions.add(0,tokenSessionUser);
 		tokenSessions.add(0,tokenSessionUser);
 		userSession.setTokenSessionList(tokenSessions);
 		userSession.setTokenSessionList(tokenSessions);

+ 15 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/LoginOAuth2PswUserOperator.java

@@ -18,6 +18,8 @@ import cn.tr.module.sys.config.SysConfigProperties;
 import cn.tr.module.sys.oauth2.config.CaptchaOperator;
 import cn.tr.module.sys.oauth2.config.CaptchaOperator;
 import cn.tr.module.sys.oauth2.mapper.OAuth2Mapper;
 import cn.tr.module.sys.oauth2.mapper.OAuth2Mapper;
 import cn.tr.module.sys.oauth2.dto.OAuth2PswReqDTO;
 import cn.tr.module.sys.oauth2.dto.OAuth2PswReqDTO;
+import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
+import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.user.dto.SysUserDTO;
 import cn.tr.module.sys.user.dto.SysUserDTO;
 import cn.tr.module.sys.user.enums.UserStatusEnum;
 import cn.tr.module.sys.user.enums.UserStatusEnum;
 import cn.tr.module.sys.user.service.ISysUserService;
 import cn.tr.module.sys.user.service.ISysUserService;
@@ -44,6 +46,9 @@ public class LoginOAuth2PswUserOperator extends AbstractOAuth2PswUserOperator{
     @Autowired
     @Autowired
     private ISysUserService sysUserService;
     private ISysUserService sysUserService;
 
 
+    @Autowired
+    private ISysTenantService tenantService;
+
     @Autowired
     @Autowired
     private SysConfigManager configManager;
     private SysConfigManager configManager;
 
 
@@ -69,6 +74,16 @@ public class LoginOAuth2PswUserOperator extends AbstractOAuth2PswUserOperator{
             //用户都被禁用
             //用户都被禁用
             throw new ServiceException(TRExcCode.USER_ERROR_A0202);
             throw new ServiceException(TRExcCode.USER_ERROR_A0202);
         }
         }
+        //查看租户是否被禁用
+        String tenantId = user.getTenantId();
+        SysTenantCommonDTO tenant = tenantService.selectSysTenantById(tenantId);
+        if(tenant==null){
+            throw new ServiceException(TRExcCode.USER_ERROR_A0205);
+        }
+        if (Boolean.TRUE.equals(tenant.getDisable())) {
+            throw new ServiceException(TRExcCode.USER_ERROR_A0204);
+        }
+
         //验证码校验
         //验证码校验
         SysConfigProperties current = configManager.getCurrent();
         SysConfigProperties current = configManager.getCurrent();
         if (Boolean.TRUE.equals(current.getCaptchaOpen())) {
         if (Boolean.TRUE.equals(current.getCaptchaOpen())) {

+ 3 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java

@@ -8,6 +8,7 @@ import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
+import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.enums.MenuEnum;
 import cn.tr.module.sys.user.enums.MenuEnum;
 import cn.tr.module.sys.user.service.ISysMenuService;
 import cn.tr.module.sys.user.service.ISysMenuService;
 import cn.tr.module.sys.user.service.ISysPortalMenuService;
 import cn.tr.module.sys.user.service.ISysPortalMenuService;
@@ -74,9 +75,9 @@ public class CurrentUserService {
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
     }
     }
 
 
-    public List<SysPortalDTO> currentUserPortals(){
+    public List<SysUserPortalListDTO> currentUserPortals(){
         String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
         String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
-        List<SysPortalDTO> portals = userPortalService.findPortalsByUserId(currentUserId);
+        List<SysUserPortalListDTO> portals = userPortalService.findPortalsByUserId(currentUserId);
         if (CollectionUtil.size(portals)==0) {
         if (CollectionUtil.size(portals)==0) {
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"当前用户未设置门户信息");
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"当前用户未设置门户信息");
         }
         }

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantController.java

@@ -2,6 +2,7 @@ package cn.tr.module.sys.tenant.controller;
 
 
 import cn.tr.module.sys.tenant.dto.SysTenantAddDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantAddDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
+import cn.tr.module.sys.user.enums.CreateEnum;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
@@ -57,6 +58,7 @@ public class SysTenantController extends BaseController{
     @SaCheckPermission("sys:tenant:add")
     @SaCheckPermission("sys:tenant:add")
     @OperateLog
     @OperateLog
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysTenantAddDTO source) {
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysTenantAddDTO source) {
+        source.setType(CreateEnum.custom.name());
         return CommonResult.success(sysTenantService.insertSysTenant(source));
         return CommonResult.success(sysTenantService.insertSysTenant(source));
     }
     }
 
 

+ 5 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantPackageController.java

@@ -1,5 +1,7 @@
 package cn.tr.module.sys.tenant.controller;
 package cn.tr.module.sys.tenant.controller;
 
 
+import cn.tr.core.pojo.TableDataInfo;
+import cn.tr.module.sys.user.enums.CreateEnum;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
@@ -37,9 +39,9 @@ public class SysTenantPackageController extends BaseController{
     @ApiOperationSupport(author = "lf",order = 1)
     @ApiOperationSupport(author = "lf",order = 1)
     @ApiOperation(value="根据条件查询租户套餐",notes = "权限:无")
     @ApiOperation(value="根据条件查询租户套餐",notes = "权限:无")
     @PostMapping("/query/page")
     @PostMapping("/query/page")
-    public CommonResult<List<SysTenantPackageDTO>> selectList(@RequestBody SysTenantPackageQueryDTO query) {
+    public TableDataInfo<SysTenantPackageDTO> selectPage(@RequestBody SysTenantPackageQueryDTO query) {
         startPage();
         startPage();
-        return CommonResult.success(sysTenantPackageService.selectSysTenantPackageList(query));
+        return getDataTable(sysTenantPackageService.selectSysTenantPackageList(query));
     }
     }
 
 
     @ApiOperationSupport(author = "lf",order = 2)
     @ApiOperationSupport(author = "lf",order = 2)
@@ -56,6 +58,7 @@ public class SysTenantPackageController extends BaseController{
     @SaCheckPermission("sys:tenantPackage:add")
     @SaCheckPermission("sys:tenantPackage:add")
     @OperateLog
     @OperateLog
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysTenantPackageDTO source) {
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysTenantPackageDTO source) {
+        source.setType(CreateEnum.custom.name());
         return CommonResult.success(sysTenantPackageService.insertSysTenantPackage(source));
         return CommonResult.success(sysTenantPackageService.insertSysTenantPackage(source));
     }
     }
 
 

+ 5 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantAddDTO.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
@@ -30,6 +31,9 @@ public class SysTenantAddDTO implements Serializable {
     @NotEmpty(message = "租户联系人不能为空")
     @NotEmpty(message = "租户联系人不能为空")
     private String contractUser;
     private String contractUser;
 
 
+    @ApiModelProperty(value = "租户类型",hidden = true)
+    private String type;
+
     @ApiModelProperty(value = "用户名称",required = true)
     @ApiModelProperty(value = "用户名称",required = true)
     @NotEmpty(message = "用户名称不能为空")
     @NotEmpty(message = "用户名称不能为空")
     private String username;
     private String username;
@@ -45,6 +49,6 @@ public class SysTenantAddDTO implements Serializable {
     private String remark;
     private String remark;
 
 
     @ApiModelProperty(value = "租户状态 0、开启 1、关闭",required = true)
     @ApiModelProperty(value = "租户状态 0、开启 1、关闭",required = true)
-    @NotEmpty(message = "租户状态不能为空")
+    @NotNull(message = "租户状态不能为空")
     private Boolean disable;
     private Boolean disable;
 }
 }

+ 15 - 5
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantCommonDTO.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.tenant.dto;
 package cn.tr.module.sys.tenant.dto;
 
 
 
 
+import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import cn.tr.core.validation.Update;
 import cn.tr.plugin.mybatis.pojo.BaseDTO;
 import cn.tr.plugin.mybatis.pojo.BaseDTO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
@@ -9,7 +10,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
-import java.io.Serializable;
+import javax.validation.constraints.NotNull;
 
 
 /**
 /**
  * @ClassName : SysTenantQueryDTO
  * @ClassName : SysTenantQueryDTO
@@ -27,15 +28,24 @@ public class SysTenantCommonDTO extends BaseDTO {
     private String id;
     private String id;
 
 
     @ApiModelProperty(value = "租户名称",required = true)
     @ApiModelProperty(value = "租户名称",required = true)
-    @NotEmpty(message = "租户名称不能为空",groups = {Update.class})
+    @NotEmpty(message = "租户名称不能为空",groups = {Insert.class,Update.class})
     private String name;
     private String name;
 
 
     @ApiModelProperty(value = "租户套餐id",required = true)
     @ApiModelProperty(value = "租户套餐id",required = true)
-    @NotEmpty(message = "租户套餐不能为空",groups = {Update.class})
+    @NotEmpty(message = "租户套餐不能为空",groups = {Insert.class,Update.class})
     private String packageId;
     private String packageId;
 
 
+    @ApiModelProperty(value = "租户套餐名称",readOnly = true)
+    private String packageName;
+
+    @ApiModelProperty(value = "租户管理用户名",readOnly = true)
+    private String username;
+
+    @ApiModelProperty(value = "租户类型")
+    private String type;
+
     @ApiModelProperty(value = "租户联系人",required = true)
     @ApiModelProperty(value = "租户联系人",required = true)
-    @NotEmpty(message = "租户联系人不能为空",groups = {Update.class})
+    @NotEmpty(message = "租户联系人不能为空",groups = {Insert.class,Update.class})
     private String contractUser;
     private String contractUser;
 
 
     @ApiModelProperty("租户联系人电话")
     @ApiModelProperty("租户联系人电话")
@@ -45,6 +55,6 @@ public class SysTenantCommonDTO extends BaseDTO {
     private String remark;
     private String remark;
 
 
     @ApiModelProperty(value = "租户状态 0、开启 1、关闭",required = true)
     @ApiModelProperty(value = "租户状态 0、开启 1、关闭",required = true)
-    @NotEmpty(message = "租户状态不能为空",groups = {Update.class})
+    @NotNull(message = "租户状态不能为空",groups = {Update.class})
     private Boolean disable;
     private Boolean disable;
 }
 }

+ 1 - 8
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageDTO.java

@@ -9,6 +9,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
@@ -30,7 +31,6 @@ public class SysTenantPackageDTO extends BaseDTO {
     private String packageCode;
     private String packageCode;
 
 
     @ApiModelProperty(value = "套餐类型 sys、系统套餐 custom、自定义套餐",required = true)
     @ApiModelProperty(value = "套餐类型 sys、系统套餐 custom、自定义套餐",required = true)
-    @NotEmpty(message = "套餐类型不能为空",groups = {Insert.class, Update.class})
     private String type;
     private String type;
 
 
     @ApiModelProperty(value = "套餐名称",required = true)
     @ApiModelProperty(value = "套餐名称",required = true)
@@ -39,11 +39,4 @@ public class SysTenantPackageDTO extends BaseDTO {
 
 
     @ApiModelProperty("套餐备注")
     @ApiModelProperty("套餐备注")
     private String remark;
     private String remark;
-
-    @ApiModelProperty("排序")
-    private Integer sort;
-
-    @ApiModelProperty(value = "是否启用 0、启用 1、关闭",required = true)
-    @NotEmpty(message = "套餐状态不能为空",groups = {Insert.class, Update.class})
-    private Boolean disable;
 }
 }

+ 0 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageQueryDTO.java

@@ -17,6 +17,4 @@ public class SysTenantPackageQueryDTO {
     private String packageCode;
     private String packageCode;
     @ApiModelProperty("套餐名称")
     @ApiModelProperty("套餐名称")
     private String packageName;
     private String packageName;
-    @ApiModelProperty("套餐名称")
-    private Boolean disable;
 }
 }

+ 13 - 14
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/po/SysTenantPO.java

@@ -2,13 +2,12 @@ package cn.tr.module.sys.tenant.po;
 
 
 
 
 import cn.tr.core.annotation.ColumnDefaultValue;
 import cn.tr.core.annotation.ColumnDefaultValue;
-import cn.tr.core.annotation.Comment;
 import cn.tr.plugin.mybatis.pojo.BasePO;
 import cn.tr.plugin.mybatis.pojo.BasePO;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
 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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
-import org.apache.ibatis.type.JdbcType;
 
 
 /**
 /**
  * @ClassName : SysTenantPO
  * @ClassName : SysTenantPO
@@ -19,33 +18,33 @@ import org.apache.ibatis.type.JdbcType;
 @Data
 @Data
 @TableName("sys_tenant")
 @TableName("sys_tenant")
 public class SysTenantPO extends BasePO {
 public class SysTenantPO extends BasePO {
-    @Comment("租户id")
+    @ApiModelProperty("租户id")
     private String id;
     private String id;
 
 
-    @Comment("租户名称")
+    @ApiModelProperty("租户名称")
     private String name;
     private String name;
 
 
-    @Comment("租户联系人")
+    @ApiModelProperty("租户类型")
+    private String type;
+
+    @ApiModelProperty("租户联系人")
     private String contractUser;
     private String contractUser;
 
 
-    @Comment("租户联系人电话")
+    @ApiModelProperty("租户联系人电话")
     private String contactMobile;
     private String contactMobile;
 
 
-    @Comment("租户所属用户id")
+    @ApiModelProperty("租户所属用户id")
     private String tenantUserId;
     private String tenantUserId;
 
 
-    @Comment("租户套餐id")
+    @ApiModelProperty("租户套餐id")
     private String packageId;
     private String packageId;
 
 
-    @Comment("租户备注")
+    @ApiModelProperty("租户备注")
     private String remark;
     private String remark;
 
 
-    @Comment("租户状态 0、开启 1、关闭")
+    @ApiModelProperty("租户状态 0、开启 1、关闭")
     private Boolean disable;
     private Boolean disable;
 
 
-    @Comment("删除标记")
-    @ColumnDefaultValue("0")
-    @TableLogic
-    @TableField(jdbcType = JdbcType.TINYINT)
+    @ApiModelProperty("删除标记")
     private Boolean deleted;
     private Boolean deleted;
 }
 }

+ 0 - 6
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/po/SysTenantPackagePO.java

@@ -31,10 +31,4 @@ public class SysTenantPackagePO extends BasePO {
 
 
     @Comment("套餐类型 sys、系统套餐 custom、自定义套餐")
     @Comment("套餐类型 sys、系统套餐 custom、自定义套餐")
     private String type;
     private String type;
-
-    @Comment("排序")
-    private Integer sort;
-
-    @Comment("是否启用 0、启用 1、关闭")
-    private Boolean disable;
 }
 }

+ 6 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/repository/SysTenantRepository.java

@@ -1,10 +1,13 @@
 package cn.tr.module.sys.tenant.repository;
 package cn.tr.module.sys.tenant.repository;
 
 
+import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
+import cn.tr.module.sys.tenant.dto.SysTenantQueryDTO;
 import cn.tr.module.sys.tenant.po.SysTenantPO;
 import cn.tr.module.sys.tenant.po.SysTenantPO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;
-
+import java.util.*;
 /**
 /**
  * @ClassName : SysRoleMenuRepository
  * @ClassName : SysRoleMenuRepository
  * @Description :
  * @Description :
@@ -14,5 +17,7 @@ import org.springframework.stereotype.Repository;
 @Mapper
 @Mapper
 @Repository
 @Repository
 public interface SysTenantRepository extends BaseMapper<SysTenantPO> {
 public interface SysTenantRepository extends BaseMapper<SysTenantPO> {
+    List<SysTenantCommonDTO> stdSelectList(@Param("query") SysTenantQueryDTO query);
 
 
+    SysTenantCommonDTO stdSelectById(@Param("id") String id);
 }
 }

+ 0 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageServiceImpl.java

@@ -42,7 +42,6 @@ public class SysTenantPackageServiceImpl implements ISysTenantPackageService {
                 tenantPackageRepository.selectList(new LambdaQueryWrapper<SysTenantPackagePO>()
                 tenantPackageRepository.selectList(new LambdaQueryWrapper<SysTenantPackagePO>()
                         .like(StrUtil.isNotEmpty(query.getPackageCode()),SysTenantPackagePO::getPackageCode,query.getPackageCode())
                         .like(StrUtil.isNotEmpty(query.getPackageCode()),SysTenantPackagePO::getPackageCode,query.getPackageCode())
                         .like(StrUtil.isNotEmpty(query.getPackageName()),SysTenantPackagePO::getPackageName,query.getPackageName())
                         .like(StrUtil.isNotEmpty(query.getPackageName()),SysTenantPackagePO::getPackageName,query.getPackageName())
-                        .eq(ObjectUtil.isNotNull(query.getDisable()),SysTenantPackagePO::getDisable,query.getDisable())
                 ));
                 ));
     }
     }
 
 

+ 57 - 23
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java

@@ -1,8 +1,10 @@
 package cn.tr.module.sys.tenant.service.impl;
 package cn.tr.module.sys.tenant.service.impl;
 
 
 
 
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.config.SysConfigManager;
 import cn.tr.module.sys.tenant.mapper.SysTenantMapper;
 import cn.tr.module.sys.tenant.mapper.SysTenantMapper;
 import cn.tr.module.sys.tenant.dto.SysTenantAddDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantAddDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
@@ -13,13 +15,9 @@ import cn.tr.module.sys.user.enums.CreateEnum;
 import cn.tr.module.sys.user.enums.UserStatusEnum;
 import cn.tr.module.sys.user.enums.UserStatusEnum;
 import cn.tr.module.sys.tenant.po.SysTenantPO;
 import cn.tr.module.sys.tenant.po.SysTenantPO;
 import cn.tr.module.sys.tenant.repository.SysTenantRepository;
 import cn.tr.module.sys.tenant.repository.SysTenantRepository;
-import cn.tr.module.sys.user.repository.SysMenuRepository;
-import cn.tr.module.sys.user.service.ISysOrgService;
-import cn.tr.module.sys.user.service.ISysRoleService;
+import cn.tr.module.sys.user.service.*;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
-import cn.tr.module.sys.user.service.ISysUserService;
-import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.plugin.biz.tenant.utils.TenantUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
@@ -39,10 +37,18 @@ public class SysTenantServiceImpl implements ISysTenantService {
     @Autowired
     @Autowired
     private SysTenantRepository tenantRepository;
     private SysTenantRepository tenantRepository;
 
 
+    @Autowired
+    @Lazy
+    private ISysPortalService portalService;
+
     @Autowired
     @Autowired
     @Lazy
     @Lazy
     private ISysUserService userService;
     private ISysUserService userService;
 
 
+    @Autowired
+    @Lazy
+    private ISysUserPortalService userPortalService;
+
     @Autowired
     @Autowired
     @Lazy
     @Lazy
     private ISysOrgService orgService;
     private ISysOrgService orgService;
@@ -52,24 +58,20 @@ public class SysTenantServiceImpl implements ISysTenantService {
     private ISysRoleService roleService;
     private ISysRoleService roleService;
 
 
     @Autowired
     @Autowired
-    private SysMenuRepository menuRepository;
+    @Lazy
+    private SysConfigManager configManager;
 
 
     @Autowired
     @Autowired
     @Lazy
     @Lazy
     private ISysTenantPackageMenuService tenantPackageMenuService;
     private ISysTenantPackageMenuService tenantPackageMenuService;
     @Override
     @Override
     public List<SysTenantCommonDTO> selectSysTenantList(SysTenantQueryDTO query) {
     public List<SysTenantCommonDTO> selectSysTenantList(SysTenantQueryDTO query) {
-        return SysTenantMapper.INSTANCE.toCommonDTOList(tenantRepository.selectList(new LambdaQueryWrapper<SysTenantPO>()
-                .like(StrUtil.isNotEmpty(query.getName()),SysTenantPO::getName,query.getName())
-                .like(StrUtil.isNotEmpty(query.getContactMobile()),SysTenantPO::getContactMobile,query.getContactMobile())
-                .like(StrUtil.isNotEmpty(query.getContractUser()),SysTenantPO::getContractUser,query.getContractUser())
-                .like(ObjectUtil.isNotNull(query.getDisable()),SysTenantPO::getDisable,query.getDisable())
-        ));
+        return tenantRepository.stdSelectList(query);
     }
     }
 
 
     @Override
     @Override
     public SysTenantCommonDTO selectSysTenantById(String id) {
     public SysTenantCommonDTO selectSysTenantById(String id) {
-        return SysTenantMapper.INSTANCE.toCommonDTO(tenantRepository.selectById(id));
+        return tenantRepository.stdSelectById(id);
     }
     }
 
 
     @Override
     @Override
@@ -83,6 +85,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         String orgId= IdWorker.getIdStr();
         String orgId= IdWorker.getIdStr();
         String userId= IdWorker.getIdStr();
         String userId= IdWorker.getIdStr();
         String roleId= IdWorker.getIdStr();
         String roleId= IdWorker.getIdStr();
+        String portalId= IdWorker.getIdStr();
         SysTenantPO tenant = SysTenantMapper.INSTANCE.toPO(source);
         SysTenantPO tenant = SysTenantMapper.INSTANCE.toPO(source);
         tenant.setTenantUserId(userId);
         tenant.setTenantUserId(userId);
         boolean result = tenantRepository.insert(tenant) != 0;
         boolean result = tenantRepository.insert(tenant) != 0;
@@ -90,19 +93,40 @@ public class SysTenantServiceImpl implements ISysTenantService {
             return false;
             return false;
         }
         }
         String tenantId = tenant.getId();
         String tenantId = tenant.getId();
-        TenantContextHolder.setIgnore(false);
-        TenantContextHolder.setTenantId(tenantId);
-        //创建部门
-        orgService.insertSysOrg(buildOrg(orgId,source.getName()));
-        //创建角色
-        roleService.insertSysRole(buildRole(roleId));
-        //创建租户用户
-        userService.insertSysUser(buildUser(userId,roleId,orgId,source.getUsername(),source.getPassword(),source.getName()));
+        TenantUtils.execute(tenantId,()->{
+            //创建门面
+            portalService.insertInnerSysPortal(buildPortal(portalId));
+            //创建部门
+            orgService.insertSysOrg(buildOrg(orgId,source.getName()));
+            //创建角色
+            roleService.insertInnerSysRole(buildRole(roleId));
+            //创建租户用户
+            userService.insertSysUser(buildUser(userId,roleId,orgId,source.
+                    getUsername(),configManager.getCurrent().getDefaultPsw(),source.getName()));
+            //关联用户和门户
+            userPortalService.assignUserPortal(buildUserPortal(userId,portalId));
+        });
+        return result;
+    }
+
+    private List<SysUserPortalDTO> buildUserPortal(String userId, String portalId) {
+        ArrayList<SysUserPortalDTO> result = new ArrayList<>();
+        SysUserPortalDTO userPortalDTO = new SysUserPortalDTO();
+        userPortalDTO.setIsDefault(true);
+        userPortalDTO.setUserId(userId);
+        userPortalDTO.setPortalId(portalId);
+        result.add(userPortalDTO);
         return result;
         return result;
     }
     }
 
 
     @Override
     @Override
     public int removeSysTenantByIds(Collection<String> ids) {
     public int removeSysTenantByIds(Collection<String> ids) {
+        List<SysTenantPO> tenants = tenantRepository.selectBatchIds(ids);
+        for (SysTenantPO role : tenants) {
+            if (StrUtil.equals(role.getType(), CreateEnum.sys.name())) {
+                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统租户进行操作");
+            }
+        }
         return tenantRepository.deleteBatchIds(ids);
         return tenantRepository.deleteBatchIds(ids);
     }
     }
 
 
@@ -112,6 +136,16 @@ public class SysTenantServiceImpl implements ISysTenantService {
         return  tenantPackageMenuService.findMenuIdByPackageId(tenant.getPackageId());
         return  tenantPackageMenuService.findMenuIdByPackageId(tenant.getPackageId());
     }
     }
 
 
+    private SysPortalDTO buildPortal(String portalId){
+        SysPortalDTO org = new SysPortalDTO();
+        org.setId(portalId);
+        org.setCode("admin");
+        org.setName("系统管理员工作台");
+        org.setType(CreateEnum.sys.name());
+        org.setSort(1);
+        return org;
+    }
+
     private SysOrgDTO buildOrg(String orgId,String tenantName){
     private SysOrgDTO buildOrg(String orgId,String tenantName){
         SysOrgDTO org = new SysOrgDTO();
         SysOrgDTO org = new SysOrgDTO();
         org.setId(orgId);
         org.setId(orgId);

+ 16 - 4
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysUserController.java

@@ -8,12 +8,12 @@ import cn.tr.core.validation.Update;
 import cn.tr.module.sys.user.dto.SysUserDTO;
 import cn.tr.module.sys.user.dto.SysUserDTO;
 import cn.tr.module.sys.user.dto.SysUserEditDTO;
 import cn.tr.module.sys.user.dto.SysUserEditDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
+import cn.tr.module.sys.user.dto.SysValidateUsernameDTO;
 import cn.tr.module.sys.user.service.ISysUserService;
 import cn.tr.module.sys.user.service.ISysUserService;
 import cn.tr.plugin.mybatis.base.BaseController;
 import cn.tr.plugin.mybatis.base.BaseController;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
@@ -33,6 +33,18 @@ import java.util.Collection;
 public class SysUserController extends BaseController {
 public class SysUserController extends BaseController {
     private final ISysUserService userService;
     private final ISysUserService userService;
 
 
+    @PostMapping("/username/valid")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "校验用户名是否重复",notes = "权限: 无")
+    @ApiResponses(
+            {
+                    @ApiResponse(code = 200,response = Boolean.class,message = "1 用户名可用")
+            }
+    )
+    public CommonResult<Boolean> valid(@RequestBody@Validated SysValidateUsernameDTO source){
+        return CommonResult.success(userService.isValidUsername(source.getUserId(),source.getUsername()));
+    }
+
     @PostMapping("/query/page")
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf")
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "根据条件查询用户",notes = "权限: 无")
     @ApiOperation(value = "根据条件查询用户",notes = "权限: 无")
@@ -65,7 +77,7 @@ public class SysUserController extends BaseController {
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysUserDTO source){
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysUserDTO source){
         return CommonResult.success(userService.insertSysUser(source));
         return CommonResult.success(userService.insertSysUser(source));
     }
     }
-    
+
     @PostMapping("/deleteByIds")
     @PostMapping("/deleteByIds")
     @ApiOperationSupport(author = "lf")
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "删除用户",notes = "权限: sys:user:del")
     @ApiOperation(value = "删除用户",notes = "权限: sys:user:del")
@@ -74,7 +86,7 @@ public class SysUserController extends BaseController {
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
         return CommonResult.success(userService.deleteSysUserByIds(ids));
         return CommonResult.success(userService.deleteSysUserByIds(ids));
     }
     }
-    
+
 
 
     //todo 导出
     //todo 导出
 
 

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/OnlineUserQueryDTO.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/OnlineSessionQueryDTO.java

@@ -14,7 +14,7 @@ import javax.validation.constraints.NotEmpty;
  */
  */
 @ApiModel("在线用户查询")
 @ApiModel("在线用户查询")
 @Data
 @Data
-public class OnlineUserQueryDTO {
+public class OnlineSessionQueryDTO {
     @ApiModelProperty("用户名模糊查询")
     @ApiModelProperty("用户名模糊查询")
     private String blurry;
     private String blurry;
 
 

+ 25 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/OnlineTokenQueryDTO.java

@@ -0,0 +1,25 @@
+package cn.tr.module.sys.user.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * @ClassName : OnlineUserQueryDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2022年11月30日
+ */
+@ApiModel("在线Token查询")
+@Data
+public class OnlineTokenQueryDTO {
+    @ApiModelProperty("会话")
+    @NotEmpty(message = "会话不能为空")
+    private String sessionId;
+
+    @ApiModelProperty("账户体系")
+    @NotEmpty(message = "账户体系不能为空")
+    private String loginType;
+}

+ 5 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/OnlineUserSessionDTO.java

@@ -39,6 +39,11 @@ public class OnlineUserSessionDTO implements Serializable {
     @ApiModelProperty("会话最后登录时间")
     @ApiModelProperty("会话最后登录时间")
     private Date lastLoginTime;
     private Date lastLoginTime;
 
 
+    @ApiModelProperty("会话最后登录浏览器")
+    private String lastBrowser;
+
+    @ApiModelProperty("会话最后登录系统")
+    private String lastOs;
     @ApiModelProperty("token会话列表")
     @ApiModelProperty("token会话列表")
     private List<OnlineUserTokenSessionDTO> tokenSessionList;
     private List<OnlineUserTokenSessionDTO> tokenSessionList;
 
 

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalDTO.java

@@ -26,7 +26,7 @@ public class SysPortalDTO  extends BaseDTO {
     private String name;
     private String name;
 
 
     /**
     /**
-     * {@link cn.tr.module.sys.user.enums.RoleEnum}
+     * {@link cn.tr.module.sys.user.enums.CreateEnum}
      */
      */
     @ApiModelProperty(value = "门户类型 sys、系统门户 custom、自定义门户",readOnly = true)
     @ApiModelProperty(value = "门户类型 sys、系统门户 custom、自定义门户",readOnly = true)
     private String type;
     private String type;

+ 23 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserPortalListDTO.java

@@ -0,0 +1,23 @@
+package cn.tr.module.sys.user.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName : SysUserPortalListDTO
+ * @Description : 用户的门户列表
+ * @Author : LF
+ * @Date: 2023年04月03日
+ */
+@Data
+public class SysUserPortalListDTO {
+    @ApiModelProperty("门户id")
+    private String id;
+
+    @ApiModelProperty(value = "门户名称",readOnly = true)
+    private String name;
+
+    @ApiModelProperty(value = "是否为默认模糊",required = true)
+    private Boolean isDefault;
+
+}

+ 21 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysValidateUsernameDTO.java

@@ -0,0 +1,21 @@
+package cn.tr.module.sys.user.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @ClassName : SysValidateUsernameDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月06日
+ */
+@Data
+public class SysValidateUsernameDTO {
+    @ApiModelProperty("用户id")
+    private String userId;
+    @ApiModelProperty(value = "用户名",required = true)
+    @NotNull(message = "用户名不能为空")
+    private String username;
+}

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysPortalPO.java

@@ -28,7 +28,7 @@ public class SysPortalPO extends TenantPO {
     @Comment("门户首页菜单id")
     @Comment("门户首页菜单id")
     private String indexMenuId;
     private String indexMenuId;
     /**
     /**
-     * {@link cn.tr.module.sys.user.enums.RoleEnum}
+     * {@link cn.tr.module.sys.user.enums.CreateEnum}
      */
      */
     @Comment("门户类型 sys、系统门户 custom、自定义门户")
     @Comment("门户类型 sys、系统门户 custom、自定义门户")
     private String type;
     private String type;

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserPortalRepository.java

@@ -1,6 +1,6 @@
 package cn.tr.module.sys.user.repository;
 package cn.tr.module.sys.user.repository;
 
 
-import cn.tr.module.sys.user.po.SysPortalPO;
+import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.po.SysUserPortalPO;
 import cn.tr.module.sys.user.po.SysUserPortalPO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -17,6 +17,6 @@ import java.util.*;
 @Repository
 @Repository
 public interface SysUserPortalRepository extends BaseMapper<SysUserPortalPO> {
 public interface SysUserPortalRepository extends BaseMapper<SysUserPortalPO> {
 
 
-    List<SysPortalPO> findPortalsByUserId(@Param("userId") String userId);
+    List<SysUserPortalListDTO> findPortalsByUserId(@Param("userId") String userId);
 
 
 }
 }

+ 7 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPortalService.java

@@ -41,6 +41,13 @@ public interface ISysPortalService {
      */
      */
     boolean insertSysPortal(SysPortalDTO source);
     boolean insertSysPortal(SysPortalDTO source);
 
 
+    /**
+     * 新增门户(系统内部使用)
+     * @param source 新增门户
+     * @return true:新增成功
+     */
+    boolean insertInnerSysPortal(SysPortalDTO source);
+
     /**
     /**
      * 根据id删除门户
      * 根据id删除门户
      * @param ids 门户id
      * @param ids 门户id

+ 6 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleService.java

@@ -56,6 +56,12 @@ public interface ISysRoleService {
      */
      */
     boolean insertSysRole(SysRoleDTO source);
     boolean insertSysRole(SysRoleDTO source);
 
 
+    /**
+     * 新增角色(系统内部调用)
+     * @param source 新增角色
+     * @return true:新增成功
+     */
+    boolean insertInnerSysRole(SysRoleDTO source);
     /**
     /**
      * 根据id删除角色
      * 根据id删除角色
      * @param ids 角色id
      * @param ids 角色id

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserPortalService.java

@@ -2,6 +2,7 @@ package cn.tr.module.sys.user.service;
 
 
 import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysUserPortalDTO;
 import cn.tr.module.sys.user.dto.SysUserPortalDTO;
+import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
@@ -28,7 +29,7 @@ public interface ISysUserPortalService {
      * @param userId
      * @param userId
      * @return
      * @return
      */
      */
-    List<SysPortalDTO> findPortalsByUserId(String userId);
+    List<SysUserPortalListDTO> findPortalsByUserId(String userId);
 
 
     /**
     /**
      * 找到持有当前所给门户id的用户id
      * 找到持有当前所给门户id的用户id

+ 7 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserService.java

@@ -72,6 +72,13 @@ public interface ISysUserService {
      */
      */
     int deleteSysUserByIds(Collection<String> ids);
     int deleteSysUserByIds(Collection<String> ids);
 
 
+    /**
+     * 判断用户名是否重复
+     * @param userId
+     * @param username
+     * @return true 不重复 false 重复
+     */
+    boolean isValidUsername(String userId,String username);
     /**
     /**
      * 更新用户最后登录信息
      * 更新用户最后登录信息
      * @param id
      * @param id

+ 5 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysPortalServiceImpl.java

@@ -66,6 +66,11 @@ public class SysPortalServiceImpl implements ISysPortalService {
         return portalRepository.insert(po)!=0;
         return portalRepository.insert(po)!=0;
     }
     }
 
 
+    @Override
+    public boolean insertInnerSysPortal(SysPortalDTO source) {
+        return portalRepository.insert( SysPortalMapper.INSTANCE.toSysPortalPO(source))!=0;
+    }
+
     @Override
     @Override
     public int deleteSysPortalByIds(Collection<String> ids) {
     public int deleteSysPortalByIds(Collection<String> ids) {
         List<SysPortalPO> portals = portalRepository.selectBatchIds(ids);
         List<SysPortalPO> portals = portalRepository.selectBatchIds(ids);

+ 5 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysRoleServiceImpl.java

@@ -81,6 +81,11 @@ public class SysRoleServiceImpl implements ISysRoleService {
         return roleRepository.insert(po)!=0;
         return roleRepository.insert(po)!=0;
     }
     }
 
 
+    @Override
+    public boolean insertInnerSysRole(SysRoleDTO source) {
+        return roleRepository.insert(SysRoleMapper.INSTANCE.toSysRolePO(source))!=0;
+    }
+
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public int deleteSysRoleByIds(Collection<String> ids) {
     public int deleteSysRoleByIds(Collection<String> ids) {

+ 3 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserPortalServiceImpl.java

@@ -2,6 +2,7 @@ package cn.tr.module.sys.user.service.impl;
 
 
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.mapper.SysPortalMapper;
 import cn.tr.module.sys.user.mapper.SysPortalMapper;
 import cn.tr.module.sys.user.mapper.SysUserPortalMapper;
 import cn.tr.module.sys.user.mapper.SysUserPortalMapper;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
@@ -48,8 +49,8 @@ public class SysUserPortalServiceImpl extends ServiceImpl<SysUserPortalRepositor
     }
     }
 
 
     @Override
     @Override
-    public List<SysPortalDTO> findPortalsByUserId(String userId) {
-        return  SysPortalMapper.INSTANCE.toSysPortalDTOList( baseMapper.findPortalsByUserId(userId));
+    public List<SysUserPortalListDTO> findPortalsByUserId(String userId) {
+        return  baseMapper.findPortalsByUserId(userId);
     }
     }
 
 
     @Override
     @Override

+ 9 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.user.service.impl;
 package cn.tr.module.sys.user.service.impl;
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.tr.core.annotation.TenantIgnore;
 import cn.tr.core.annotation.TenantIgnore;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
@@ -137,6 +138,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepository,SysUserPO>
         return baseMapper.deleteBatchIds(ids);
         return baseMapper.deleteBatchIds(ids);
     }
     }
 
 
+    @Override
+    @TenantIgnore
+    public boolean isValidUsername(String userId, String username) {
+        return baseMapper.selectCount(new LambdaQueryWrapper<SysUserPO>()
+                .ne(StrUtil.isNotEmpty(userId),SysUserPO::getId,userId)
+                .eq(SysUserPO::getUsername,username))==0;
+    }
+
     @Override
     @Override
     public void updateLastLoginInfo(String id, Date loginTime, String ip, String cityInfo) {
     public void updateLastLoginInfo(String id, Date loginTime, String ip, String cityInfo) {
         SysUserPO user = this.getById(id);
         SysUserPO user = this.getById(id);

+ 45 - 0
tr-modules/tr-module-system/src/main/resources/mapper/tenant/SysTenantMapper.xml

@@ -0,0 +1,45 @@
+<?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="cn.tr.module.sys.tenant.repository.SysTenantRepository">
+    <resultMap id="CommonResult" type="cn.tr.module.sys.tenant.dto.SysTenantCommonDTO">
+        <result column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="package_name" property="packageName"/>
+        <result column="username" property="username"/>
+        <result column="type" property="type"/>
+        <result column="contract_user" property="contractUser"/>
+        <result column="contact_mobile" property="contactMobile"/>
+        <result column="remark" property="remark"/>
+        <result column="disable" property="disable"/>
+    </resultMap>
+
+    <select id="stdSelectList" resultType="cn.tr.module.sys.tenant.dto.SysTenantCommonDTO" parameterType="cn.tr.module.sys.tenant.dto.SysTenantQueryDTO">
+            select t.*,tp.package_name,u.username from
+            sys_tenant as t LEFT JOIN sys_tenant_package as tp on t.package_id=tp.id
+            LEFT JOIN sys_user as u on u.id=t.tenant_user_id
+        <where>
+            t.deleted = 0
+            <if test="query.name != null">
+                    and t.name like  concat('%',#{query.name},'%')
+            </if>
+            <if test="query.contractUser != null">
+                and t.contract_user like  concat('%',#{query.contractUser},'%')
+            </if>
+            <if test="query.contactMobile != null">
+                and t.contact_mobile like  concat('%',#{query.contactMobile},'%')
+            </if>
+            <if test="query.disable != null">
+                and t.disable = #{query.disable}
+            </if>
+        </where>
+    </select>
+
+    <select id="stdSelectById" resultType="cn.tr.module.sys.tenant.dto.SysTenantCommonDTO" parameterType="java.lang.String">
+        select t.*,tp.package_name,u.username from
+        sys_tenant as t LEFT JOIN sys_tenant_package as tp on t.package_id=tp.id
+        LEFT JOIN sys_user as u on u.id=t.tenant_user_id
+        where t.id = #{id} and  t.deleted = 0
+    </select>
+</mapper>

+ 9 - 2
tr-modules/tr-module-system/src/main/resources/mapper/user/SysUserPortalMapper.xml

@@ -4,9 +4,16 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.tr.module.sys.user.repository.SysUserPortalRepository">
 <mapper namespace="cn.tr.module.sys.user.repository.SysUserPortalRepository">
 
 
+    <resultMap id="userPortalList" type="cn.tr.module.sys.user.dto.SysUserPortalListDTO">
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="isDefault" column="is_default"/>
+    </resultMap>
 
 
-    <select id="findPortalsByUserId" resultType="cn.tr.module.sys.user.po.SysPortalPO">
-         select p.*
+    <select id="findPortalsByUserId" resultMap="userPortalList">
+         select p.id as id,
+                p.name  as  name,
+                up.is_default as is_default
             from (select * from sys_user where id=#{userId}) as u
             from (select * from sys_user where id=#{userId}) as u
             join sys_user_portal  as up on up.user_id=u.id
             join sys_user_portal  as up on up.user_id=u.id
             join sys_portal as p on p.id = up.portal_id;
             join sys_portal as p on p.id = up.portal_id;

+ 2 - 1
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantCreateAndUpdateMetaObjectHandler.java

@@ -2,6 +2,7 @@ package cn.tr.plugin.biz.tenant.config.db;
 
 
 import cn.tr.core.strategy.LoginUserStrategy;
 import cn.tr.core.strategy.LoginUserStrategy;
 import cn.tr.core.constant.MybatisConstant;
 import cn.tr.core.constant.MybatisConstant;
+import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.reflection.MetaObject;
@@ -21,7 +22,7 @@ public class TenantCreateAndUpdateMetaObjectHandler implements MetaObjectHandler
     public void insertFill(MetaObject metaObject) {
     public void insertFill(MetaObject metaObject) {
         try {
         try {
             String localUserId = LoginUserStrategy.tr.getCurrentUserId();
             String localUserId = LoginUserStrategy.tr.getCurrentUserId();
-            String tenantId = LoginUserStrategy.tr.getTenantId();
+            String tenantId = TenantContextHolder.getTenantId();
             if (metaObject.hasGetter(MybatisConstant.CREATE_TIME) && metaObject.getValue(MybatisConstant.CREATE_TIME) == null) {
             if (metaObject.hasGetter(MybatisConstant.CREATE_TIME) && metaObject.getValue(MybatisConstant.CREATE_TIME) == null) {
                 this.strictInsertFill(metaObject,MybatisConstant. CREATE_TIME, Date.class, new Date());
                 this.strictInsertFill(metaObject,MybatisConstant. CREATE_TIME, Date.class, new Date());
             }
             }

+ 1 - 1
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantDatabaseInterceptor.java

@@ -40,7 +40,7 @@ public class TenantDatabaseInterceptor implements TenantLineHandler {
         if(request==null){
         if(request==null){
             ignore=true;
             ignore=true;
         }
         }
-        return ignore?new StringValue(""):new StringValue(LoginUserStrategy.tr.getTenantId());
+        return ignore?new StringValue(""):new StringValue(TenantContextHolder.getTenantId());
     }
     }
 
 
     @Override
     @Override

+ 0 - 1
tr-test/src/main/resources/application.yml

@@ -24,7 +24,6 @@ spring:
     active: dev
     active: dev
   jackson:
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss
     date-format: yyyy-MM-dd HH:mm:ss
-    time-zone: GMT-8