Explorar o código

日常上传了

18339543638 %!s(int64=2) %!d(string=hai) anos
pai
achega
bf4b659b92
Modificáronse 46 ficheiros con 641 adicións e 177 borrados
  1. 20 11
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/controller/GenBasicController.java
  2. 1 2
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/param/GenBasicAddParam.java
  3. 1 6
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/param/GenBasicEditParam.java
  4. 1 2
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/GenBasicService.java
  5. 13 9
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/impl/GenBasicServiceImpl.java
  6. 10 2
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/config/controller/GenConfigController.java
  7. 2 0
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/config/entity/GenConfig.java
  8. 11 10
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/config/param/GenConfigEditParam.java
  9. 27 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/user/SysUserPortalMapper.java
  10. 6 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CurrentUserController.java
  11. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/operator/LoginOAuth2PswUserOperator.java
  12. 23 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java
  13. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageMenuServiceImpl.java
  14. 13 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java
  15. 14 7
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysRoleController.java
  16. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysUserController.java
  17. 0 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalDTO.java
  18. 21 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalMenuAssignDTO.java
  19. 0 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalQueryDTO.java
  20. 20 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysRoleMenuAssignDTO.java
  21. 1 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserDTO.java
  22. 82 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserEditDTO.java
  23. 24 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserPortalDTO.java
  24. 15 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/enums/PortalEnum.java
  25. 0 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysMenuPO.java
  26. 1 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysPortalPO.java
  27. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPO.java
  28. 28 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPortalPO.java
  29. 7 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysMenuRepository.java
  30. 0 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysPortalMenuRepository.java
  31. 22 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserPortalRepository.java
  32. 22 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPortalMenuService.java
  33. 39 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserPortalService.java
  34. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserService.java
  35. 42 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysPortalMenuServiceImpl.java
  36. 57 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysPortalServiceImpl.java
  37. 4 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysRoleMenuServiceImpl.java
  38. 12 6
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysRoleServiceImpl.java
  39. 60 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserPortalServiceImpl.java
  40. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserRoleServiceImpl.java
  41. 10 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserServiceImpl.java
  42. 6 0
      tr-modules/tr-module-system/src/main/resources/mapper/user/SysMenuMapper.xml
  43. 16 0
      tr-modules/tr-module-system/src/main/resources/mapper/user/SysUserPortalMapper.xml
  44. 0 55
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/handler/ListTypeHandler.java
  45. 0 15
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/handler/StringListTypeHandler.java
  46. 1 1
      tr-test/src/main/resources/application.yml

+ 20 - 11
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/controller/GenBasicController.java

@@ -13,6 +13,7 @@
 package cn.tr.module.gen.modular.basic.controller;
 
 import cn.tr.core.pojo.CommonResult;
+import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.module.gen.modular.basic.entity.CommonValidList;
 import cn.tr.module.gen.modular.basic.entity.GenBasic;
 import cn.tr.module.gen.modular.basic.param.*;
@@ -28,16 +29,16 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
 import java.io.IOException;
 import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * 代码生成基础控制器
  *
@@ -61,10 +62,10 @@ public class GenBasicController extends BaseController {
      */
     @ApiOperationSupport(order = 1)
     @ApiOperation("获取代码生成基础分页")
-    @GetMapping("/gen/basic/page")
-    public CommonResult<Page<GenBasic>> page(GenBasicPageParam genBasicPageParam) {
-
-        return CommonResult.success(genBasicService.page(genBasicPageParam));
+    @PostMapping("/gen/basic/page")
+    public TableDataInfo page(@RequestBody GenBasicPageParam genBasicPageParam) {
+        startPage();
+        return getDataTable(genBasicService.list(genBasicPageParam));
     }
 
     /**
@@ -103,8 +104,14 @@ public class GenBasicController extends BaseController {
     @ApiOperation("删除代码生成基础")
     @PostMapping("/gen/basic/delete")
     public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
-                                               CommonValidList<GenBasicIdParam> genBasicIdParamList) {
-        genBasicService.delete(genBasicIdParamList);
+                                               List<String> ids) {
+        genBasicService.delete(ids.stream()
+                .map(id->{
+                    GenBasicIdParam result = new GenBasicIdParam();
+                    result.setId(id);
+                    return result;
+                })
+                .collect(Collectors.toList()));
         return CommonResult.success();
     }
 
@@ -117,7 +124,9 @@ public class GenBasicController extends BaseController {
     @ApiOperationSupport(order = 5)
     @ApiOperation("获取代码生成基础详情")
     @GetMapping("/gen/basic/detail")
-    public CommonResult<GenBasic> detail(@Valid GenBasicIdParam genBasicIdParam) {
+    public CommonResult<GenBasic> detail(@RequestParam("id") @Valid String id) {
+        GenBasicIdParam genBasicIdParam = new GenBasicIdParam();
+        genBasicIdParam.setId(id);
         return CommonResult.success(genBasicService.detail(genBasicIdParam));
     }
 

+ 1 - 2
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/param/GenBasicAddParam.java

@@ -50,12 +50,11 @@ public class GenBasicAddParam {
 
     /** 所属模块 */
     @ApiModelProperty(value = "所属模块", required = true, position = 5)
-    @NotNull(message = "module不能为空")
     private String module;
 
     /** 上级目录 */
     @ApiModelProperty(value = "上级目录", required = true, position = 6)
-    @NotNull(message = "menuPid不能为空")
+//    @NotNull(message = "menuPid不能为空")
     private String menuPid;
 
     /** 功能名 */

+ 1 - 6
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/param/GenBasicEditParam.java

@@ -56,12 +56,7 @@ public class GenBasicEditParam {
     /** 所属模块 */
     @ApiModelProperty(value = "所属模块", position = 6)
     @NotNull(message = "module不能为空")
-    private String module;
-
-    /** 上级目录 */
-    @ApiModelProperty(value = "上级目录", position = 7)
-    @NotNull(message = "menuPid不能为空")
-    private String menuPid;
+    private String moduleName;
 
     /** 功能名 */
     @ApiModelProperty(value = "功能名", position = 8)

+ 1 - 2
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/GenBasicService.java

@@ -17,7 +17,6 @@ import cn.tr.module.gen.modular.basic.param.*;
 import cn.tr.module.gen.modular.basic.result.GenBasicPreviewResult;
 import cn.tr.module.gen.modular.basic.result.GenBasicTableColumnResult;
 import cn.tr.module.gen.modular.basic.result.GenBasicTableResult;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -37,7 +36,7 @@ public interface GenBasicService extends IService<GenBasic> {
      * @author yubaoshan
      * @date 2022/10/25 22:33
      */
-    Page<GenBasic> page(GenBasicPageParam genBasicPageParam);
+    List<GenBasic> list(GenBasicPageParam genBasicPageParam);
 
     /**
      * 添加代码生成基础

+ 13 - 9
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/impl/GenBasicServiceImpl.java

@@ -49,6 +49,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mysql.cj.jdbc.ConnectionImpl;
 import org.beetl.core.Configuration;
 import org.beetl.core.GroupTemplate;
 import org.beetl.core.Template;
@@ -76,11 +77,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
 @Service
 public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> implements GenBasicService {
 
-    private static final String DB_URL_KEY = "spring.datasource.dynamic.datasource.master.url";
+//    private static final String DB_URL_KEY = "spring.datasource.dynamic.datasource.master.url";
+    private static final String DB_URL_KEY = "spring.datasource.url";
 
-    private static final String DB_USERNAME_KEY = "spring.datasource.dynamic.datasource.master.username";
+//    private static final String DB_USERNAME_KEY = "spring.datasource.dynamic.datasource.master.username";
+    private static final String DB_USERNAME_KEY = "spring.datasource.username";
 
-    private static final String DB_PASSWORD_KEY = "spring.datasource.dynamic.datasource.master.password";
+//    private static final String DB_PASSWORD_KEY = "spring.datasource.dynamic.datasource.master.password";
+    private static final String DB_PASSWORD_KEY = "spring.datasource.password";
 
     private static final String MODULE_KEY = "biz";
 
@@ -132,7 +136,7 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
     private GenConfigService genConfigService;
 
     @Override
-    public Page<GenBasic> page(GenBasicPageParam genBasicPageParam) {
+    public List<GenBasic> list(GenBasicPageParam genBasicPageParam) {
         QueryWrapper<GenBasic> queryWrapper = new QueryWrapper<>();
 
         if(ObjectUtil.isAllNotEmpty(genBasicPageParam.getSortField(), genBasicPageParam.getSortOrder())) {
@@ -142,7 +146,7 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
         } else {
             queryWrapper.lambda().orderByAsc(GenBasic::getSortCode);
         }
-        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+        return this.list(queryWrapper);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -244,9 +248,9 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
                 schema = metaData.getUserName();
             }
             List<GenBasicTableResult> tables = new ArrayList<>();
-            rs = metaData.getTables(null, schema, "%", new String[]{"TABLE", "VIEW"});
+            rs = metaData.getTables(((ConnectionImpl) conn).getDatabase(), schema, "%", new String[]{"TABLE"});
             while (rs.next()) {
-                String tableName = rs.getString("TABLE_NAME").toUpperCase();
+                String tableName = rs.getString("TABLE_NAME");
                 if (!tableName.startsWith("ACT_")) {
                     GenBasicTableResult genBasicTableResult = new GenBasicTableResult();
                     genBasicTableResult.setTableName(tableName);
@@ -284,9 +288,9 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
                 schema = metaData.getUserName();
             }
             List<GenBasicTableColumnResult> columns = new ArrayList<>();
-            rs = metaData.getColumns(null, schema, genBasicTableColumnParam.getTableName(), "%");
+            rs = metaData.getColumns(((ConnectionImpl) conn).getDatabase(), schema, genBasicTableColumnParam.getTableName(), "%");
             while (rs.next()) {
-                String columnName = rs.getString("COLUMN_NAME").toUpperCase();
+                String columnName = rs.getString("COLUMN_NAME");
                 GenBasicTableColumnResult genBasicTableColumnResult = new GenBasicTableColumnResult();
                 genBasicTableColumnResult.setColumnName(columnName);
                 String remarks = rs.getString("REMARKS");

+ 10 - 2
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/config/controller/GenConfigController.java

@@ -33,6 +33,7 @@ import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 代码生成详细配置控制器
@@ -86,8 +87,15 @@ public class GenConfigController {
     @ApiOperation("删除代码生成详细配置")
     @PostMapping("/gen/config/delete")
     public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
-                                               CommonValidList<GenConfigIdParam> genConfigIdParamList) {
-        genConfigService.delete(genConfigIdParamList);
+                                               List<String> ids) {
+
+        genConfigService.delete(ids.stream()
+                .map(id->{
+                    GenConfigIdParam result = new GenConfigIdParam();
+                    result.setId(id);
+                    return result;
+                })
+                .collect(Collectors.toList()));
         return CommonResult.success();
     }
 

+ 2 - 0
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/config/entity/GenConfig.java

@@ -41,6 +41,8 @@ public class GenConfig extends BasePO {
     @ApiModelProperty(value = "是否主键", position = 3)
     private String isTableKey;
 
+    @ApiModelProperty(value = "模块名称", position = 4)
+    private String moduleName;
     /** 字段 */
     @ApiModelProperty(value = "字段", position = 4)
     private String fieldName;

+ 11 - 10
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/config/param/GenConfigEditParam.java

@@ -17,6 +17,7 @@ import lombok.Getter;
 import lombok.Setter;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 
 /**
  * 代码生成详细配置编辑参数
@@ -74,28 +75,28 @@ public class GenConfigEditParam {
 
     /** 列表显示 */
     @ApiModelProperty(value = "列表显示", required = true, position = 10)
-    @NotBlank(message = "whetherTable不能为空")
-    private String whetherTable;
+    @NotNull(message = "whetherTable不能为空")
+    private Boolean whetherTable;
 
     /** 列省略 */
     @ApiModelProperty(value = "列省略", required = true, position = 11)
-    @NotBlank(message = "whetherRetract不能为空")
-    private String whetherRetract;
+    @NotNull(message = "whetherRetract不能为空")
+    private Boolean whetherRetract;
 
     /** 增改 */
     @ApiModelProperty(value = "增改", required = true, position = 12)
-    @NotBlank(message = "whetherAddUpdate不能为空")
-    private String whetherAddUpdate;
+    @NotNull(message = "whetherAddUpdate不能为空")
+    private Boolean whetherAddUpdate;
 
     /** 必填 */
     @ApiModelProperty(value = "必填", required = true, position = 13)
-    @NotBlank(message = "whetherRequired不能为空")
-    private String whetherRequired;
+    @NotNull(message = "whetherRequired不能为空")
+    private Boolean whetherRequired;
 
     /** 查询 */
     @ApiModelProperty(value = "查询", required = true, position = 14)
-    @NotBlank(message = "queryWhether不能为空")
-    private String queryWhether;
+    @NotNull(message = "queryWhether不能为空")
+    private Boolean queryWhether;
 
     /** 查询方式 */
     @ApiModelProperty(value = "查询方式", required = true, position = 15)

+ 27 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/mapper/user/SysUserPortalMapper.java

@@ -0,0 +1,27 @@
+package cn.tr.module.sys.mapper.user;
+
+import cn.tr.module.sys.user.dto.SysUserPortalDTO;
+import cn.tr.module.sys.user.po.SysUserPortalPO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @ClassName : SysUserPortalMapper
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Mapper
+public interface SysUserPortalMapper {
+    SysUserPortalMapper INSTANCE = Mappers.getMapper(SysUserPortalMapper.class);
+
+    List<SysUserPortalDTO> toSysUserPortalDTOList(List<SysUserPortalPO> source);
+
+    List<SysUserPortalPO> toSysUserPortalPOList(List<SysUserPortalDTO> source);
+
+    SysUserPortalDTO toSysUserPortalDTO(SysUserPortalPO source);
+
+    SysUserPortalPO toSysUserPortalPO(SysUserPortalDTO source);
+}

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

@@ -7,6 +7,7 @@ import cn.tr.core.utils.TreeUtil;
 import cn.tr.module.sys.oauth2.psw.operator.AbstractOAuth2PswUserOperator;
 import cn.tr.module.sys.oauth2.psw.operator.OAuth2PswUserOperatorManager;
 import cn.tr.module.sys.oauth2.service.CurrentUserService;
+import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.vo.RouteItemVO;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
 import io.swagger.annotations.Api;
@@ -55,4 +56,9 @@ public class CurrentUserController {
         return CommonResult.success(TreeUtil.buildTree(currentUserService.currentUserMenus()));
     }
 
+    @GetMapping("/listPortal")
+    @ApiOperation("获取登录用户的门户列表")
+    public CommonResult<List<SysPortalDTO>> getPortals() {
+        return CommonResult.success(currentUserService.currentUserPortals());
+    }
 }

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

@@ -72,7 +72,7 @@ public class LoginOAuth2PswUserOperator extends AbstractOAuth2PswUserOperator{
         updateUser.setLastLoginDate(loginTime);
         updateUser.setLastLoginIp(ip);
         updateUser.setLastLoginAddress(cityInfo);
-        sysUserService.updateSysUserById(updateUser);
+//        sysUserService.updateSysUserById(updateUser);
         //清除缓存
         self.delUserLoginInfoCache(user.getId());
 

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

@@ -3,20 +3,21 @@ package cn.tr.module.sys.oauth2.service;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
+import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.enums.MenuEnum;
 import cn.tr.module.sys.user.service.ISysMenuService;
-import cn.tr.module.sys.user.service.ISysRoleService;
+import cn.tr.module.sys.user.service.ISysPortalMenuService;
+import cn.tr.module.sys.user.service.ISysUserPortalService;
 import cn.tr.module.sys.user.vo.RouteItemVO;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -28,9 +29,10 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 @Component
 public class CurrentUserService {
-    private final ISysRoleService roleService;
     private final ISysTenantService tenantService;
     private final ISysMenuService menuService;
+    private final ISysPortalMenuService portalMenuService;
+    private final ISysUserPortalService userPortalService;
     /**
      * 获取当前用户权限
      * @return
@@ -50,9 +52,13 @@ public class CurrentUserService {
      * @return
      */
     public List<RouteItemVO> currentUserMenus(){
+        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
         Set<SysMenuDTO> tenantMenus = tenantService.currentTenantMenus();
-        Set<SysMenuDTO> roleMenus = menuService.findUserMenus(String.valueOf(SaTokenUtils.getStpUtil().getLoginId()));
-        Collection<SysMenuDTO> allMenus = CollectionUtil.union(tenantMenus, roleMenus);
+        Set<SysMenuDTO> roleMenus = menuService.findUserMenus(currentUserId);
+        //门面菜单
+        Set<SysMenuDTO> portalMenus =new HashSet<>(portalMenuService.findAllMenusByPortalId("1"));
+        // 交集(门面菜单,租户菜单,角色菜单)
+        Collection<SysMenuDTO> allMenus = CollectionUtil.intersection(tenantMenus, roleMenus,portalMenus);
         if(CollectionUtil.isEmpty(allMenus)){
             return new ArrayList<>();
         }
@@ -66,4 +72,13 @@ public class CurrentUserService {
                 .map(menuService::convertToRoute)
                 .collect(Collectors.toList());
     }
+
+    public List<SysPortalDTO> currentUserPortals(){
+        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
+        List<SysPortalDTO> portals = userPortalService.findPortalsByUserId(currentUserId);
+        if (CollectionUtil.size(portals)==0) {
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"当前用户未设置门户信息");
+        }
+        return portals;
+    }
 }

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

@@ -59,9 +59,8 @@ public class SysTenantPackageMenuServiceImpl  extends ServiceImpl<SysTenantPacka
             );
             self.delCacheMenuIdByPackageId(packageId);
         });
-        //todo 可优化
-        sysRoles.forEach(role->menuService.delRoleMenusCache(role.getId()));
         this.saveBatch(packageMenus);
+        sysRoles.forEach(role->menuService.delRoleMenusCache(role.getId()));
     }
 
     @Override

+ 13 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java

@@ -6,6 +6,7 @@ import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
+import cn.tr.module.sys.user.dto.SysPortalMenuAssignDTO;
 import cn.tr.module.sys.user.dto.SysPortalMenuDTO;
 import cn.tr.module.sys.user.dto.SysPortalQueryDTO;
 import cn.tr.module.sys.user.service.ISysPortalMenuService;
@@ -19,6 +20,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @ClassName : SysPortalController
@@ -37,8 +39,16 @@ public class SysPortalController extends BaseController {
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "为门户分配菜单",notes = "权限: sys:portal:assign")
     @SaCheckPermission("sys:portal:assign")
-    public CommonResult<Boolean> selectList(@RequestBody List<SysPortalMenuDTO> source){
-        portalMenuService.assignPortalMenu(source);
+    public CommonResult<Boolean> selectList(@RequestBody@Validated SysPortalMenuAssignDTO source){
+        portalMenuService.assignPortalMenu(source.getMenuIds()
+                .stream()
+                .map(menuId->{
+                    SysPortalMenuDTO result = new SysPortalMenuDTO();
+                    result.setMenuId(menuId);
+                    result.setPortalId(source.getPortalId());
+                    return result;
+                })
+                .collect(Collectors.toList()));
         return CommonResult.success(true);
     }
 
@@ -82,7 +92,7 @@ public class SysPortalController extends BaseController {
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
         return CommonResult.success(portalService.deleteSysPortalByIds(ids));
     }
-    
+
 
     //todo 导出
 

+ 14 - 7
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysRoleController.java

@@ -6,10 +6,7 @@ import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.utils.TreeUtil;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
-import cn.tr.module.sys.user.dto.SysMenuDTO;
-import cn.tr.module.sys.user.dto.SysRoleDTO;
-import cn.tr.module.sys.user.dto.SysRoleMenuDTO;
-import cn.tr.module.sys.user.dto.SysRoleQueryDTO;
+import cn.tr.module.sys.user.dto.*;
 import cn.tr.module.sys.user.enums.RoleEnum;
 import cn.tr.module.sys.user.service.ISysMenuService;
 import cn.tr.module.sys.user.service.ISysRoleMenuService;
@@ -23,6 +20,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.constraints.NotNull;
 import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -41,7 +39,7 @@ public class SysRoleController extends BaseController {
     private final ISysRoleService roleService;
     private final ISysRoleMenuService roleMenuService;
 
-    @GetMapping("/menu/tree/{roleId}")
+    @GetMapping("/menu/list/{roleId}")
     @ApiOperation(value = "查询角色下的权限信息",notes = "权限: 无")
     public CommonResult<List<SysMenuDTO>> listMenu(@PathVariable("roleId") String roleId) {
         return CommonResult.success(roleMenuService.findAllMenuByRoleId(roleId));
@@ -60,8 +58,17 @@ public class SysRoleController extends BaseController {
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "为角色分配权限",notes = "权限: sys:role:assign")
     @SaCheckPermission("sys:role:assign")
-    public CommonResult<Boolean> selectList(@RequestBody List<SysRoleMenuDTO> source){
-        roleMenuService.assignRoleMenu(source);
+    public CommonResult<Boolean> selectList(@RequestBody@Validated SysRoleMenuAssignDTO source){
+        List<String> menuIds = source.getMenuIds();
+        roleMenuService.assignRoleMenu(menuIds
+                .stream()
+                .map(menuId->{
+                    SysRoleMenuDTO result = new SysRoleMenuDTO();
+                    result.setMenuId(menuId);
+                    result.setRoleId(source.getRoleId());
+                    return result;
+                })
+                .collect(Collectors.toList()));
         return CommonResult.success(true);
     }
 

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

@@ -6,6 +6,7 @@ import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import cn.tr.module.sys.user.dto.SysUserDTO;
+import cn.tr.module.sys.user.dto.SysUserEditDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
 import cn.tr.module.sys.user.service.ISysUserService;
 import cn.tr.plugin.mybatis.base.BaseController;
@@ -52,7 +53,7 @@ public class SysUserController extends BaseController {
     @ApiOperationSupport(author = "lf")
     @SaCheckPermission("sys:user:edit")
     @ApiOperation(value = "根据id更新用户",notes = "权限: sys:user:edit")
-    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysUserDTO source){
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysUserEditDTO source){
         return CommonResult.success(userService.updateSysUserById(source));
     }
 

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

@@ -37,6 +37,4 @@ public class SysPortalDTO  extends BaseDTO {
     @ApiModelProperty(value = "排序",required = true)
     private Integer sort;
 
-    @ApiModelProperty(value = "是否启用 0、启用 1、关闭",required = true)
-    private Boolean disable;
 }

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

@@ -0,0 +1,21 @@
+package cn.tr.module.sys.user.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @ClassName : SysRoleMenuAssignDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月11日
+ */
+@Data
+public class SysPortalMenuAssignDTO {
+    @NotNull(message = "门户id不能为空")
+    private String portalId;
+
+    @NotNull(message = "菜单id不能为空")
+    private List<String> menuIds;
+}

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

@@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 /**
@@ -23,8 +22,4 @@ public class SysPortalQueryDTO implements Serializable {
     @ApiModelProperty(value = "门户名称")
     private String portalName;
 
-    @ApiModelProperty(value = "是否启用 0、启用 1、关闭")
-    private Boolean disable;
-
-
 }

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

@@ -0,0 +1,20 @@
+package cn.tr.module.sys.user.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.*;
+/**
+ * @ClassName : SysRoleMenuAssignDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月11日
+ */
+@Data
+public class SysRoleMenuAssignDTO {
+    @NotNull(message = "角色id不能为空")
+    private String roleId;
+
+    @NotNull(message = "菜单id不能为空")
+    private List<String> menuIds;
+}

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

@@ -12,6 +12,7 @@ import lombok.EqualsAndHashCode;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.List;
 import java.util.Set;
 
 /**

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

@@ -0,0 +1,82 @@
+package cn.tr.module.sys.user.dto;
+
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.module.sys.user.enums.UserStatusEnum;
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * @ClassName : SysUserEditDTO
+ * @Description : 系统用户修改、新增实体类
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Data
+public class SysUserEditDTO implements Serializable {
+
+    @ApiModelProperty(value = "用户id")
+    @NotNull(message = "用户id不能为空",groups = {Update.class})
+    private String id;
+
+    @ApiModelProperty(value = "用户名",required = true)
+    @NotNull(message = "用户名不能为空",groups = {Update.class,Insert.class})
+    private String username;
+
+    @ApiModelProperty(value = "昵称")
+    @NotNull(message = "昵称不能为空",groups = {Update.class,Insert.class})
+    private String nickname;
+
+    @ApiModelProperty("密码")
+    @NotNull(message = "昵称不能为空",groups = {Insert.class})
+    private String password;
+
+    @ApiModelProperty("角色id")
+    @NotNull(message = "角色不能为空",groups = {Insert.class,Update.class})
+    private Set<String> roleIds;
+
+    @ApiModelProperty(value = "性别")
+    @NotNull(message = "性别不能为空",groups = {Insert.class,Update.class})
+    private String gender;
+
+    @ApiModelProperty(value = "组织部门id")
+    @NotEmpty(message = "组织部门不能为空",groups = {Insert.class, Update.class})
+    private String orgId;
+
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "邮箱地址")
+    private String email;
+
+    @ApiModelProperty(value = "出生日期")
+    private Date birthday;
+
+    @ApiModelProperty(value = "岗位id")
+    private String postIds;
+
+
+    @ApiModelProperty(value = "用户头像")
+    private String avatar;
+
+    /**
+     * {@link UserStatusEnum#getValue()}
+     */
+    @ApiModelProperty(value = "用户状态",required = true)
+    @NotEmpty(message = "用户状态不能为空",groups = {Insert.class, Update.class})
+    private String status;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+}

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

@@ -0,0 +1,24 @@
+package cn.tr.module.sys.user.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @ClassName : SysUserPortalDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月04日
+ */
+@Data
+public class SysUserPortalDTO {
+    private String id;
+
+    @ApiModelProperty(value = "门户id",required = true)
+    private String portalId;
+
+    @ApiModelProperty(value = "用户id",required = true)
+    private String userId;
+
+    @ApiModelProperty(value = "是否为默认门户",required = true)
+    private Boolean isDefault;
+}

+ 15 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/enums/PortalEnum.java

@@ -0,0 +1,15 @@
+package cn.tr.module.sys.user.enums;
+
+/**
+ * @ClassName : RoleEnum
+ * @Description : 角色类型
+ * @Author : LF
+ * @Date: 2023年04月05日
+ */
+
+public enum PortalEnum {
+    //系统类型
+    sys,
+    //自定义类型
+    custom
+}

+ 0 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysMenuPO.java

@@ -6,8 +6,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.ToString;
 
-import java.io.Serializable;
-
 /**
  * 菜单对象 sys_menu
  *

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

@@ -18,7 +18,7 @@ import java.util.List;
  * @Date: 2023年04月03日
  */
 @Data
-@TableName("sys_protal")
+@TableName("sys_portal")
 public class SysPortalPO extends TenantPO {
     @TableId
     @Comment("门户id")
@@ -44,6 +44,4 @@ public class SysPortalPO extends TenantPO {
     @Comment("排序")
     private Integer sort;
 
-    @Comment("是否启用 0、启用 1、关闭")
-    private Boolean disable;
 }

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPO.java

@@ -3,13 +3,14 @@ package cn.tr.module.sys.user.po;
 import cn.tr.core.annotation.ColumnDefaultValue;
 import cn.tr.core.annotation.Comment;
 import cn.tr.module.sys.user.enums.UserStatusEnum;
+import cn.tr.plugin.mybatis.config.handler.StringListTypeHandler;
 import cn.tr.plugin.mybatis.pojo.TenantPO;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.apache.ibatis.type.JdbcType;
 import java.util.Date;
-
+import java.util.*;
 /**
  * @ClassName : SysUserPO
  * @Description : 系统用户实体类
@@ -75,7 +76,6 @@ public class SysUserPO extends TenantPO {
     @Comment("最后登录时间")
     private Date lastLoginDate;
 
-
     @Comment("备注")
     private String remark;
 

+ 28 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPortalPO.java

@@ -0,0 +1,28 @@
+package cn.tr.module.sys.user.po;
+
+import cn.tr.core.annotation.Comment;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @ClassName : SysRoleMenuPO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月04日
+ */
+@Data
+@TableName("sys_user_portal")
+public class SysUserPortalPO {
+    @TableId
+    private String id;
+
+    @Comment("门户id")
+    private String portalId;
+
+    @Comment("用户id")
+    private String userId;
+
+    @Comment("是否为默认门户")
+    private Boolean isDefault;
+}

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

@@ -21,4 +21,11 @@ public interface SysMenuRepository extends BaseMapper<SysMenuPO> {
      * @return
      */
     List<SysMenuPO> findAllMenuByRoleId(@Param("roleId") String roleId);
+
+    /**
+     * 根据门户id查询所有的菜单信息
+     * @param portalId
+     * @return
+     */
+    List<SysMenuPO> findAllMenuByPortalId(String portalId);
 }

+ 0 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysPortalMenuRepository.java

@@ -1,11 +1,9 @@
 package cn.tr.module.sys.user.repository;
 
 import cn.tr.module.sys.user.po.SysPortalMenuPO;
-import cn.tr.module.sys.user.po.SysRoleMenuPO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
-
 /**
  * @ClassName : SysRoleMenuRepository
  * @Description :
@@ -15,5 +13,4 @@ import org.springframework.stereotype.Repository;
 @Mapper
 @Repository
 public interface SysPortalMenuRepository extends BaseMapper<SysPortalMenuPO> {
-
 }

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

@@ -0,0 +1,22 @@
+package cn.tr.module.sys.user.repository;
+
+import cn.tr.module.sys.user.po.SysPortalPO;
+import cn.tr.module.sys.user.po.SysUserPortalPO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import java.util.*;
+/**
+ * @ClassName : SysRoleMenuRepository
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+@Mapper
+@Repository
+public interface SysUserPortalRepository extends BaseMapper<SysUserPortalPO> {
+
+    List<SysPortalPO> findPortalsByUserId(@Param("userId") String userId);
+
+}

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

@@ -1,6 +1,10 @@
 package cn.tr.module.sys.user.service;
 
+import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysPortalMenuDTO;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+
 import java.util.List;
 
 /**
@@ -18,4 +22,22 @@ public interface ISysPortalMenuService {
      * @return
      */
     void assignPortalMenu(List<SysPortalMenuDTO> source);
+
+    /**
+     * 找到所给门户下的所有菜单
+     * @param portalId
+     * @return
+     */
+    @Cacheable(value = "sys:portal:menu",key = "#portalId")
+    List<SysMenuDTO> findAllMenusByPortalId(String portalId);
+
+    /**
+     * 删除门户菜单缓存
+     * {@link ISysPortalMenuService#assignPortalMenu(List)} (List)} /
+     * @param portalId
+     */
+    @CacheEvict(value = "sys:portal:menu",key = "#portalId")
+    default void delMenusByPortalId(String portalId){
+
+    };
 }

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

@@ -0,0 +1,39 @@
+package cn.tr.module.sys.user.service;
+
+import cn.tr.module.sys.user.dto.SysPortalDTO;
+import cn.tr.module.sys.user.dto.SysUserPortalDTO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @ClassName : ISysUserPortalService
+ * @Description : 用户门户关联关系
+ * @Author : LF
+ * @Date: 2023年03月31日
+ */
+
+public interface ISysUserPortalService {
+
+    /**
+     * 为用户分配角色
+     * @param source 角色门户关联信息
+     * @return
+     */
+    void assignUserPortal(List<SysUserPortalDTO> source);
+
+    /**
+     * 通过用户id找到该用户的所有门户
+     * @param userId
+     * @return
+     */
+    List<SysPortalDTO> findPortalsByUserId(String userId);
+
+    /**
+     * 找到持有当前所给门户id的用户id
+     * @param portalIds
+     * @return
+     */
+    Set<String> findUserIdsByPortalId(Collection<String> portalIds);
+}

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

@@ -1,5 +1,6 @@
 package cn.tr.module.sys.user.service;
 import cn.tr.module.sys.user.dto.SysUserDTO;
+import cn.tr.module.sys.user.dto.SysUserEditDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
 import cn.tr.plugin.security.bo.UserLoginInfoBO;
 
@@ -31,7 +32,7 @@ public interface ISysUserService {
      * @param source 更新用户
      * @return true:更新成功
      */
-    boolean updateSysUserById(SysUserDTO source);
+    boolean updateSysUserById(SysUserEditDTO source);
 
     /**
      * 根据用户名查询

+ 42 - 8
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysPortalMenuServiceImpl.java

@@ -1,18 +1,26 @@
 package cn.tr.module.sys.user.service.impl;
 
+import cn.hutool.core.util.StrUtil;
+import cn.tr.module.sys.mapper.user.SysMenuMapper;
 import cn.tr.module.sys.mapper.user.SysPortalMenuMapper;
+import cn.tr.module.sys.tenant.service.ISysTenantService;
+import cn.tr.module.sys.user.dto.SysMenuDTO;
+import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysPortalMenuDTO;
+import cn.tr.module.sys.user.enums.PortalEnum;
 import cn.tr.module.sys.user.po.SysPortalMenuPO;
+import cn.tr.module.sys.user.repository.SysMenuRepository;
 import cn.tr.module.sys.user.repository.SysPortalMenuRepository;
 import cn.tr.module.sys.user.service.ISysPortalMenuService;
+import cn.tr.module.sys.user.service.ISysPortalService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -22,17 +30,43 @@ import java.util.stream.Collectors;
  * @Date: 2023年04月09日
  */
 @Service
-@AllArgsConstructor
 public class SysPortalMenuServiceImpl extends ServiceImpl<SysPortalMenuRepository, SysPortalMenuPO> implements ISysPortalMenuService {
+    @Autowired
+    @Lazy
+    private ISysPortalMenuService portalMenuService;
+
+    @Autowired
+    @Lazy
+    private ISysPortalService portalService;
+
+    @Autowired
+    private SysMenuRepository menuRepository;
+
+    @Autowired
+    @Lazy
+    private ISysTenantService tenantService;
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void assignPortalMenu(List<SysPortalMenuDTO> source) {
         List<SysPortalMenuPO> portalMenus = SysPortalMenuMapper.INSTANCE.toSysPortalMenuPOList(source);
-        Map<String, List<SysPortalMenuPO>> collect = portalMenus.stream()
+        Map<String, List<SysPortalMenuPO>> portalIdMap = portalMenus.stream()
                 .collect(Collectors.groupingBy(SysPortalMenuPO::getPortalId));
-        collect.forEach((portalId,relations)->{
-            baseMapper.delete(new LambdaQueryWrapper<SysPortalMenuPO>().eq(SysPortalMenuPO::getPortalId,portalId));
-        });
+        baseMapper.delete(new LambdaQueryWrapper<SysPortalMenuPO>().in(SysPortalMenuPO::getPortalId,portalIdMap.keySet()));
         saveBatch(portalMenus);
+        portalIdMap.forEach((portalId,relations)->{
+            portalMenuService.delMenusByPortalId(portalId);
+        });
+    }
+
+    @Override
+    public List<SysMenuDTO> findAllMenusByPortalId(String portalId) {
+        SysPortalDTO portal = portalService.selectSysPortalById(portalId);
+        if (Objects.isNull(portal)) {
+            return new ArrayList<>();
+        }
+        if(StrUtil.equals(portal.getType(), PortalEnum.sys.name())){
+            return new ArrayList<>(tenantService.currentTenantMenus());
+        }
+        return SysMenuMapper.INSTANCE.toSysMenuDTOList(menuRepository.findAllMenuByPortalId(portalId));
     }
 }

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

@@ -1,13 +1,20 @@
 package cn.tr.module.sys.user.service.impl;
 
-import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.mapper.user.SysPortalMapper;
 import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysPortalQueryDTO;
+import cn.tr.module.sys.user.enums.PortalEnum;
+import cn.tr.module.sys.user.po.SysPortalMenuPO;
 import cn.tr.module.sys.user.po.SysPortalPO;
+import cn.tr.module.sys.user.repository.SysPortalMenuRepository;
 import cn.tr.module.sys.user.repository.SysPortalRepository;
+import cn.tr.module.sys.user.repository.SysUserPortalRepository;
 import cn.tr.module.sys.user.service.ISysPortalService;
+import cn.tr.module.sys.user.service.ISysUserPortalService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -25,12 +32,17 @@ import java.util.*;
 public class SysPortalServiceImpl implements ISysPortalService {
     @Autowired
     private SysPortalRepository portalRepository;
+
+    @Autowired
+    private SysPortalMenuRepository portalMenuRepository;
+
+    @Autowired
+    private ISysUserPortalService userPortalService;
     @Override
     public List<SysPortalDTO> selectSysPortalList(SysPortalQueryDTO query) {
         return SysPortalMapper.INSTANCE.toSysPortalDTOList(portalRepository.selectList(new LambdaQueryWrapper<SysPortalPO>()
                 .like(StrUtil.isNotEmpty(query.getPortalCode()),SysPortalPO::getCode,query.getPortalCode())
                 .like(StrUtil.isNotEmpty(query.getPortalName()),SysPortalPO::getName,query.getPortalName())
-                .eq(ObjectUtil.isNotNull(query.getDisable()),SysPortalPO::getDisable,query.getDisable())
         ));
     }
 
@@ -42,17 +54,57 @@ public class SysPortalServiceImpl implements ISysPortalService {
 
     @Override
     public boolean updateSysPortalById(SysPortalDTO source) {
-        return portalRepository.updateById( SysPortalMapper.INSTANCE.toSysPortalPO(source))!=0;
+        SysPortalPO po = SysPortalMapper.INSTANCE.toSysPortalPO(source);
+        validatePortalSource(po);
+        return portalRepository.updateById(po)!=0;
     }
 
     @Override
     @Transactional
     public boolean insertSysPortal(SysPortalDTO source) {
-        return portalRepository.insert(SysPortalMapper.INSTANCE.toSysPortalPO(source))!=0;
+        SysPortalPO po = SysPortalMapper.INSTANCE.toSysPortalPO(source);
+        validatePortalSource(po);
+        return portalRepository.insert(po)!=0;
     }
 
     @Override
     public int deleteSysPortalByIds(Collection<String> ids) {
-        return portalRepository.deleteBatchIds(ids);
+        List<SysPortalPO> portals = portalRepository.selectBatchIds(ids);
+        for (SysPortalPO portal : portals) {
+            if (StrUtil.equals(portal.getType(), PortalEnum.sys.name())) {
+                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统门户进行操作");
+            }
+        }
+        Set<String> userIds = userPortalService.findUserIdsByPortalId(ids);
+        if(CollectionUtil.isNotEmpty(userIds)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"所选门户已与用户关联,无法删除");
+        }
+        int result = portalRepository.deleteBatchIds(ids);
+        if(result!=0){
+            portalMenuRepository.delete(new LambdaQueryWrapper<SysPortalMenuPO>().in(SysPortalMenuPO::getPortalId,ids));
+        }
+        return result;
+    }
+
+
+    private void validatePortalSource(SysPortalPO source){
+        SysPortalPO role = portalRepository.selectOne(new LambdaQueryWrapper<SysPortalPO>()
+                .eq(SysPortalPO::getCode, source.getCode())
+                .last("limit 1"));
+        if(role!=null&& StrUtil.equals(role.getId(),source.getId())){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,String.format("门户编码{%s}不能重复",source.getCode()));
+        }
+        if(StrUtil.equals(source.getType(), PortalEnum.sys.name())){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统级门户进行操作");
+        }
+        if(StrUtil.isNotEmpty(source.getId())){
+            SysPortalPO sysRolePO = portalRepository.selectById(source.getId());
+            if(sysRolePO==null){
+                return;
+            }
+            if(StrUtil.equals(sysRolePO.getType(), PortalEnum.sys.name())){
+                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统角色进行操作");
+            }
+        }
     }
 }

+ 4 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysRoleMenuServiceImpl.java

@@ -52,13 +52,16 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuRepository,Sy
         Map<String, List<SysRoleMenuPO>> roleIdMap = roleMenus.stream()
                 .collect(Collectors.groupingBy(SysRoleMenuPO::getRoleId));
         baseMapper.delete(new LambdaQueryWrapper<SysRoleMenuPO>().in(SysRoleMenuPO::getRoleId,roleIdMap.keySet()));
-        roleIdMap.keySet().forEach(self::delRoleMenusCache);
         saveBatch(roleMenus);
+        roleIdMap.keySet().forEach(self::delRoleMenusCache);
     }
 
     @Override
     public List<SysMenuDTO> findAllMenuByRoleId(String roleId) {
         SysRoleDTO roleDTO = roleService.selectSysRoleById(roleId);
+        if (Objects.isNull(roleDTO)) {
+            return new ArrayList<>();
+        }
         if(StrUtil.equals(roleDTO.getType(), RoleEnum.sys.name())){
             //当前租户的所有菜单
             return new ArrayList<>(tenantService.currentTenantMenus());

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

@@ -6,15 +6,13 @@ import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.mapper.user.SysRoleMapper;
-import cn.tr.module.sys.tenant.service.ISysTenantService;
-import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysRoleDTO;
 import cn.tr.module.sys.user.dto.SysRoleQueryDTO;
 import cn.tr.module.sys.user.enums.RoleEnum;
+import cn.tr.module.sys.user.po.SysRoleMenuPO;
 import cn.tr.module.sys.user.po.SysRolePO;
+import cn.tr.module.sys.user.repository.SysRoleMenuRepository;
 import cn.tr.module.sys.user.repository.SysRoleRepository;
-import cn.tr.module.sys.user.service.ISysMenuService;
-import cn.tr.module.sys.user.service.ISysRoleMenuService;
 import cn.tr.module.sys.user.service.ISysRoleService;
 import cn.tr.module.sys.user.service.ISysUserRoleService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -24,7 +22,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @ClassName : SysRoleServiceImpl
@@ -41,11 +38,15 @@ public class SysRoleServiceImpl implements ISysRoleService {
     @Lazy
     private ISysUserRoleService userRoleService;
 
+    @Autowired
+    private SysRoleMenuRepository roleMenuRepository;
+
     @Override
     public List<SysRoleDTO> selectSysRoleList(SysRoleQueryDTO query) {
         return SysRoleMapper.INSTANCE.toSysRoleDTOList(roleRepository.selectList(new LambdaQueryWrapper<SysRolePO>()
                 .like(StrUtil.isNotEmpty(query.getRoleCode()),SysRolePO::getCode,query.getRoleCode())
                 .like(StrUtil.isNotEmpty(query.getRoleName()),SysRolePO::getName,query.getRoleName())
+                .eq(StrUtil.isNotEmpty(query.getType()),SysRolePO::getType,query.getType())
                 .eq(ObjectUtil.isNotNull(query.getDisable()),SysRolePO::getDisable,query.getDisable())
         ));
     }
@@ -81,6 +82,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int deleteSysRoleByIds(Collection<String> ids) {
         List<SysRolePO> roles = roleRepository.selectBatchIds(ids);
         for (SysRolePO role : roles) {
@@ -92,7 +94,11 @@ public class SysRoleServiceImpl implements ISysRoleService {
         if(CollectionUtil.isNotEmpty(userIds)){
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"所选角色已与用户关联,无法删除");
         }
-        return roleRepository.deleteBatchIds(ids);
+        int result = roleRepository.deleteBatchIds(ids);
+        if(result!=0){
+            roleMenuRepository.delete(new LambdaQueryWrapper<SysRoleMenuPO>().in(SysRoleMenuPO::getRoleId,ids));
+        }
+        return result;
     }
 
     private void validateRoleSource(SysRolePO source){

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

@@ -0,0 +1,60 @@
+package cn.tr.module.sys.user.service.impl;
+
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.mapper.user.SysPortalMapper;
+import cn.tr.module.sys.mapper.user.SysUserPortalMapper;
+import cn.tr.module.sys.user.dto.SysPortalDTO;
+import cn.tr.module.sys.user.dto.SysUserPortalDTO;
+import cn.tr.module.sys.user.po.SysUserPortalPO;
+import cn.tr.module.sys.user.repository.SysUserPortalRepository;
+import cn.tr.module.sys.user.service.ISysUserPortalService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : SysUserPortalServiceImpl
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月10日
+ */
+@Service
+public class SysUserPortalServiceImpl extends ServiceImpl<SysUserPortalRepository, SysUserPortalPO> implements ISysUserPortalService {
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void assignUserPortal(List<SysUserPortalDTO> source) {
+        long count = source.stream()
+                .filter(userPortal -> Boolean.TRUE.equals(userPortal.getIsDefault()))
+                .count();
+        if(count==0){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"当前用户未设置默认门户");
+        }
+        if(count>1){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"当前用户设置默认门户数量不能大于1");
+        }
+        List<SysUserPortalPO> userPortals = SysUserPortalMapper.INSTANCE.toSysUserPortalPOList(source);
+        Map<String, List<SysUserPortalPO>> userIdMap = userPortals.stream()
+                .collect(Collectors.groupingBy(SysUserPortalPO::getUserId));
+        baseMapper.delete(new LambdaQueryWrapper<SysUserPortalPO>().in(SysUserPortalPO::getUserId,userIdMap.keySet()));
+        saveBatch(userPortals);
+    }
+
+    @Override
+    public List<SysPortalDTO> findPortalsByUserId(String userId) {
+        return  SysPortalMapper.INSTANCE.toSysPortalDTOList( baseMapper.findPortalsByUserId(userId));
+    }
+
+    @Override
+    public Set<String> findUserIdsByPortalId(Collection<String> portalIds) {
+        List<SysUserPortalPO> userRoles = this.list(new LambdaQueryWrapper<SysUserPortalPO>().in(SysUserPortalPO::getPortalId, portalIds));
+        return userRoles.stream().map(SysUserPortalPO::getUserId).collect(Collectors.toSet());
+    }
+}

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

@@ -41,8 +41,8 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleRepository, S
         Map<String, List<SysUserRolePO>> userIdMap = userRoles.stream()
                 .collect(Collectors.groupingBy(SysUserRolePO::getUserId));
         baseMapper.delete(new LambdaQueryWrapper<SysUserRolePO>().in(SysUserRolePO::getUserId,userIdMap.keySet()));
-        userIdMap.keySet().forEach(self::delUserRoleCache);
         saveBatch(userRoles);
+        userIdMap.keySet().forEach(self::delUserRoleCache);
     }
 
     @Override

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

@@ -7,6 +7,7 @@ import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.utils.PswUtils;
 import cn.tr.module.sys.mapper.user.SysUserMapper;
 import cn.tr.module.sys.user.dto.SysUserDTO;
+import cn.tr.module.sys.user.dto.SysUserEditDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
 import cn.tr.module.sys.user.dto.SysUserRoleDTO;
 import cn.tr.module.sys.user.service.ISysUserRoleService;
@@ -18,6 +19,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+
+import javax.validation.constraints.NotNull;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -60,8 +63,12 @@ public class SysUserServiceImpl implements ISysUserService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean updateSysUserById(SysUserDTO source) {
-        boolean result=userRepository.updateById(SysUserMapper.INSTANCE.toUserPO(source))!=0;
+    public boolean updateSysUserById(SysUserEditDTO source) {
+        boolean result= true;
+        //角色更新 todo
+        Set<String> roleIds = source.getRoleIds();
+
+
         if(result){
             assignUserRole(source.getId(),source.getRoleIds());
         }
@@ -136,7 +143,7 @@ public class SysUserServiceImpl implements ISysUserService {
     }
 
 
-    private void assignUserRole(String userId, Set<String > roleIds){
+    private void assignUserRole(String userId, Set<String> roleIds){
         if(CollectionUtil.isEmpty(roleIds)){
             return;
         }

+ 6 - 0
tr-modules/tr-module-system/src/main/resources/mapper/user/SysMenuMapper.xml

@@ -13,4 +13,10 @@
     </select>
 
 
+    <select id="findAllMenuByPortalId" resultType="cn.tr.module.sys.user.po.SysMenuPO" parameterType="java.lang.String">
+            select m.*
+            from (select * from sys_portal where id=#{portalId}) as p
+            join sys_portal_menu  as pm on pm.portal_id=p.id
+            join sys_menu as m on m.id = pm.menu_id
+    </select>
 </mapper>

+ 16 - 0
tr-modules/tr-module-system/src/main/resources/mapper/user/SysUserPortalMapper.xml

@@ -0,0 +1,16 @@
+<?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.user.repository.SysUserPortalRepository">
+
+
+    <select id="findPortalsByUserId" resultType="cn.tr.module.sys.user.po.SysPortalPO">
+         select p.*
+            from (select * from sys_user where id=#{userId}) as u
+            join sys_user_portal  as up on up.user_id=u.id
+            join sys_portal as p on p.id = up.portal_id;
+    </select>
+
+
+</mapper>

+ 0 - 55
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/handler/ListTypeHandler.java

@@ -1,55 +0,0 @@
-package cn.tr.plugin.mybatis.handler;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.tr.core.utils.JsonUtils;
-import lombok.EqualsAndHashCode;
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-import org.apache.ibatis.type.MappedJdbcTypes;
-import org.apache.ibatis.type.MappedTypes;
-
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-@MappedJdbcTypes(JdbcType.VARCHAR)
-@MappedTypes({List.class})
-@EqualsAndHashCode(callSuper = true)
-public abstract class ListTypeHandler<T> extends BaseTypeHandler<List<T>> {
- 
-    @Override
-    public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
-        String content = CollUtil.isEmpty(parameter) ? null : JsonUtils.toJsonString(parameter);
-        ps.setString(i, content);
-    }
- 
-    @Override
-    public List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
-        return this.getListByJsonArrayString(rs.getString(columnName));
-    }
- 
-    @Override
-    public List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-        return this.getListByJsonArrayString(rs.getString(columnIndex));
-    }
- 
-    @Override
-    public List<T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
-        return this.getListByJsonArrayString(cs.getString(columnIndex));
-    } 
- 
-    private List<T> getListByJsonArrayString(String content) {
-        return StrUtil.isBlank(content) ? new ArrayList<>() : JsonUtils.parseArray(content, this.specificType());
-    }
- 
-    /**
-     * 具体类型,由子类提供
-     *
-     * @return 具体类型
-     */
-    protected abstract Class specificType();
-}

+ 0 - 15
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/handler/StringListTypeHandler.java

@@ -1,15 +0,0 @@
-package cn.tr.plugin.mybatis.handler;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName StringListTypeHandler.java
- * @Description TODO
- * @createTime 2022年08月20日 14:32:00
- */
-public class StringListTypeHandler extends ListTypeHandler<String> {
-    @Override
-    protected Class specificType() {
-        return String.class;
-    }
-}

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

@@ -17,7 +17,7 @@ spring:
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     driverClassName: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.100.32:3306/tr-footstone?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
+    url: jdbc:mysql://192.168.100.32:3306/tr-footstone?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&useInformationSchema=true
     username: root
     password: 123456
   redis: