From f09a13e31604641cf417d6f0a4566330521f5720 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 26 Mar 2024 17:53:29 +0800 Subject: [PATCH 001/130] =?UTF-8?q?feat(2227-commonDict):=20=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E5=85=B8=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/SaasCommonDictApi.java | 23 +++++++++++ .../client/model/req/CommonDictQueryReq.java | 26 ++++++++++++ .../tyr/client/model/res/CommonDictResp.java | 20 +++++++++ .../dict/SaasCommonDictController.java | 30 ++++++++++++++ .../repository/dao/SaasCommonDictDao.java | 19 +++++++++ .../repository/entity/SaasCommonDict.java | 41 +++++++++++++++++++ .../mapper/SaasCommonDictMapper.java | 16 ++++++++ .../server/service/SaasCommonDictService.java | 17 ++++++++ .../impl/SaasCommonDictServiceImpl.java | 41 +++++++++++++++++++ 9 files changed, 233 insertions(+) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasCommonDictDao.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasCommonDict.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasCommonDictMapper.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasCommonDictService.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java new file mode 100644 index 00000000..6bcc4ae7 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java @@ -0,0 +1,23 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author: chenwenjian + * @date: 2023/9/6 15:33 + * @description: 企业字典api + * @modifiedBy: + * @version: 1.0 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface SaasCommonDictApi { + + @PostMapping("/api/commonDict/query") + ApiResult query(@RequestBody CommonDictQueryReq req); + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java new file mode 100644 index 00000000..99d1c607 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java @@ -0,0 +1,26 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 通用字典查询请求参数 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/3/26 17:03 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CommonDictQueryReq { + + private String scope; + + private List keys; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java new file mode 100644 index 00000000..a1d1c0b9 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java @@ -0,0 +1,20 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 通用字典响应 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/3/26 17:04 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CommonDictResp { +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java new file mode 100644 index 00000000..f10f636d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java @@ -0,0 +1,30 @@ +package cn.axzo.tyr.server.controller.dict; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.SaasCommonDictApi; +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; +import cn.axzo.tyr.server.service.SaasCommonDictService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; + +/** + * 同用字典服务接口 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/3/26 17:37 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class SaasCommonDictController implements SaasCommonDictApi { + + private final SaasCommonDictService commonDictService; + + @Override + public ApiResult query(CommonDictQueryReq req) { + return ApiResult.ok(commonDictService.query(req)); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasCommonDictDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasCommonDictDao.java new file mode 100644 index 00000000..a182946d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasCommonDictDao.java @@ -0,0 +1,19 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.tyr.server.repository.entity.SaasCommonDict; +import cn.axzo.tyr.server.repository.mapper.SaasCommonDictMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 通用字典表 服务实现类 + *

+ * + * @author ZhanSiHu + * @since 2024-03-26 + */ +@Service +public class SaasCommonDictDao extends ServiceImpl { + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasCommonDict.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasCommonDict.java new file mode 100644 index 00000000..35e8136d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasCommonDict.java @@ -0,0 +1,41 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 通用字典表 + *

+ * + * @author ZhanSiHu + * @since 2024-03-26 + */ +@Getter +@Setter +@TableName("saas_common_dict") +public class SaasCommonDict extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 业务域 + */ + private String scope; + + /** + * 字典编码 + */ + private String dictCode; + + /** + * 字典值 + */ + private String dictValue; + + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasCommonDictMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasCommonDictMapper.java new file mode 100644 index 00000000..2fc186d0 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasCommonDictMapper.java @@ -0,0 +1,16 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasCommonDict; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 通用字典表 Mapper 接口 + *

+ * + * @author ZhanSiHu + * @since 2024-03-26 + */ +public interface SaasCommonDictMapper extends BaseMapper { + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasCommonDictService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasCommonDictService.java new file mode 100644 index 00000000..63e433e9 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasCommonDictService.java @@ -0,0 +1,17 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; + +import java.util.List; + +/** + * 通用字典服务 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/3/26 17:40 + */ +public interface SaasCommonDictService { + List query(CommonDictQueryReq req); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java new file mode 100644 index 00000000..e42dac9f --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java @@ -0,0 +1,41 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; +import cn.axzo.tyr.server.repository.dao.SaasCommonDictDao; +import cn.axzo.tyr.server.repository.entity.SaasCommonDict; +import cn.axzo.tyr.server.service.SaasCommonDictService; +import cn.hutool.core.collection.CollectionUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; + +/** + * 通用字典服务实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/3/26 17:40 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class SaasCommonDictServiceImpl implements SaasCommonDictService { + + private final SaasCommonDictDao commonDictDao; + + @Override + public List query(CommonDictQueryReq req) { + + List list = commonDictDao.lambdaQuery() + .list(); + if (CollectionUtil.isEmpty(list)) { + return Collections.emptyList(); + } + return BeanMapper.copyList(list, CommonDictResp.class); + } +} From 9bba45c4eda1af8724af4739db65ef3271cb1846 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 26 Mar 2024 17:54:44 +0800 Subject: [PATCH 002/130] =?UTF-8?q?feat(2227-commonDict):=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java | 4 +++- .../tyr/server/controller/dict/SaasCommonDictController.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java index 6bcc4ae7..c6cb6a55 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasCommonDictApi.java @@ -7,6 +7,8 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import java.util.List; + /** * @author: chenwenjian * @date: 2023/9/6 15:33 @@ -18,6 +20,6 @@ import org.springframework.web.bind.annotation.RequestBody; public interface SaasCommonDictApi { @PostMapping("/api/commonDict/query") - ApiResult query(@RequestBody CommonDictQueryReq req); + ApiResult> query(@RequestBody CommonDictQueryReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java index f10f636d..bc809cdc 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasCommonDictController.java @@ -9,6 +9,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** * 同用字典服务接口 * @@ -24,7 +26,7 @@ public class SaasCommonDictController implements SaasCommonDictApi { private final SaasCommonDictService commonDictService; @Override - public ApiResult query(CommonDictQueryReq req) { + public ApiResult> query(CommonDictQueryReq req) { return ApiResult.ok(commonDictService.query(req)); } } From b8aecba0d64d3ea6a431d1a736c2f4a45833c2bc Mon Sep 17 00:00:00 2001 From: zhansihu Date: Thu, 28 Mar 2024 09:39:37 +0800 Subject: [PATCH 003/130] =?UTF-8?q?feat(2227-commonDict):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java | 2 +- .../tyr/server/service/impl/SaasCommonDictServiceImpl.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java index 99d1c607..d4645605 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/CommonDictQueryReq.java @@ -22,5 +22,5 @@ public class CommonDictQueryReq { private String scope; - private List keys; + private List codes; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java index e42dac9f..5ca0695c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasCommonDictServiceImpl.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; +import java.util.Objects; /** * 通用字典服务实现 @@ -32,6 +33,8 @@ public class SaasCommonDictServiceImpl implements SaasCommonDictService { public List query(CommonDictQueryReq req) { List list = commonDictDao.lambdaQuery() + .eq(Objects.nonNull(req.getScope()), SaasCommonDict::getScope, req.getScope()) + .in(CollectionUtil.isNotEmpty(req.getCodes()), SaasCommonDict::getDictCode, req.getCodes()) .list(); if (CollectionUtil.isEmpty(list)) { return Collections.emptyList(); From 6cf46dba73ad44d7ce1a0446b8a6531f924d4ede Mon Sep 17 00:00:00 2001 From: zhansihu Date: Sun, 7 Apr 2024 09:38:37 +0800 Subject: [PATCH 004/130] =?UTF-8?q?feat(2227-syncFeature):=20feature?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/FeatureResourceType.java | 48 ++++++ .../tyr/client/feign/FeatureResourceApi.java | 31 ++++ .../client/model/res/FeatureResourceDTO.java | 139 +++++++++++++++++ .../model/res/FeatureResourceTreeNode.java | 45 ++++++ .../permission/FeatureResourceController.java | 46 ++++++ .../inner/feign/BaseFeatureResourceApi.java | 25 +++ .../axzo/tyr/server/inner/package-info.java | 8 + .../dao/SaasFeatureResourceDao.java | 22 +++ .../entity/SaasFeatureResource.java | 144 ++++++++++++++++++ .../mapper/SaasFeatureResourceMapper.java | 16 ++ .../service/SaasFeatureResourceService.java | 20 +++ .../impl/SaasFeatureResourceServiceImpl.java | 105 +++++++++++++ 12 files changed, 649 insertions(+) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDTO.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/inner/package-info.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasFeatureResource.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java new file mode 100644 index 00000000..79030a5d --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java @@ -0,0 +1,48 @@ +package cn.axzo.tyr.client.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 功能资源类型 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 11:35 + */ +@Getter +@AllArgsConstructor +public enum FeatureResourceType { + + MENU(1, "菜单"), + PAGE(2, "页面"), + APP_ENTRY(3, "应用入口"), + COMPONENT(4, "组件"), + ; + + private static final Map MAPPING = new HashMap<>(); + + static { + Arrays.stream(FeatureResourceType.values()).forEach(t -> MAPPING.put(t.code, t)); + } + + private final Integer code; + + private final String desc; + + public FeatureResourceType getByCode(Integer code) { + return MAPPING.get(code); + } + + public boolean apply(Integer code) { + return this.code.equals(code); + } + + public static boolean applyPage(Integer code) { + return PAGE.apply(code) || APP_ENTRY.apply(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java new file mode 100644 index 00000000..8133f42a --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -0,0 +1,31 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 功能资源API接口 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 10:03 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface FeatureResourceApi { + + + /** 根据ID获取要同步的功能资源树详情 **/ + @PostMapping("/api/featureResource/sync/getTreeById") + ApiResult> getSyncTreeById(@RequestParam Long id); + + + /** 从基准环境同步接口功能资源 **/ + @PostMapping("/api/featureResource/sync/fromBase") + ApiResult syncFromBase(@RequestBody List ids); +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDTO.java new file mode 100644 index 00000000..59f67bca --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDTO.java @@ -0,0 +1,139 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; +import java.util.Date; + +/** + * 功能资源DTO + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 10:34 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class FeatureResourceDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** 主键ID **/ + private Long id; + + /** + * 资源编码-权限码 + */ + private String featureCode; + + /** + * 资源名称 + */ + private String featureName; + + /** + * 资源类型1-菜单 2-页面 3-应用入口 4-组件 + */ + private Integer featureType; + + /** + * 资源所属端 + */ + private String terminal; + + /** + * 组件细分类型 1-跳转子页面 2-跳转公共组件 3-弹出窗口 4-下拉项 5-操作按钮 6-数据卡片 7-站外跳转 + */ + private Integer componentType; + + /** + * 上级资源ID + */ + private Long parentId; + + /** + * 资源ID层级路径, 逗号分隔 + */ + private String path; + + /** + * 展示顺序 + */ + private Integer displayOrder; + + /** + * 资源状态 0-隐藏 1-展示 + */ + private Integer status; + + /** + * 资源图标 + */ + private String icon; + + /** + * 跳转类型 1-站内跳转 2-站外跳转 + */ + private Integer redirectType; + + /** + * 资源跳转URI + */ + private String linkUrl; + + /** + * 路由类型1-PC 2-小程序 3-原生 + */ + private Integer linkType; + + /** + * APP适配参数 + */ + private String linkExt; + + /** + * 小程序id + */ + private Integer appItemId; + + /** + * 资源同步版本 + */ + private Integer syncVersion; + + /** + * 扩展字段 + */ + private String extra; + + /** + * 授权类型0-全部角色 1-指定角色 + */ + private Integer authType; + + /** + * 子级鉴权类型 0-不鉴权1-鉴权 + */ + private Integer subAuthType; + + /** 创建时间 **/ + private Date createAt; + /** 更新时间 **/ + private Date updateAt; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 更新人 + */ + private Long updateBy; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java new file mode 100644 index 00000000..2104c4b7 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java @@ -0,0 +1,45 @@ +package cn.axzo.tyr.client.model.res; + +import cn.axzo.basics.common.model.IBaseTree; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +/** + * 功能资源树形节点 + * 全属性 复用需要注意 + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 17:00 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBaseTree { + + private List children; + + @Override + public Long getNodeCode() { + return super.getId(); + } + + @Override + public Long getParentNodeCode() { + return super.getParentId(); + } + + @Override + public List getNodeChildren() { + return this.children; + } + + @Override + public void setNodeChildren(List nodeChildren) { + this.children = nodeChildren; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java new file mode 100644 index 00000000..7e9dd883 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -0,0 +1,46 @@ +package cn.axzo.tyr.server.controller.permission; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.FeatureResourceApi; +import cn.axzo.tyr.client.model.res.FeatureResourceDTO; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.hutool.core.collection.CollectionUtil; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collections; +import java.util.List; + +/** + * 功能资源接口实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 10:06 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class FeatureResourceController implements FeatureResourceApi { + + private SaasFeatureResourceService featureResourceService; + + @Override + public ApiResult> getSyncTreeById(Long id) { + return ApiResult.ok(featureResourceService.getSyncTreeById(id)); + } + + @Override + public ApiResult syncFromBase(List ids) { + + if (CollectionUtil.isEmpty(ids)) { + log.warn("no ids to sync from base env"); + return ApiResult.ok(); + } + featureResourceService.syncFromBase(ids); + return ApiResult.ok(); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java new file mode 100644 index 00000000..84787030 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java @@ -0,0 +1,25 @@ +package cn.axzo.tyr.server.inner.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 基准环境功能资源接口 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 10:25 + */ +@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:https://pre-api.axzo.cn/tyr}") +public interface BaseFeatureResourceApi { + + + /** 从基准环境同步接口功能资源 - 批量限制20条 **/ + @PostMapping("/api/featureResource/sync/getTreeById") + ApiResult> getSyncTreeById(@RequestParam Long id); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/package-info.java new file mode 100644 index 00000000..4e34cb5b --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/package-info.java @@ -0,0 +1,8 @@ +/** + * 不对外提供的接口调用feign封装 + * + * @author: ZhanSiHu + * @date: 2024/4/3 10:24 + * @version V1.0 + */ +package cn.axzo.tyr.server.inner; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java new file mode 100644 index 00000000..618cd184 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java @@ -0,0 +1,22 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import cn.axzo.tyr.server.repository.mapper.SaasFeatureResourceMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +/** + *

+ * 功能资源表 服务实现类 + *

+ * + * @author AXZO + * @since 2024-04-03 + */ +@Repository +public class SaasFeatureResourceDao extends ServiceImpl { + + public SaasFeatureResource getByCode(String featureCode) { + return this.lambdaQuery().eq(SaasFeatureResource::getFeatureCode, featureCode).one(); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasFeatureResource.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasFeatureResource.java new file mode 100644 index 00000000..0a08b04a --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasFeatureResource.java @@ -0,0 +1,144 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 功能资源表 + *

+ * + * @author AXZO + * @since 2024-04-03 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("saas_feature_resource") +public class SaasFeatureResource extends BaseEntity { + + private static final long serialVersionUID = 1L; + + + /** + * 资源编码-权限码 + */ + private String featureCode; + + /** + * 资源名称 + */ + private String featureName; + + /** + * 资源类型1-菜单 2-页面 3-应用入口 4-组件 + */ + private Integer featureType; + + /** + * 资源所属端 + */ + private String terminal; + + /** + * 组件细分类型 1-跳转子页面 2-跳转公共组件 3-弹出窗口 4-下拉项 5-操作按钮 6-数据卡片 7-站外跳转 + */ + private Integer componentType; + + /** + * 上级资源ID + */ + private Long parentId; + + /** + * 资源ID层级路径, 逗号分隔 + */ + private String path; + + /** + * 展示顺序 + */ + private Integer displayOrder; + + /** + * 资源状态 0-隐藏 1-展示 + */ + private Integer status; + + /** + * 资源图标 + */ + private String icon; + + /** + * 跳转类型 1-站内跳转 2-站外跳转 + */ + private Integer redirectType; + + /** + * 资源跳转URI + */ + private String linkUrl; + + /** + * 路由类型1-PC 2-小程序 3-原生 + */ + private Integer linkType; + + /** + * APP适配参数 + */ + private String linkExt; + + /** + * 小程序id + */ + private Integer appItemId; + + /** + * 资源同步版本 + */ + private Integer syncVersion; + + /** + * 扩展字段 + */ + private String extra; + + /** + * 授权类型0-全部角色 1-指定角色 + */ + private Integer authType; + + /** + * 子级鉴权类型 0-不鉴权1-鉴权 + */ + private Integer subAuthType; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 更新人 + */ + private Long updateBy; + + public List splitPath() { + if (StrUtil.isBlank(this.path)) { + return Collections.emptyList(); + } + return StrUtil.split(this.path, ",").stream().map(Long::valueOf).collect(Collectors.toList()); + } + + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java new file mode 100644 index 00000000..cae6288d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java @@ -0,0 +1,16 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 功能资源表 Mapper 接口 + *

+ * + * @author AXZO + * @since 2024-04-03 + */ +public interface SaasFeatureResourceMapper extends BaseMapper { + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java new file mode 100644 index 00000000..edbd3bd1 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -0,0 +1,20 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.res.FeatureResourceDTO; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; + +import java.util.List; + +/** + * 功能资源服务 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 10:17 + */ +public interface SaasFeatureResourceService { + + List getSyncTreeById(Long id); + + void syncFromBase(List ids); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java new file mode 100644 index 00000000..3dd9373b --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -0,0 +1,105 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.util.TreeUtil; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.res.FeatureResourceDTO; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi; +import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.util.RpcInternalUtil; +import cn.hutool.core.collection.CollectionUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 功能资源服务实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 10:18 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceService { + + private final SaasFeatureResourceDao featureResourceDao; + + private final BaseFeatureResourceApi baseFeatureResourceApi; + + @Override + public List getSyncTreeById(Long id) { + //选中同步的数据 + SaasFeatureResource resource = featureResourceDao.lambdaQuery() + .eq(SaasFeatureResource::getId, id) + .one(); + if (resource == null) { + return Collections.emptyList(); + } + //找到所有上级 - 包含自己? + List resourceList = featureResourceDao.lambdaQuery() + .in(SaasFeatureResource::getId, resource.splitPath()) + .list(); + //resourceList.add(resource); + //如果是页面或应用入口-同时返回所有页面组件 + if (FeatureResourceType.applyPage(resource.getFeatureType())) { + List componentList = featureResourceDao.lambdaQuery() + .eq(SaasFeatureResource::getFeatureCode, FeatureResourceType.COMPONENT.getCode()) + .apply("FIND_IN_SET(" + id + ", path)") + .list(); + resourceList.addAll(componentList); + } + List dtoList = BeanMapper.copyList(resourceList, FeatureResourceTreeNode.class); + return TreeUtil.buildTree(dtoList); + } + + @Override + public void syncFromBase(List ids) { + final Map idCache = new HashMap<>(); + final Map codeCache = new ConcurrentHashMap<>(); + for (Long id : ids) { + doSyncFromBase(id, idCache, codeCache); + } + } + + private void doSyncFromBase(Long id, Map idCache, Map codeCache) { + if (codeCache.containsKey(id)) { + //已处理过 + log.info("already sync resource:{}", id); + return; + } + List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), + "get sync tree by id", id).getData(); + for (FeatureResourceTreeNode treeNode : syncList) { + SaasFeatureResource resource = featureResourceDao.getByCode(treeNode.getFeatureCode()); + if (resource == null) { + syncInsert(treeNode, codeCache); + } else { + syncUpdate(resource, treeNode); + } + } + } + + private void syncUpdate(SaasFeatureResource resource, FeatureResourceTreeNode treeNode) { + + } + + private void syncInsert(FeatureResourceTreeNode treeNode, Map codeCache) { + SaasFeatureResource resource = BeanMapper.copyBean(treeNode, SaasFeatureResource.class); + //修正parent id 和path + String parentCode = codeCache.get(resource.getParentId()); + + } +} From 25a7888078a1ee4e08bd3adbabf8cadad807bfdf Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Sun, 7 Apr 2024 14:09:29 +0800 Subject: [PATCH 005/130] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 4 ++ .../model/base/BaseFeatureResourceDO.java | 35 +++++++++++ .../model/req/FeatureComponentSaveReq.java | 17 ++++++ .../model/req/FeatureResourceTreeQuery.java | 22 +++++++ .../model/req/FeatureResourceTreeSaveReq.java | 58 +++++++++++++++++++ .../permission/FeatureResourceController.java | 7 +++ 6 files changed, 143 insertions(+) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeQuery.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 8133f42a..a5426b29 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -28,4 +29,7 @@ public interface FeatureResourceApi { /** 从基准环境同步接口功能资源 **/ @PostMapping("/api/featureResource/sync/fromBase") ApiResult syncFromBase(@RequestBody List ids); + + @PostMapping("/api/featureResource/saveOrUpdate") + ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java new file mode 100644 index 00000000..366b97ef --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java @@ -0,0 +1,35 @@ +package cn.axzo.tyr.client.model.base; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class BaseFeatureResourceDO { + /** + * 资源ID 新增时为null,编辑时必传 + **/ + private Long id; + + /** 上级资源ID **/ + private Long parentId; + + /** 资源名称 **/ + private String featureName; + + /** 资源类型 1-菜单 2-页面 3-应用入口 4-组件 **/ + private Integer featureType; + + /** 资源编码 **/ + private String featureCode; + + /** 状态 0-隐藏 1-显示 **/ + private Integer status; + + /** 图标 **/ + private String icon; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java new file mode 100644 index 00000000..9800d7df --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java @@ -0,0 +1,17 @@ +package cn.axzo.tyr.client.model.req; + +import cn.axzo.tyr.client.model.base.BaseFeatureResourceDO; + +import java.util.List; + +public class FeatureComponentSaveReq extends BaseFeatureResourceDO { + + /** 子级是否需要鉴权 0-不鉴权 1-鉴权 **/ + private Integer subAuthType; + + /** 路由地址 **/ + private String linkUrl; + + /** 子级组件 **/ + private List children; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeQuery.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeQuery.java new file mode 100644 index 00000000..12ae685a --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeQuery.java @@ -0,0 +1,22 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FeatureResourceTreeQuery { + + /** 查询搜索关键字 **/ + private String keyword; + + /** 端 **/ + private String terminal; + + /** 展示状态 默认不传返回全部 0-隐藏 1-显示 **/ + private Integer status; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java new file mode 100644 index 00000000..01895ff8 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java @@ -0,0 +1,58 @@ +package cn.axzo.tyr.client.model.req; + +import cn.axzo.tyr.client.model.base.BaseFeatureResourceDO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class FeatureResourceTreeSaveReq extends BaseFeatureResourceDO { + + /** 跳转类型 1-站内跳转 2-站外跳转 **/ + private Integer redirectType; + + /** 路由地址 **/ + private String linkUrl; + + /** 路由类型 1-PC 2-小程序 3-原生 **/ + private Integer linkType; + + /** APP适配参数 **/ + private String linkExt; + + /** 小程序ID **/ + private Long appItemId; + + /** 授权类型 0-全部角色 1-指定角色 **/ + private Integer authType; + + /** 页面组件对象 **/ + private List componentSaveReqList; + + /** 页面及组件权限对象 **/ + private List permissions; + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class RolePermissionSaveReq { + + /** + * 角色ID + **/ + private Long roleId; + + /** + * 资源编码 + **/ + private List featureCode; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 7e9dd883..2d1573b3 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.server.controller.permission; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.FeatureResourceApi; +import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.service.SaasFeatureResourceService; @@ -43,4 +44,10 @@ public class FeatureResourceController implements FeatureResourceApi { featureResourceService.syncFromBase(ids); return ApiResult.ok(); } + + @Override + public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { + log.info("save feature resouce req : " + req.toString()); + return ApiResult.ok(); + } } From 51fdd3a0b1fd99f32fa24c44900a5930db11108f Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Sun, 7 Apr 2024 14:22:20 +0800 Subject: [PATCH 006/130] =?UTF-8?q?=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java | 1 - 1 file changed, 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java index a1d1c0b9..4d5d5746 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java @@ -14,7 +14,6 @@ import lombok.NoArgsConstructor; */ @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class CommonDictResp { } From f7d67dce2315712ef52f9008877a54330532c831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Sun, 7 Apr 2024 14:36:42 +0800 Subject: [PATCH 007/130] =?UTF-8?q?feat(2227-=E9=80=9A=E8=AE=AF=E5=BD=95):?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A=E4=B9=89=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=9F=A5=E8=AF=A2=EF=BC=8C=E4=BF=9D=E5=AD=98=E6=88=96?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=AA=E5=AE=9A=E4=B9=89=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/common/enums/RoleTypeEnum.java | 5 +- .../tyr/client/feign/TyrSaasRoleUserApi.java | 14 +- .../roleuser/dto/GetUserAutoOwnRoleResp.java | 32 ++++ .../roleuser/req/AutoOwnRoleUserReq.java | 69 ++++++++ .../roleuser/req/GetUserAutoOwnRoleReq.java | 38 +++++ .../roleuser/RoleUserController.java | 12 ++ .../server/service/SaasRoleUserService.java | 13 ++ .../server/service/impl/RoleUserService.java | 149 +++++++++++++++--- 8 files changed, 303 insertions(+), 29 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/GetUserAutoOwnRoleResp.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/AutoOwnRoleUserReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/GetUserAutoOwnRoleReq.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java index ec0f621a..ea30834b 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java @@ -18,11 +18,12 @@ import java.util.stream.Collectors; @AllArgsConstructor public enum RoleTypeEnum { - //角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 + //角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 auto_own自定义角色(禁止删除)<承载向用户单独分配的自定义权限> COMMON("common", "普通角色",false), SUPER_ADMIN("super_admin", "超级管理员",true), ADMIN("admin", "子管理员",true), - INIT("init", "初始化内置角色",false); + INIT("init", "初始化内置角色",false), + AUTO_OWN("auto_own", "自定义角色",false); @EnumValue private final String value; diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleUserApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleUserApi.java index 07f877bd..da634195 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleUserApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleUserApi.java @@ -1,12 +1,11 @@ package cn.axzo.tyr.client.feign; -import cn.axzo.basics.common.page.PageRequest; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.roleuser.dto.GetUserAutoOwnRoleResp; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; import cn.axzo.tyr.client.model.roleuser.req.*; -import cn.azxo.framework.common.model.CommonResponse; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -103,4 +102,15 @@ public interface TyrSaasRoleUserApi { @PostMapping("/api/saas-role-user/get-special-role") ApiResult> getSpecialRole(); + /** + * 保存/更新 用户自定义权限,每次传入新的featureIds都会覆盖原来的所有featureIds + */ + @PostMapping("/api/saas-role-user/save-or-update-auto-own-role") + ApiResult saveOrUpdateAutoOwnRole(@RequestBody @Valid AutoOwnRoleUserReq req); + + /** + * 查询用户自定义角色和权限 + */ + @PostMapping("/api/saas-role-user/get-auto-own-role") + ApiResult getUserAutoOwnRole(@RequestBody @Valid GetUserAutoOwnRoleReq req); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/GetUserAutoOwnRoleResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/GetUserAutoOwnRoleResp.java new file mode 100644 index 00000000..f23fe61c --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/GetUserAutoOwnRoleResp.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.client.model.roleuser.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author likunpeng + * @version 1.0 + * @date 2024/4/3 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class GetUserAutoOwnRoleResp { + + public static final GetUserAutoOwnRoleResp EMPTY = GetUserAutoOwnRoleResp.builder().build(); + + /** + * 角色ID + */ + private Long roleId; + + /** + * 资源ID列表 + */ + private List featureIds; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/AutoOwnRoleUserReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/AutoOwnRoleUserReq.java new file mode 100644 index 00000000..510603dd --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/AutoOwnRoleUserReq.java @@ -0,0 +1,69 @@ +package cn.axzo.tyr.client.model.roleuser.req; + +import cn.axzo.tyr.client.model.enums.IdentityType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.util.Set; + + +/** + * @author likunpeng + * @date 2024/4/2 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AutoOwnRoleUserReq { + + /** + * 工作台id + */ + @NotNull + private Long workspaceId; + + /** + * 单位id + */ + @NotNull + private Long ouId; + + /** + * 身份id + */ + @NotNull + private Long identityId; + + /** + * 自然人id + */ + @NotNull + private Long personId; + + /** + * 身份类型 + */ + @NotNull + private IdentityType identityType; + + /** + * 操作人 + */ + @NotNull + private Long operatorId; + + /** + * 自定义角色ID + */ + @NotNull + private Long roleId; + + /** + * 资源ID列表 + */ + private Set featureIds; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/GetUserAutoOwnRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/GetUserAutoOwnRoleReq.java new file mode 100644 index 00000000..d1a8ee4f --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/GetUserAutoOwnRoleReq.java @@ -0,0 +1,38 @@ +package cn.axzo.tyr.client.model.roleuser.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + + +/** + * @author likunpeng + * @date 2024/4/2 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class GetUserAutoOwnRoleReq { + + /** + * 工作台id + */ + @NotNull + private Long workspaceId; + + /** + * 单位id + */ + @NotNull + private Long ouId; + + /** + * 自然人id + */ + @NotNull + private Long personId; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java index 7c67592c..dd78d34b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java @@ -6,6 +6,7 @@ import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.feign.TyrSaasRoleUserApi; import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.roleuser.dto.GetUserAutoOwnRoleResp; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; import cn.axzo.tyr.client.model.roleuser.req.*; @@ -148,4 +149,15 @@ public class RoleUserController implements TyrSaasRoleUserApi { public ApiPageResult pageQuery(RoleUserParam param) { return ApiPageResult.ok(saasRoleUserRelationService.pageQuery(param)); } + + @Override + public ApiResult saveOrUpdateAutoOwnRole(AutoOwnRoleUserReq req) { + saasRoleUserService.saveOrUpdateAutoOwnRole(req); + return ApiResult.ok(); + } + + @Override + public ApiResult getUserAutoOwnRole(GetUserAutoOwnRoleReq req) { + return ApiResult.ok(saasRoleUserService.getUserAutoOwnRole(req)); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java index e186b954..60fae1fb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.service; import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.roleuser.dto.GetUserAutoOwnRoleResp; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; import cn.axzo.tyr.client.model.roleuser.req.*; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; @@ -84,4 +85,16 @@ public interface SaasRoleUserService { */ void grantOrUngrantWorkerManager(WorkerManagerRoleUserReq req); + /** + * 保存/更新 用户自定义角色权限 + * @param req + */ + void saveOrUpdateAutoOwnRole(AutoOwnRoleUserReq req); + + /** + * 查询用户自定义角色和权限 + * @param req + * @return + */ + GetUserAutoOwnRoleResp getUserAutoOwnRole(GetUserAutoOwnRoleReq req); } \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index 18efed45..8d82008c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -11,32 +11,24 @@ import cn.axzo.tyr.client.model.BaseWorkspaceModel; import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.enums.WorkerLeaderRoleEnum; +import cn.axzo.tyr.client.model.roleuser.dto.GetUserAutoOwnRoleResp; import cn.axzo.tyr.client.model.roleuser.dto.IdentityInfo; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; -import cn.axzo.tyr.client.model.roleuser.req.CreateSuperAdminRoleParam; -import cn.axzo.tyr.client.model.roleuser.req.GantOrUnGantaWorkerLeaderRoleReq; -import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; -import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; -import cn.axzo.tyr.client.model.roleuser.req.WorkerManagerRoleUserReq; +import cn.axzo.tyr.client.model.roleuser.req.*; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.server.model.RoleUserInfo; -import cn.axzo.tyr.server.repository.dao.RemoveRoleUserByResource; -import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao; -import cn.axzo.tyr.server.repository.dao.SaasRoleDao; -import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; -import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; -import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; -import cn.axzo.tyr.server.repository.entity.SaasRole; -import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; -import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; +import cn.axzo.tyr.server.repository.dao.*; +import cn.axzo.tyr.server.repository.entity.*; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserService; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.nacos.common.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -65,6 +57,7 @@ public class RoleUserService implements SaasRoleUserService { private final SaasPgroupRoleRelationDao saasPgroupRoleRelationDao; private final SaasRoleGroupService saasRoleGroupService; private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; + private final SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; // 单位类型默认角色关系,后面可以座位管理员的逻辑进行迭代 @Value("#{${participateUnitDefaultRoleId:{}}}") @@ -103,14 +96,18 @@ public class RoleUserService implements SaasRoleUserService { // 查询用户所有角色 List existsRoleUser = roleUserRelationDao.query(req.getIdentityId(), req.getIdentityType().getCode(), req.getWorkspaceId(), req.getOuId()); - // 当前用户非超管的角色 - List notAdminRole = Collections.emptyList(); + // 当前用户非超管、自定义的角色 + List notAdminAndAutoOwnRole = Collections.emptyList(); if (CollectionUtils.isNotEmpty(existsRoleUser)) { List existsRole = saasRoleDao.listByIds(existsRoleUser.stream().mapToLong(SaasRoleUserRelation::getRoleId).boxed().collect(Collectors.toList())); // 管理员角色 List adminRole = existsRole.stream().filter(e -> RoleTypeEnum.getRoleType(e.getRoleType()).isAdminRole()).mapToLong(SaasRole::getId).boxed().collect(Collectors.toList()); - // 排除管理员角色(普通角色) 这里用过滤的方式,是为了防止脏数据产生(saas_role_user_relation表有用户数据但是角色表已经被删除) - notAdminRole = existsRoleUser.stream().mapToLong(SaasRoleUserRelation::getRoleId).boxed().filter(roleId -> !adminRole.contains(roleId)).collect(Collectors.toList()); + // 自定义角色 + Long autoOwnRole = existsRole.stream().filter(e -> RoleTypeEnum.AUTO_OWN.equals(RoleTypeEnum.getRoleType(e.getRoleType()))).findFirst().map(SaasRole::getId).orElse(0L); + log.info("personId:{} autoOwnRole:{} adminRole:{}", req.getPersonId(), autoOwnRole, JSONUtil.toJsonStr(adminRole)); + // 排除管理员角色、自定义角色(普通角色) 这里用过滤的方式,是为了防止脏数据产生(saas_role_user_relation表有用户数据但是角色表已经被删除) + notAdminAndAutoOwnRole = existsRoleUser.stream().mapToLong(SaasRoleUserRelation::getRoleId).boxed().filter(roleId -> !adminRole.contains(roleId)) + .filter(roleId -> !autoOwnRole.equals(roleId)).collect(Collectors.toList()); } BaseWorkspaceModel workspaceModel = BaseWorkspaceModel.builder() .workspaceId(req.getWorkspaceId()).ouId(req.getOuId()) @@ -118,20 +115,20 @@ public class RoleUserService implements SaasRoleUserService { .build(); // 删除现有非管理员的角色 - if (CollectionUtils.isNotEmpty(notAdminRole)) { + if (CollectionUtils.isNotEmpty(notAdminAndAutoOwnRole)) { //如果该接口支持 权限回收,那么参数UpdateRoleIds就是待删除的权限合集 if (req.isRecycleModel()) { - notAdminRole.clear(); + notAdminAndAutoOwnRole.clear(); //回收角色权限,只移除用户传参的权限 - notAdminRole.addAll(req.getUpdateRoleIds()); - roleUserRelationDao.deleteByUser(workspaceModel, notAdminRole); + notAdminAndAutoOwnRole.addAll(req.getUpdateRoleIds()); + roleUserRelationDao.deleteByUser(workspaceModel, notAdminAndAutoOwnRole); return; } - roleUserRelationDao.deleteByUser(workspaceModel, notAdminRole); + roleUserRelationDao.deleteByUser(workspaceModel, notAdminAndAutoOwnRole); } if(req.isMergeExistsRoles()){ //合并新的角色和老的角色 - updateRoleIds.addAll(notAdminRole); + updateRoleIds.addAll(notAdminAndAutoOwnRole); } // 清空所有角色 if (CollectionUtil.isEmpty(updateRoleIds)) { @@ -144,7 +141,6 @@ public class RoleUserService implements SaasRoleUserService { saasRoleUserRelation.setIdentityType(req.getIdentityType().getCode()); saasRoleUserRelation.setRoleId(e); saasRoleUserRelation.setNaturalPersonId(req.getPersonId()); - saasRoleUserRelation.setNaturalPersonId(req.getPersonId()); saasRoleUserRelation.setOuId(req.getOuId()); saasRoleUserRelation.setWorkspaceId(req.getWorkspaceId()); return saasRoleUserRelation; @@ -430,6 +426,88 @@ public class RoleUserService implements SaasRoleUserService { } + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdateAutoOwnRole(AutoOwnRoleUserReq req) { + SaasRole role = saasRoleDao.getById(req.getRoleId()); + AssertUtil.notNull(role, "未配置自定义角色"); + AssertUtil.isTrue(RoleTypeEnum.AUTO_OWN.equals(RoleTypeEnum.getRoleType(role.getRoleType())), "未配置自定义角色"); + // 查询用户已存在角色 + List existsRoleUser = roleUserRelationDao.queryByPersonId(req.getPersonId(), req.getWorkspaceId(), req.getOuId()); + Long autoOwnRoleId = null; + if (CollectionUtils.isNotEmpty(existsRoleUser)) { + List autoOwnRoles = existsRoleUser.stream().filter(e -> role.getId().equals(e.getRoleId())).mapToLong(SaasRoleUserRelation::getRoleId).boxed().collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(autoOwnRoles) && autoOwnRoles.size() > 1) { + log.warn("personId:{} ouId:{} workspaceId:{} has {} auto_own roles", req.getPersonId(), req.getOuId(), req.getWorkspaceId(), autoOwnRoles.size()); + } + autoOwnRoleId = autoOwnRoles.get(0); + } + + if (Objects.isNull(autoOwnRoleId)) { + SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); + saasRoleUserRelation.setIdentityId(req.getIdentityId()); + saasRoleUserRelation.setIdentityType(req.getIdentityType().getCode()); + saasRoleUserRelation.setRoleId(role.getId()); + saasRoleUserRelation.setNaturalPersonId(req.getPersonId()); + saasRoleUserRelation.setOuId(req.getOuId()); + saasRoleUserRelation.setWorkspaceId(req.getWorkspaceId()); + roleUserRelationDao.save(saasRoleUserRelation); + } + + List saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(Sets.newHashSet(role.getId())); + AssertUtil.notEmpty(saasPgroupRoleRelations, "角色权限集不存在"); + + Long permissionGroupId = saasPgroupRoleRelations.get(0).getGroupId(); + List saasPgroupPermissionRelations = saasPgroupPermissionRelationDao.lambdaQuery() + .eq(SaasPgroupPermissionRelation::getGroupId, permissionGroupId).eq(SaasPgroupPermissionRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + + // 新增是以featureIds维度新增,删除是以SaasPgroupPermissionRelation的id维度删除 + Set insertFeatureIds = getInsertFeatureIds(req.getFeatureIds(), saasPgroupPermissionRelations); + Set deleteIds = getDeleteIds(req.getFeatureIds(), saasPgroupPermissionRelations); + if (CollectionUtils.isNotEmpty(insertFeatureIds)) { + saasPgroupPermissionRelationDao.saveBatch(insertFeatureIds.stream().map(e -> { + SaasPgroupPermissionRelation relation = new SaasPgroupPermissionRelation(); + relation.setGroupId(permissionGroupId); + relation.setFeatureId(e); + relation.setCreateBy(req.getOperatorId()); + relation.setUpdateBy(req.getOperatorId()); + return relation; + }).collect(Collectors.toList())); + } + if (CollectionUtils.isNotEmpty(deleteIds)) { + saasPgroupPermissionRelationDao.removeByIds(deleteIds); + } + } + + @Override + public GetUserAutoOwnRoleResp getUserAutoOwnRole(GetUserAutoOwnRoleReq req) { + // 查询用户所有角色 + List existsRoleUser = roleUserRelationDao.queryByPersonId(req.getPersonId(), req.getWorkspaceId(), req.getOuId()); + if (CollectionUtils.isEmpty(existsRoleUser)) { + return GetUserAutoOwnRoleResp.EMPTY; + } + List existsAutoOwnRoles = saasRoleDao.listByIds(existsRoleUser.stream().mapToLong(SaasRoleUserRelation::getRoleId).boxed().collect(Collectors.toList())) + .stream().filter(e -> RoleTypeEnum.AUTO_OWN.equals(RoleTypeEnum.getRoleType(e.getRoleType()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(existsAutoOwnRoles)) { + log.info("personId:{} ouId:{} workspaceId:{} has not auto_own roles", req.getPersonId(), req.getOuId(), req.getWorkspaceId()); + return GetUserAutoOwnRoleResp.EMPTY; + } + + List saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(Sets.newHashSet(existsAutoOwnRoles.get(0).getId())); + if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) { + return GetUserAutoOwnRoleResp.EMPTY; + } + + List saasPgroupPermissionRelations = saasPgroupPermissionRelationDao.lambdaQuery() + .eq(SaasPgroupPermissionRelation::getGroupId, saasPgroupRoleRelations.get(0).getGroupId()) + .eq(SaasPgroupPermissionRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + + return CollectionUtils.isEmpty(saasPgroupPermissionRelations) ? GetUserAutoOwnRoleResp.EMPTY : GetUserAutoOwnRoleResp.builder() + .roleId(existsAutoOwnRoles.get(0).getId()) + .featureIds(saasPgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getFeatureId).collect(Collectors.toList())) + .build(); + } + private void batchRemoveByRoleUserInfo(RoleUserInfo roleUserBaseInfo) { roleUserBaseInfo.getRoleUserResourceInfos().forEach(e -> { @@ -445,4 +523,25 @@ public class RoleUserService implements SaasRoleUserService { }); } + private Set getInsertFeatureIds(Set featureIds, List existsPgroupPermissionRelations) { + if (CollectionUtils.isEmpty(featureIds)) { + return Collections.emptySet(); + } + + if (CollectionUtils.isEmpty(existsPgroupPermissionRelations)) { + return featureIds; + } + Set existsFeatureIds = existsPgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getFeatureId).collect(Collectors.toSet()); + return featureIds.stream().filter(e -> !existsFeatureIds.contains(e)).collect(Collectors.toSet()); + } + + private Set getDeleteIds(Set featureIds, List existsPgroupPermissionRelations) { + if (CollectionUtils.isEmpty(existsPgroupPermissionRelations)) { + return Collections.emptySet(); + } + if (CollectionUtils.isEmpty(featureIds)) { + return existsPgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getId).collect(Collectors.toSet()); + } + return existsPgroupPermissionRelations.stream().filter(e -> !featureIds.contains(e.getFeatureId())).map(SaasPgroupPermissionRelation::getId).collect(Collectors.toSet()); + } } From bffda7fbc0e98e3d46d9498726b4caffdc867305 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Sun, 7 Apr 2024 14:40:23 +0800 Subject: [PATCH 008/130] =?UTF-8?q?feat(2227-syncFeature):=20feature?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 4 +- .../tyr/client/model/req/ResourceSyncReq.java | 32 +++++++ .../tyr/client/model/res/CommonDictResp.java | 15 ++++ .../model/res/FeatureResourceTreeNode.java | 4 + .../cn/axzo/tyr/server/TyrApplication.java | 49 ++++------ .../axzo/tyr/server/config/GlobalConfig.java | 7 +- .../permission/FeatureResourceController.java | 9 +- .../inner/feign/BaseFeatureResourceApi.java | 3 +- .../dao/SaasFeatureResourceDao.java | 4 + .../mapper/SaasFeatureResourceMapper.java | 6 ++ .../service/SaasFeatureResourceService.java | 3 +- .../impl/SaasFeatureResourceServiceImpl.java | 90 ++++++++++++++----- 12 files changed, 165 insertions(+), 61 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ResourceSyncReq.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 8133f42a..d669b2c9 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -1,12 +1,14 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import javax.validation.Valid; import java.util.List; /** @@ -27,5 +29,5 @@ public interface FeatureResourceApi { /** 从基准环境同步接口功能资源 **/ @PostMapping("/api/featureResource/sync/fromBase") - ApiResult syncFromBase(@RequestBody List ids); + ApiResult syncFromBase(@RequestBody @Valid ResourceSyncReq req); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ResourceSyncReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ResourceSyncReq.java new file mode 100644 index 00000000..88e4c9c4 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ResourceSyncReq.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 功能资源同步请求 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 11:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ResourceSyncReq { + + /** 同步资源ID **/ + @NotEmpty(message = "要同步的资源ID不能为空") + private List ids; + + /** 操作人personId **/ + @NotNull(message = "操作人ID不能为空") + private Long operatorId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java index a1d1c0b9..a53d2c5e 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java @@ -17,4 +17,19 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class CommonDictResp { + + /** + * 业务域 + */ + private String scope; + + /** + * 字典编码 + */ + private String dictCode; + + /** + * 字典值 + */ + private String dictValue; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java index 2104c4b7..73cf25c6 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.client.model.res; import cn.axzo.basics.common.model.IBaseTree; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -23,16 +24,19 @@ public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBase private List children; + @JsonIgnore @Override public Long getNodeCode() { return super.getId(); } + @JsonIgnore @Override public Long getParentNodeCode() { return super.getParentId(); } + @JsonIgnore @Override public List getNodeChildren() { return this.children; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java index 3c1129e7..1247f100 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java @@ -1,10 +1,7 @@ package cn.axzo.tyr.server; -import cn.axzo.tyr.server.job.CMSRoleJobHandler; -import cn.hutool.extra.spring.SpringUtil; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; -import cn.axzo.tyr.server.job.OMSRoleJobHandler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @@ -15,7 +12,6 @@ import org.springframework.scheduling.annotation.EnableAsync; @Slf4j @EnableAsync @EnableDiscoveryClient -//@EnableFeignClients @MapperScan(value = {"cn.axzo.tyr.server.repository.mapper"}) @SpringBootApplication(scanBasePackages = "cn.axzo") public class TyrApplication { @@ -23,33 +19,22 @@ public class TyrApplication { ConfigurableApplicationContext run = SpringApplication.run(TyrApplication.class, args); Environment env = run.getEnvironment(); log.info( - "--------------------------------------------------------------------------------------------------------------------\n" + - "Application 【{}】 is running on 【{}】 environment!\n" + - "Api Local: \thttp://127.0.0.1:{}\n" + - "Mysql: \t{}\t username:{}\n" + - "Redis: \t{}:{}\t database:{}\n" + - "RabbitMQ: \t{}\t username:{}", - env.getProperty("spring.application.name"), - env.getProperty("spring.profiles.active"), - env.getProperty("server.port"), - env.getProperty("spring.datasource.url"), - env.getProperty("spring.datasource.username"), - env.getProperty("spring.redis.host"), - env.getProperty("spring.redis.port"), - env.getProperty("spring.redis.database"), - env.getProperty("spring.rabbitmq.addresses"), - env.getProperty("spring.rabbitmq.username") + - "\n----------------------------------------------------------"); - -// try { -// test(); -// } catch (Exception e) { -// e.printStackTrace(); -// } + "--------------------------------------------------------------------------------------------------------------------\n" + + "Application 【{}】 is running on 【{}】 environment!\n" + + "Api Local: \thttp://127.0.0.1:{}\n" + + "Mysql: \t{}\t username:{}\n" + + "Redis: \t{}:{}\t database:{}\n" + + "RabbitMQ: \t{}\t username:{}", + env.getProperty("spring.application.name"), + env.getProperty("spring.profiles.active"), + env.getProperty("server.port"), + env.getProperty("spring.datasource.url"), + env.getProperty("spring.datasource.username"), + env.getProperty("spring.redis.host"), + env.getProperty("spring.redis.port"), + env.getProperty("spring.redis.database"), + env.getProperty("spring.rabbitmq.addresses"), + env.getProperty("spring.rabbitmq.username") + + "\n----------------------------------------------------------"); } - -// public static void test() throws Exception { -// CMSRoleJobHandler executor = SpringUtil.getBean(CMSRoleJobHandler.class); -// executor.execute(null); -// } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/GlobalConfig.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/GlobalConfig.java index ac439b8f..a9aadbde 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/GlobalConfig.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/GlobalConfig.java @@ -17,15 +17,18 @@ import static cn.axzo.tyr.server.config.GlobalConfig.FeignClientConstant.*; */ @Configuration @EnableFeignClients(basePackages = { - WORKFLOW_ENGINE + WORKFLOW_ENGINE, + INNER_FEIGN }) public class GlobalConfig { /** * 第三方Feign */ - public class FeignClientConstant { + public static class FeignClientConstant { public static final String WORKFLOW_ENGINE = "cn.axzo.workflow.client.feign.bpmn"; + public static final String INNER_FEIGN = "cn.axzo.tyr.server.inner.feign"; + } /** diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 7e9dd883..42feafdd 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.server.controller.permission; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.FeatureResourceApi; +import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.service.SaasFeatureResourceService; @@ -26,7 +27,7 @@ import java.util.List; @RequiredArgsConstructor public class FeatureResourceController implements FeatureResourceApi { - private SaasFeatureResourceService featureResourceService; + private final SaasFeatureResourceService featureResourceService; @Override public ApiResult> getSyncTreeById(Long id) { @@ -34,13 +35,13 @@ public class FeatureResourceController implements FeatureResourceApi { } @Override - public ApiResult syncFromBase(List ids) { + public ApiResult syncFromBase(ResourceSyncReq req) { - if (CollectionUtil.isEmpty(ids)) { + if (CollectionUtil.isEmpty(req.getIds())) { log.warn("no ids to sync from base env"); return ApiResult.ok(); } - featureResourceService.syncFromBase(ids); + featureResourceService.syncFromBase(req); return ApiResult.ok(); } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java index 84787030..19ad14fb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java @@ -15,7 +15,8 @@ import java.util.List; * @author: ZhanSiHu * @date: 2024/4/3 10:25 */ -@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:https://pre-api.axzo.cn/tyr}") +//@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:https://pre-api.axzo.cn/tyr}") +@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:http://127.0.0.1:8080}") public interface BaseFeatureResourceApi { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java index 618cd184..e421cdc0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java @@ -19,4 +19,8 @@ public class SaasFeatureResourceDao extends ServiceImpl @@ -13,4 +15,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SaasFeatureResourceMapper extends BaseMapper { + @Update("UPDATE saas_feature_resource" + + " SET path = REPLACE(path, #{oldPath}, #{newPath})" + + " WHERE is_delete = 0 AND path LIKE CONCAT(#{oldPath}, '%')") + void replacePath(@Param("oldPath") String oldPath, @Param("newPath") String newPath); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index edbd3bd1..8855d645 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.server.service; +import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; @@ -16,5 +17,5 @@ public interface SaasFeatureResourceService { List getSyncTreeById(Long id); - void syncFromBase(List ids); + void syncFromBase(ResourceSyncReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 3dd9373b..b6f9bd76 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi; @@ -12,6 +13,7 @@ import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -56,7 +58,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic //如果是页面或应用入口-同时返回所有页面组件 if (FeatureResourceType.applyPage(resource.getFeatureType())) { List componentList = featureResourceDao.lambdaQuery() - .eq(SaasFeatureResource::getFeatureCode, FeatureResourceType.COMPONENT.getCode()) + .eq(SaasFeatureResource::getFeatureType, FeatureResourceType.COMPONENT.getCode()) .apply("FIND_IN_SET(" + id + ", path)") .list(); resourceList.addAll(componentList); @@ -66,40 +68,88 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } @Override - public void syncFromBase(List ids) { - final Map idCache = new HashMap<>(); + public void syncFromBase(ResourceSyncReq req) { final Map codeCache = new ConcurrentHashMap<>(); - for (Long id : ids) { - doSyncFromBase(id, idCache, codeCache); + for (Long id : req.getIds()) { + //TODO:@Zhan 并发处理;同一个parent下同批查询 + //获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件 + List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), + "get base sync tree by id", id).getData(); + doSyncFromBase(syncList, codeCache, req.getOperatorId()); } } - private void doSyncFromBase(Long id, Map idCache, Map codeCache) { - if (codeCache.containsKey(id)) { - //已处理过 - log.info("already sync resource:{}", id); - return; - } - List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), - "get sync tree by id", id).getData(); + private void doSyncFromBase(List syncList, Map codeCache, Long operatorId) { + for (FeatureResourceTreeNode treeNode : syncList) { + if (codeCache.containsKey(treeNode.getId())) { + //已处理过 + log.info("already sync resource:{}", treeNode.getId()); + //递归子节点 + if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { + doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); + } + continue; + } + //缓存code + codeCache.put(treeNode.getId(), treeNode.getFeatureCode()); + + SaasFeatureResource baseResource = BeanMapper.copyBean(treeNode, SaasFeatureResource.class); + //修正数据 + String parentCode = codeCache.get(baseResource.getParentId()); + fixData(baseResource, parentCode); + SaasFeatureResource resource = featureResourceDao.getByCode(treeNode.getFeatureCode()); if (resource == null) { - syncInsert(treeNode, codeCache); + //新增 + baseResource.setCreateBy(operatorId); + baseResource.setUpdateBy(operatorId); + newResource(baseResource); } else { - syncUpdate(resource, treeNode); + //更新 + baseResource.setId(resource.getId()); + baseResource.setPath(baseResource.getPath() + "," + resource.getId()); + baseResource.setUpdateBy(operatorId); + featureResourceDao.updateById(baseResource); + + if (!StrUtil.equals(baseResource.getPath(), resource.getPath())) { + //层级变化 + log.info("replace path from old:{} to new:{}", resource.getPath(), baseResource.getPath()); + featureResourceDao.replacePath(resource.getPath(), baseResource.getPath()); + } + } + //递归子节点 + if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { + doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); } } } - private void syncUpdate(SaasFeatureResource resource, FeatureResourceTreeNode treeNode) { + /** 修正当前环境的数据 parentId path **/ + private void fixData(SaasFeatureResource resource, String parentCode) { + if (StrUtil.isBlank(parentCode)) { + resource.setParentId(0L); + resource.setPath("0"); + } else { + //找当前环境的parent + SaasFeatureResource parent = featureResourceDao.getByCode(parentCode); + if (parent == null) { + resource.setParentId(0L); + resource.setPath("0"); + } else { + resource.setParentId(parent.getId()); + resource.setPath(parent.getPath()); + } + } } - private void syncInsert(FeatureResourceTreeNode treeNode, Map codeCache) { - SaasFeatureResource resource = BeanMapper.copyBean(treeNode, SaasFeatureResource.class); - //修正parent id 和path - String parentCode = codeCache.get(resource.getParentId()); + private void newResource(SaasFeatureResource resource) { + + featureResourceDao.save(resource); + //path追加自身ID + resource.setPath(resource.getPath() + "," + resource.getId()); + featureResourceDao.updateById(resource); } } From c81eb30dedbd5676287fcb1ebae4baf49cbf8ac9 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Sun, 7 Apr 2024 14:49:44 +0800 Subject: [PATCH 009/130] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/model/req/FeatureComponentSaveReq.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java index 9800d7df..9d79daf3 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java @@ -1,9 +1,17 @@ package cn.axzo.tyr.client.model.req; import cn.axzo.tyr.client.model.base.BaseFeatureResourceDO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import java.util.List; +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor public class FeatureComponentSaveReq extends BaseFeatureResourceDO { /** 子级是否需要鉴权 0-不鉴权 1-鉴权 **/ From 7dcdd143d5a1cf2dd224848fb423afe61157ad06 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Sun, 7 Apr 2024 17:55:47 +0800 Subject: [PATCH 010/130] =?UTF-8?q?feat(2227-permissionQuery):=20=E5=AF=BC?= =?UTF-8?q?=E8=88=AA=E8=8F=9C=E5=8D=95=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/PermissionQueryApi.java | 22 +++++++++++ .../client/model/base/WorkspaceOUPair.java | 24 ++++++++++++ .../axzo/tyr/client/model/req/NavTreeReq.java | 26 +++++++++++++ .../client/model/req/PermissionQueryReq.java | 38 +++++++++++++++++++ .../tyr/client/model/res/NavTreeResp.java | 35 +++++++++++++++++ .../permission/PermissionQueryController.java | 32 ++++++++++++++++ .../service/PermissionQueryService.java | 19 ++++++++++ .../impl/PermissionQueryServiceImpl.java | 32 ++++++++++++++++ 8 files changed, 228 insertions(+) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java new file mode 100644 index 00000000..ac33b827 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java @@ -0,0 +1,22 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.res.NavTreeResp; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.validation.Valid; +import java.util.List; + +/** + * 权限服务接口 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 16:18 + */ +public interface PermissionQueryApi { + + /** 返回导航菜单页面 **/ + ApiResult> getNavTree(@RequestBody @Valid NavTreeReq req); +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java new file mode 100644 index 00000000..99cc90c2 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java @@ -0,0 +1,24 @@ +package cn.axzo.tyr.client.model.base; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * OU Workspace对 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 16:28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkspaceOUPair { + + private Long ouId; + + private Long workspaceId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java new file mode 100644 index 00000000..2ec0bd68 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java @@ -0,0 +1,26 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * NavTreeReq + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 17:38 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NavTreeReq { + + private Long personId; + + private String terminal; + + private Long ouId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java new file mode 100644 index 00000000..d3c463d8 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java @@ -0,0 +1,38 @@ +package cn.axzo.tyr.client.model.req; + +import cn.axzo.tyr.client.model.base.WorkspaceOUPair; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 权限查询请求 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 16:23 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PermissionQueryReq { + + @NotNull(message = "人员ID不能为空") + private Long personId; + + @NotEmpty(message = "单位标识对不能为空") + private List workspaceOUPairs; + + private String terminal; + + private Integer featureType; + + private List featureCodes; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java new file mode 100644 index 00000000..0c855331 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java @@ -0,0 +1,35 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 用户导航树数据 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 15:20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NavTreeResp { + + //APP侧需要扩展返回必要的数据 + + /** 资源ID **/ + private Long id; + /** 资源编码 **/ + private String featureCode; + /** 资源名称 **/ + private String featureName; + /** 资源类型 **/ + private Integer featureType; + /** 子级 **/ + private List children; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java new file mode 100644 index 00000000..342f5797 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.server.controller.permission; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.PermissionQueryApi; +import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.res.NavTreeResp; +import cn.axzo.tyr.server.service.PermissionQueryService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 权限接口实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 17:29 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class PermissionQueryController implements PermissionQueryApi { + + private final PermissionQueryService permissionService; + + @Override + public ApiResult> getNavTree(NavTreeReq req) { + return ApiResult.ok(permissionService.getNavTree(req)); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java new file mode 100644 index 00000000..1d4de8ca --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java @@ -0,0 +1,19 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.res.NavTreeResp; + +import java.util.List; + +/** + * 权限服务接口 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 17:33 + */ +public interface PermissionQueryService { + + /** 获取导航菜单页面 **/ + List getNavTree(NavTreeReq req); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java new file mode 100644 index 00000000..72fa9f11 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.res.NavTreeResp; +import cn.axzo.tyr.server.service.PermissionQueryService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; + +/** + * 权限查询服务实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/7 17:54 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PermissionQueryServiceImpl implements PermissionQueryService { + + + + @Override + public List getNavTree(NavTreeReq req) { + //TODO:@Zhan + return Collections.emptyList(); + } +} From 599fd9ddaf2247838b97da89ff0bb8ec9809256d Mon Sep 17 00:00:00 2001 From: zhansihu Date: Sun, 7 Apr 2024 17:58:38 +0800 Subject: [PATCH 011/130] =?UTF-8?q?feat(2227-permissionQuery):=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9A=E4=B9=89=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/client/feign/PermissionQueryApi.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java index ac33b827..46ef850e 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java @@ -3,6 +3,8 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.req.NavTreeReq; import cn.axzo.tyr.client.model.res.NavTreeResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import javax.validation.Valid; @@ -15,8 +17,10 @@ import java.util.List; * @author: ZhanSiHu * @date: 2024/4/7 16:18 */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") public interface PermissionQueryApi { /** 返回导航菜单页面 **/ + @PostMapping(value = "/api/v3/permission/query/getNavTree") ApiResult> getNavTree(@RequestBody @Valid NavTreeReq req); } From 6fc00f0b1dafa9b16a5911af622950558567f8bb Mon Sep 17 00:00:00 2001 From: lilong Date: Sun, 7 Apr 2024 18:45:39 +0800 Subject: [PATCH 012/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=EF=BC=8C=E5=90=A6=E5=88=99copy=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java index a1371d60..714cf0c6 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java @@ -15,6 +15,7 @@ import lombok.NoArgsConstructor; @Data @Builder @AllArgsConstructor +@NoArgsConstructor public class CommonDictResp { /** From 695d48560e080aa05207b9e3c2f03f3b4d021124 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 8 Apr 2024 15:20:54 +0800 Subject: [PATCH 013/130] =?UTF-8?q?feat(2227-permissionQuery):=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E5=92=8C=E6=9D=83?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/FeatureResourceType.java | 7 + .../tyr/client/common/enums/RoleTypeEnum.java | 7 + .../client/model/base/WorkspaceOUPair.java | 4 + .../axzo/tyr/client/model/req/NavTreeReq.java | 12 +- .../client/model/req/PermissionQueryReq.java | 2 +- .../tyr/client/model/res/NavTreeResp.java | 29 +++- .../permission/FeatureResourceController.java | 12 +- .../axzo/tyr/server/model/PermissionDO.java | 25 +++ .../server/model/PermissionQueryContext.java | 42 +++++ .../tyr/server/model/RoleFeatureRelation.java | 24 +++ .../tyr/server/model/RoleWithFeature.java | 32 ++++ .../axzo/tyr/server/model/UserIdentity.java | 24 +++ .../server/repository/dao/SaasRoleDao.java | 5 + .../repository/mapper/SaasRoleMapper.java | 2 + .../service/FeatureResourceSyncService.java | 20 +++ .../axzo/tyr/server/service/RoleService.java | 3 + .../service/SaasFeatureResourceService.java | 9 +- .../impl/FeatureResourceSyncServiceImpl.java | 151 ++++++++++++++++++ .../impl/PermissionQueryServiceImpl.java | 108 ++++++++++++- .../server/service/impl/RoleServiceImpl.java | 28 ++++ .../impl/SaasFeatureResourceServiceImpl.java | 134 +--------------- .../main/resources/mapper/SaasRoleMapper.xml | 18 +++ 22 files changed, 554 insertions(+), 144 deletions(-) create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleFeatureRelation.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/UserIdentity.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java index 79030a5d..d38a8461 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java @@ -5,6 +5,7 @@ import lombok.Getter; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -45,4 +46,10 @@ public enum FeatureResourceType { public static boolean applyPage(Integer code) { return PAGE.apply(code) || APP_ENTRY.apply(code); } + + public static List navTypes() { + return Arrays.asList(FeatureResourceType.MENU.getCode(), + FeatureResourceType.PAGE.getCode(), + FeatureResourceType.APP_ENTRY.getCode()); + } } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java index ea30834b..8f3d3f08 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java @@ -6,6 +6,7 @@ import lombok.Getter; import java.util.Arrays; import java.util.Map; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -44,4 +45,10 @@ public enum RoleTypeEnum { return isAdmin; } + public static boolean isAdmin(String roleType) { + return Optional.ofNullable(getRoleType(roleType)) + .map(RoleTypeEnum::isAdminRole) + .orElse(false); + } + } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java index 99cc90c2..863ef25f 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/WorkspaceOUPair.java @@ -21,4 +21,8 @@ public class WorkspaceOUPair { private Long ouId; private Long workspaceId; + + private String buildKey() { + return ouId + "-" + workspaceId; + } } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java index 2ec0bd68..28ceb482 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/NavTreeReq.java @@ -1,10 +1,15 @@ package cn.axzo.tyr.client.model.req; +import cn.axzo.tyr.client.model.base.WorkspaceOUPair; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + /** * NavTreeReq * @@ -18,9 +23,12 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class NavTreeReq { + @NotNull(message = "人员ID不能为空") private Long personId; - + /** 登录端 **/ + @NotNull(message = "登录端不能为空") private String terminal; - private Long ouId; + @NotEmpty(message = "单位标识对不能为空") + private List workspaceOUPairs; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java index d3c463d8..f4ac67fb 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java @@ -31,7 +31,7 @@ public class PermissionQueryReq { private String terminal; - private Integer featureType; + private List featureTypes; private List featureCodes; diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java index 0c855331..0c205eb6 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java @@ -1,5 +1,7 @@ package cn.axzo.tyr.client.model.res; +import cn.axzo.basics.common.model.IBaseTree; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -18,7 +20,7 @@ import java.util.List; @Builder @NoArgsConstructor @AllArgsConstructor -public class NavTreeResp { +public class NavTreeResp implements IBaseTree { //APP侧需要扩展返回必要的数据 @@ -30,6 +32,31 @@ public class NavTreeResp { private String featureName; /** 资源类型 **/ private Integer featureType; + /** 上级ID **/ + private Long parentId; /** 子级 **/ private List children; + + @JsonIgnore + @Override + public Long getNodeCode() { + return id; + } + + @JsonIgnore + @Override + public Long getParentNodeCode() { + return parentId; + } + + @JsonIgnore + @Override + public List getNodeChildren() { + return children; + } + + @Override + public void setNodeChildren(List nodeChildren) { + this.children = nodeChildren; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 4752bb7f..6f389c84 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -2,18 +2,16 @@ package cn.axzo.tyr.server.controller.permission; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.FeatureResourceApi; -import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; -import cn.axzo.tyr.client.model.res.FeatureResourceDTO; +import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.service.FeatureResourceSyncService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.hutool.core.collection.CollectionUtil; -import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; -import java.util.Collections; import java.util.List; /** @@ -28,11 +26,13 @@ import java.util.List; @RequiredArgsConstructor public class FeatureResourceController implements FeatureResourceApi { + private final FeatureResourceSyncService featureResourceSyncService; + private final SaasFeatureResourceService featureResourceService; @Override public ApiResult> getSyncTreeById(Long id) { - return ApiResult.ok(featureResourceService.getSyncTreeById(id)); + return ApiResult.ok(featureResourceSyncService.getSyncTreeById(id)); } @Override @@ -42,7 +42,7 @@ public class FeatureResourceController implements FeatureResourceApi { log.warn("no ids to sync from base env"); return ApiResult.ok(); } - featureResourceService.syncFromBase(req); + featureResourceSyncService.syncFromBase(req); return ApiResult.ok(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java new file mode 100644 index 00000000..10dc7dc4 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java @@ -0,0 +1,25 @@ +package cn.axzo.tyr.server.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 权限对象 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 11:09 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PermissionDO { + private Long ouId; + private Long workspaceId; + private List featureIds; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java new file mode 100644 index 00000000..d2c8ceff --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.server.model; + +import cn.axzo.tyr.client.model.base.WorkspaceOUPair; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Set; + +/** + * 权限查询上下文 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 11:04 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PermissionQueryContext { + + /** 用户标识 **/ + private UserIdentity userIdentity; + /** 权限范围 **/ + private List workspaceOUPairs; + /** 登录端 **/ + private String terminal; + /** 资源类型 **/ + private List featureTypes; + + /** 预览角色ID **/ + private List previewRoleIds; + + /** 资源ID **/ + private Set featureIds; + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleFeatureRelation.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleFeatureRelation.java new file mode 100644 index 00000000..68a97d44 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleFeatureRelation.java @@ -0,0 +1,24 @@ +package cn.axzo.tyr.server.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 角色权限关联 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 14:50 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleFeatureRelation { + + private Long roleId; + + private Long featureId; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java new file mode 100644 index 00000000..12a07d65 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.server.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 角色和权限 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 14:16 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleWithFeature { + + private Long roleId; + + private String roleName; + + private String roleType; + + private Integer productUnitType; + + private List featureIds; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/UserIdentity.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/UserIdentity.java new file mode 100644 index 00000000..9421b448 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/UserIdentity.java @@ -0,0 +1,24 @@ +package cn.axzo.tyr.server.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 用户标识对象 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 10:59 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserIdentity { + + private Long personId; + private Long identityId; + private Integer identityType; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java index 8d81ac9e..4f11e3fc 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java @@ -5,6 +5,7 @@ import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; +import cn.axzo.tyr.server.model.RoleFeatureRelation; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import cn.axzo.tyr.server.repository.mapper.SaasRoleMapper; @@ -115,5 +116,9 @@ public class SaasRoleDao extends ServiceImpl { .eq(SaasRole::getRoleType, RoleTypeEnum.INIT.getValue()) .list(); } + + public List listFeatureByIds(Set roleIds, Set featureIds) { + return this.baseMapper.listFeatureByIds(roleIds, featureIds); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java index 4609e79c..23ea0923 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.repository.mapper; import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.server.model.RoleFeatureRelation; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -27,5 +28,6 @@ public interface SaasRoleMapper extends BaseMapper { List listRoleByFeatures(@Param("featureIds") Set featureIds); + List listFeatureByIds(@Param("roleIds") Set roleIds, @Param("featureIds") Set featureIds); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java new file mode 100644 index 00000000..94da849f --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java @@ -0,0 +1,20 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.req.ResourceSyncReq; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; + +import java.util.List; + +/** + * 功能资源同步服务 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 10:09 + */ +public interface FeatureResourceSyncService { + + List getSyncTreeById(Long id); + + void syncFromBase(ResourceSyncReq req); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index e2b305cc..3409e4eb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -12,6 +12,7 @@ import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; import cn.axzo.tyr.client.model.vo.SaasRoleVO; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; +import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import cn.axzo.tyr.server.service.impl.TyrSaasAuthServiceImpl; @@ -101,4 +102,6 @@ public interface RoleService { /** 查询超管和管理员角色 **/ List listAdmins(Long workspaceId, Long ouId); + + List listWithFeatures(Set roleIds, Set featureIds); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index 8855d645..804b3102 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -1,8 +1,6 @@ package cn.axzo.tyr.server.service; -import cn.axzo.tyr.client.model.req.ResourceSyncReq; -import cn.axzo.tyr.client.model.res.FeatureResourceDTO; -import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import java.util.List; @@ -15,7 +13,6 @@ import java.util.List; */ public interface SaasFeatureResourceService { - List getSyncTreeById(Long id); - - void syncFromBase(ResourceSyncReq req); + /** 根据ID查询导航菜单页面信息 - 限制查询字段 **/ + List listNavByIds(List featureIds); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java new file mode 100644 index 00000000..c2b2314d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java @@ -0,0 +1,151 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.util.TreeUtil; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.req.ResourceSyncReq; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi; +import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import cn.axzo.tyr.server.service.FeatureResourceSyncService; +import cn.axzo.tyr.server.util.RpcInternalUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 功能资源同步服务实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 10:09 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncService { + + private final SaasFeatureResourceDao featureResourceDao; + + private final BaseFeatureResourceApi baseFeatureResourceApi; + + @Override + public List getSyncTreeById(Long id) { + //选中同步的数据 + SaasFeatureResource resource = featureResourceDao.lambdaQuery() + .eq(SaasFeatureResource::getId, id) + .one(); + if (resource == null) { + return Collections.emptyList(); + } + //找到所有上级 - 包含自己? + List resourceList = featureResourceDao.lambdaQuery() + .in(SaasFeatureResource::getId, resource.splitPath()) + .list(); + //resourceList.add(resource); + //如果是页面或应用入口-同时返回所有页面组件 + if (FeatureResourceType.applyPage(resource.getFeatureType())) { + List componentList = featureResourceDao.lambdaQuery() + .eq(SaasFeatureResource::getFeatureType, FeatureResourceType.COMPONENT.getCode()) + .apply("FIND_IN_SET(" + id + ", path)") + .list(); + resourceList.addAll(componentList); + } + List dtoList = BeanMapper.copyList(resourceList, FeatureResourceTreeNode.class); + return TreeUtil.buildTree(dtoList); + } + + @Override + public void syncFromBase(ResourceSyncReq req) { + final Map codeCache = new ConcurrentHashMap<>(); + for (Long id : req.getIds()) { + //TODO:@Zhan 并发处理;同一个parent下同批查询 + //获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件 + List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), + "get base sync tree by id", id).getData(); + doSyncFromBase(syncList, codeCache, req.getOperatorId()); + } + } + + private void doSyncFromBase(List syncList, Map codeCache, Long operatorId) { + + for (FeatureResourceTreeNode treeNode : syncList) { + if (codeCache.containsKey(treeNode.getId())) { + //已处理过 + log.info("already sync resource:{}", treeNode.getId()); + //递归子节点 + if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { + doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); + } + continue; + } + //缓存code + codeCache.put(treeNode.getId(), treeNode.getFeatureCode()); + + SaasFeatureResource baseResource = BeanMapper.copyBean(treeNode, SaasFeatureResource.class); + //修正数据 + String parentCode = codeCache.get(baseResource.getParentId()); + fixData(baseResource, parentCode); + + SaasFeatureResource resource = featureResourceDao.getByCode(treeNode.getFeatureCode()); + if (resource == null) { + //新增 + baseResource.setCreateBy(operatorId); + baseResource.setUpdateBy(operatorId); + newResource(baseResource); + } else { + //更新 + baseResource.setId(resource.getId()); + baseResource.setPath(baseResource.getPath() + "," + resource.getId()); + baseResource.setUpdateBy(operatorId); + featureResourceDao.updateById(baseResource); + + if (!StrUtil.equals(baseResource.getPath(), resource.getPath())) { + //层级变化 + log.info("replace path from old:{} to new:{}", resource.getPath(), baseResource.getPath()); + featureResourceDao.replacePath(resource.getPath(), baseResource.getPath()); + } + } + //递归子节点 + if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { + doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); + } + } + } + + + /** 修正当前环境的数据 parentId path **/ + private void fixData(SaasFeatureResource resource, String parentCode) { + if (StrUtil.isBlank(parentCode)) { + resource.setParentId(0L); + resource.setPath("0"); + } else { + //找当前环境的parent + SaasFeatureResource parent = featureResourceDao.getByCode(parentCode); + if (parent == null) { + resource.setParentId(0L); + resource.setPath("0"); + } else { + resource.setParentId(parent.getId()); + resource.setPath(parent.getPath()); + } + } + } + + private void newResource(SaasFeatureResource resource) { + + featureResourceDao.save(resource); + //path追加自身ID + resource.setPath(resource.getPath() + "," + resource.getId()); + featureResourceDao.updateById(resource); + + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 72fa9f11..dc306a98 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -1,14 +1,35 @@ package cn.axzo.tyr.server.service.impl; +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.util.TreeUtil; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.server.model.PermissionDO; +import cn.axzo.tyr.server.model.PermissionQueryContext; +import cn.axzo.tyr.server.model.RoleWithFeature; +import cn.axzo.tyr.server.model.UserIdentity; +import cn.axzo.tyr.client.model.base.WorkspaceOUPair; +import cn.axzo.tyr.client.model.req.IdentityAuthReq; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PermissionQueryReq; import cn.axzo.tyr.client.model.res.NavTreeResp; +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.service.PermissionQueryService; +import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.util.KeyUtil; +import cn.hutool.core.collection.CollectionUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 权限查询服务实现 @@ -22,11 +43,94 @@ import java.util.List; @RequiredArgsConstructor public class PermissionQueryServiceImpl implements PermissionQueryService { - + private final SaasFeatureResourceService featureResourceService; + private final RoleUserService roleUserService; + private final RoleService roleService; @Override public List getNavTree(NavTreeReq req) { - //TODO:@Zhan + //构造参数 + PermissionQueryContext context = BeanMapper.copyBean(req, PermissionQueryContext.class); + //限制只查菜单页面 + context.setFeatureTypes(FeatureResourceType.navTypes()); + //查询权限 + List permissions = queryUserPermission(context); + if (CollectionUtil.isEmpty(permissions)) { + return Collections.emptyList(); + } + List featureIds = permissions.stream().map(PermissionDO::getFeatureIds).flatMap(List::stream).collect(Collectors.toList()); + //反查资源信息 + List resourceList = featureResourceService.listNavByIds(featureIds); + //组装导航树 + return TreeUtil.buildTree(BeanMapper.copyList(resourceList, NavTreeResp.class)); + } + + + + private List queryUserPermission(PermissionQueryContext context) { + //查询用户具有的角色 + List userRoleRelations = listRoleUserRelations(context); + if (CollectionUtil.isEmpty(userRoleRelations)) { + log.warn("no user role relation found"); + return Collections.emptyList(); + } + Set realWorkspaceId = userRoleRelations.stream().map(SaasRoleUserRelation::getWorkspaceId).collect(Collectors.toSet()); + //TODO: 查询产品分配的权限 + Set roleIds = userRoleRelations.stream().map(SaasRoleUserRelation::getRoleId).collect(Collectors.toSet()); + //查询角色权限 + List roles = roleService.listWithFeatures(roleIds, context.getFeatureIds()); + return Collections.emptyList(); } + + private List listRoleUserRelations(PermissionQueryContext context) { + if (CollectionUtil.isNotEmpty(context.getPreviewRoleIds())) { + //指定了角色 则不需要去查用户角色关系 + log.info("mock specify roles relation"); + return mockRoleUserRelation(context); + } + //查询人员角色关系 + Set workspaceIds = new HashSet<>(); + Set ouIds = new HashSet<>(); + Set owKeys = new HashSet<>(); + List workspaceOUPairs = context.getWorkspaceOUPairs(); + workspaceOUPairs.forEach(ow -> { + workspaceIds.add(ow.getWorkspaceId()); + ouIds.add(ow.getOuId()); + owKeys.add(KeyUtil.buildKeyBySeparator(ow.getWorkspaceId(), ow.getOuId())); + }); + UserIdentity userIdentity = context.getUserIdentity(); + List relations = roleUserService.queryByWorkspaceIdOrOu(userIdentity.getPersonId(), + userIdentity.getIdentityId(), IdentityType.getIdentityType(userIdentity.getIdentityType()), workspaceIds, ouIds); + if (CollectionUtil.isEmpty(relations)) { + log.warn("no user role relations found"); + return relations; + } + //工作台和单位需成对查询, 对结果二次过滤 + return relations.stream() + .filter(roleUserService -> owKeys.contains( + KeyUtil.buildKeyBySeparator(roleUserService.getWorkspaceId(), roleUserService.getOuId()))) + .collect(Collectors.toList()); + } + + private List mockRoleUserRelation(PermissionQueryContext context) { + final List relations = new ArrayList<>(); + List workspaceOUPairs = context.getWorkspaceOUPairs(); + // mock 看做已有指定的角色 + for (WorkspaceOUPair ow : workspaceOUPairs) { + List mockRelations = context.getPreviewRoleIds().stream().map(id -> { + SaasRoleUserRelation relation = new SaasRoleUserRelation(); + relation.setRoleId(id); + relation.setOuId(ow.getOuId()); + relation.setWorkspaceId(ow.getWorkspaceId()); + relation.setIdentityId(context.getUserIdentity().getIdentityId()); + relation.setIdentityType(context.getUserIdentity().getIdentityType()); + // 使用角色ID替代,不需要在查询一次 + relation.setId(id); + return relation; + }).collect(Collectors.toList()); + relations.addAll(mockRelations); + } + return relations; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index e556b6a6..c45dafb0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -27,6 +27,8 @@ import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleVO; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; +import cn.axzo.tyr.server.model.RoleFeatureRelation; +import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupDao; import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao; @@ -975,4 +977,30 @@ public class RoleServiceImpl implements RoleService { .or().eq(SaasRole::getRoleType, RoleTypeEnum.ADMIN.getValue());}) .list(); } + + @Override + public List listWithFeatures(Set roleIds, Set featureIds) { + List result = new ArrayList<>(); + + List roles = saasRoleDao.listByIds(roleIds); + if (CollectionUtil.isEmpty(roles)) { + log.warn("no roles found for ids:{}", roles); + return result; + } + + List relations = saasRoleDao.listFeatureByIds(roleIds, featureIds); + Map> mapping = relations.stream() + .collect(Collectors.groupingBy(RoleFeatureRelation::getRoleId, + Collectors.mapping(RoleFeatureRelation::getFeatureId, Collectors.toList()))); + for (SaasRole role : roles) { + result.add(RoleWithFeature.builder() + .roleId(role.getId()) + .roleName(role.getName()) + .roleType(role.getRoleType()) + .productUnitType(role.getProductUnitType()) + .featureIds(mapping.getOrDefault(role.getId(), Collections.emptyList())) + .build()); + } + return result; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index b6f9bd76..2e8f3912 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -1,29 +1,13 @@ package cn.axzo.tyr.server.service.impl; -import cn.axzo.basics.common.BeanMapper; -import cn.axzo.basics.common.util.TreeUtil; -import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.tyr.client.common.enums.FeatureResourceType; -import cn.axzo.tyr.client.model.req.ResourceSyncReq; -import cn.axzo.tyr.client.model.res.FeatureResourceDTO; -import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; -import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; -import cn.axzo.tyr.server.util.RpcInternalUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; /** * 功能资源服务实现 @@ -39,117 +23,15 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic private final SaasFeatureResourceDao featureResourceDao; - private final BaseFeatureResourceApi baseFeatureResourceApi; - @Override - public List getSyncTreeById(Long id) { - //选中同步的数据 - SaasFeatureResource resource = featureResourceDao.lambdaQuery() - .eq(SaasFeatureResource::getId, id) - .one(); - if (resource == null) { - return Collections.emptyList(); - } - //找到所有上级 - 包含自己? - List resourceList = featureResourceDao.lambdaQuery() - .in(SaasFeatureResource::getId, resource.splitPath()) + public List listNavByIds(List featureIds) { + //按需扩展要查询的字段 + return featureResourceDao.lambdaQuery() + .select(SaasFeatureResource::getId, + SaasFeatureResource::getFeatureCode, + SaasFeatureResource::getFeatureName, + SaasFeatureResource::getFeatureType) + .in(SaasFeatureResource::getId, featureIds) .list(); - //resourceList.add(resource); - //如果是页面或应用入口-同时返回所有页面组件 - if (FeatureResourceType.applyPage(resource.getFeatureType())) { - List componentList = featureResourceDao.lambdaQuery() - .eq(SaasFeatureResource::getFeatureType, FeatureResourceType.COMPONENT.getCode()) - .apply("FIND_IN_SET(" + id + ", path)") - .list(); - resourceList.addAll(componentList); - } - List dtoList = BeanMapper.copyList(resourceList, FeatureResourceTreeNode.class); - return TreeUtil.buildTree(dtoList); - } - - @Override - public void syncFromBase(ResourceSyncReq req) { - final Map codeCache = new ConcurrentHashMap<>(); - for (Long id : req.getIds()) { - //TODO:@Zhan 并发处理;同一个parent下同批查询 - //获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件 - List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), - "get base sync tree by id", id).getData(); - doSyncFromBase(syncList, codeCache, req.getOperatorId()); - } - } - - private void doSyncFromBase(List syncList, Map codeCache, Long operatorId) { - - for (FeatureResourceTreeNode treeNode : syncList) { - if (codeCache.containsKey(treeNode.getId())) { - //已处理过 - log.info("already sync resource:{}", treeNode.getId()); - //递归子节点 - if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { - doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); - } - continue; - } - //缓存code - codeCache.put(treeNode.getId(), treeNode.getFeatureCode()); - - SaasFeatureResource baseResource = BeanMapper.copyBean(treeNode, SaasFeatureResource.class); - //修正数据 - String parentCode = codeCache.get(baseResource.getParentId()); - fixData(baseResource, parentCode); - - SaasFeatureResource resource = featureResourceDao.getByCode(treeNode.getFeatureCode()); - if (resource == null) { - //新增 - baseResource.setCreateBy(operatorId); - baseResource.setUpdateBy(operatorId); - newResource(baseResource); - } else { - //更新 - baseResource.setId(resource.getId()); - baseResource.setPath(baseResource.getPath() + "," + resource.getId()); - baseResource.setUpdateBy(operatorId); - featureResourceDao.updateById(baseResource); - - if (!StrUtil.equals(baseResource.getPath(), resource.getPath())) { - //层级变化 - log.info("replace path from old:{} to new:{}", resource.getPath(), baseResource.getPath()); - featureResourceDao.replacePath(resource.getPath(), baseResource.getPath()); - } - } - //递归子节点 - if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { - doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); - } - } - } - - - /** 修正当前环境的数据 parentId path **/ - private void fixData(SaasFeatureResource resource, String parentCode) { - if (StrUtil.isBlank(parentCode)) { - resource.setParentId(0L); - resource.setPath("0"); - } else { - //找当前环境的parent - SaasFeatureResource parent = featureResourceDao.getByCode(parentCode); - if (parent == null) { - resource.setParentId(0L); - resource.setPath("0"); - } else { - resource.setParentId(parent.getId()); - resource.setPath(parent.getPath()); - } - } - } - - private void newResource(SaasFeatureResource resource) { - - featureResourceDao.save(resource); - //path追加自身ID - resource.setPath(resource.getPath() + "," + resource.getId()); - featureResourceDao.updateById(resource); - } } diff --git a/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml b/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml index af3a6ecb..283bec6a 100644 --- a/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml +++ b/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml @@ -126,4 +126,22 @@ + + \ No newline at end of file From e25a6b9095e642f18e4462ff931199fe6de2c8b5 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 8 Apr 2024 15:20:56 +0800 Subject: [PATCH 014/130] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/base/BaseFeatureResourceDO.java | 3 + .../model/req/FeatureComponentSaveReq.java | 3 +- .../model/req/FeatureResourceTreeSaveReq.java | 4 + .../cn/axzo/tyr/server/TyrApplication.java | 3 + .../permission/FeatureResourceController.java | 3 + .../roleuser/RoleUserController.java | 2 + .../service/SaasFeatureResourceService.java | 3 + .../impl/SaasFeatureResourceServiceImpl.java | 78 +++++++++++++++++++ 8 files changed, 98 insertions(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java index 366b97ef..e141ec7d 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java @@ -32,4 +32,7 @@ public class BaseFeatureResourceDO { /** 图标 **/ private String icon; + + /** 端类型 **/ + private String terminal; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java index 9d79daf3..14b3dd11 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureComponentSaveReq.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.ArrayList; import java.util.List; @Data @@ -21,5 +22,5 @@ public class FeatureComponentSaveReq extends BaseFeatureResourceDO { private String linkUrl; /** 子级组件 **/ - private List children; + private List children = new ArrayList<>(); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java index 01895ff8..10fecb9e 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import javax.validation.constraints.NotNull; import java.util.List; @Data @@ -39,6 +40,9 @@ public class FeatureResourceTreeSaveReq extends BaseFeatureResourceDO { /** 页面及组件权限对象 **/ private List permissions; + @NotNull(message = "操作人ID不能为空") + private Long operatorId; + @Data @Builder @AllArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java index 1247f100..e07a81da 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java @@ -16,8 +16,11 @@ import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication(scanBasePackages = "cn.axzo") public class TyrApplication { public static void main(String[] args) { + System.setProperty("spring.redis.port","31270"); + System.setProperty("spring.redis.host","123.249.44.111"); ConfigurableApplicationContext run = SpringApplication.run(TyrApplication.class, args); Environment env = run.getEnvironment(); + log.info( "--------------------------------------------------------------------------------------------------------------------\n" + "Application 【{}】 is running on 【{}】 environment!\n" + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 4752bb7f..4d7bfbf0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -49,6 +49,9 @@ public class FeatureResourceController implements FeatureResourceApi { @Override public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { log.info("save feature resouce req : " + req.toString()); + + featureResourceService.saveOrUpdateMenu(req); + return ApiResult.ok(); } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java index dd78d34b..90a4b163 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java @@ -120,6 +120,7 @@ public class RoleUserController implements TyrSaasRoleUserApi { * 根据id删除用户角色关联关系 * @return */ + @Override public ApiResult removeRoleUserRelation(@RequestBody @Valid List ids){ AssertUtil.isTrue(!CollectionUtils.isEmpty(ids),"用户角色关联id不能为空"); List relations = saasRoleUserRelationDao.listByIds(ids); @@ -141,6 +142,7 @@ public class RoleUserController implements TyrSaasRoleUserApi { * 获取分包负责人等特殊角色 * @return */ + @Override public ApiResult> getSpecialRole() { return ApiResult.ok(saasRoleUserService.getSpecialRole()); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index 8855d645..c4139582 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.server.service; +import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; @@ -18,4 +19,6 @@ public interface SaasFeatureResourceService { List getSyncTreeById(Long id); void syncFromBase(ResourceSyncReq req); + + void saveOrUpdateMenu(FeatureResourceTreeSaveReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index b6f9bd76..ce81ff2a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -3,7 +3,10 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq; +import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; @@ -13,16 +16,20 @@ import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -152,4 +159,75 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic featureResourceDao.updateById(resource); } + + @Override + public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { + SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); + baseResource.setUpdateBy(req.getOperatorId()); + // 新增时候 + if (req.getId() == null) { + baseResource.setCreateBy(req.getOperatorId()); + newResource(baseResource); + } else { + featureResourceDao.updateById(baseResource); + } + + if (CollectionUtil.isNotEmpty(req.getComponentSaveReqList())) { + for (FeatureComponentSaveReq componentSaveReq : req.getComponentSaveReqList()) { + saveOrUpdateFeatureComponent(componentSaveReq, baseResource.getPath(), req.getOperatorId()); + } + } else { + deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); + } + } + + private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId) { + // 批量保存path + SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class); + saasFeatureResource.setUpdateBy(operatorId); + if (saasFeatureResource.getId() != null) { + featureResourceDao.updateById(saasFeatureResource); + } else { + saasFeatureResource.setCreateBy(operatorId); + featureResourceDao.save(saasFeatureResource); + saasFeatureResource.setPath(parentPath + "," + saasFeatureResource.getId()); + featureResourceDao.updateById(saasFeatureResource); + } + + List children = featureComponentSaveReq.getChildren(); + // 删除前端没带但数据库中有的组件。 + deleteComponentRecursionById(saasFeatureResource.getId(), children, operatorId); + + // 更新前端提交的数据; + if (!CollectionUtil.isEmpty(children)) { + for (FeatureComponentSaveReq childComponent : children) { + if (childComponent.getParentId() != null) { + childComponent.setParentId(saasFeatureResource.getId()); + } + // 递归新增修改删除子节点 + saveOrUpdateFeatureComponent(childComponent, saasFeatureResource.getPath(), operatorId); + } + } + } + + // 删除自己和自己的子集 + private void deleteComponentRecursionById(Long resourceId, List submitChildren, Long operatorId) { + if (submitChildren == null) { + submitChildren = Collections.emptyList(); + } + // 删除前端没带过来的 + List existChild = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getParentId, resourceId).list(); + List updateChildIds = submitChildren.stream().map(FeatureComponentSaveReq::getId).filter(Objects::nonNull).collect(Collectors.toList()); + List deleteChildren = existChild.stream().filter(item -> !updateChildIds.contains(item.getId())).collect(Collectors.toList()); + // 前端没传但是数据库中有的,需要删除 + if (!CollectionUtil.isEmpty(deleteChildren)) { + for (SaasFeatureResource deleteChild : deleteChildren) { + // 删除自己及自己的子集 + featureResourceDao.lambdaUpdate() + .apply("FIND_IN_SET('" + deleteChild.getId() + "', path)") + .set(SaasFeatureResource::getUpdateBy, operatorId) + .set(BaseEntity::getIsDelete,1); + } + } + } } From 2436b8ab65761c44161460d90ebcb8dcb91ac7e7 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 8 Apr 2024 15:27:32 +0800 Subject: [PATCH 015/130] =?UTF-8?q?fix(2227-merge):=20=E4=BD=95=E5=BF=85?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasFeatureResourceServiceImpl.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index c2abfd40..3825f3bf 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -1,13 +1,21 @@ package cn.axzo.tyr.server.service.impl; +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq; +import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.hutool.core.collection.CollectionUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * 功能资源服务实现 @@ -55,4 +63,63 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); } } + + private void newResource(SaasFeatureResource resource) { + + featureResourceDao.save(resource); + //path追加自身ID + resource.setPath(resource.getPath() + "," + resource.getId()); + featureResourceDao.updateById(resource); + + } + + private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId) { + // 批量保存path + SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class); + saasFeatureResource.setUpdateBy(operatorId); + if (saasFeatureResource.getId() != null) { + featureResourceDao.updateById(saasFeatureResource); + } else { + saasFeatureResource.setCreateBy(operatorId); + featureResourceDao.save(saasFeatureResource); + saasFeatureResource.setPath(parentPath + "," + saasFeatureResource.getId()); + featureResourceDao.updateById(saasFeatureResource); + } + + List children = featureComponentSaveReq.getChildren(); + // 删除前端没带但数据库中有的组件。 + deleteComponentRecursionById(saasFeatureResource.getId(), children, operatorId); + + // 更新前端提交的数据; + if (!CollectionUtil.isEmpty(children)) { + for (FeatureComponentSaveReq childComponent : children) { + if (childComponent.getParentId() != null) { + childComponent.setParentId(saasFeatureResource.getId()); + } + // 递归新增修改删除子节点 + saveOrUpdateFeatureComponent(childComponent, saasFeatureResource.getPath(), operatorId); + } + } + } + + // 删除自己和自己的子集 + private void deleteComponentRecursionById(Long resourceId, List submitChildren, Long operatorId) { + if (submitChildren == null) { + submitChildren = Collections.emptyList(); + } + // 删除前端没带过来的 + List existChild = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getParentId, resourceId).list(); + List updateChildIds = submitChildren.stream().map(FeatureComponentSaveReq::getId).filter(Objects::nonNull).collect(Collectors.toList()); + List deleteChildren = existChild.stream().filter(item -> !updateChildIds.contains(item.getId())).collect(Collectors.toList()); + // 前端没传但是数据库中有的,需要删除 + if (!CollectionUtil.isEmpty(deleteChildren)) { + for (SaasFeatureResource deleteChild : deleteChildren) { + // 删除自己及自己的子集 + featureResourceDao.lambdaUpdate() + .apply("FIND_IN_SET('" + deleteChild.getId() + "', path)") + .set(SaasFeatureResource::getUpdateBy, operatorId) + .set(BaseEntity::getIsDelete,1); + } + } + } } From 308623e6d4679a6c0a589027a94ecb4be3bfaa4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Mon, 8 Apr 2024 16:26:32 +0800 Subject: [PATCH 016/130] =?UTF-8?q?feat(2227-=E9=80=9A=E8=AE=AF=E5=BD=95):?= =?UTF-8?q?=20modify=E4=BF=9D=E5=AD=98=E6=88=96=E6=9B=B4=E6=96=B0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=9D=83=E9=99=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/server/service/impl/RoleUserService.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index 8d82008c..85eb749c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -437,10 +437,12 @@ public class RoleUserService implements SaasRoleUserService { Long autoOwnRoleId = null; if (CollectionUtils.isNotEmpty(existsRoleUser)) { List autoOwnRoles = existsRoleUser.stream().filter(e -> role.getId().equals(e.getRoleId())).mapToLong(SaasRoleUserRelation::getRoleId).boxed().collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(autoOwnRoles) && autoOwnRoles.size() > 1) { - log.warn("personId:{} ouId:{} workspaceId:{} has {} auto_own roles", req.getPersonId(), req.getOuId(), req.getWorkspaceId(), autoOwnRoles.size()); + if (CollectionUtils.isNotEmpty(autoOwnRoles)) { + autoOwnRoleId = autoOwnRoles.get(0); + if (autoOwnRoles.size() > 1) { + log.warn("personId:{} ouId:{} workspaceId:{} has {} auto_own roles", req.getPersonId(), req.getOuId(), req.getWorkspaceId(), autoOwnRoles.size()); + } } - autoOwnRoleId = autoOwnRoles.get(0); } if (Objects.isNull(autoOwnRoleId)) { From 0aeae35a1a6e613421c462f7a26871136e405dcc Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 8 Apr 2024 19:36:14 +0800 Subject: [PATCH 017/130] =?UTF-8?q?fix(2227-permissionQuery):=20=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=88=86=E6=94=AF=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/FeatureResourceAuthType.java | 42 +++++++ .../common/enums/FeatureResourceStatus.java | 42 +++++++ .../tyr/client/common/enums/RoleTypeEnum.java | 5 + .../common/constants/CacheConstant.java | 14 +++ .../axzo/tyr/server/model/PermissionDO.java | 5 +- .../server/model/PermissionQueryContext.java | 2 - .../tyr/server/model/ResourcePermission.java | 30 +++++ .../model/ResourcePermissionQueryDTO.java | 31 +++++ .../tyr/server/model/RoleWithFeature.java | 4 +- .../model/WorkspaceFeatureRelation.java | 26 ++++ .../service/SaasFeatureResourceService.java | 10 +- .../impl/PermissionQueryServiceImpl.java | 112 ++++++++++++++++-- .../server/service/impl/RoleServiceImpl.java | 6 +- .../impl/SaasFeatureResourceServiceImpl.java | 48 ++++++++ 14 files changed, 355 insertions(+), 22 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceAuthType.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceStatus.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/CacheConstant.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermission.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/WorkspaceFeatureRelation.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceAuthType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceAuthType.java new file mode 100644 index 00000000..01f726a5 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceAuthType.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.client.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 功能资源授权类型 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 17:57 + */ +@Getter +@AllArgsConstructor +public enum FeatureResourceAuthType { + + ALL_ROLE(0, "全部角色"), + GRANT_ROLE(1, "指定角色"), + ; + + private static final Map MAPPING = new HashMap<>(); + + static { + Arrays.stream(FeatureResourceAuthType.values()).forEach(t -> MAPPING.put(t.code, t)); + } + + private final Integer code; + + private final String desc; + + public FeatureResourceAuthType getByCode(Integer code) { + return MAPPING.get(code); + } + + public boolean apply(Integer code) { + return this.code.equals(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceStatus.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceStatus.java new file mode 100644 index 00000000..c14d359f --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceStatus.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.client.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 功能资源状态 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 17:37 + */ +@Getter +@AllArgsConstructor +public enum FeatureResourceStatus { + + HIDE(0, "隐藏"), + NORMAL(1, "展示"), + ; + + private static final Map MAPPING = new HashMap<>(); + + static { + Arrays.stream(FeatureResourceStatus.values()).forEach(t -> MAPPING.put(t.code, t)); + } + + private final Integer code; + + private final String desc; + + public FeatureResourceStatus getByCode(Integer code) { + return MAPPING.get(code); + } + + public boolean apply(Integer code) { + return this.code.equals(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java index 8f3d3f08..04a09e7f 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java @@ -6,6 +6,7 @@ import lombok.Getter; import java.util.Arrays; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -51,4 +52,8 @@ public enum RoleTypeEnum { .orElse(false); } + public boolean apply(String value) { + return Objects.equals(this.value, value); + } + } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/CacheConstant.java b/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/CacheConstant.java new file mode 100644 index 00000000..3b5f250a --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/CacheConstant.java @@ -0,0 +1,14 @@ +package cn.axzo.tyr.server.common.constants; + +/** + * 缓存常量 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 17:50 + */ +public class CacheConstant { + + /** 免授权缓存KEY **/ + public static final String KEY_AUTH_FREE = "tyr:auth-free"; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java index 10dc7dc4..eb4247e1 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionDO.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; +import java.util.Set; /** * 权限对象 @@ -21,5 +21,6 @@ import java.util.List; public class PermissionDO { private Long ouId; private Long workspaceId; - private List featureIds; + private Set featureIds; + private boolean superAdmin; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java index d2c8ceff..1531be19 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java @@ -30,8 +30,6 @@ public class PermissionQueryContext { private List workspaceOUPairs; /** 登录端 **/ private String terminal; - /** 资源类型 **/ - private List featureTypes; /** 预览角色ID **/ private List previewRoleIds; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermission.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermission.java new file mode 100644 index 00000000..02460801 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermission.java @@ -0,0 +1,30 @@ +package cn.axzo.tyr.server.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 资源权限 + * feature简化权限相关属性 + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 17:11 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ResourcePermission { + + private Long id; + + private Long parentId; + + private String featureCode; + + private Integer featureType; + + private Integer authType; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java new file mode 100644 index 00000000..0b7653fd --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java @@ -0,0 +1,31 @@ +package cn.axzo.tyr.server.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 资源权限查询 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 17:10 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ResourcePermissionQueryDTO { + + private List ids; + + private List featureTypes; + + private List terminals; + + private List authType; + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java index 12a07d65..418af1be 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/RoleWithFeature.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; +import java.util.Set; /** * 角色和权限 @@ -28,5 +28,5 @@ public class RoleWithFeature { private Integer productUnitType; - private List featureIds; + private Set featureIds; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/WorkspaceFeatureRelation.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/WorkspaceFeatureRelation.java new file mode 100644 index 00000000..52f24b3f --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/WorkspaceFeatureRelation.java @@ -0,0 +1,26 @@ +package cn.axzo.tyr.server.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 租户产品权限关系 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/8 15:56 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkspaceFeatureRelation { + + private Long workspaceId; + + private Integer productUnitType; + + private Long featureId; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index 0f8df3c4..d8edafaf 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -1,5 +1,7 @@ package cn.axzo.tyr.server.service; +import cn.axzo.tyr.server.model.ResourcePermission; +import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; @@ -15,6 +17,12 @@ import java.util.List; public interface SaasFeatureResourceService { void saveOrUpdateMenu(FeatureResourceTreeSaveReq req); - /** 根据ID查询导航菜单页面信息 - 限制查询字段 **/ + /** 根据ID查询导航菜单页面信息 仅可显示 - 限制查询字段 **/ List listNavByIds(List featureIds); + + /** 资源权限通用查询 **/ + List permissionQuery(ResourcePermissionQueryDTO param); + + /** 是否免授权 **/ + boolean isAuthFree(Long featureId); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index dc306a98..1a7455fb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -1,18 +1,22 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.util.NumberUtil; import cn.axzo.basics.common.util.TreeUtil; -import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.framework.auth.domain.TerminalInfo; +import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.base.WorkspaceOUPair; import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.res.NavTreeResp; import cn.axzo.tyr.server.model.PermissionDO; import cn.axzo.tyr.server.model.PermissionQueryContext; +import cn.axzo.tyr.server.model.ResourcePermission; +import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.model.UserIdentity; -import cn.axzo.tyr.client.model.base.WorkspaceOUPair; -import cn.axzo.tyr.client.model.req.IdentityAuthReq; -import cn.axzo.tyr.client.model.req.NavTreeReq; -import cn.axzo.tyr.client.model.req.PermissionQueryReq; -import cn.axzo.tyr.client.model.res.NavTreeResp; +import cn.axzo.tyr.server.model.WorkspaceFeatureRelation; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.service.PermissionQueryService; @@ -26,9 +30,13 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -51,14 +59,16 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { public List getNavTree(NavTreeReq req) { //构造参数 PermissionQueryContext context = BeanMapper.copyBean(req, PermissionQueryContext.class); - //限制只查菜单页面 - context.setFeatureTypes(FeatureResourceType.navTypes()); + //查询权限 List permissions = queryUserPermission(context); if (CollectionUtil.isEmpty(permissions)) { return Collections.emptyList(); } - List featureIds = permissions.stream().map(PermissionDO::getFeatureIds).flatMap(List::stream).collect(Collectors.toList()); + List featureIds = permissions.stream() + .map(PermissionDO::getFeatureIds) + .flatMap(Set::stream) + .collect(Collectors.toList()); //反查资源信息 List resourceList = featureResourceService.listNavByIds(featureIds); //组装导航树 @@ -74,13 +84,91 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { log.warn("no user role relation found"); return Collections.emptyList(); } - Set realWorkspaceId = userRoleRelations.stream().map(SaasRoleUserRelation::getWorkspaceId).collect(Collectors.toSet()); - //TODO: 查询产品分配的权限 + //查询租户产品权限点 + List workspaceFeatureRelations = listWorkspaceFeatureRelations(context); Set roleIds = userRoleRelations.stream().map(SaasRoleUserRelation::getRoleId).collect(Collectors.toSet()); //查询角色权限 List roles = roleService.listWithFeatures(roleIds, context.getFeatureIds()); + //取交集确定权限 + return buildFinalPermission(userRoleRelations, workspaceFeatureRelations, roles); + } - return Collections.emptyList(); + private List buildFinalPermission(List userRoleRelations, + List workspaceFeatureRelations, + List roles) { + + //mapping + Map roleMap = roles.stream() + .collect(Collectors.toMap(RoleWithFeature::getRoleId, Function.identity())); + Map> workspaceMap = workspaceFeatureRelations.stream() + .collect(Collectors.groupingBy(WorkspaceFeatureRelation::getWorkspaceId)); + //按拥有的角色构建权限结果 + Map result = new HashMap<>(); + for (SaasRoleUserRelation relation : userRoleRelations) { + RoleWithFeature role = roleMap.get(relation.getRoleId()); + if (role == null) { + log.warn("no role found for id:{}", relation.getRoleId()); + continue; + } + List allFeatures = workspaceMap.get(relation.getWorkspaceId()); + if (CollectionUtil.isEmpty(allFeatures)) { + log.warn("no workspace product feature found for id:{}", relation.getWorkspaceId()); + continue; + } + + String key = relation.getWorkspaceId() + "-" + relation.getOuId(); + PermissionDO permission = result.getOrDefault(key, + PermissionDO.builder().ouId(relation.getOuId()).workspaceId(relation.getWorkspaceId()).build()); + if (RoleTypeEnum.isAdmin(role.getRoleType())) { + //管理员和超管类权限 + permission.getFeatureIds().addAll(buildAdminPermission(role, allFeatures)); + if (RoleTypeEnum.SUPER_ADMIN.apply(role.getRoleType())) { + //超管标记 + permission.setSuperAdmin(true); + } + } else { + //普通角色权限 + permission.getFeatureIds().addAll(buildNormalPermission(role, allFeatures)); + } + + result.put(key, permission); + } + return null; + } + + private List buildNormalPermission(RoleWithFeature role, List allFeatures) { + //普通角色:角色同类型的租户产品权限已分配 且角色上已分配 + 免授权 + Set roleFeatures = role.getFeatureIds(); + return allFeatures.stream() + .filter(f -> Objects.equals(f.getProductUnitType(), role.getProductUnitType()) + || !NumberUtil.isPositiveNumber(role.getProductUnitType())) + .map(WorkspaceFeatureRelation::getFeatureId) + .filter(id -> roleFeatures.contains(id) || featureResourceService.isAuthFree(id)) + .collect(Collectors.toList()); + } + + private List buildAdminPermission(RoleWithFeature role, List allFeatures) { + //超管和管理员 直接取和角色类型匹配的租户产品权限 + return allFeatures.stream() + .filter(f -> Objects.equals(f.getProductUnitType(), role.getProductUnitType()) + || !NumberUtil.isPositiveNumber(role.getProductUnitType())) + .map(WorkspaceFeatureRelation::getFeatureId) + .collect(Collectors.toList()); + } + + private List listWorkspaceFeatureRelations(PermissionQueryContext context) { + //TODO:@Zhan 本期没做产品权限配置,这里暂时先查询所有OMS资源作为已配置产品权限 + List permissions = featureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder() + .terminals(Collections.singletonList(TerminalInfo.NT_OMS_WEB)) + .build()); + List result = new ArrayList<>(); + for (WorkspaceOUPair ow : context.getWorkspaceOUPairs()) { + List owPermission = permissions.stream().map(p -> WorkspaceFeatureRelation.builder().workspaceId(ow.getWorkspaceId()) + .productUnitType(SaasCooperateShipCooperateTypeEnum.OMS.code) + .build()).collect(Collectors.toList()); + result.addAll(owPermission); + } + return result; } private List listRoleUserRelations(PermissionQueryContext context) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index c45dafb0..0c380e6a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -989,16 +989,16 @@ public class RoleServiceImpl implements RoleService { } List relations = saasRoleDao.listFeatureByIds(roleIds, featureIds); - Map> mapping = relations.stream() + Map> mapping = relations.stream() .collect(Collectors.groupingBy(RoleFeatureRelation::getRoleId, - Collectors.mapping(RoleFeatureRelation::getFeatureId, Collectors.toList()))); + Collectors.mapping(RoleFeatureRelation::getFeatureId, Collectors.toSet()))); for (SaasRole role : roles) { result.add(RoleWithFeature.builder() .roleId(role.getId()) .roleName(role.getName()) .roleType(role.getRoleType()) .productUnitType(role.getProductUnitType()) - .featureIds(mapping.getOrDefault(role.getId(), Collections.emptyList())) + .featureIds(mapping.getOrDefault(role.getId(), Collections.emptySet())) .build()); } return result; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 3825f3bf..8833044c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -2,12 +2,19 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.pokonyan.config.redis.RedisClient; +import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; +import cn.axzo.tyr.client.common.enums.FeatureResourceStatus; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; +import cn.axzo.tyr.server.model.ResourcePermission; +import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.BooleanUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -15,8 +22,11 @@ import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static cn.axzo.tyr.server.common.constants.CacheConstant.KEY_AUTH_FREE; + /** * 功能资源服务实现 * @@ -36,13 +46,51 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic //按需扩展要查询的字段 return featureResourceDao.lambdaQuery() .select(SaasFeatureResource::getId, + SaasFeatureResource::getParentId, SaasFeatureResource::getFeatureCode, SaasFeatureResource::getFeatureName, SaasFeatureResource::getFeatureType) + .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) .in(SaasFeatureResource::getId, featureIds) + .in(SaasFeatureResource::getFeatureType, FeatureResourceType.navTypes()) .list(); } + @Override + public List permissionQuery(ResourcePermissionQueryDTO param) { + List resourceList = featureResourceDao.lambdaQuery() + .select(SaasFeatureResource::getId, + SaasFeatureResource::getParentId, + SaasFeatureResource::getFeatureCode, + SaasFeatureResource::getFeatureType, + SaasFeatureResource::getAuthType) + .in(CollectionUtil.isNotEmpty(param.getIds()), SaasFeatureResource::getId, param.getIds()) + .in(CollectionUtil.isNotEmpty(param.getFeatureTypes()), SaasFeatureResource::getFeatureType, param.getFeatureTypes()) + .in(CollectionUtil.isNotEmpty(param.getTerminals()), SaasFeatureResource::getTerminal, param.getTerminals()) + .list(); + return BeanMapper.copyList(resourceList, ResourcePermission.class); + } + + @Override + public boolean isAuthFree(Long featureId) { + + if (BooleanUtil.isTrue(RedisClient.KeyOps.hasKey(KEY_AUTH_FREE))) { + return RedisClient.SetOps.sIsMember(KEY_AUTH_FREE, featureId); + } + + //load from DB + String[] featureIds = this.permissionQuery(ResourcePermissionQueryDTO.builder() + .authType(Collections.singletonList(FeatureResourceAuthType.ALL_ROLE.getCode())) + .build()) + .stream() + .map(ResourcePermission::getId).map(String::valueOf) + .toArray(String[]::new); + RedisClient.SetOps.sAdd(KEY_AUTH_FREE, featureIds); + RedisClient.KeyOps.expire(KEY_AUTH_FREE, 120L, TimeUnit.MINUTES); + + return RedisClient.SetOps.sIsMember(KEY_AUTH_FREE, featureId); + } + @Override public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); From 906699c863c8cf910d08ff614add39485ee50596 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 8 Apr 2024 20:50:42 +0800 Subject: [PATCH 018/130] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E6=8E=92=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasFeatureResourceServiceImpl.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 8833044c..e7b0d226 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -98,14 +99,26 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic // 新增时候 if (req.getId() == null) { baseResource.setCreateBy(req.getOperatorId()); + baseResource.setDisplayOrder(0); + List parallelResources = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getParentId, req.getParentId()).list(); + if (CollectionUtil.isNotEmpty(parallelResources)) { + SaasFeatureResource maxOrderResource = parallelResources.stream().max(Comparator.comparingInt(SaasFeatureResource::getDisplayOrder)).orElse(new SaasFeatureResource()); + baseResource.setDisplayOrder(maxOrderResource.getDisplayOrder() + 1); + } newResource(baseResource); } else { featureResourceDao.updateById(baseResource); } if (CollectionUtil.isNotEmpty(req.getComponentSaveReqList())) { - for (FeatureComponentSaveReq componentSaveReq : req.getComponentSaveReqList()) { - saveOrUpdateFeatureComponent(componentSaveReq, baseResource.getPath(), req.getOperatorId()); + List components = req.getComponentSaveReqList(); + for (int i = 0; i < components.size(); i++) { + FeatureComponentSaveReq childComponent = components.get(i); + if (childComponent.getParentId() != null) { + childComponent.setParentId(baseResource.getId()); + } + // 递归新增修改删除子节点 + saveOrUpdateFeatureComponent(childComponent, baseResource.getPath(), req.getOperatorId(), i); } } else { deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); @@ -121,10 +134,11 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } - private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId) { + private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId, Integer displayOrder) { // 批量保存path SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class); saasFeatureResource.setUpdateBy(operatorId); + saasFeatureResource.setDisplayOrder(displayOrder); if (saasFeatureResource.getId() != null) { featureResourceDao.updateById(saasFeatureResource); } else { @@ -140,12 +154,13 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic // 更新前端提交的数据; if (!CollectionUtil.isEmpty(children)) { - for (FeatureComponentSaveReq childComponent : children) { + for (int i = 0; i < children.size(); i++) { + FeatureComponentSaveReq childComponent = children.get(i); if (childComponent.getParentId() != null) { childComponent.setParentId(saasFeatureResource.getId()); } // 递归新增修改删除子节点 - saveOrUpdateFeatureComponent(childComponent, saasFeatureResource.getPath(), operatorId); + saveOrUpdateFeatureComponent(childComponent, saasFeatureResource.getPath(), operatorId, i); } } } @@ -164,6 +179,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic for (SaasFeatureResource deleteChild : deleteChildren) { // 删除自己及自己的子集 featureResourceDao.lambdaUpdate() + .eq(BaseEntity::getIsDelete,0) .apply("FIND_IN_SET('" + deleteChild.getId() + "', path)") .set(SaasFeatureResource::getUpdateBy, operatorId) .set(BaseEntity::getIsDelete,1); From 672c7d96c7658f0819c11b64b4f04bde59794f41 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 9 Apr 2024 14:07:15 +0800 Subject: [PATCH 019/130] =?UTF-8?q?feat:(REQ-2227)=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E8=A7=92=E8=89=B2tree=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 14 +- .../tyr/client/model/req/TreeRoleReq.java | 15 ++ .../tyr/client/model/res/RoleTreeRes.java | 42 +++++ .../tyr/client/model/vo/SaasRoleGroupVO.java | 4 + tyr-server/pom.xml | 4 + .../controller/role/SaasRoleController.java | 164 +++++++++++++++++- .../repository/entity/SaasRoleGroup.java | 10 ++ .../axzo/tyr/server/service/RoleService.java | 50 +++++- .../service/SaasRoleGroupRelationService.java | 44 ++++- .../server/service/impl/RoleServiceImpl.java | 27 ++- .../SaasRoleGroupRelationServiceImpl.java | 31 +++- .../impl/SaasRoleGroupServiceImpl.java | 1 + 12 files changed, 398 insertions(+), 8 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index f6de9e38..3d49455b 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -1,12 +1,15 @@ package cn.axzo.tyr.client.feign; +import cn.axzo.framework.domain.web.result.ApiListResult; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; -import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.TreeRoleReq; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -140,4 +143,13 @@ public interface TyrSaasRoleApi { */ @PostMapping("api/saasRole/changeGroupLeaderRole") ApiResult changeGroupLeaderRole(@RequestBody @Valid List req); + + /** + * 查询角色树 + * @param req + * @return + */ + @PostMapping("/api/saasRole/tree") + ApiListResult treeSaasRole(@RequestBody @Valid TreeRoleReq req); + } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java new file mode 100644 index 00000000..402f65f0 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TreeRoleReq { + + private Boolean needRole; +} \ No newline at end of file diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java new file mode 100644 index 00000000..cbbd1057 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleTreeRes { + + /** + * id + */ + private Long id; + + /** + * 根节点的code + */ + private String workspaceTypeCode; + + /** + * 名字 + */ + private String name; + + /** + * 类型:ROLE_GROUP(分组)、ROLE(角色)、ROOT(根节点) + */ + private String type; + + /** + * 是否显示 + */ + private Boolean isDisplay; + + private List children; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleGroupVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleGroupVO.java index 449812c4..65340683 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleGroupVO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleGroupVO.java @@ -66,4 +66,8 @@ public class SaasRoleGroupVO { private Date updateAt; + /** + * 上级分组id + */ + private Long parentId; } diff --git a/tyr-server/pom.xml b/tyr-server/pom.xml index 3c2ab346..e60566e2 100644 --- a/tyr-server/pom.xml +++ b/tyr-server/pom.xml @@ -101,6 +101,10 @@ maokai-api + + cn.axzo.pokonyan + pokonyan + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 7e3becd5..1462a164 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -1,14 +1,20 @@ package cn.axzo.tyr.server.controller.role; import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.framework.domain.web.result.ApiListResult; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.TyrSaasRoleApi; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; -import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.TreeRoleReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -16,20 +22,34 @@ import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleVO; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; import cn.axzo.tyr.server.model.PermissionCacheKey; +import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRole; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.service.PermissionCacheService; import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasCommonDictService; +import cn.axzo.tyr.server.service.SaasRoleGroupService; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 权限 @@ -49,6 +69,17 @@ public class SaasRoleController implements TyrSaasRoleApi { PermissionCacheService permissionCacheService; @Autowired private SaasRoleUserRelationDao saasRoleUserRelationDao; + @Autowired + private SaasCommonDictService saasCommonDictService; + @Autowired + private SaasRoleGroupService saasRoleGroupService; + @Autowired + private SaasRoleGroupRelationDao saasRoleGroupRelationDao; + + /** + * 角色组里面parentId = 0 + */ + private static final Long ROOT_ROLE_GROUP_PARENT_ID = 0L; @Override public ApiResult saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) { @@ -133,4 +164,135 @@ public class SaasRoleController implements TyrSaasRoleApi { roleService.changeGroupLeaderRole(reqs); return ApiResult.ok(); } + + @Override + public ApiListResult treeSaasRole(TreeRoleReq req) { + + // 因为根节点在roleGroup里面没有,都是workspaceTypeCode,描述是放在字典表里 + List commonDicts = listRootRole(); + + List roots = commonDicts.stream() + .map(e -> RoleTreeRes.builder() + .workspaceTypeCode(e.getDictCode()) + .name(e.getDictValue()) + .type("ROOT") + .build()) + .collect(Collectors.toList()); + + Map> roleGroups = listRoleGroupTree(commonDicts, req); + + List result = roots.stream() + .peek(root -> root.setChildren(roleGroups.get(root.getWorkspaceTypeCode()))) + .collect(Collectors.toList()); + return ApiListResult.ok(result); + } + + /** + * 查询角色 + * Map<角色分组Id, List> + * @param roleGroups + * @param req + * @return + */ + private Map> listRole(List roleGroups, + TreeRoleReq req) { + + List roleGroupIds = roleGroups.stream().map(SaasRoleGroupVO::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(roleGroupIds) || BooleanUtils.isNotTrue(req.getNeedRole())) { + return Collections.emptyMap(); + } + + List saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupIds); + + Map saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() + .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) + .build()) + .stream() + .collect(Collectors.toMap(SaasRole::getId, Function.identity())); + + return saasRoleGroupRelations.stream() + .collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId)) + .entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() + .stream() + .map(value -> toRoleTree(saasRoles.get(value.getRoleId()))) + .filter(Objects::nonNull) + .collect(Collectors.toList()))); + } + + private Map> listRoleGroupTree(List commonDicts, + TreeRoleReq req) { + if (CollectionUtils.isEmpty(commonDicts)) { + return Collections.emptyMap(); + } + + List roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder() + .workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode)) + .build()) + .stream() + .sorted(Comparator.comparing(SaasRoleGroupVO::getSort)) + .collect(Collectors.toList()); + + Map> roles = listRole(roleGroups, req); + + Map> rootRoleGroups = roleGroups.stream() + .filter(e -> Objects.equals(e.getParentId(), ROOT_ROLE_GROUP_PARENT_ID)) + .collect(Collectors.groupingBy(SaasRoleGroupVO::getWorkspaceTypeCode, + LinkedHashMap::new, + Collectors.mapping(this::toRoleTree, Collectors.toList()))); + + rootRoleGroups.values().forEach(e -> e.forEach(root -> appendChildren(root, roleGroups, roles))); + + return rootRoleGroups; + } + + private RoleTreeRes toRoleTree(SaasRoleGroupVO roleGroup) { + return RoleTreeRes.builder() + .workspaceTypeCode(roleGroup.getWorkspaceTypeCode()) + .id(roleGroup.getId()) + .name(roleGroup.getName()) + .type("ROLE_GROUP") + .build(); + } + + private RoleTreeRes toRoleTree(SaasRole role) { + if (role == null) { + return null; + } + return RoleTreeRes.builder() + .id(role.getId()) + .name(role.getName()) + .type("ROLE") + .build(); + } + + private void appendChildren(RoleTreeRes rootRoleGroup, + List roleGroups, + Map> roles) { + if (rootRoleGroup == null) { + return; + } + + // 因为children可能是role或者roleGroup + List childrenRoleGroups = roleGroups.stream() + .filter(p -> Objects.equals(p.getParentId(), rootRoleGroup.getId())) + .map(this::toRoleTree) + .collect(Collectors.toList()); + + List childrenRoles = roles.get(rootRoleGroup.getId()); + if (CollectionUtils.isNotEmpty(childrenRoles)) { + childrenRoleGroups.addAll(childrenRoles); + } + + rootRoleGroup.setChildren(childrenRoleGroups); + + childrenRoleGroups.forEach(e -> appendChildren(e, roleGroups, roles)); + } + + private List listRootRole() { + return saasCommonDictService.query(CommonDictQueryReq.builder() + .scope("role") + .build()); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroup.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroup.java index 32d8da5e..61e29103 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroup.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroup.java @@ -3,8 +3,11 @@ package cn.axzo.tyr.server.repository.entity; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; @@ -19,6 +22,9 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor public class SaasRoleGroup extends BaseEntity implements Serializable { private static final long serialVersionUID = 972205950455439772L; @@ -69,6 +75,10 @@ public class SaasRoleGroup extends BaseEntity implements Serializ */ private String categoryCode; + /** + * 上级分组id + */ + private Long parentId; /** * 获取主键值 diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 3409e4eb..431392bf 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -1,8 +1,15 @@ package cn.axzo.tyr.server.service; import cn.axzo.framework.domain.page.PageResp; +import cn.axzo.pokonyan.dao.page.IPageParam; +import cn.axzo.pokonyan.dao.wrapper.CriteriaField; +import cn.axzo.pokonyan.dao.wrapper.Operator; import cn.axzo.tyr.client.model.enums.IdentityType; -import cn.axzo.tyr.client.model.req.*; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; +import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -16,6 +23,12 @@ import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import cn.axzo.tyr.server.service.impl.TyrSaasAuthServiceImpl; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import java.util.List; import java.util.Set; @@ -27,7 +40,7 @@ import java.util.Set; * @author: ZhanSiHu * @date: 2023/9/6 15:51 */ -public interface RoleService { +public interface RoleService extends IService { List queryByIdentityIdType(Long identityId, Integer identityType,Long workspaceId,Long ouId, Boolean includePermissionGroup); @@ -103,5 +116,38 @@ public interface RoleService { /** 查询超管和管理员角色 **/ List listAdmins(Long workspaceId, Long ouId); + List list(ListSaasRoleParam param); + + Page page(PageSaasRoleParam param); + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class ListSaasRoleParam { + + @CriteriaField(field = "id", operator = Operator.IN) + private List roleIds; + } + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class PageSaasRoleParam extends ListSaasRoleParam implements IPageParam { + @CriteriaField(ignore = true) + Integer page; + + @CriteriaField(ignore = true) + Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + List sort; + } + + List listWithFeatures(Set roleIds, Set featureIds); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java index b8ae8a52..20b9f57c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java @@ -1,9 +1,51 @@ package cn.axzo.tyr.server.service; +import cn.axzo.pokonyan.dao.page.IPageParam; +import cn.axzo.pokonyan.dao.wrapper.CriteriaField; +import cn.axzo.pokonyan.dao.wrapper.Operator; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import java.util.List; -public interface SaasRoleGroupRelationService { +public interface SaasRoleGroupRelationService extends IService { void saveOrUpdate(List relations); + + List list(ListSaasRoleGroupRelationParam param); + + Page page(PageSaasRoleGroupRelationParam param); + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class ListSaasRoleGroupRelationParam { + + @CriteriaField(field = "roleId", operator = Operator.IN) + private List roleId; + } + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class PageSaasRoleGroupRelationParam extends ListSaasRoleGroupRelationParam implements IPageParam { + @CriteriaField(ignore = true) + Integer page; + + @CriteriaField(ignore = true) + Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + List sort; + } + } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 0c380e6a..4a716ee0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -4,6 +4,8 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.framework.domain.page.PageResp; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.pokonyan.dao.converter.PageConverter; +import cn.axzo.pokonyan.dao.mysql.QueryWrapperHelper; import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.enums.IdentityType; @@ -45,6 +47,7 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; +import cn.axzo.tyr.server.repository.mapper.SaasRoleMapper; import cn.axzo.tyr.server.service.PermissionGroupService; import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; @@ -56,13 +59,16 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -93,7 +99,8 @@ import java.util.stream.Stream; @RequiredArgsConstructor @RefreshScope @Service -public class RoleServiceImpl implements RoleService { +public class RoleServiceImpl extends ServiceImpl + implements RoleService { @Autowired SaasRoleUserRelationDao roleUserRelationDao; @@ -1003,4 +1010,22 @@ public class RoleServiceImpl implements RoleService { } return result; } + + @Override + public List list(ListSaasRoleParam param) { + return PageConverter.drainAll(pageNumber -> { + PageSaasRoleParam pageParam = PageSaasRoleParam.builder().build(); + BeanUtils.copyProperties(param, pageParam); + pageParam.setPage(pageNumber); + pageParam.setPageSize(500); + return page(pageParam); + }); + } + + @Override + public Page page(PageSaasRoleParam param) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasRole.class); + wrapper.eq("is_delete", 0); + return this.page(PageConverter.convertToMybatis(param, SaasRole.class), wrapper); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java index f067191e..dafb0283 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java @@ -1,12 +1,19 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; -import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.pokonyan.dao.converter.PageConverter; +import cn.axzo.pokonyan.dao.mysql.QueryWrapperHelper; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupRelationMapper; import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,7 +24,8 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class SaasRoleGroupRelationServiceImpl implements SaasRoleGroupRelationService { +public class SaasRoleGroupRelationServiceImpl extends ServiceImpl + implements SaasRoleGroupRelationService { private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; @Override @@ -42,4 +50,23 @@ public class SaasRoleGroupRelationServiceImpl implements SaasRoleGroupRelationSe saasRoleGroupRelationDao.removeByIds(deleteList.stream().map(SaasRoleGroupRelation::getId).collect(Collectors.toList())); } } + + @Override + public List list(ListSaasRoleGroupRelationParam param) { + return PageConverter.drainAll(pageNumber -> { + PageSaasRoleGroupRelationParam pageParam = PageSaasRoleGroupRelationParam.builder().build(); + BeanUtils.copyProperties(param, pageParam); + pageParam.setPage(pageNumber); + pageParam.setPageSize(500); + return page(pageParam); + }); + } + + @Override + public Page page(PageSaasRoleGroupRelationParam param) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasRoleGroupRelation.class); + wrapper.eq("is_delete", 0); + + return this.page(PageConverter.convertToMybatis(param, SaasRoleGroupRelation.class), wrapper); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 3dfaf22f..8aa00f0b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -156,6 +156,7 @@ public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { saasRoleGroup.setSort(req.getSort()); saasRoleGroup.setWorkspaceId(req.getWorkspaceId() != null ? req.getWorkspaceId() : -1L); saasRoleGroup.setOuId(req.getOuId() != null ? req.getOuId() : -1L); + saasRoleGroup.setParentId(req.getParentId()); return saasRoleGroup; } From 107b6f784bbf1ca2c82cb85a494e0d315cb00487 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 9 Apr 2024 15:28:42 +0800 Subject: [PATCH 020/130] =?UTF-8?q?fix(2227-permissionQuery):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E5=8A=9F=E8=83=BD=E9=89=B4=E6=9D=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/PermissionQueryApi.java | 7 +++- .../client/model/req/PermissionCheckReq.java | 39 +++++++++++++++++++ .../client/model/req/PermissionQueryReq.java | 2 - .../permission/PermissionQueryController.java | 6 +++ .../server/model/PermissionQueryContext.java | 16 ++++++++ .../model/ResourcePermissionQueryDTO.java | 2 + .../service/PermissionQueryService.java | 3 ++ .../impl/PermissionQueryServiceImpl.java | 28 ++++++++++++- .../impl/SaasFeatureResourceServiceImpl.java | 1 + 9 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionCheckReq.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java index 46ef850e..244c9a1c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -20,7 +21,11 @@ import java.util.List; @FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") public interface PermissionQueryApi { - /** 返回导航菜单页面 **/ + /** 返回有权限的导航菜单页面 **/ @PostMapping(value = "/api/v3/permission/query/getNavTree") ApiResult> getNavTree(@RequestBody @Valid NavTreeReq req); + + /** 鉴权接口 **/ + @PostMapping(value = "/api/v3/permission/query/hasPermission") + ApiResult hasPermission(PermissionCheckReq req); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionCheckReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionCheckReq.java new file mode 100644 index 00000000..c354c77a --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionCheckReq.java @@ -0,0 +1,39 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 权限校验请求 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/9 14:17 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PermissionCheckReq { + + @NotNull(message = "人员ID不能为空") + private Long personId; + + @NotEmpty(message = "权限code不能为空") + private List featureCodes; + + @NotNull(message = "单位ID不能为空") + private Long ouId; + + @NotNull(message = "租户ID不能为空") + private Long workspaceId; + + /** 登录端 **/ + private String terminal; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java index f4ac67fb..113d1f12 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java @@ -31,8 +31,6 @@ public class PermissionQueryReq { private String terminal; - private List featureTypes; - private List featureCodes; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java index 342f5797..7c0a0b42 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.server.controller.permission; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.PermissionQueryApi; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; import cn.axzo.tyr.server.service.PermissionQueryService; import lombok.RequiredArgsConstructor; @@ -29,4 +30,9 @@ public class PermissionQueryController implements PermissionQueryApi { public ApiResult> getNavTree(NavTreeReq req) { return ApiResult.ok(permissionService.getNavTree(req)); } + + @Override + public ApiResult hasPermission(PermissionCheckReq req) { + return ApiResult.ok(permissionService.hasPermission(req)); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java index 1531be19..11c793ac 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/PermissionQueryContext.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -37,4 +38,19 @@ public class PermissionQueryContext { /** 资源ID **/ private Set featureIds; + public PermissionQueryContext appendPersonId(Long personId) { + if (this.userIdentity == null) { + this.userIdentity = new UserIdentity(); + } + this.userIdentity.setPersonId(personId); + return this; + } + + public PermissionQueryContext appendOuWorkspace(Long ouId, Long workspaceId) { + if (this.workspaceOUPairs == null) { + this.workspaceOUPairs = new ArrayList<>(); + } + this.workspaceOUPairs.add(WorkspaceOUPair.builder().ouId(ouId).workspaceId(workspaceId).build()); + return this; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java index 0b7653fd..1b24bbbc 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java @@ -24,6 +24,8 @@ public class ResourcePermissionQueryDTO { private List featureTypes; + private List featureCodes; + private List terminals; private List authType; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java index 1d4de8ca..e6d64584 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.service; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; import java.util.List; @@ -16,4 +17,6 @@ public interface PermissionQueryService { /** 获取导航菜单页面 **/ List getNavTree(NavTreeReq req); + + boolean hasPermission(PermissionCheckReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 1a7455fb..81419b8f 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -9,6 +9,7 @@ import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.base.WorkspaceOUPair; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; import cn.axzo.tyr.server.model.PermissionDO; import cn.axzo.tyr.server.model.PermissionQueryContext; @@ -58,7 +59,12 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { @Override public List getNavTree(NavTreeReq req) { //构造参数 - PermissionQueryContext context = BeanMapper.copyBean(req, PermissionQueryContext.class); + PermissionQueryContext context = PermissionQueryContext.builder() + .terminal(req.getTerminal()) + .workspaceOUPairs(req.getWorkspaceOUPairs()) + .build() + .appendPersonId(req.getPersonId()); + //查询权限 List permissions = queryUserPermission(context); @@ -75,6 +81,26 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { return TreeUtil.buildTree(BeanMapper.copyList(resourceList, NavTreeResp.class)); } + @Override + public boolean hasPermission(PermissionCheckReq req) { + //权限编码转ID + List resourcePermissions = featureResourceService.permissionQuery( + ResourcePermissionQueryDTO.builder().featureCodes(req.getFeatureCodes()).build()); + if (CollectionUtil.isEmpty(resourcePermissions)) { + log.warn("no feature resource found for codes:{}", req.getFeatureCodes()); + return false; + } + PermissionQueryContext context = PermissionQueryContext.builder() + .terminal(req.getTerminal()) + .build() + .appendPersonId(req.getPersonId()) + .appendOuWorkspace(req.getOuId(), req.getWorkspaceId()); + //查询权限 + List permissions = queryUserPermission(context); + Set featureIds = permissions.stream().map(PermissionDO::getFeatureIds).flatMap(Set::stream).collect(Collectors.toSet()); + //是否任意一个有授权 + return resourcePermissions.stream().anyMatch(r -> featureIds.contains(r.getId())); + } private List queryUserPermission(PermissionQueryContext context) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 8833044c..5e363eaf 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -66,6 +66,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource::getAuthType) .in(CollectionUtil.isNotEmpty(param.getIds()), SaasFeatureResource::getId, param.getIds()) .in(CollectionUtil.isNotEmpty(param.getFeatureTypes()), SaasFeatureResource::getFeatureType, param.getFeatureTypes()) + .in(CollectionUtil.isNotEmpty(param.getFeatureCodes()), SaasFeatureResource::getFeatureCode, param.getFeatureCodes()) .in(CollectionUtil.isNotEmpty(param.getTerminals()), SaasFeatureResource::getTerminal, param.getTerminals()) .list(); return BeanMapper.copyList(resourceList, ResourcePermission.class); From ce93e4d1d8aff203d14e5ed422ee655f90ff14ef Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 9 Apr 2024 16:57:48 +0800 Subject: [PATCH 021/130] =?UTF-8?q?fix(2227-permissionQuery):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=A1=B5=E9=9D=A2=E6=9D=83=E9=99=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/PermissionQueryApi.java | 6 +++ .../client/model/req/PagePermissionReq.java | 38 +++++++++++++++++++ .../client/model/req/PagePermissionResp.java | 26 +++++++++++++ .../permission/PermissionQueryController.java | 7 ++++ .../model/ResourcePermissionQueryDTO.java | 3 ++ .../service/PermissionQueryService.java | 4 ++ .../service/SaasFeatureResourceService.java | 2 + .../impl/PermissionQueryServiceImpl.java | 31 +++++++++++++++ .../impl/SaasFeatureResourceServiceImpl.java | 6 +++ 9 files changed, 123 insertions(+) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionResp.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java index 244c9a1c..3cf00349 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java @@ -2,6 +2,8 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PagePermissionReq; +import cn.axzo.tyr.client.model.req.PagePermissionResp; import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; import org.springframework.cloud.openfeign.FeignClient; @@ -25,6 +27,10 @@ public interface PermissionQueryApi { @PostMapping(value = "/api/v3/permission/query/getNavTree") ApiResult> getNavTree(@RequestBody @Valid NavTreeReq req); + /** 页面权限详情:页面自身及所有下级 **/ + @PostMapping(value = "/api/v3/permission/query/getPagePermission") + ApiResult> getPagePermission(@RequestBody @Valid PagePermissionReq req); + /** 鉴权接口 **/ @PostMapping(value = "/api/v3/permission/query/hasPermission") ApiResult hasPermission(PermissionCheckReq req); diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionReq.java new file mode 100644 index 00000000..1b639ab4 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionReq.java @@ -0,0 +1,38 @@ +package cn.axzo.tyr.client.model.req; + +import cn.axzo.tyr.client.model.base.WorkspaceOUPair; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 页面权限查询请求 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/9 16:09 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PagePermissionReq { + + @NotNull(message = "权限码不能为空") + private String featureCode; + + @NotNull(message = "人员ID不能为空") + private Long personId; + /** 登录端 **/ + @NotNull(message = "登录端不能为空") + private String terminal; + + @NotEmpty(message = "单位标识对不能为空") + private List workspaceOUPairs; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionResp.java new file mode 100644 index 00000000..42a445fa --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePermissionResp.java @@ -0,0 +1,26 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 页面权限查询响应 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/9 16:14 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PagePermissionResp { + + /** 权限ID **/ + private Long featureId; + /** 权限编码 **/ + private String featureCode; + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java index 7c0a0b42..2d7f22d9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java @@ -3,6 +3,8 @@ package cn.axzo.tyr.server.controller.permission; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.PermissionQueryApi; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PagePermissionReq; +import cn.axzo.tyr.client.model.req.PagePermissionResp; import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; import cn.axzo.tyr.server.service.PermissionQueryService; @@ -31,6 +33,11 @@ public class PermissionQueryController implements PermissionQueryApi { return ApiResult.ok(permissionService.getNavTree(req)); } + @Override + public ApiResult> getPagePermission(PagePermissionReq req) { + return ApiResult.ok(permissionService.getPagePermission(req)); + } + @Override public ApiResult hasPermission(PermissionCheckReq req) { return ApiResult.ok(permissionService.hasPermission(req)); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java index 1b24bbbc..b3818ac9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java @@ -30,4 +30,7 @@ public class ResourcePermissionQueryDTO { private List authType; + /** 路径包含 **/ + private Long inPath; + } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java index e6d64584..3beccde5 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionQueryService.java @@ -1,6 +1,8 @@ package cn.axzo.tyr.server.service; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PagePermissionReq; +import cn.axzo.tyr.client.model.req.PagePermissionResp; import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; @@ -19,4 +21,6 @@ public interface PermissionQueryService { List getNavTree(NavTreeReq req); boolean hasPermission(PermissionCheckReq req); + + List getPagePermission(PagePermissionReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index d8edafaf..4e4ac142 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -25,4 +25,6 @@ public interface SaasFeatureResourceService { /** 是否免授权 **/ boolean isAuthFree(Long featureId); + + SaasFeatureResource getByCode(String featureCode); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 81419b8f..3db00c79 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.common.util.NumberUtil; import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.framework.auth.domain.TerminalInfo; @@ -9,6 +10,8 @@ import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.base.WorkspaceOUPair; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.req.NavTreeReq; +import cn.axzo.tyr.client.model.req.PagePermissionReq; +import cn.axzo.tyr.client.model.req.PagePermissionResp; import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.res.NavTreeResp; import cn.axzo.tyr.server.model.PermissionDO; @@ -102,6 +105,34 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { return resourcePermissions.stream().anyMatch(r -> featureIds.contains(r.getId())); } + @Override + public List getPagePermission(PagePermissionReq req) { + //这里没有区分是否为页面的组件或菜单树下级 同时包含了页面自身 + //权限编码转ID + SaasFeatureResource page = featureResourceService.getByCode(req.getFeatureCode()); + AssertUtil.notNull(page, "权限码不存在"); + + //所有子级 + ResourcePermissionQueryDTO param = ResourcePermissionQueryDTO.builder().inPath(page.getId()).build(); + List resourceList = featureResourceService.permissionQuery(param); + + PermissionQueryContext context = PermissionQueryContext.builder() + .terminal(req.getTerminal()) + .workspaceOUPairs(req.getWorkspaceOUPairs()) + .build() + .appendPersonId(req.getPersonId()); + //查询权限 + List permissions = queryUserPermission(context); + Set featureIds = permissions.stream().map(PermissionDO::getFeatureIds).flatMap(Set::stream).collect(Collectors.toSet()); + //权限过滤 + return resourceList.stream() + .filter(r -> featureIds.contains(r.getId())) + .map(r -> PagePermissionResp.builder() + .featureId(r.getId()) + .featureCode(r.getFeatureCode()).build()) + .collect(Collectors.toList()); + } + private List queryUserPermission(PermissionQueryContext context) { //查询用户具有的角色 diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 81797d13..ae88d77a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -69,6 +69,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .in(CollectionUtil.isNotEmpty(param.getFeatureTypes()), SaasFeatureResource::getFeatureType, param.getFeatureTypes()) .in(CollectionUtil.isNotEmpty(param.getFeatureCodes()), SaasFeatureResource::getFeatureCode, param.getFeatureCodes()) .in(CollectionUtil.isNotEmpty(param.getTerminals()), SaasFeatureResource::getTerminal, param.getTerminals()) + .apply(Objects.nonNull(param.getInPath()), " FIND_IN_SET(" + param.getInPath() + ", path)") .list(); return BeanMapper.copyList(resourceList, ResourcePermission.class); } @@ -93,6 +94,11 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic return RedisClient.SetOps.sIsMember(KEY_AUTH_FREE, featureId); } + @Override + public SaasFeatureResource getByCode(String featureCode) { + return featureResourceDao.getByCode(featureCode); + } + @Override public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); From d1cf9e161db9068ec9c23f325ff86bf8e82cdf88 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Tue, 9 Apr 2024 17:10:14 +0800 Subject: [PATCH 022/130] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=9A=84=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=EF=BC=8C=E5=88=A0=E9=99=A4=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 14 ++++ .../model/res/FeatureResourceDetailResp.java | 7 ++ .../permission/FeatureResourceController.java | 24 ++++++- .../service/SaasFeatureResourceService.java | 10 +++ .../impl/SaasFeatureResourceServiceImpl.java | 65 +++++++++++++++++++ 5 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 0763bdb1..bd9abd36 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -34,4 +34,18 @@ public interface FeatureResourceApi { @PostMapping("/api/featureResource/saveOrUpdate") ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); + + /** 删除菜单/页面/组件 **/ + @PostMapping("/api/featureResource/delete") + ApiResult deleteFeatureResource(@RequestParam Long featureId, @RequestParam Long operatorId); + + + /** 重排序菜单/页面/组件 **/ + @PostMapping("/api/featureResource/reorder") + ApiResult reorderFeatureTree(@RequestParam Long featureId, @RequestParam Integer offset); + + + /** 获取菜单/页面/组件 及子孙节点 **/ + @PostMapping("/api/featureResource/list") + ApiResult> listFeatureDescendant(@RequestParam Long featureId); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java new file mode 100644 index 00000000..e33d08eb --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java @@ -0,0 +1,7 @@ +package cn.axzo.tyr.client.model.res; + +public class FeatureResourceDetailResp { + + + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index e3fab73d..7c551a11 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -48,10 +48,28 @@ public class FeatureResourceController implements FeatureResourceApi { @Override public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { - log.info("save feature resouce req : " + req.toString()); - + log.info("save feature resource req : " + req.toString()); featureResourceService.saveOrUpdateMenu(req); - return ApiResult.ok(); } + + @Override + public ApiResult deleteFeatureResource(Long featureId, Long operatorId) { + log.info("deleteFeatureResource featureId : {}, operatorId : {}", featureId, operatorId); + featureResourceService.deleteMenuFeature(featureId, operatorId); + return ApiResult.ok(); + } + + @Override + public ApiResult reorderFeatureTree(Long featureId, Integer offset) { + log.info("reorderFeatureTree featureId : {}, offset : {}", featureId, offset); + featureResourceService.reorderMenuFeature(featureId, offset); + return ApiResult.ok(); + } + + @Override + public ApiResult> listFeatureDescendant(Long featureId) { + + return null; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index d8edafaf..e9e3d214 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -17,6 +17,16 @@ import java.util.List; public interface SaasFeatureResourceService { void saveOrUpdateMenu(FeatureResourceTreeSaveReq req); + + /**递归的**/ + List listDescendant(Long featureId); + + /**删除指定菜单**/ + void deleteMenuFeature(Long featureId, Long operatorId); + + /**菜单重排序**/ + void reorderMenuFeature(Long featureId, Integer offset); + /** 根据ID查询导航菜单页面信息 仅可显示 - 限制查询字段 **/ List listNavByIds(List featureIds); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index e7b0d226..6363050b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.model.IBaseTree; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.pokonyan.config.redis.RedisClient; import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; @@ -14,16 +15,23 @@ import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.BooleanUtil; +import io.swagger.models.auth.In; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; import static cn.axzo.tyr.server.common.constants.CacheConstant.KEY_AUTH_FREE; @@ -186,4 +194,61 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } } } + + // 查询resource节点及子节点 + @Override + public List listDescendant(Long featureId) { + return featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .apply("FIND_IN_SET('" + featureId + "', path)") + .list(); + } + + @Override + public void deleteMenuFeature(Long featureId, Long operatorId) { + // 删除自己及自己的子集 + featureResourceDao.lambdaUpdate() + .eq(BaseEntity::getIsDelete,0) + .apply("FIND_IN_SET('" + featureId + "', path)") + .set(SaasFeatureResource::getUpdateBy, operatorId) + .set(BaseEntity::getIsDelete,1); + } + + @Override + public void reorderMenuFeature(Long featureId, Integer offset) { + // 删除自己及自己的子集 + SaasFeatureResource resource = featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .eq(SaasFeatureResource::getId, featureId) + .one(); + Assert.notNull(resource, "菜单不存在"); + + List parallelFeature = featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .eq(SaasFeatureResource::getParentId, resource.getParentId()) + .orderByAsc(SaasFeatureResource::getDisplayOrder) + .list(); + List parallelIds = parallelFeature.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); + int index = parallelIds.indexOf(featureId); + Assert.isTrue(index >= 0, "未查询到元素下标"); + Integer offsetIndex = index + offset; + if (offsetIndex < 0) { + offsetIndex = 0; + } + if (offsetIndex > parallelFeature.size() - 1) { + offsetIndex = parallelFeature.size() - 1; + } + // 要交换和当前下标一致,代表不需要交换,比如下标为0时上移,下标最大时下移 + if (offsetIndex.equals(index)) { + return; + } + Assert.isTrue(index >= 0, "移动下班"); + Collections.swap(parallelFeature, index, offsetIndex); + for (int i = 0; i < parallelFeature.size(); i++) { + SaasFeatureResource featureResource = parallelFeature.get(i); + featureResource.setDisplayOrder(i); + } + featureResourceDao.updateBatchById(parallelFeature); + } + } From 152ebc182f98ee7081b92aeedf5df33cd7153b20 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 9 Apr 2024 21:12:47 +0800 Subject: [PATCH 023/130] =?UTF-8?q?feat:(REQ-2227)=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E7=9B=B8=E5=85=B3=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/SaasRoleGroupApi.java | 12 +++- .../model/req/QuerySaasRoleGroupReq.java | 2 + .../model/req/UpdateRoleGroupOffsetReq.java | 27 ++++++++ .../role/SaasRoleGroupController.java | 63 +++++++++++++++++++ .../repository/dao/SaasRoleGroupDao.java | 2 + .../impl/SaasRoleGroupServiceImpl.java | 45 ++++++++++++- 6 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleGroupOffsetReq.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java index c261b38e..8adf14bb 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.req.UpdateRoleGroupOffsetReq; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import javax.validation.Valid; import javax.validation.constraints.NotEmpty; import java.util.List; @@ -61,5 +63,13 @@ public interface SaasRoleGroupApi { @GetMapping("/api/saasRoleGroup/listByCategoryCode") ApiResult> listByCategoryCode(@RequestParam("categoryCode") List categoryCodes); - + /** + * 更新角色分组的位置 + * 向下移动,则找到后面位置的分组,替换sort + * 向上移动,则找到前面位置的分组,替换sort + * @param request + * @return + */ + @PostMapping("/role/group/offset/update") + ApiResult updateRoleGroupOffset(@Valid @RequestBody UpdateRoleGroupOffsetReq request); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleGroupReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleGroupReq.java index 2e6cab57..6c732293 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleGroupReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleGroupReq.java @@ -44,4 +44,6 @@ public class QuerySaasRoleGroupReq { * 被那些角色使用到的分组 */ private List roleIds; + + private Long parentId; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleGroupOffsetReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleGroupOffsetReq.java new file mode 100644 index 00000000..203eef0c --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleGroupOffsetReq.java @@ -0,0 +1,27 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UpdateRoleGroupOffsetReq { + + /** + * 角色分组id + */ + @NotNull(message = "id不能为空") + private Long id; + + /** + * 偏移量:向上移就是负数,例如上移一位:-1,向下移就是正数,例如下移一位:1 + */ + @NotNull(message = "offset不能为空") + private Integer offset; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java index 994e8e52..6e507ce3 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.SaasRoleGroupApi; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.req.UpdateRoleGroupOffsetReq; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.server.service.SaasRoleGroupService; import com.google.common.collect.Lists; @@ -12,7 +13,9 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.web.bind.annotation.RestController; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; @Slf4j @RestController @@ -56,4 +59,64 @@ public class SaasRoleGroupController implements SaasRoleGroupApi { return ApiResult.ok(saasRoleGroupService.listByCategoryCode(categoryCode)); } + @Override + public ApiResult updateRoleGroupOffset(UpdateRoleGroupOffsetReq request) { + if (request.getOffset() != 1 && request.getOffset() != -1) { + throw new ServiceException("暂时只支持移动一个位置"); + } + SaasRoleGroupVO saasRoleGroup = getById(request.getId()).getData(); + + List roleGroupList = saasRoleGroupService.getRoleGroupList(QuerySaasRoleGroupReq.builder() + .parentId(saasRoleGroup.getParentId()) + .workspaceTypeCode(Lists.newArrayList(saasRoleGroup.getWorkspaceTypeCode())) + .build()) + .stream() + .sorted(Comparator.comparing(SaasRoleGroupVO::getSort)) + .collect(Collectors.toList()); + + SaasRoleGroupVO exchangeRoleGroup = findExchangeRoleGroup(request, saasRoleGroup, roleGroupList); + if (exchangeRoleGroup == null) { + throw new ServiceException("未找到可以移动的位置"); + } + saasRoleGroupService.saveOrUpdate(SaasRoleGroupVO.builder() + .id(saasRoleGroup.getId()) + .sort(exchangeRoleGroup.getSort()) + .build()); + + saasRoleGroupService.saveOrUpdate(SaasRoleGroupVO.builder() + .id(exchangeRoleGroup.getId()) + .sort(saasRoleGroup.getSort()) + .build()); + return ApiResult.ok(); + } + + /** + * 只支持移动一位 + * @param request + * @param saasRoleGroup + * @param roleGroupList + * @return + */ + private SaasRoleGroupVO findExchangeRoleGroup(UpdateRoleGroupOffsetReq request, + SaasRoleGroupVO saasRoleGroup, + List roleGroupList) { + List ids = roleGroupList.stream() + .map(SaasRoleGroupVO::getId) + .collect(Collectors.toList()); + int currentIndex = ids.indexOf(request.getId()); + // 下移一位 + if (request.getOffset() == 1) { + int exchangeIndex = currentIndex + 1; + if (roleGroupList.size() > exchangeIndex) { + return roleGroupList.get(exchangeIndex); + } + } else if (request.getOffset() == -1) { + if (currentIndex == 0) { + return null; + } + int exchangeIndex = currentIndex - 1; + return roleGroupList.get(exchangeIndex); + } + return null; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java index 8d5c7128..ffcd7dd6 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java @@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Objects; @Repository public class SaasRoleGroupDao extends ServiceImpl { @@ -37,6 +38,7 @@ public class SaasRoleGroupDao extends ServiceImpl listByCategoryCode(List categoryCode) { return BeanUtil.copyToList(saasRoleGroupDao.listByCategoryCode(categoryCode), SaasRoleGroupVO.class); } + + private void assembleSort(SaasRoleGroup saasRoleGroup) { + if (saasRoleGroup.getSort() == null || saasRoleGroup.getId() != null || saasRoleGroup.getParentId() == null) { + return; + } + + Optional last = saasRoleGroupDao.lambdaQuery() + .eq(SaasRoleGroup::getParentId, saasRoleGroup.getParentId()) + .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .orderByDesc(SaasRoleGroup::getSort) + .last("limit 1") + .list() + .stream() + .findFirst(); + saasRoleGroup.setSort(last.map(e -> e.getSort() == null ? 1 : e.getSort() + 1).orElse(1)); + } + + private void checkAdd(SaasRoleGroupVO req) { + // 只有新增的时候才会提交code + if (req.getId() != null) { + return; + } + + if (StringUtils.isNotBlank(req.getCode())) { + Integer count = saasRoleGroupDao.lambdaQuery() + .eq(SaasRoleGroup::getCode, req.getCode()) + .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .count(); + if (count > 0) { + throw new ServiceException("角色分组编码已经存在"); + } + } + } } From 25b870eda69a7b84578e9f654c550edc0fe5c2e1 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 9 Apr 2024 21:49:19 +0800 Subject: [PATCH 024/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E6=97=B6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 973f5b6d..26ac10ac 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -164,7 +164,7 @@ public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { saasRoleGroup.setWorkspaceId(req.getWorkspaceId() != null ? req.getWorkspaceId() : -1L); saasRoleGroup.setOuId(req.getOuId() != null ? req.getOuId() : -1L); saasRoleGroup.setParentId(req.getParentId()); - + saasRoleGroup.setCode(req.getCode()); // 新增的时候,没有指定sort,sort放在同层级的最后 assembleSort(saasRoleGroup); return saasRoleGroup; From bc4736d49436795fd2d296b81c682595a86b052a Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 9 Apr 2024 22:14:59 +0800 Subject: [PATCH 025/130] =?UTF-8?q?feat:(REQ-2227)=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E6=97=B6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?sort=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 26ac10ac..978e34ea 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -176,7 +176,7 @@ public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { } private void assembleSort(SaasRoleGroup saasRoleGroup) { - if (saasRoleGroup.getSort() == null || saasRoleGroup.getId() != null || saasRoleGroup.getParentId() == null) { + if (saasRoleGroup.getSort() != null || saasRoleGroup.getId() != null || saasRoleGroup.getParentId() == null) { return; } From 793f34c67bf7a2248d45b1fd608e79c22b04b482 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 9 Apr 2024 22:29:10 +0800 Subject: [PATCH 026/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0api?= =?UTF-8?q?=E5=89=8D=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java index 8adf14bb..0df9e9c7 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java @@ -70,6 +70,6 @@ public interface SaasRoleGroupApi { * @param request * @return */ - @PostMapping("/role/group/offset/update") + @PostMapping("/api/role/group/offset/update") ApiResult updateRoleGroupOffset(@Valid @RequestBody UpdateRoleGroupOffsetReq request); } From ed3ac9e5f88dc33f5fa8a31312e9a43b3cee1f44 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 9 Apr 2024 22:40:28 +0800 Subject: [PATCH 027/130] =?UTF-8?q?feat:(REQ-2227)=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E6=97=B6=EF=BC=8Csort?= =?UTF-8?q?=E5=8F=96=E5=90=8C=E4=B8=80=E4=B8=AAworkspaceTypeCode=E7=9A=84?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 978e34ea..7ccc9388 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -182,6 +182,7 @@ public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { Optional last = saasRoleGroupDao.lambdaQuery() .eq(SaasRoleGroup::getParentId, saasRoleGroup.getParentId()) + .eq(SaasRoleGroup::getWorkspaceTypeCode, saasRoleGroup.getWorkspaceTypeCode()) .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value) .orderByDesc(SaasRoleGroup::getSort) .last("limit 1") From c61a03ba2acf38061413468ada9e57b6b2518886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Wed, 10 Apr 2024 09:10:05 +0800 Subject: [PATCH 028/130] =?UTF-8?q?feat(2227-featureResource):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=9F=E8=83=BD=E8=B5=84=E6=BA=90=E6=A0=91=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=8F=8A=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 5 + .../model/req/GetFeatureResourceTreeReq.java | 30 +++++ .../cn/axzo/tyr/server/TyrApplication.java | 2 + .../permission/FeatureResourceController.java | 6 + .../dao/SaasFeatureResourceDao.java | 20 ++++ .../service/SaasFeatureResourceService.java | 5 + .../impl/SaasFeatureResourceCacheService.java | 31 +++++ .../impl/SaasFeatureResourceServiceImpl.java | 108 +++++++++++++++++- tyr-server/src/main/resources/bootstrap.yml | 2 + 9 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index bd9abd36..41c228c0 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; @@ -35,6 +36,10 @@ public interface FeatureResourceApi { @PostMapping("/api/featureResource/saveOrUpdate") ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); + /** 查询功能资源树 **/ + @PostMapping("/api/featureResource/getTree") + ApiResult> getTree(@RequestBody @Valid GetFeatureResourceTreeReq req); + /** 删除菜单/页面/组件 **/ @PostMapping("/api/featureResource/delete") ApiResult deleteFeatureResource(@RequestParam Long featureId, @RequestParam Long operatorId); diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java new file mode 100644 index 00000000..2c2438d3 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java @@ -0,0 +1,30 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.*; + +import java.util.List; + +/** + * @author likunpeng + * @version 1.0 + * @date 2024/4/9 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class GetFeatureResourceTreeReq { + + /** 查询搜索关键字 **/ + private String keyword; + + /** 端 **/ + private String terminal; + + /** 展示状态 默认不传返回全部 0-隐藏 1-显示 **/ + private Integer status; + + /** feature类型列表 **/ + private List featureTypes; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java index e07a81da..9df76d7a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.Environment; @@ -11,6 +12,7 @@ import org.springframework.scheduling.annotation.EnableAsync; @Slf4j @EnableAsync +@EnableCaching @EnableDiscoveryClient @MapperScan(value = {"cn.axzo.tyr.server.repository.mapper"}) @SpringBootApplication(scanBasePackages = "cn.axzo") diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 7c551a11..d9971be9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.server.controller.permission; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.FeatureResourceApi; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.service.FeatureResourceSyncService; @@ -72,4 +73,9 @@ public class FeatureResourceController implements FeatureResourceApi { return null; } + + @Override + public ApiResult> getTree(GetFeatureResourceTreeReq req) { + return ApiResult.ok(featureResourceService.getTree(req)); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java index e421cdc0..89382aa8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java @@ -1,10 +1,17 @@ package cn.axzo.tyr.server.repository.dao; +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.mapper.SaasFeatureResourceMapper; +import cn.azxo.framework.common.utils.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Objects; + /** *

* 功能资源表 服务实现类 @@ -23,4 +30,17 @@ public class SaasFeatureResourceDao extends ServiceImpl getByResourceTreeParam(GetFeatureResourceTreeReq req) { + return this.lambdaQuery().select(SaasFeatureResource::getId, SaasFeatureResource::getFeatureCode, + SaasFeatureResource::getFeatureName, SaasFeatureResource::getFeatureType, + SaasFeatureResource::getTerminal, SaasFeatureResource::getParentId, + SaasFeatureResource::getDisplayOrder) + .eq(SaasFeatureResource::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .eq(StringUtils.isNotBlank(req.getTerminal()), SaasFeatureResource::getTerminal, req.getTerminal()) + .eq(Objects.nonNull(req.getStatus()), SaasFeatureResource::getStatus, req.getStatus()) + .in(CollectionUtils.isNotEmpty(req.getFeatureTypes()), SaasFeatureResource::getFeatureType, req.getFeatureTypes()) + .list(); + } + } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index ffa14802..f14a04c0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -1,5 +1,7 @@ package cn.axzo.tyr.server.service; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.model.ResourcePermission; import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; @@ -36,5 +38,8 @@ public interface SaasFeatureResourceService { /** 是否免授权 **/ boolean isAuthFree(Long featureId); + /** 查询资源树 **/ + List getTree(GetFeatureResourceTreeReq req); + SaasFeatureResource getByCode(String featureCode); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java new file mode 100644 index 00000000..e57bbb5d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java @@ -0,0 +1,31 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; +import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author likunpeng + * @version 1.0 + * @date 2024/4/9 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class SaasFeatureResourceCacheService { + public static final String CACHE_FEATURE_RESOURCE_TREE = "featureResource:tree"; + + private final SaasFeatureResourceDao featureResourceDao; + + @Cacheable(value = CACHE_FEATURE_RESOURCE_TREE, key = "#req.keyword + '_' + #req.terminal+ '_' + #req.featureTypes", unless = "#result.isEmpty()") + public List getByResourceTreeParam (GetFeatureResourceTreeReq req) { + log.info("get feature resource tree has not user cache!"); + return featureResourceDao.getByResourceTreeParam(req); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 3429c952..cd30454e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -1,7 +1,8 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; -import cn.axzo.basics.common.model.IBaseTree; +import cn.axzo.basics.common.util.StopWatchUtil; +import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.pokonyan.config.redis.RedisClient; import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; @@ -9,27 +10,32 @@ import cn.axzo.tyr.client.common.enums.FeatureResourceStatus; import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; +import cn.axzo.tyr.client.model.res.FeatureResourceDTO; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.model.ResourcePermission; import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.azxo.framework.common.utils.StringUtils; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.BooleanUtil; -import io.swagger.models.auth.In; +import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import java.util.Collections; import java.util.Comparator; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -46,9 +52,19 @@ import static cn.axzo.tyr.server.common.constants.CacheConstant.KEY_AUTH_FREE; @Slf4j @Service @RequiredArgsConstructor +@RefreshScope public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceService { private final SaasFeatureResourceDao featureResourceDao; + private final SaasFeatureResourceCacheService saasFeatureResourceCacheService; + + /** + * 功能资源树根节点配置 + * key < - > TerminalInfo定义的terminal + * value < - > 端描述 + */ + @Value("#{${featureResourceTreeRootNodeMap:{'NT_CMS_WEB_GENERAL':'CMS端', 'NT_OMS_WEB':'OMS端'}}}") + private Map treeRootNodeMap; @Override public List listNavByIds(List featureIds) { @@ -108,6 +124,40 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } @Override + public List getTree(GetFeatureResourceTreeReq req) { + List rootNodes = treeRootNodeMap.entrySet().stream().map(e -> FeatureResourceTreeNode.builder() + .id(0L).terminal(e.getKey()).featureName(e.getValue()).children(Lists.newArrayList()).build()).collect(Collectors.toList()); + + StopWatchUtil watch = StopWatchUtil.createStarted("feature-resource-tree"); + watch.start("dbQuery"); + List saasFeatureResources = saasFeatureResourceCacheService.getByResourceTreeParam(req); + watch.stop(); + if (CollectionUtils.isEmpty(saasFeatureResources)) { + return Collections.emptyList(); + } + + List treeList = TreeUtil.buildTree(saasFeatureResources.stream() + .map(this::featureResource2Node) + .sorted(Comparator.comparing(FeatureResourceDTO::getDisplayOrder)) + .collect(Collectors.toList())); + saasFeatureResources = null; // help GC + + //搜索或需要按授权策略过滤 - 有额外的过滤条件 + watch.start("filter-node"); + List filterResultNode = filterTreeNode(req.getKeyword(), treeList); + watch.stop(); + + //把处理后的树结构添加上根节点 + watch.start("fill-children-to-root"); + List resultNode = fillChildren2Root(rootNodes, filterResultNode); + watch.stop(); + + log.info("feature-resource-tree cost:{} , ms:{}", watch.prettyPrint(), watch.getTotalTimeMillis()); + return resultNode; + } + + @Override + @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); baseResource.setUpdateBy(req.getOperatorId()); @@ -258,4 +308,52 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic featureResourceDao.updateBatchById(parallelFeature); } + + private FeatureResourceTreeNode featureResource2Node(SaasFeatureResource featureResource) { + return FeatureResourceTreeNode.builder() + .id(featureResource.getId()) + .featureCode(featureResource.getFeatureCode()) + .featureName(featureResource.getFeatureName()) + .featureType(featureResource.getFeatureType()) + .terminal(featureResource.getTerminal()) + .parentId(featureResource.getParentId()) + .displayOrder(featureResource.getDisplayOrder()) + .build(); + } + + private List filterTreeNode(String keyword, List treeList) { + if (StringUtils.isBlank(keyword)) { + return treeList; + } + + return treeList.stream().filter(x -> this.recursionFilter(keyword, x)).collect(Collectors.toList()); + } + + private boolean recursionFilter(String keyword, FeatureResourceTreeNode node) { + boolean matched = node.getFeatureName().contains(keyword); + if (CollectionUtils.isEmpty(node.getNodeChildren())) { + return matched; + } + // 过滤子节点 + List filterChildren = node.getChildren().stream().filter(x -> recursionFilter(keyword, x)).collect(Collectors.toList()); + // 重置子节点 + node.setChildren(filterChildren); + if (CollectionUtils.isEmpty(filterChildren)) { + return matched; + } + return true; + } + + private List fillChildren2Root(List rootNodes, List childrenNodes) { + Map rootNodeMap = rootNodes.stream().collect(Collectors.toMap(FeatureResourceDTO::getTerminal, Function.identity(), (v1, v2) -> v1)); + for(FeatureResourceTreeNode child : childrenNodes) { + FeatureResourceTreeNode rootNode = rootNodeMap.get(child.getTerminal()); + if (child.getParentId() > 0 || Objects.isNull(rootNode)) { + continue; + } + rootNode.getChildren().add(child); + } + + return rootNodes; + } } diff --git a/tyr-server/src/main/resources/bootstrap.yml b/tyr-server/src/main/resources/bootstrap.yml index 9bf74eb2..9a6a3cb1 100644 --- a/tyr-server/src/main/resources/bootstrap.yml +++ b/tyr-server/src/main/resources/bootstrap.yml @@ -1,4 +1,6 @@ spring: + cache: + type: redis application: name: tyr cloud: From ccd762b13c79215da30cc6f55f1547c248c7cf24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Wed, 10 Apr 2024 09:12:01 +0800 Subject: [PATCH 029/130] =?UTF-8?q?feat(2227-featureResource):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=9F=E8=83=BD=E8=B5=84=E6=BA=90=E6=A0=91=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=8F=8A=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index cd30454e..7bcc9f08 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -44,7 +44,8 @@ import static cn.axzo.tyr.server.common.constants.CacheConstant.KEY_AUTH_FREE; /** * 功能资源服务实现 - * + * 功能资源树查询增加了redis缓存,在新增、修改该表时,记得清空缓存, + * 实现:对应方法加上注解@CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) * @version V1.0 * @author: ZhanSiHu * @date: 2024/4/3 10:18 From 58b47612a454ee715d44a40cab7ffde03fefee6e Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 10 Apr 2024 09:39:13 +0800 Subject: [PATCH 030/130] =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 5 ++ .../model/res/FeatureResourceDetailResp.java | 56 +++++++++++++++++++ .../permission/FeatureResourceController.java | 10 ++++ 3 files changed, 71 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index bd9abd36..57225992 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; +import cn.axzo.tyr.client.model.res.FeatureResourceDetailResp; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -48,4 +49,8 @@ public interface FeatureResourceApi { /** 获取菜单/页面/组件 及子孙节点 **/ @PostMapping("/api/featureResource/list") ApiResult> listFeatureDescendant(@RequestParam Long featureId); + + /** 菜单详情 **/ + @PostMapping("/api/featureResource/detail") + ApiResult detail(@RequestParam Long featureId); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java index e33d08eb..82f03da8 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceDetailResp.java @@ -1,7 +1,63 @@ package cn.axzo.tyr.client.model.res; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class FeatureResourceDetailResp { + private Long id; + /** 上级ID **/ + private Long parentId; + /** 资源名称 **/ + private String featureName; + + /** 资源类型 1-菜单 2-页面 3-应用入口 4-组件 **/ + private Integer featureType; + + /** 资源编码 **/ + private String featureCode; + + /** 图标 **/ + private String icon; + + /** 状态 0-隐藏 1-显示 **/ + private Integer status; + + /*- for page -*/ + /** 跳转类型 1-站内跳转 2-站外跳转 **/ + private Integer redirectType; + /** 路由地址 **/ + private String linkUrl; + /** 授权类型 0-全部角色 1-指定角色 **/ + private Integer authType; + /** 链接类型 1-PC 2-小程序 3-APP **/ + private Integer linkType; + /** APP扩展适配参数 **/ + private String linkExt; + /** 小程序ID **/ + private Long appItemId; + /** 页面组件 **/ + private List components; + + private List rolePermissions; + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class ResourceRolePermissionResp { + private Long roleId; + + private List featureCode; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 7c551a11..b0871bc4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -4,6 +4,7 @@ import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.FeatureResourceApi; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; +import cn.axzo.tyr.client.model.res.FeatureResourceDetailResp; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.service.FeatureResourceSyncService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; @@ -70,6 +71,15 @@ public class FeatureResourceController implements FeatureResourceApi { @Override public ApiResult> listFeatureDescendant(Long featureId) { + return null; + } + + @Override + public ApiResult detail(Long featureId) { + + + + return null; } } From 5d0ddf85d0f86cce9ae7389b82969dd0e01d3256 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 10 Apr 2024 11:20:09 +0800 Subject: [PATCH 031/130] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/req/FeatureResourceTreeSaveReq.java | 2 +- .../impl/SaasFeatureResourceServiceImpl.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java index 10fecb9e..22bdd16c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureResourceTreeSaveReq.java @@ -29,7 +29,7 @@ public class FeatureResourceTreeSaveReq extends BaseFeatureResourceDO { private String linkExt; /** 小程序ID **/ - private Long appItemId; + private Integer appItemId; /** 授权类型 0-全部角色 1-指定角色 **/ private Integer authType; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 7bcc9f08..e9a8d636 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -171,7 +171,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource maxOrderResource = parallelResources.stream().max(Comparator.comparingInt(SaasFeatureResource::getDisplayOrder)).orElse(new SaasFeatureResource()); baseResource.setDisplayOrder(maxOrderResource.getDisplayOrder() + 1); } - newResource(baseResource); + newResource(baseResource, ""); } else { featureResourceDao.updateById(baseResource); } @@ -191,15 +191,14 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } } - private void newResource(SaasFeatureResource resource) { - + private void newResource(SaasFeatureResource resource, String parentPath) { featureResourceDao.save(resource); //path追加自身ID - resource.setPath(resource.getPath() + "," + resource.getId()); + resource.setPath(StringUtils.isBlank(parentPath) ? resource.getId().toString() : parentPath + "," + resource.getId()); featureResourceDao.updateById(resource); - } + private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId, Integer displayOrder) { // 批量保存path SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class); @@ -209,9 +208,10 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic featureResourceDao.updateById(saasFeatureResource); } else { saasFeatureResource.setCreateBy(operatorId); - featureResourceDao.save(saasFeatureResource); - saasFeatureResource.setPath(parentPath + "," + saasFeatureResource.getId()); - featureResourceDao.updateById(saasFeatureResource); + newResource(saasFeatureResource, parentPath); +// featureResourceDao.save(saasFeatureResource); +// saasFeatureResource.setPath(parentPath + "," + saasFeatureResource.getId()); +// featureResourceDao.updateById(saasFeatureResource); } List children = featureComponentSaveReq.getChildren(); From 9370ecf4ccf7f73e01ed060f48190e56526d4f00 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 10 Apr 2024 14:00:06 +0800 Subject: [PATCH 032/130] =?UTF-8?q?fix(2227-permissionQuery):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=BF=94=E5=9B=9E=E9=A1=B5=E9=9D=A2=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java index 0c205eb6..f73f8fd4 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java @@ -34,6 +34,8 @@ public class NavTreeResp implements IBaseTree { private Integer featureType; /** 上级ID **/ private Long parentId; + /** 页面路由 **/ + private String linkUrl; /** 子级 **/ private List children; From 44a328edce5f76ffb7f4eb9aefa22644c6a4ad0d Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 10 Apr 2024 14:22:38 +0800 Subject: [PATCH 033/130] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 2 +- .../permission/FeatureResourceController.java | 4 +-- .../convert/SaasFeatureResourceConvert.java | 15 +++++++++++ .../service/SaasFeatureResourceService.java | 2 ++ .../impl/SaasFeatureResourceServiceImpl.java | 27 ++++++++++++++++--- 5 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/model/convert/SaasFeatureResourceConvert.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 93f5f820..6e968ccb 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -57,5 +57,5 @@ public interface FeatureResourceApi { /** 菜单详情 **/ @PostMapping("/api/featureResource/detail") - ApiResult detail(@RequestParam Long featureId); + ApiResult detail(@RequestParam Long featureId); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 3aa30cc9..211c74b8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -76,8 +76,8 @@ public class FeatureResourceController implements FeatureResourceApi { } @Override - public ApiResult detail(Long featureId) { - return null; + public ApiResult detail(Long featureId) { + return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(featureId)); } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/convert/SaasFeatureResourceConvert.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/convert/SaasFeatureResourceConvert.java new file mode 100644 index 00000000..5c55d117 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/convert/SaasFeatureResourceConvert.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.server.model.convert; + +import cn.axzo.maokai.api.vo.request.UpdateNodeWorkerReq; +import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SaasFeatureResourceConvert { + + SaasFeatureResourceConvert INSTANCE = Mappers.getMapper(SaasFeatureResourceConvert.class); + + FeatureResourceTreeNode convert(SaasFeatureResource req); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index f14a04c0..be5730ee 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -23,6 +23,8 @@ public interface SaasFeatureResourceService { /**递归的**/ List listDescendant(Long featureId); + FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId); + /**删除指定菜单**/ void deleteMenuFeature(Long featureId, Long operatorId); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index e9a8d636..47b00aa1 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.server.service.impl; +import cn.axzo.basics.auth.vo.resp.SaasFeatureTreeResp; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.util.StopWatchUtil; import cn.axzo.basics.common.util.TreeUtil; @@ -15,6 +16,7 @@ import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.model.ResourcePermission; import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; +import cn.axzo.tyr.server.model.convert.SaasFeatureResourceConvert; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; @@ -30,6 +32,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.Comparator; @@ -158,6 +161,23 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } @Override + public FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId) { + List descendants = featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .apply("FIND_IN_SET('" + featureId + "', path)") + .list(); + if (CollectionUtil.isEmpty(descendants)) { + return null; + } + List treeList = TreeUtil.buildTree(descendants.stream() + .map(SaasFeatureResourceConvert.INSTANCE::convert) + .sorted(Comparator.comparing(FeatureResourceDTO::getDisplayOrder)) + .collect(Collectors.toList())); + return treeList.get(0); + } + + @Override + @Transactional(rollbackFor = Exception.class) @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); @@ -180,7 +200,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic List components = req.getComponentSaveReqList(); for (int i = 0; i < components.size(); i++) { FeatureComponentSaveReq childComponent = components.get(i); - if (childComponent.getParentId() != null) { + if (childComponent.getParentId() == null) { childComponent.setParentId(baseResource.getId()); } // 递归新增修改删除子节点 @@ -209,9 +229,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } else { saasFeatureResource.setCreateBy(operatorId); newResource(saasFeatureResource, parentPath); -// featureResourceDao.save(saasFeatureResource); -// saasFeatureResource.setPath(parentPath + "," + saasFeatureResource.getId()); -// featureResourceDao.updateById(saasFeatureResource); } List children = featureComponentSaveReq.getChildren(); @@ -357,4 +374,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic return rootNodes; } + + } From c96c780d9445efdf6369cdba869cb41b8bd13259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Wed, 10 Apr 2024 17:05:28 +0800 Subject: [PATCH 034/130] =?UTF-8?q?feat(2227-featureResource):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=8A=9F=E8=83=BD=E8=B5=84=E6=BA=90=E6=A0=91=E6=A0=B9?= =?UTF-8?q?=E8=8A=82=E7=82=B9id=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasFeatureResourceServiceImpl.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 47b00aa1..c1962616 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -1,6 +1,5 @@ package cn.axzo.tyr.server.service.impl; -import cn.axzo.basics.auth.vo.resp.SaasFeatureTreeResp; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.util.StopWatchUtil; import cn.axzo.basics.common.util.TreeUtil; @@ -9,9 +8,11 @@ import cn.axzo.pokonyan.config.redis.RedisClient; import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; import cn.axzo.tyr.client.common.enums.FeatureResourceStatus; import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.model.ResourcePermission; @@ -19,6 +20,7 @@ import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.model.convert.SaasFeatureResourceConvert; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import cn.axzo.tyr.server.service.SaasCommonDictService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.azxo.framework.common.utils.StringUtils; import cn.hutool.core.collection.CollectionUtil; @@ -28,7 +30,6 @@ import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; @@ -40,6 +41,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; import java.util.stream.Collectors; @@ -59,16 +61,12 @@ import static cn.axzo.tyr.server.common.constants.CacheConstant.KEY_AUTH_FREE; @RefreshScope public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceService { + /** 功能资源树根节点所有端配置的scope **/ + private static final String RESOURCE_TERMINAL_SCOPE = "resource.terminal"; + private final SaasFeatureResourceDao featureResourceDao; private final SaasFeatureResourceCacheService saasFeatureResourceCacheService; - - /** - * 功能资源树根节点配置 - * key < - > TerminalInfo定义的terminal - * value < - > 端描述 - */ - @Value("#{${featureResourceTreeRootNodeMap:{'NT_CMS_WEB_GENERAL':'CMS端', 'NT_OMS_WEB':'OMS端'}}}") - private Map treeRootNodeMap; + private final SaasCommonDictService saasCommonDictService; @Override public List listNavByIds(List featureIds) { @@ -129,8 +127,15 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic @Override public List getTree(GetFeatureResourceTreeReq req) { - List rootNodes = treeRootNodeMap.entrySet().stream().map(e -> FeatureResourceTreeNode.builder() - .id(0L).terminal(e.getKey()).featureName(e.getValue()).children(Lists.newArrayList()).build()).collect(Collectors.toList()); + List commonDictResponses = saasCommonDictService.query(CommonDictQueryReq.builder().scope(RESOURCE_TERMINAL_SCOPE).build()); + if (CollectionUtils.isEmpty(commonDictResponses)) { + log.error("not config resource terminal in saas_common_dict table"); + return Collections.emptyList(); + } + + final AtomicLong rootIdIndex = new AtomicLong(0L); + List rootNodes = commonDictResponses.stream().map(e -> FeatureResourceTreeNode.builder() + .id(rootIdIndex.decrementAndGet()).terminal(e.getDictCode()).featureName(e.getDictValue()).children(Lists.newArrayList()).build()).collect(Collectors.toList()); StopWatchUtil watch = StopWatchUtil.createStarted("feature-resource-tree"); watch.start("dbQuery"); From 558c137f8299bb1ff05578ca78efda15d0015c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Wed, 10 Apr 2024 17:36:02 +0800 Subject: [PATCH 035/130] =?UTF-8?q?feat(2227-featureResource):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=8A=9F=E8=83=BD=E8=B5=84=E6=BA=90=E6=A0=91=E6=A0=B9?= =?UTF-8?q?=E8=8A=82=E7=82=B9id=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index c1962616..46a125b4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -31,7 +31,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -58,7 +57,6 @@ import static cn.axzo.tyr.server.common.constants.CacheConstant.KEY_AUTH_FREE; @Slf4j @Service @RequiredArgsConstructor -@RefreshScope public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceService { /** 功能资源树根节点所有端配置的scope **/ From 0f54c9399beafe5eb2b927d8051b9f358d342c6a Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 10 Apr 2024 17:46:50 +0800 Subject: [PATCH 036/130] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 11 +++ .../model/req/FeatureRoleRelationReq.java | 24 ++++++ .../model/res/FeatureRoleRelationResp.java | 24 ++++++ .../controller/role/SaasRoleController.java | 13 ++++ .../dao/SaasPgroupPermissionRelationDao.java | 23 ++++++ .../axzo/tyr/server/service/RoleService.java | 6 ++ .../service/SaasFeatureResourceService.java | 3 + .../server/service/impl/RoleServiceImpl.java | 74 +++++++++++++++++++ .../impl/SaasFeatureResourceServiceImpl.java | 11 +++ 9 files changed, 189 insertions(+) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureRoleRelationResp.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 3d49455b..08f4ac1d 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -4,9 +4,11 @@ import cn.axzo.framework.domain.web.result.ApiListResult; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; @@ -44,6 +46,15 @@ public interface TyrSaasRoleApi { @PostMapping("/api/saasRole/saveOrUpdate") ApiResult saveOrUpdate(@RequestBody @Validated SaveOrUpdateRoleVO saveOrUpdateRole); + + /** OMS编辑菜单时给角色赋权限 **/ + @PostMapping("/api/saasRoleGroup/relation/saveOrUpdate") + ApiResult saveOrUpdateFeatureRoleRelation(List saasFeatureRoleRelationReq, Long operatorId); + + /** 角色和组件页面的关联关系 **/ + @PostMapping("/api/saasRoleGroup/relation/query") + ApiResult> queryFeatureRoleRelation(Long featureId); + /** * 根据id查询详情 */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java new file mode 100644 index 00000000..f5a922c3 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java @@ -0,0 +1,24 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FeatureRoleRelationReq { + + /** 功能Id **/ + private Long featureId; + + /** 应用的角色Id列表 **/ + private List roleIds; + + /** 授权类型 0-全部角色 1-指定角色 **/ + private Integer authType; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureRoleRelationResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureRoleRelationResp.java new file mode 100644 index 00000000..83d318b2 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureRoleRelationResp.java @@ -0,0 +1,24 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FeatureRoleRelationResp { + + /** 功能Id **/ + private Long featureId; + + /** 应用的角色Id列表 **/ + private List roleIds; + + /** 授权类型 0-全部角色 1-指定角色 **/ + private Integer authType; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 1462a164..741e2725 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -7,10 +7,12 @@ import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.TyrSaasRoleApi; import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.req.CommonDictQueryReq; +import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; @@ -88,6 +90,17 @@ public class SaasRoleController implements TyrSaasRoleApi { return ApiResult.ok(result); } + @Override + public ApiResult saveOrUpdateFeatureRoleRelation(List saasFeatureRoleRelationReq, Long operatorId) { + roleService.saveOrUpdateFeatureRoleRelation(saasFeatureRoleRelationReq, operatorId); + return ApiResult.ok(); + } + + @Override + public ApiResult> queryFeatureRoleRelation(Long featureId) { + return ApiResult.ok(roleService.queryFeatureRoleRelation(featureId)); + } + @Override public ApiResult getById(Long id) { QuerySaasRoleReq query = QuerySaasRoleReq.builder() diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupPermissionRelationDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupPermissionRelationDao.java index 37240edd..7ce3db6c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupPermissionRelationDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupPermissionRelationDao.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; import cn.axzo.tyr.server.repository.mapper.SaasPgroupPermissionRelationMapper; +import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.collections.CollectionUtils; @@ -11,6 +12,7 @@ import org.springframework.stereotype.Repository; import java.io.Serializable; import java.util.Collection; +import java.util.Collections; import java.util.List; @Repository @@ -38,5 +40,26 @@ public class SaasPgroupPermissionRelationDao extends ServiceImpl groupIds, Long operatorId) { + if (featureId != null && !CollectionUtil.isEmpty(groupIds)) { + lambdaUpdate() + .eq(SaasPgroupPermissionRelation::getFeatureId, featureId) + .in(SaasPgroupPermissionRelation::getGroupId, groupIds) + .set(SaasPgroupPermissionRelation::getUpdateBy, operatorId) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } + } + + public List queryByFeatureIds(List featureIds) { + if (featureIds == null) { + return Collections.emptyList(); + } + return lambdaQuery() + .in(SaasPgroupPermissionRelation::getFeatureId,featureIds) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 431392bf..392b7faf 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -6,10 +6,12 @@ import cn.axzo.pokonyan.dao.wrapper.CriteriaField; import cn.axzo.pokonyan.dao.wrapper.Operator; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; +import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -120,6 +122,10 @@ public interface RoleService extends IService { Page page(PageSaasRoleParam param); + void saveOrUpdateFeatureRoleRelation(List req, Long operatorId); + + List queryFeatureRoleRelation(Long featureId); + @SuperBuilder @Data @NoArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index be5730ee..c5d29eab 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -6,6 +6,7 @@ import cn.axzo.tyr.server.model.ResourcePermission; import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; +import io.swagger.models.auth.In; import java.util.List; @@ -20,6 +21,8 @@ public interface SaasFeatureResourceService { void saveOrUpdateMenu(FeatureResourceTreeSaveReq req); + void updateFeatureAuthType(Long featureId, Integer authType); + /**递归的**/ List listDescendant(Long featureId); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 4a716ee0..cbc86854 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -12,12 +12,14 @@ import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.enums.PermissionGroupType; import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode; import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasPermissionGroupReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; +import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -33,12 +35,14 @@ import cn.axzo.tyr.server.model.RoleFeatureRelation; import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupDao; +import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao; import cn.axzo.tyr.server.repository.dao.SaasRoleDao; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupDao; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; import cn.axzo.tyr.server.repository.entity.SaasFeature; +import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; @@ -50,6 +54,7 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import cn.axzo.tyr.server.repository.mapper.SaasRoleMapper; import cn.axzo.tyr.server.service.PermissionGroupService; import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupService; @@ -76,6 +81,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; @@ -128,9 +135,13 @@ public class RoleServiceImpl extends ServiceImpl @Autowired SaasRoleUserRelationDao saasRoleUserRelationDao; @Autowired + SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; + @Autowired RoleUserService roleUserService; @Autowired SaasRoleGroupRelationDao saasRoleGroupRelationDao; + @Autowired + SaasFeatureResourceService saasFeatureResourceService; @Value("${groupLeader.code:projectTeamGPLeader}") private String groupLeaderCode; @@ -1028,4 +1039,67 @@ public class RoleServiceImpl extends ServiceImpl wrapper.eq("is_delete", 0); return this.page(PageConverter.convertToMybatis(param, SaasRole.class), wrapper); } + + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdateFeatureRoleRelation(List req, Long operatorId) { + for (FeatureRoleRelationReq item : req) { + saasFeatureResourceService.updateFeatureAuthType(item.getFeatureId(), item.getAuthType()); + if (CollectionUtil.isEmpty(item.getRoleIds()) || item.getAuthType() == 0) { + saasPgroupPermissionRelationDao.removeByPermissionPointIds(Collections.singletonList(item.getFeatureId())); + } else { + List existGroupIds = saasPgroupPermissionRelationDao.queryByFeatureIds(Collections.singletonList(item.getFeatureId())) + .stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); + + List groupIds = saasPgroupRoleRelationDao.findByRoleIds(item.getRoleIds()) + .stream().map(SaasPgroupRoleRelation::getGroupId).collect(Collectors.toList()); + List insertGroupIds = groupIds.stream().filter(role -> !existGroupIds.contains(role)).collect(Collectors.toList()); + List deleteGroupIds = existGroupIds.stream().filter(role -> !groupIds.contains(role)).collect(Collectors.toList()); + + // 新增的 + if (CollectionUtils.isNotEmpty(insertGroupIds)) { + List insertRelation = new ArrayList<>(); + insertGroupIds.forEach(groupId -> { + SaasPgroupPermissionRelation relation = new SaasPgroupPermissionRelation(); + relation.setFeatureId(item.getFeatureId()); + relation.setGroupId(groupId); + relation.setCreateBy(operatorId); + insertRelation.add(relation); + }); + saasPgroupPermissionRelationDao.saveBatch(insertRelation); + } + + // 删除的 + if (CollectionUtils.isNotEmpty(deleteGroupIds)) { + saasPgroupPermissionRelationDao.removeByFeatureIdAndGroupIds(item.getFeatureId(), deleteGroupIds, operatorId); + } + } + } + } + + @Override + public List queryFeatureRoleRelation(Long featureId) { + List list = saasFeatureResourceService.listDescendant(featureId); + List featureIds = list.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); + + List pgroupPermissionRelations = saasPgroupPermissionRelationDao.queryByFeatureIds(featureIds); + Map> permissionMap = pgroupPermissionRelations.stream().collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getFeatureId)); + List groupIds = pgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); + List relations = saasPgroupRoleRelationDao.listByGroupIds(groupIds); + + List resps = new ArrayList<>(); + list.forEach(item -> { + FeatureRoleRelationResp resp = new FeatureRoleRelationResp(); + resp.setFeatureId(item.getId()); + resp.setAuthType(item.getAuthType()); + List groups = permissionMap.get(item.getId()); + if (CollectionUtil.isNotEmpty(groups)) { + List itemGroupIds = groups.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); + List itemRoles = relations.stream().filter(role -> itemGroupIds.contains(role.getGroupId())).collect(Collectors.toList()); + List roleIds = itemRoles.stream().map(SaasPgroupRoleRelation::getRoleId).collect(Collectors.toList()); + resp.setRoleIds(roleIds); + } + resps.add(resp); + }); + return resps; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 47b00aa1..852cf5b3 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -211,6 +211,17 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } } + @Override + public void updateFeatureAuthType(Long featureId, Integer authType) { + if (featureId != null && authType != null) { + featureResourceDao.lambdaUpdate() + .eq(SaasFeatureResource::getId, featureId) + .eq(BaseEntity::getIsDelete,1) + .set(SaasFeatureResource::getAuthType, authType) + .update(); + } + } + private void newResource(SaasFeatureResource resource, String parentPath) { featureResourceDao.save(resource); //path追加自身ID From 1689297635cda2554d441bef72706e25fb26125b Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 10 Apr 2024 17:50:31 +0800 Subject: [PATCH 037/130] =?UTF-8?q?api=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 08f4ac1d..3ca55c3c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -49,11 +49,11 @@ public interface TyrSaasRoleApi { /** OMS编辑菜单时给角色赋权限 **/ @PostMapping("/api/saasRoleGroup/relation/saveOrUpdate") - ApiResult saveOrUpdateFeatureRoleRelation(List saasFeatureRoleRelationReq, Long operatorId); + ApiResult saveOrUpdateFeatureRoleRelation(@RequestParam List saasFeatureRoleRelationReq, @RequestParam Long operatorId); /** 角色和组件页面的关联关系 **/ @PostMapping("/api/saasRoleGroup/relation/query") - ApiResult> queryFeatureRoleRelation(Long featureId); + ApiResult> queryFeatureRoleRelation(@RequestParam Long featureId); /** * 根据id查询详情 From f11eca13bcb6cf8c1c12e5e80c33c319866cf970 Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 11 Apr 2024 09:47:38 +0800 Subject: [PATCH 038/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=92=E8=89=B2=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 4 +- .../client/model/vo/SaveOrUpdateRoleVO.java | 19 +++-- .../cn/axzo/tyr/server/TyrApplication.java | 1 + .../controller/role/SaasRoleController.java | 4 +- .../server/service/impl/RoleServiceImpl.java | 70 ++++++++++++++----- 5 files changed, 73 insertions(+), 25 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 3ca55c3c..dd334b02 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -8,13 +8,13 @@ import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; -import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; -import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; +import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; +import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java index 2e51c9a3..3afed4d6 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java @@ -7,6 +7,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; +import java.util.Set; @Data public class SaveOrUpdateRoleVO { @@ -42,10 +43,14 @@ public class SaveOrUpdateRoleVO { /** * 角色分组 */ - @NotEmpty - @Valid private List groupTree; + /** + * 产品单位类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + */ + private Integer productUnitType; + private String permissionGroupName; private String permissionGroupDescription; @@ -57,23 +62,27 @@ public class SaveOrUpdateRoleVO { /** * 选中的权限点id + * cms再使用,后面都会切到使用permissionIds */ - @NotNull(message = "权限点ID不能为空") + @Deprecated private List selectedPPIds; + /** + * 新的oms权限 + */ + private Set permissionIds; + @Data public static class GroupInfoVO { /** * 角色分组id */ - @NotNull(message = "角色分组ID不能为空") private Long id; /** * 项目部类型字典code */ - @NotNull(message = "workspaceTypeCode不能为空") private String workspaceTypeCode; } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java index 9df76d7a..22bff94e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java @@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Import; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.EnableAsync; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 741e2725..4e5331ad 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -12,14 +12,14 @@ import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; -import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; -import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; import cn.axzo.tyr.client.model.res.CommonDictResp; +import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; +import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index cbc86854..bb4cc082 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -31,6 +31,8 @@ import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleVO; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; +import cn.axzo.tyr.server.model.ResourcePermission; +import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.model.RoleFeatureRelation; import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; @@ -81,8 +83,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; @@ -145,6 +145,8 @@ public class RoleServiceImpl extends ServiceImpl @Value("${groupLeader.code:projectTeamGPLeader}") private String groupLeaderCode; + private static final Set COMMON_ROLE_TYPES = Sets.newHashSet(RoleTypeEnum.COMMON.getValue(), RoleTypeEnum.AUTO_OWN.getValue()); + @Override public List queryByIdentityIdType(Long identityId, Integer identityType, Long workspaceId, Long ouId, Boolean includePermissionGroup) { // 查询人关联的角色id @@ -314,7 +316,11 @@ public class RoleServiceImpl extends ServiceImpl SaasRole saasRole = validAndBuildRole(saveOrUpdateRole, now); //验证权限集信息 SaasPermissionGroup saasPermissionGroup = validPermissionGroupCommon(saveOrUpdateRole); + + // TODO 旧的权限,待权限切完后就下掉 validFeature(saveOrUpdateRole.getSelectedPPIds()); + // 新的权限 + validPermission(saveOrUpdateRole.getPermissionIds()); saasRoleDao.saveOrUpdate(saasRole); // 新增或者保存分组和角色映射关系 @@ -338,16 +344,24 @@ public class RoleServiceImpl extends ServiceImpl if (Objects.isNull(saveOrUpdateRole.getId())) { saasPgroupRoleRelationDao.save(pgrr); } - // 保存权限集和权限点映射关系 - List pgpRelations = Optional.ofNullable(saveOrUpdateRole.getSelectedPPIds()).orElse(new ArrayList<>()).stream().map(ppId -> { - SaasPgroupPermissionRelation target = new SaasPgroupPermissionRelation(); - target.setGroupId(saasPermissionGroup.getId()); - target.setFeatureId(ppId); - target.setCreateBy(saveOrUpdateRole.getOperatorId()); - target.setUpdateBy(saveOrUpdateRole.getOperatorId()); - return target; - }).collect(Collectors.toList()); - saasPgroupPermissionRelationService.saveOrUpdate(Lists.newArrayList(saasPermissionGroup.getId()), pgpRelations); + if (CollectionUtils.isNotEmpty(saveOrUpdateRole.getSelectedPPIds()) + || CollectionUtils.isNotEmpty(saveOrUpdateRole.getPermissionIds())) { + + List pids = Optional.ofNullable(saveOrUpdateRole.getSelectedPPIds()) + .orElse(Lists.newArrayList(saveOrUpdateRole.getPermissionIds())); + + // 保存权限集和权限点映射关系 + List pgpRelations = pids.stream().map(ppId -> { + SaasPgroupPermissionRelation target = new SaasPgroupPermissionRelation(); + target.setGroupId(saasPermissionGroup.getId()); + target.setFeatureId(ppId); + target.setCreateBy(saveOrUpdateRole.getOperatorId()); + target.setUpdateBy(saveOrUpdateRole.getOperatorId()); + return target; + }).collect(Collectors.toList()); + saasPgroupPermissionRelationService.saveOrUpdate(Lists.newArrayList(saasPermissionGroup.getId()), pgpRelations); + } + return saasRole.getId(); } @@ -453,8 +467,20 @@ public class RoleServiceImpl extends ServiceImpl saasRole.setRoleType(saveOrUpdateRole.getRoleType()); saasRole.setWorkspaceId(saveOrUpdateRole.getWorkspaceId()); saasRole.setOwnerOuId(saveOrUpdateRole.getOwnerOuId()); - saasRole.setWorkspaceType(Integer.parseInt(saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode())); - saasRole.setProductUnitType(setProductUnitType(saveOrUpdateRole.getGroupTree().get(0))); + // roleType = 自定义,common,workspaceType = saveOrUpdateRole.workspaceType + // 其他就从角色组取,没有就saveOrUpdateRole.workspaceType + Integer workspaceType = null; + if (COMMON_ROLE_TYPES.contains(saveOrUpdateRole.getRoleType()) || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { + workspaceType = saveOrUpdateRole.getWorkspaceType(); + } else { + workspaceType = Integer.parseInt(saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode()); + } + if (CollectionUtils.isNotEmpty(saveOrUpdateRole.getGroupTree())) { + saasRole.setProductUnitType(setProductUnitType(saveOrUpdateRole.getGroupTree().get(0))); + } else { + saasRole.setProductUnitType(saveOrUpdateRole.getProductUnitType()); + } + saasRole.setUpdateBy(saveOrUpdateRole.getOperatorId()); saasRole.setUpdateAt(now); String message = "角色校验异常"; @@ -467,9 +493,8 @@ public class RoleServiceImpl extends ServiceImpl message = "同一角色分组内,角色名称不能重复!"; } else { //自定义角色 同一个企业单位 同一个工作台 角色名称不能为空 - String currentWorkspaceCode = saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode(); List systemAndCustomWorkspaceCodes = new ArrayList<>(); - systemAndCustomWorkspaceCodes.add(Long.valueOf(currentWorkspaceCode)); + systemAndCustomWorkspaceCodes.add(Long.valueOf(workspaceType)); systemAndCustomWorkspaceCodes.add(-1L); List systemAndCustomOuIds = new ArrayList<>(); @@ -1102,4 +1127,17 @@ public class RoleServiceImpl extends ServiceImpl }); return resps; } + + private void validPermission(Set permissionIds) { + if (CollectionUtils.isEmpty(permissionIds)) { + return; + } + List resourcePermissions = saasFeatureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder() + .ids(Lists.newArrayList(permissionIds)) + .build()); + if (permissionIds.size() != resourcePermissions.size()) { + permissionIds.removeAll(resourcePermissions.stream().map(ResourcePermission::getId).collect(Collectors.toSet())); + throw new ServiceException(String.format("权限点 %s 信息错误", permissionIds)); + } + } } From fe0b171f0738688099616f8ac077f70623f8350f Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 11 Apr 2024 11:01:32 +0800 Subject: [PATCH 039/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=98=AF=E5=90=A6=E6=98=BE=E7=A4=BA=E3=80=81?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E9=9A=90=E8=97=8F=E3=80=81=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/client/model/vo/SaasRoleVO.java | 14 ++++++++++++++ .../tyr/client/model/vo/SaveOrUpdateRoleVO.java | 13 +++++++++++++ .../tyr/server/repository/entity/SaasRole.java | 13 +++++++++++++ .../tyr/server/service/impl/RoleServiceImpl.java | 3 +++ 4 files changed, 43 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java index 46486507..b9f95a6d 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java @@ -64,6 +64,20 @@ public class SaasRoleVO { private Date createAt; private Date updateAt; + + /** + * '角色编码' + */ + private String roleCode; + /** + * '是否显示' + */ + private Boolean isDisplay; + /** + * '是否启用' + */ + private Boolean enabled; + /** * 获取角色对应所用的菜单,不管例外 * diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java index 3afed4d6..a8e7c7c4 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java @@ -72,6 +72,19 @@ public class SaveOrUpdateRoleVO { */ private Set permissionIds; + /** + * '角色编码' + */ + private String roleCode; + /** + * '是否显示' + */ + private Boolean isDisplay; + /** + * '是否启用' + */ + private Boolean enabled; + @Data public static class GroupInfoVO { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java index 838e0e29..2357ee26 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java @@ -76,6 +76,19 @@ public class SaasRole extends BaseEntity { @Deprecated private Long fitOuTypeBit; + /** + * '角色编码' + */ + private String roleCode; + /** + * '是否显示' + */ + private Boolean isDisplay; + /** + * '是否启用' + */ + private Boolean enabled; + /** * 获取主键值 * diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index bb4cc082..f177cc9d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -462,6 +462,9 @@ public class RoleServiceImpl extends ServiceImpl throw new ServiceException("角色不存在"); } } + saasRole.setRoleCode(saveOrUpdateRole.getRoleCode()); + saasRole.setIsDisplay(saveOrUpdateRole.getIsDisplay()); + saasRole.setEnabled(saveOrUpdateRole.getEnabled()); saasRole.setName(saveOrUpdateRole.getName()); saasRole.setDescription(saasRole.getDescription()); saasRole.setRoleType(saveOrUpdateRole.getRoleType()); From 18efc99fa4ab56926afe851bc61dc45bc6cabf53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Thu, 11 Apr 2024 13:50:50 +0800 Subject: [PATCH 040/130] =?UTF-8?q?feat(2227-featureResource):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=8A=9F=E8=83=BD=E8=B5=84=E6=BA=90=E6=A0=91=E6=A0=B9?= =?UTF-8?q?=E8=8A=82=E7=82=B9id=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 0bc69735..a02e969a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -133,7 +133,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic final AtomicLong rootIdIndex = new AtomicLong(0L); List rootNodes = commonDictResponses.stream().map(e -> FeatureResourceTreeNode.builder() - .id(rootIdIndex.decrementAndGet()).terminal(e.getDictCode()).featureName(e.getDictValue()).children(Lists.newArrayList()).build()).collect(Collectors.toList()); + .id(rootIdIndex.decrementAndGet()).terminal(e.getDictCode()).featureName(e.getDictValue()) + .featureCode("TERMINAL").featureType(-1).children(Lists.newArrayList()).build()).collect(Collectors.toList()); StopWatchUtil watch = StopWatchUtil.createStarted("feature-resource-tree"); watch.start("dbQuery"); From 15b1b7200ccca4ece86663ccfc846e5ec8f43678 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Thu, 11 Apr 2024 14:49:14 +0800 Subject: [PATCH 041/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=97=B6=E5=88=A0=E9=99=A4=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SaasFeatureResourceServiceImpl.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 0bc69735..8a7471a7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -263,7 +263,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } // 删除自己和自己的子集 - private void deleteComponentRecursionById(Long resourceId, List submitChildren, Long operatorId) { + @Transactional(rollbackFor = Exception.class) + public void deleteComponentRecursionById(Long resourceId, List submitChildren, Long operatorId) { if (submitChildren == null) { submitChildren = Collections.emptyList(); } @@ -294,6 +295,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) public void deleteMenuFeature(Long featureId, Long operatorId) { // 删除自己及自己的子集 featureResourceDao.lambdaUpdate() @@ -304,6 +307,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) public void reorderMenuFeature(Long featureId, Integer offset) { // 删除自己及自己的子集 SaasFeatureResource resource = featureResourceDao.lambdaQuery() @@ -327,11 +332,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic if (offsetIndex > parallelFeature.size() - 1) { offsetIndex = parallelFeature.size() - 1; } - // 要交换和当前下标一致,代表不需要交换,比如下标为0时上移,下标最大时下移 - if (offsetIndex.equals(index)) { - return; - } - Assert.isTrue(index >= 0, "移动下班"); Collections.swap(parallelFeature, index, offsetIndex); for (int i = 0; i < parallelFeature.size(); i++) { SaasFeatureResource featureResource = parallelFeature.get(i); From 55bc39e0a615e3e7bc8e3f7bdeeab40c6a262caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Thu, 11 Apr 2024 15:01:28 +0800 Subject: [PATCH 042/130] =?UTF-8?q?feat(2227-featureResource):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=8A=9F=E8=83=BD=E8=B5=84=E6=BA=90=E6=A0=91=E6=A0=B9?= =?UTF-8?q?=E8=8A=82=E7=82=B9id=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index ec31fcbf..9d7ccf4a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -134,7 +134,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic final AtomicLong rootIdIndex = new AtomicLong(0L); List rootNodes = commonDictResponses.stream().map(e -> FeatureResourceTreeNode.builder() .id(rootIdIndex.decrementAndGet()).terminal(e.getDictCode()).featureName(e.getDictValue()) - .featureCode("TERMINAL").featureType(-1).children(Lists.newArrayList()).build()).collect(Collectors.toList()); + .featureCode(e.getDictCode()).featureType(-1).children(Lists.newArrayList()).build()).collect(Collectors.toList()); StopWatchUtil watch = StopWatchUtil.createStarted("feature-resource-tree"); watch.start("dbQuery"); From 7fac618f83d8b6736936f6f16323f14957769826 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Thu, 11 Apr 2024 15:12:12 +0800 Subject: [PATCH 043/130] =?UTF-8?q?featureCode=E7=9A=84=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E6=80=A7=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SaasFeatureResourceServiceImpl.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index ec31fcbf..925f202c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -187,6 +187,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); baseResource.setUpdateBy(req.getOperatorId()); // 新增时候 + validFeatureCode(baseResource); if (req.getId() == null) { baseResource.setCreateBy(req.getOperatorId()); baseResource.setDisplayOrder(0); @@ -239,6 +240,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class); saasFeatureResource.setUpdateBy(operatorId); saasFeatureResource.setDisplayOrder(displayOrder); + validFeatureCode(saasFeatureResource); if (saasFeatureResource.getId() != null) { featureResourceDao.updateById(saasFeatureResource); } else { @@ -390,5 +392,14 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic return rootNodes; } + void validFeatureCode(SaasFeatureResource featureResource) { + Assert.notNull(featureResource.getFeatureCode(), "featureCode 不能为空"); + SaasFeatureResource exist = featureResourceDao.lambdaQuery() + .eq(SaasFeatureResource::getFeatureCode, featureResource.getFeatureCode()) + .eq(BaseEntity::getIsDelete, 0) + .one(); + Assert.isTrue(exist != null && !exist.getId().equals(featureResource.getId()), "存在重复的FeatureCode"); + } + } From 91cf6fb11c3eab4beb4929d9d2363f0630583562 Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 11 Apr 2024 16:34:25 +0800 Subject: [PATCH 044/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=A0=91=E5=A2=9E=E5=8A=A0id=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 11 ++ .../tyr/client/model/req/TreeRoleReq.java | 2 + .../client/model/req/UpdateRoleOffsetReq.java | 27 +++++ .../tyr/client/model/res/CommonDictResp.java | 2 + .../tyr/client/model/res/SaasRoleRes.java | 105 ++++++++++++++++++ .../axzo/tyr/client/model/vo/SaasRoleVO.java | 6 + .../client/model/vo/SaveOrUpdateRoleVO.java | 11 +- .../controller/role/SaasRoleController.java | 89 ++++++++++++++- .../role/SaasRoleGroupController.java | 4 +- .../server/repository/entity/SaasRole.java | 6 + .../axzo/tyr/server/service/RoleService.java | 6 + .../server/service/impl/RoleServiceImpl.java | 25 +++++ 12 files changed, 285 insertions(+), 9 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleOffsetReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index dd334b02..c5e2cd15 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -10,6 +10,8 @@ import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; +import cn.axzo.tyr.client.model.req.UpdateRoleGroupOffsetReq; +import cn.axzo.tyr.client.model.req.UpdateRoleOffsetReq; import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; @@ -163,4 +165,13 @@ public interface TyrSaasRoleApi { @PostMapping("/api/saasRole/tree") ApiListResult treeSaasRole(@RequestBody @Valid TreeRoleReq req); + /** + * 更新角色的位置 + * 向下移动,则找到后面位置的分组,替换sort + * 向上移动,则找到前面位置的分组,替换sort + * @param request + * @return + */ + @PostMapping("/api/role/group/update") + ApiResult updateRoleOffset(@Valid @RequestBody UpdateRoleOffsetReq request); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java index 402f65f0..d9432ef1 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java @@ -11,5 +11,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class TreeRoleReq { + private String workspaceTypeCode; + private Boolean needRole; } \ No newline at end of file diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleOffsetReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleOffsetReq.java new file mode 100644 index 00000000..50f2a61e --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/UpdateRoleOffsetReq.java @@ -0,0 +1,27 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UpdateRoleOffsetReq { + + /** + * 角色id + */ + @NotNull(message = "id不能为空") + private Long id; + + /** + * 偏移量:向上移就是负数,例如上移一位:-1,向下移就是正数,例如下移一位:1 + */ + @NotNull(message = "offset不能为空") + private Integer offset; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java index 714cf0c6..e60ba3a2 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/CommonDictResp.java @@ -18,6 +18,8 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class CommonDictResp { + private Long id; + /** * 业务域 */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java new file mode 100644 index 00000000..5426cf35 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java @@ -0,0 +1,105 @@ +package cn.axzo.tyr.client.model.res; + +import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SaasRoleRes { + + private Long id; + + /** + * 角色名称 + */ + private String name; + + /** + * 角色描述 + */ + private String description; + + /** + * 角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 + */ + private String roleType; + + private Long workspaceId; + + /** + * 废弃 + */ + @Deprecated + private Integer workspaceType; + + private Long ownerOuId; + + /** + * 产品单位类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + */ + private Integer productUnitType; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 来源的模版角色id(1052上线后可删除) + */ + @Deprecated + private Long fromPreRoleId; + + /** + * 适用单位类型 1:总包 2:建设单位 4:监理单位 8:劳务分包 16:专业分包 0都可以用 只会挂在最末级 + * (1052上线后可删除) + */ + @Deprecated + private Long fitOuTypeBit; + + /** + * '角色编码' + */ + private String roleCode; + /** + * '是否显示' + */ + private Boolean isDisplay; + /** + * '是否启用' + */ + private Boolean enabled; + + /** + * 排序 + */ + private Integer sort; + + /** + * 权限组 + */ + private List permissionGroup; + + /** + * 是否删除 + */ + private Long isDelete; + + private Date createAt; + + private Date updateAt; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java index b9f95a6d..db8b8740 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java @@ -78,6 +78,12 @@ public class SaasRoleVO { */ private Boolean enabled; + + /** + * 排序 + */ + private Integer sort; + /** * 获取角色对应所用的菜单,不管例外 * diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java index a8e7c7c4..f51a165f 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java @@ -1,15 +1,18 @@ package cn.axzo.tyr.client.model.vo; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; -import javax.validation.Valid; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; import java.util.List; import java.util.Set; @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class SaveOrUpdateRoleVO { /** @@ -85,6 +88,8 @@ public class SaveOrUpdateRoleVO { */ private Boolean enabled; + private Integer sort; + @Data public static class GroupInfoVO { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 4e5331ad..a75b0d06 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -14,6 +14,7 @@ import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; +import cn.axzo.tyr.client.model.req.UpdateRoleOffsetReq; import cn.axzo.tyr.client.model.res.CommonDictResp; import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; @@ -35,12 +36,14 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.service.PermissionCacheService; import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasCommonDictService; +import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupService; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; @@ -77,6 +80,8 @@ public class SaasRoleController implements TyrSaasRoleApi { private SaasRoleGroupService saasRoleGroupService; @Autowired private SaasRoleGroupRelationDao saasRoleGroupRelationDao; + @Autowired + private SaasRoleGroupRelationService saasRoleGroupRelationService; /** * 角色组里面parentId = 0 @@ -182,10 +187,11 @@ public class SaasRoleController implements TyrSaasRoleApi { public ApiListResult treeSaasRole(TreeRoleReq req) { // 因为根节点在roleGroup里面没有,都是workspaceTypeCode,描述是放在字典表里 - List commonDicts = listRootRole(); + List commonDicts = listRootRole(req); List roots = commonDicts.stream() .map(e -> RoleTreeRes.builder() + .id(e.getId()) .workspaceTypeCode(e.getDictCode()) .name(e.getDictValue()) .type("ROOT") @@ -200,6 +206,79 @@ public class SaasRoleController implements TyrSaasRoleApi { return ApiListResult.ok(result); } + @Override + public ApiResult updateRoleOffset(UpdateRoleOffsetReq request) { + if (request.getOffset() != 1 && request.getOffset() != -1) { + throw new ServiceException("暂时只支持移动一个位置"); + } + + SaasRole saasRole = roleService.getById(request.getId()); + if (saasRole == null) { + throw new ServiceException("角色信息不存在"); + } + + List saasRoleGroupRelations = saasRoleGroupRelationService.list(SaasRoleGroupRelationService.ListSaasRoleGroupRelationParam.builder() + .roleId(Lists.newArrayList(saasRole.getId())) + .build()); + if (CollectionUtils.isEmpty(saasRoleGroupRelations)) { + throw new ServiceException("角色分组信息不存在"); + } + + if (saasRoleGroupRelations.size() != 1) { + throw new ServiceException("角色分组信息不唯一,请检查异常"); + } + + List saasRoles = roleService.query(QuerySaasRoleReq.builder() + .sassRoleGroupIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getSaasRoleGroupId)) + .build()) + .stream() + .sorted(Comparator.comparing(SaasRoleVO::getSort)) + .collect(Collectors.toList()); + + SaasRoleVO exchangeRole = findExchangeRole(request, saasRoles); + if (exchangeRole == null) { + throw new ServiceException("未找到可以移动的位置"); + } + roleService.saveOrUpdate(SaveOrUpdateRoleVO.builder() + .id(saasRole.getId()) + .sort(exchangeRole.getSort()) + .build()); + + roleService.saveOrUpdate(SaveOrUpdateRoleVO.builder() + .id(exchangeRole.getId()) + .sort(saasRole.getSort()) + .build()); + return ApiResult.ok(); + } + + /** + * 只支持移动一位 + * @param request + * @param roles + * @return + */ + private SaasRoleVO findExchangeRole(UpdateRoleOffsetReq request, + List roles) { + List ids = roles.stream() + .map(SaasRoleVO::getId) + .collect(Collectors.toList()); + int currentIndex = ids.indexOf(request.getId()); + // 下移一位 + if (request.getOffset() == 1) { + int exchangeIndex = currentIndex + 1; + if (roles.size() > exchangeIndex) { + return roles.get(exchangeIndex); + } + } else if (request.getOffset() == -1) { + if (currentIndex == 0) { + return null; + } + int exchangeIndex = currentIndex - 1; + return roles.get(exchangeIndex); + } + return null; + } + /** * 查询角色 * Map<角色分组Id, List> @@ -229,7 +308,10 @@ public class SaasRoleController implements TyrSaasRoleApi { .stream() .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() .stream() - .map(value -> toRoleTree(saasRoles.get(value.getRoleId()))) + .map(value -> saasRoles.get(value.getRoleId())) + .filter(Objects::nonNull) + .sorted(Comparator.comparing(SaasRole::getSort)) + .map(this::toRoleTree) .filter(Objects::nonNull) .collect(Collectors.toList()))); } @@ -303,8 +385,9 @@ public class SaasRoleController implements TyrSaasRoleApi { childrenRoleGroups.forEach(e -> appendChildren(e, roleGroups, roles)); } - private List listRootRole() { + private List listRootRole(TreeRoleReq req) { return saasCommonDictService.query(CommonDictQueryReq.builder() + .codes(StringUtils.isBlank(req.getWorkspaceTypeCode()) ? null : Lists.newArrayList(req.getWorkspaceTypeCode())) .scope("role") .build()); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java index 6e507ce3..12b35461 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java @@ -74,7 +74,7 @@ public class SaasRoleGroupController implements SaasRoleGroupApi { .sorted(Comparator.comparing(SaasRoleGroupVO::getSort)) .collect(Collectors.toList()); - SaasRoleGroupVO exchangeRoleGroup = findExchangeRoleGroup(request, saasRoleGroup, roleGroupList); + SaasRoleGroupVO exchangeRoleGroup = findExchangeRoleGroup(request, roleGroupList); if (exchangeRoleGroup == null) { throw new ServiceException("未找到可以移动的位置"); } @@ -93,12 +93,10 @@ public class SaasRoleGroupController implements SaasRoleGroupApi { /** * 只支持移动一位 * @param request - * @param saasRoleGroup * @param roleGroupList * @return */ private SaasRoleGroupVO findExchangeRoleGroup(UpdateRoleGroupOffsetReq request, - SaasRoleGroupVO saasRoleGroup, List roleGroupList) { List ids = roleGroupList.stream() .map(SaasRoleGroupVO::getId) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java index 2357ee26..0b2bd48e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.repository.entity; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -89,6 +90,11 @@ public class SaasRole extends BaseEntity { */ private Boolean enabled; + /** + * 排序 + */ + private Integer sort; + /** * 获取主键值 * diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 392b7faf..f709e469 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -134,6 +134,12 @@ public interface RoleService extends IService { @CriteriaField(field = "id", operator = Operator.IN) private List roleIds; + + @CriteriaField(ignore = true) + private Boolean needPermission; + + @CriteriaField(ignore = true) + private Boolean needRoleGroup; } @SuperBuilder diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index f177cc9d..3996d4a6 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -533,9 +533,34 @@ public class RoleServiceImpl extends ServiceImpl } }); } + saasRole.setSort(saveOrUpdateRole.getSort()); + assembleSort(saveOrUpdateRole, saasRole); return saasRole; } + + private void assembleSort(SaveOrUpdateRoleVO saveOrUpdateRole, SaasRole saasRole) { + if (saasRole.getSort() != null || saasRole.getId() != null || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { + return; + } + + List saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(Lists.transform(saveOrUpdateRole.getGroupTree(), SaveOrUpdateRoleVO.GroupInfoVO::getId)); + if (CollectionUtils.isEmpty(saasRoleGroupRelations)) { + saasRole.setSort(1); + return; + } + + Optional last = this.lambdaQuery() + .eq(SaasRole::getId, Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) + .eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .orderByDesc(SaasRole::getSort) + .last("limit 1") + .list() + .stream() + .findFirst(); + saasRole.setSort(last.map(e -> e.getSort() == null ? 1 : e.getSort() + 1).orElse(1)); + } + /** * 产品单位类型 */ From 44d1c21e475108f073d5d51cb6f4a9c785e21a9e Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 11 Apr 2024 16:36:07 +0800 Subject: [PATCH 045/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2offset=E4=BF=AE=E6=94=B9url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index c5e2cd15..0f0eb96b 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -172,6 +172,6 @@ public interface TyrSaasRoleApi { * @param request * @return */ - @PostMapping("/api/role/group/update") + @PostMapping("/api/saasRole/offset/update") ApiResult updateRoleOffset(@Valid @RequestBody UpdateRoleOffsetReq request); } From dc235edbff5af9370c599e046f682356f689c38c Mon Sep 17 00:00:00 2001 From: zhansihu Date: Thu, 11 Apr 2024 17:18:44 +0800 Subject: [PATCH 046/130] =?UTF-8?q?fix(2227-baseTree):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=9F=BA=E5=87=86=E8=B7=AF=E7=94=B1=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/FeatureResourceApi.java | 4 ++++ .../permission/FeatureResourceController.java | 5 +++++ .../inner/feign/BaseFeatureResourceApi.java | 15 ++++++++++++--- .../service/FeatureResourceSyncService.java | 3 +++ .../impl/FeatureResourceSyncServiceImpl.java | 7 +++++++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 6e968ccb..a9b6eaf1 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -58,4 +58,8 @@ public interface FeatureResourceApi { /** 菜单详情 **/ @PostMapping("/api/featureResource/detail") ApiResult detail(@RequestParam Long featureId); + + /** 从基准环境查询功能资源树 **/ + @PostMapping("/api/featureResource/getBaseTree") + ApiResult> getBaseTree(@RequestBody @Valid GetFeatureResourceTreeReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 211c74b8..f987f67e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -84,4 +84,9 @@ public class FeatureResourceController implements FeatureResourceApi { public ApiResult> getTree(GetFeatureResourceTreeReq req) { return ApiResult.ok(featureResourceService.getTree(req)); } + + @Override + public ApiResult> getBaseTree(GetFeatureResourceTreeReq req) { + return ApiResult.ok(featureResourceSyncService.getBaseTree(req)); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java index 19ad14fb..1034f957 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java @@ -1,11 +1,16 @@ package cn.axzo.tyr.server.inner.feign; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.client.model.res.NavTreeResp; import org.springframework.cloud.openfeign.FeignClient; +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.RequestParam; +import javax.validation.Valid; import java.util.List; /** @@ -15,12 +20,16 @@ import java.util.List; * @author: ZhanSiHu * @date: 2024/4/3 10:25 */ -//@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:https://pre-api.axzo.cn/tyr}") -@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:http://127.0.0.1:8080}") +@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:https://pre-api.axzo.cn/tyr}") public interface BaseFeatureResourceApi { /** 从基准环境同步接口功能资源 - 批量限制20条 **/ - @PostMapping("/api/featureResource/sync/getTreeById") + @GetMapping("/api/featureResource/sync/getTreeById") ApiResult> getSyncTreeById(@RequestParam Long id); + + /** 从基准环境拉取资源树 **/ + @PostMapping("/api/featureResource/getTree") + ApiResult> getTree(@RequestBody @Valid GetFeatureResourceTreeReq req); + } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java index 94da849f..875cb911 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/FeatureResourceSyncService.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.server.service; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; @@ -17,4 +18,6 @@ public interface FeatureResourceSyncService { List getSyncTreeById(Long id); void syncFromBase(ResourceSyncReq req); + + List getBaseTree(GetFeatureResourceTreeReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java index c2b2314d..5ac579f2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi; @@ -75,6 +76,12 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic } } + @Override + public List getBaseTree(GetFeatureResourceTreeReq req) { + return RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getTree(req), + "get resource tree from base env", req).getData(); + } + private void doSyncFromBase(List syncList, Map codeCache, Long operatorId) { for (FeatureResourceTreeNode treeNode : syncList) { From a24fd8ec63ed3f1b0cf59e345834f110d62138c1 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Thu, 11 Apr 2024 17:30:58 +0800 Subject: [PATCH 047/130] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasFeatureResourceServiceImpl.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 8bbad7a0..2d32881e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -301,12 +301,23 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic @Transactional(rollbackFor = Exception.class) @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) public void deleteMenuFeature(Long featureId, Long operatorId) { + if (featureId == null) { + return; + } + List featureDescendant = featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .apply("FIND_IN_SET('" + featureId + "', path)") + .list(); + List featureIds = featureDescendant.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); + + // 删除自己及自己的子集 featureResourceDao.lambdaUpdate() .eq(BaseEntity::getIsDelete,0) .apply("FIND_IN_SET('" + featureId + "', path)") .set(SaasFeatureResource::getUpdateBy, operatorId) - .set(BaseEntity::getIsDelete,1); + .set(BaseEntity::getIsDelete,1) + .update(); } @Override From 65facb510611dbb7f3344607b3c563422eab1e9d Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 11 Apr 2024 19:08:15 +0800 Subject: [PATCH 048/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=9A=84page=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=A7=92=E8=89=B2=E7=9A=84tree=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 10 ++ .../tyr/client/model/req/PageRoleReq.java | 30 ++++ .../tyr/client/model/res/RoleTreeRes.java | 5 + .../client/model/res/SaasPermissionRes.java | 20 +++ .../client/model/res/SaasRoleGroupRes.java | 60 +++++++ .../tyr/client/model/res/SaasRoleRes.java | 15 +- .../controller/role/SaasRoleController.java | 34 +++- .../axzo/tyr/server/service/RoleService.java | 5 +- .../server/service/impl/RoleServiceImpl.java | 148 +++++++++++++++++- 9 files changed, 310 insertions(+), 17 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageRoleReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 0f0eb96b..98518200 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -5,6 +5,7 @@ import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; +import cn.axzo.tyr.client.model.req.PageRoleReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; @@ -18,6 +19,7 @@ import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; +import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -174,4 +176,12 @@ public interface TyrSaasRoleApi { */ @PostMapping("/api/saasRole/offset/update") ApiResult updateRoleOffset(@Valid @RequestBody UpdateRoleOffsetReq request); + + /** + * 角色page接口 + * @param request + * @return + */ + @PostMapping("/api/saasRole/page") + ApiPageResult page(@RequestBody PageRoleReq request); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageRoleReq.java new file mode 100644 index 00000000..0949638c --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageRoleReq.java @@ -0,0 +1,30 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageRoleReq { + + private List roleIds; + + private Boolean needPermission; + + private Boolean needRoleGroup; + + private Integer page; + + private Integer pageSize; + + /** + * 排序:使用示例,createAt__DESC + */ + private List sort; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java index cbbd1057..4692331f 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java @@ -39,4 +39,9 @@ public class RoleTreeRes { private Boolean isDisplay; private List children; + + /** + * id跟type拼接,因为前端组件所有节点的id不能重复 + */ + private String idStr; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java new file mode 100644 index 00000000..5e007685 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java @@ -0,0 +1,20 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SaasPermissionRes { + + private Long id; + + /** + * 资源编码-权限码 + */ + private String featureCode; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java new file mode 100644 index 00000000..e3d616de --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java @@ -0,0 +1,60 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SaasRoleGroupRes { + + private Long id; + + /** + * 工作台类型字典code + */ + private String workspaceTypeCode; + + /** + * 单位类型字典code + */ + private String ouTypeCode; + + /** + * 名称 + */ + private String name; + + /** + * 所属工作台id + */ + private Long workspaceId; + + /** + * 所属单位id + */ + private Long ouId; + + /** + * 排序 + */ + private Integer sort; + + /** + * 分组CODE + */ + private String code; + + /** + * 分类CODE, 用于代班长,小组长的权限分类。 + */ + private String categoryCode; + + /** + * 上级分组id + */ + private Long parentId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java index 5426cf35..dab00cf6 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleRes.java @@ -89,11 +89,6 @@ public class SaasRoleRes { */ private Integer sort; - /** - * 权限组 - */ - private List permissionGroup; - /** * 是否删除 */ @@ -102,4 +97,14 @@ public class SaasRoleRes { private Date createAt; private Date updateAt; + + /** + * 角色组 + */ + private List saasRoleGroups; + + /** + * 角色权限 + */ + private List saasPermissions; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index a75b0d06..8b8740e5 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -8,6 +8,7 @@ import cn.axzo.tyr.client.feign.TyrSaasRoleApi; import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.req.CommonDictQueryReq; import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; +import cn.axzo.tyr.client.model.req.PageRoleReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; @@ -22,6 +23,7 @@ import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; +import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -38,12 +40,14 @@ import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasCommonDictService; import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; @@ -88,6 +92,10 @@ public class SaasRoleController implements TyrSaasRoleApi { */ private static final Long ROOT_ROLE_GROUP_PARENT_ID = 0L; + private static final String ROOT_TYPE = "ROOT"; + private static final String ROLE_TYPE = "ROLE"; + private static final String ROLE_GROUP_TYPE = "ROLE_GROUP"; + @Override public ApiResult saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) { Long result = roleService.saveOrUpdate(saveOrUpdateRole); @@ -194,7 +202,8 @@ public class SaasRoleController implements TyrSaasRoleApi { .id(e.getId()) .workspaceTypeCode(e.getDictCode()) .name(e.getDictValue()) - .type("ROOT") + .type(ROOT_TYPE) + .idStr(e.getId() + ":" + ROOT_TYPE) .build()) .collect(Collectors.toList()); @@ -251,6 +260,14 @@ public class SaasRoleController implements TyrSaasRoleApi { return ApiResult.ok(); } + @Override + public ApiPageResult page(PageRoleReq request) { + RoleService.PageSaasRoleParam param = RoleService.PageSaasRoleParam.builder().build(); + BeanUtils.copyProperties(request, param); + Page page = roleService.page(param); + return ApiPageResult.ok(page.getRecords(), page.getTotal(), (int) page.getCurrent(), (int) page.getSize()); + } + /** * 只支持移动一位 * @param request @@ -296,11 +313,11 @@ public class SaasRoleController implements TyrSaasRoleApi { List saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupIds); - Map saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() + Map saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) .build()) .stream() - .collect(Collectors.toMap(SaasRole::getId, Function.identity())); + .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); return saasRoleGroupRelations.stream() .collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId)) @@ -310,7 +327,7 @@ public class SaasRoleController implements TyrSaasRoleApi { .stream() .map(value -> saasRoles.get(value.getRoleId())) .filter(Objects::nonNull) - .sorted(Comparator.comparing(SaasRole::getSort)) + .sorted(Comparator.comparing(SaasRoleRes::getSort)) .map(this::toRoleTree) .filter(Objects::nonNull) .collect(Collectors.toList()))); @@ -347,18 +364,21 @@ public class SaasRoleController implements TyrSaasRoleApi { .workspaceTypeCode(roleGroup.getWorkspaceTypeCode()) .id(roleGroup.getId()) .name(roleGroup.getName()) - .type("ROLE_GROUP") + .type(ROLE_GROUP_TYPE) + .idStr(roleGroup.getId() + ":" + ROLE_GROUP_TYPE) .build(); } - private RoleTreeRes toRoleTree(SaasRole role) { + private RoleTreeRes toRoleTree(SaasRoleRes role) { if (role == null) { return null; } return RoleTreeRes.builder() .id(role.getId()) .name(role.getName()) - .type("ROLE") + .type(ROLE_TYPE) + .idStr(role.getId() + ":" + ROLE_TYPE) + .isDisplay(role.getIsDisplay()) .build(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index f709e469..9108837f 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -16,6 +16,7 @@ import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleWithUserRes; +import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -118,9 +119,9 @@ public interface RoleService extends IService { /** 查询超管和管理员角色 **/ List listAdmins(Long workspaceId, Long ouId); - List list(ListSaasRoleParam param); + List list(ListSaasRoleParam param); - Page page(PageSaasRoleParam param); + Page page(PageSaasRoleParam param); void saveOrUpdateFeatureRoleRelation(List req, Long operatorId); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 3996d4a6..c3b169ba 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -24,6 +24,9 @@ import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleWithUserRes; +import cn.axzo.tyr.client.model.res.SaasPermissionRes; +import cn.axzo.tyr.client.model.res.SaasRoleGroupRes; +import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; @@ -71,9 +74,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -83,6 +91,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; @@ -1076,7 +1085,7 @@ public class RoleServiceImpl extends ServiceImpl } @Override - public List list(ListSaasRoleParam param) { + public List list(ListSaasRoleParam param) { return PageConverter.drainAll(pageNumber -> { PageSaasRoleParam pageParam = PageSaasRoleParam.builder().build(); BeanUtils.copyProperties(param, pageParam); @@ -1087,10 +1096,143 @@ public class RoleServiceImpl extends ServiceImpl } @Override - public Page page(PageSaasRoleParam param) { + public Page page(PageSaasRoleParam param) { QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasRole.class); wrapper.eq("is_delete", 0); - return this.page(PageConverter.convertToMybatis(param, SaasRole.class), wrapper); + + Page page = this.page(PageConverter.convertToMybatis(param, SaasRole.class), wrapper); + + Map> saasRoleGroups = listRoleGroups(param, page.getRecords()); + + return PageConverter.convert(page, (record) -> from(record, + saasRoleGroups)); + } + + private SaasRoleRes from(SaasRole saasRole, + Map> saasRoleGroups) { + SaasRoleRes saasRoleRes = SaasRoleRes.builder().build(); + BeanUtils.copyProperties(saasRole, saasRoleRes); + saasRoleRes.setSaasRoleGroups(saasRoleGroups.get(saasRoleRes.getId())); + + return saasRoleRes; + } + + private Map> listRolePermissions(PageSaasRoleParam param, + List saasRoles) { + if (CollectionUtils.isEmpty(saasRoles) || BooleanUtils.isNotTrue(param.getNeedPermission())) { + return Collections.emptyMap(); + } + + List saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(Lists.transform(saasRoles, SaasRole::getId)); + + if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) { + return Collections.emptyMap(); + } + + List saasPgroupPermissionRelations = saasPgroupPermissionRelationDao.lambdaQuery() + .in(SaasPgroupPermissionRelation::getGroupId, Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId)) + .eq(SaasPgroupPermissionRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + if (CollectionUtils.isEmpty(saasPgroupPermissionRelations)) { + return Collections.emptyMap(); + } + + Map resourcePermissions = saasFeatureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder() + .ids(Lists.transform(saasPgroupPermissionRelations, SaasPgroupPermissionRelation::getFeatureId)) + .build()) + .stream() + .map(e -> SaasPermissionRes.builder().id(e.getId()).featureCode(e.getFeatureCode()).build()) + .collect(Collectors.toMap(SaasPermissionRes::getId, Function.identity())); + + Map> pgroupPermissions = saasPgroupPermissionRelations.stream() + .collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId, + Collectors.mapping(SaasPgroupPermissionRelation::getFeatureId, Collectors.toList()))); + +// return saasPgroupRoleRelations.stream() +// .map(e -> { +// List permissionIds = pgroupPermissions.get(e.getGroupId()); +// if (CollectionUtils.isEmpty(permissionIds)) { +// return null; +// } +// +// return permissionIds.stream() +// .map(permissionId -> { +// SaasPermissionRes saasPermissionRes = resourcePermissions.get(permissionId); +// if (saasPermissionRes == null) { +// return null; +// } +// return SaasPermissionWrapper.builder() +// .id(saasPermissionRes.getId()) +// .featureCode(saasPermissionRes.getFeatureCode()) +// .roleId(e.getRoleId()) +// .build(); +// }) +// .filter(Objects::nonNull) +// .collect(Collectors.toList()); +// }) +// .collect(Collectors.groupingBy(SaasPgroupRoleRelation::getRoleId, +// Collectors.mapping(e -> { +// List permissionIds = pgroupPermissions.get(e.getGroupId()); +// if (CollectionUtils.isEmpty(permissionIds)) { +// return null; +// } +// +// return permissionIds.stream() +// .map(resourcePermissions::get) +// .collect(Collectors.toList()); +// }, Collectors.toList()))); + + return Collections.emptyMap(); + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + static class SaasPermissionWrapper { + + private Long id; + + /** + * 资源编码-权限码 + */ + private String featureCode; + + private Long roleId; + } + + private Map> listRoleGroups(PageSaasRoleParam param, + List saasRoles) { + if (CollectionUtils.isEmpty(saasRoles) || BooleanUtils.isNotTrue(param.getNeedRoleGroup())) { + return Collections.emptyMap(); + } + + List roleGroupRelations = saasRoleGroupRelationDao.lambdaQuery() + .in(SaasRoleGroupRelation::getRoleId, Lists.transform(saasRoles, SaasRole::getId)) + .eq(SaasRoleGroupRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + + if (CollectionUtils.isEmpty(roleGroupRelations)) { + return Collections.emptyMap(); + } + + Map saasRoleGroups = saasRoleGroupDao.query(QuerySaasRoleGroupReq.builder() + .ids(Lists.transform(roleGroupRelations, SaasRoleGroupRelation::getSaasRoleGroupId)) + .build()) + .stream() + .collect(Collectors.toMap(SaasRoleGroup::getId, Function.identity())); + + return roleGroupRelations.stream() + .collect(Collectors.groupingBy(SaasRoleGroupRelation::getRoleId, + Collectors.mapping(e -> { + SaasRoleGroup saasRoleGroup = saasRoleGroups.get(e.getSaasRoleGroupId()); + if (saasRoleGroup == null) { + return null; + } + SaasRoleGroupRes saasRoleGroupRes = SaasRoleGroupRes.builder().build(); + BeanUtils.copyProperties(saasRoleGroup, saasRoleGroupRes); + return saasRoleGroupRes; + }, Collectors.toList()))); } @Transactional(rollbackFor = Exception.class) From 2ffee9e1c3b51a19fe968765e993b7e925d2b830 Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 11 Apr 2024 21:22:05 +0800 Subject: [PATCH 049/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2pag?= =?UTF-8?q?e=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/RoleServiceImpl.java | 71 +++++++++---------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index c3b169ba..b734f0b7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1104,16 +1104,20 @@ public class RoleServiceImpl extends ServiceImpl Map> saasRoleGroups = listRoleGroups(param, page.getRecords()); + Map> saasPermissions = listRolePermissions(param, page.getRecords()); + return PageConverter.convert(page, (record) -> from(record, - saasRoleGroups)); + saasRoleGroups, + saasPermissions)); } private SaasRoleRes from(SaasRole saasRole, - Map> saasRoleGroups) { + Map> saasRoleGroups, + Map> saasPermissions) { SaasRoleRes saasRoleRes = SaasRoleRes.builder().build(); BeanUtils.copyProperties(saasRole, saasRoleRes); saasRoleRes.setSaasRoleGroups(saasRoleGroups.get(saasRoleRes.getId())); - + saasRoleRes.setSaasPermissions(saasPermissions.get(saasRoleRes.getId())); return saasRoleRes; } @@ -1148,41 +1152,34 @@ public class RoleServiceImpl extends ServiceImpl .collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId, Collectors.mapping(SaasPgroupPermissionRelation::getFeatureId, Collectors.toList()))); -// return saasPgroupRoleRelations.stream() -// .map(e -> { -// List permissionIds = pgroupPermissions.get(e.getGroupId()); -// if (CollectionUtils.isEmpty(permissionIds)) { -// return null; -// } -// -// return permissionIds.stream() -// .map(permissionId -> { -// SaasPermissionRes saasPermissionRes = resourcePermissions.get(permissionId); -// if (saasPermissionRes == null) { -// return null; -// } -// return SaasPermissionWrapper.builder() -// .id(saasPermissionRes.getId()) -// .featureCode(saasPermissionRes.getFeatureCode()) -// .roleId(e.getRoleId()) -// .build(); -// }) -// .filter(Objects::nonNull) -// .collect(Collectors.toList()); -// }) -// .collect(Collectors.groupingBy(SaasPgroupRoleRelation::getRoleId, -// Collectors.mapping(e -> { -// List permissionIds = pgroupPermissions.get(e.getGroupId()); -// if (CollectionUtils.isEmpty(permissionIds)) { -// return null; -// } -// -// return permissionIds.stream() -// .map(resourcePermissions::get) -// .collect(Collectors.toList()); -// }, Collectors.toList()))); + return saasPgroupRoleRelations.stream() + .map(e -> { + List permissionIds = pgroupPermissions.get(e.getGroupId()); + if (CollectionUtils.isEmpty(permissionIds)) { + return null; + } + + return permissionIds.stream() + .map(permissionId -> { + SaasPermissionRes saasPermissionRes = resourcePermissions.get(permissionId); + if (saasPermissionRes == null) { + return null; + } + return SaasPermissionWrapper.builder() + .id(saasPermissionRes.getId()) + .featureCode(saasPermissionRes.getFeatureCode()) + .roleId(e.getRoleId()) + .build(); + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + }) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.groupingBy(SaasPermissionWrapper::getRoleId, + Collectors.mapping(e -> SaasPermissionRes.builder().id(e.getId()).featureCode(e.getFeatureCode()).build(), + Collectors.toList()))); - return Collections.emptyMap(); } @Data From 3c391215a54fb7a31acc031d4e2b8c56fb2c33b6 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 12 Apr 2024 09:43:00 +0800 Subject: [PATCH 050/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2sort=E8=A7=A3=E6=9E=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index b734f0b7..6ac8177d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -560,7 +560,7 @@ public class RoleServiceImpl extends ServiceImpl } Optional last = this.lambdaQuery() - .eq(SaasRole::getId, Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) + .in(SaasRole::getId, Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) .eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value) .orderByDesc(SaasRole::getSort) .last("limit 1") From 6d1e238712ab25b30523d5a8309f2820edff0d2c Mon Sep 17 00:00:00 2001 From: zhansihu Date: Fri, 12 Apr 2024 10:45:59 +0800 Subject: [PATCH 051/130] =?UTF-8?q?fix(2227-baseTree):=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9A=E4=B9=89=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index a9b6eaf1..407ffd33 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -7,6 +7,7 @@ import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import cn.axzo.tyr.client.model.res.FeatureResourceDetailResp; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import org.springframework.cloud.openfeign.FeignClient; +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.RequestParam; @@ -31,7 +32,7 @@ public interface FeatureResourceApi { /** 从基准环境同步接口功能资源 **/ - @PostMapping("/api/featureResource/sync/fromBase") + @GetMapping("/api/featureResource/sync/fromBase") ApiResult syncFromBase(@RequestBody @Valid ResourceSyncReq req); @PostMapping("/api/featureResource/saveOrUpdate") From 5109552188618c36b30c68397d977ae0cb1f635a Mon Sep 17 00:00:00 2001 From: zhansihu Date: Fri, 12 Apr 2024 10:51:01 +0800 Subject: [PATCH 052/130] =?UTF-8?q?fix(2227-syncResource):=20http=20method?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/client/feign/FeatureResourceApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 407ffd33..3b9c4267 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -27,12 +27,12 @@ public interface FeatureResourceApi { /** 根据ID获取要同步的功能资源树详情 **/ - @PostMapping("/api/featureResource/sync/getTreeById") + @GetMapping("/api/featureResource/sync/getTreeById") ApiResult> getSyncTreeById(@RequestParam Long id); /** 从基准环境同步接口功能资源 **/ - @GetMapping("/api/featureResource/sync/fromBase") + @PostMapping("/api/featureResource/sync/fromBase") ApiResult syncFromBase(@RequestBody @Valid ResourceSyncReq req); @PostMapping("/api/featureResource/saveOrUpdate") From f28fb8229d3987720a119b52a4124e4cdf304fb1 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Fri, 12 Apr 2024 11:07:38 +0800 Subject: [PATCH 053/130] =?UTF-8?q?fix(2227-syncResource):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BC=82=E6=AD=A5=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/config/ExecutorConfig.java | 18 +++++++++-- .../impl/FeatureResourceSyncServiceImpl.java | 31 +++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/ExecutorConfig.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/ExecutorConfig.java index 70f4f236..2d0c1d41 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/ExecutorConfig.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/ExecutorConfig.java @@ -22,7 +22,7 @@ public class ExecutorConfig { * 权限定制线程池 * @return */ - @Bean + @Bean("authExecutor") public ExecutorService authExecutor() { new ThreadPoolExecutor.CallerRunsPolicy(); int coreSize = 5; @@ -43,7 +43,7 @@ public class ExecutorConfig { * 用户角色清理任务线程池 * @return */ - @Bean + @Bean("userRoleCleanExecutor") public ExecutorService userRoleCleanExecutor() { new ThreadPoolExecutor.CallerRunsPolicy(); int coreSize = 5; @@ -52,4 +52,18 @@ public class ExecutorConfig { executor.prestartCoreThread(); return executor; } + + /** + * 异步处理线程池 - 不需要等待处理结束 + * @return + */ + @Bean("asyncExecutor") + public ExecutorService asyncExecutor() { + new ThreadPoolExecutor.CallerRunsPolicy(); + int coreSize = 5; + ThreadPoolExecutor executor = new ThreadPoolExecutor(coreSize, 10, 60, TimeUnit.SECONDS, + new ArrayBlockingQueue<>(100), new NamedThreadFactory("sync-task-", false), new ThreadPoolExecutor.CallerRunsPolicy()); + executor.prestartCoreThread(); + return executor; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java index 5ac579f2..a63fd499 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java @@ -15,12 +15,16 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; /** * 功能资源同步服务实现 @@ -38,6 +42,10 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic private final BaseFeatureResourceApi baseFeatureResourceApi; + @Qualifier("asyncExecutor") + @Autowired + private ExecutorService asyncExecutor; + @Override public List getSyncTreeById(Long id) { //选中同步的数据 @@ -66,13 +74,23 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic @Override public void syncFromBase(ResourceSyncReq req) { + if (req.getIds().size() > 1) { + //超过一个异步处理 + CompletableFuture.runAsync(() -> doSyncFromBase(req), asyncExecutor); + return; + } + doSyncFromBase(req); + } + + private void doSyncFromBase(ResourceSyncReq req) { + //TODO:@Zhan 并发处理;同一个parent下同批查询 final Map codeCache = new ConcurrentHashMap<>(); + for (Long id : req.getIds()) { - //TODO:@Zhan 并发处理;同一个parent下同批查询 //获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件 List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), "get base sync tree by id", id).getData(); - doSyncFromBase(syncList, codeCache, req.getOperatorId()); + syncResourceProcess(syncList, codeCache, req.getOperatorId()); } } @@ -82,7 +100,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic "get resource tree from base env", req).getData(); } - private void doSyncFromBase(List syncList, Map codeCache, Long operatorId) { + private void syncResourceProcess(List syncList, Map codeCache, Long operatorId) { for (FeatureResourceTreeNode treeNode : syncList) { if (codeCache.containsKey(treeNode.getId())) { @@ -90,7 +108,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic log.info("already sync resource:{}", treeNode.getId()); //递归子节点 if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { - doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); + syncResourceProcess(treeNode.getChildren(), codeCache, operatorId); } continue; } @@ -109,10 +127,11 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic baseResource.setUpdateBy(operatorId); newResource(baseResource); } else { - //更新 + //更新 - 恢复不能变更的数据 baseResource.setId(resource.getId()); baseResource.setPath(baseResource.getPath() + "," + resource.getId()); baseResource.setUpdateBy(operatorId); + baseResource.setAppItemId(resource.getAppItemId()); featureResourceDao.updateById(baseResource); if (!StrUtil.equals(baseResource.getPath(), resource.getPath())) { @@ -123,7 +142,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic } //递归子节点 if (CollectionUtil.isNotEmpty(treeNode.getChildren())) { - doSyncFromBase(treeNode.getChildren(), codeCache, operatorId); + syncResourceProcess(treeNode.getChildren(), codeCache, operatorId); } } } From 93483471c9414afe130ae28b63241014137e01a2 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Fri, 12 Apr 2024 11:09:57 +0800 Subject: [PATCH 054/130] =?UTF-8?q?fix(2227-syncResource):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BC=82=E6=AD=A5=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/FeatureResourceSyncServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java index a63fd499..fe3a347a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java @@ -84,6 +84,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic private void doSyncFromBase(ResourceSyncReq req) { //TODO:@Zhan 并发处理;同一个parent下同批查询 + //处理数据缓存:避免同级节点上级重复处理 - 上级code查询 final Map codeCache = new ConcurrentHashMap<>(); for (Long id : req.getIds()) { From 6b472807813b30d1aa4d8a5a86919f26945087b2 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 12 Apr 2024 11:47:09 +0800 Subject: [PATCH 055/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2tre?= =?UTF-8?q?e=E6=8E=A5=E5=8F=A3=E6=9F=A5=E8=AF=A2=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/client/model/req/TreeRoleReq.java | 7 +++++++ .../tyr/server/controller/role/SaasRoleController.java | 6 ++++-- .../main/java/cn/axzo/tyr/server/service/RoleService.java | 6 ++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java index d9432ef1..7afc7c11 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java @@ -14,4 +14,11 @@ public class TreeRoleReq { private String workspaceTypeCode; private Boolean needRole; + + private Integer workspaceType; + + /** + * '是否显示' + */ + private Boolean isDisplay; } \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 8b8740e5..522bbcd1 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -314,8 +314,10 @@ public class SaasRoleController implements TyrSaasRoleApi { List saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupIds); Map saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() - .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) - .build()) + .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) + .isDisplay(req.getIsDisplay()) + .workspaceType(req.getWorkspaceType()) + .build()) .stream() .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 9108837f..69af777c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -136,6 +136,12 @@ public interface RoleService extends IService { @CriteriaField(field = "id", operator = Operator.IN) private List roleIds; + @CriteriaField(field = "workspaceType", operator = Operator.EQ) + private Integer workspaceType; + + @CriteriaField(field = "isDisplay", operator = Operator.EQ) + private Boolean isDisplay; + @CriteriaField(ignore = true) private Boolean needPermission; From 7ded370e51fde68a8eb092d683223b5d867178f8 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 12 Apr 2024 14:14:34 +0800 Subject: [PATCH 056/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2tre?= =?UTF-8?q?e=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0workspaceType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java | 2 ++ .../cn/axzo/tyr/server/controller/role/SaasRoleController.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java index 4692331f..e0f1aabe 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java @@ -23,6 +23,8 @@ public class RoleTreeRes { */ private String workspaceTypeCode; + private String workspaceType; + /** * 名字 */ diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 522bbcd1..985a3469 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -5,6 +5,7 @@ import cn.axzo.framework.domain.web.result.ApiListResult; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.TyrSaasRoleApi; +import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum; import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.req.CommonDictQueryReq; import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq; @@ -197,6 +198,7 @@ public class SaasRoleController implements TyrSaasRoleApi { // 因为根节点在roleGroup里面没有,都是workspaceTypeCode,描述是放在字典表里 List commonDicts = listRootRole(req); + List roots = commonDicts.stream() .map(e -> RoleTreeRes.builder() .id(e.getId()) @@ -204,6 +206,7 @@ public class SaasRoleController implements TyrSaasRoleApi { .name(e.getDictValue()) .type(ROOT_TYPE) .idStr(e.getId() + ":" + ROOT_TYPE) + .workspaceType(DictWorkSpaceTypeEnum.getByValueWorkspaceType(Integer.valueOf(e.getDictCode())).getValue()) .build()) .collect(Collectors.toList()); From ab66152d99173049568cda2f1388e5a3d3310765 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Fri, 12 Apr 2024 14:26:01 +0800 Subject: [PATCH 057/130] =?UTF-8?q?fix(2227-NavTree):=20=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=8C=E8=BF=94=E5=9B=9E=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PermissionQueryServiceImpl.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 3db00c79..44b24420 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -70,7 +70,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { //查询权限 - List permissions = queryUserPermission(context); + //List permissions = queryUserPermission(context); + List permissions = queryAllPermission(context); if (CollectionUtil.isEmpty(permissions)) { return Collections.emptyList(); } @@ -122,7 +123,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .build() .appendPersonId(req.getPersonId()); //查询权限 - List permissions = queryUserPermission(context); +// List permissions = queryUserPermission(context); + List permissions = queryAllPermission(context); Set featureIds = permissions.stream().map(PermissionDO::getFeatureIds).flatMap(Set::stream).collect(Collectors.toSet()); //权限过滤 return resourceList.stream() @@ -133,6 +135,19 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .collect(Collectors.toList()); } + private List queryAllPermission(PermissionQueryContext context) { + //mock 调试用 返回全部权限 + List workspaceFeatureRelations = listWorkspaceFeatureRelations(context); + if (CollectionUtil.isEmpty(workspaceFeatureRelations)) { + return Collections.emptyList(); + } + Set featureIds = workspaceFeatureRelations.stream() + .map(WorkspaceFeatureRelation::getFeatureId) + .collect(Collectors.toSet()); + PermissionDO permission = PermissionDO.builder().featureIds(featureIds).build(); + return Collections.singletonList(permission); + } + private List queryUserPermission(PermissionQueryContext context) { //查询用户具有的角色 From dde3fb71b2937725679ee3d88703604a1cf9e756 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Fri, 12 Apr 2024 14:38:04 +0800 Subject: [PATCH 058/130] =?UTF-8?q?=E8=8F=9C=E5=8D=95code=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasFeatureResourceServiceImpl.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 2d32881e..d349f242 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -3,6 +3,8 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.util.StopWatchUtil; import cn.axzo.basics.common.util.TreeUtil; +import cn.axzo.framework.domain.web.BizException; +import cn.axzo.framework.domain.web.code.BaseCode; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.pokonyan.config.redis.RedisClient; import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; @@ -15,11 +17,13 @@ import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.res.CommonDictResp; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.common.util.Throws; import cn.axzo.tyr.server.model.ResourcePermission; import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.model.convert.SaasFeatureResourceConvert; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; +import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasCommonDictService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.azxo.framework.common.utils.StringUtils; @@ -44,6 +48,8 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; import java.util.stream.Collectors; +import static cn.axzo.framework.domain.web.code.BaseCode.BAD_REQUEST; +import static cn.axzo.framework.domain.web.code.BaseCode.SERVER_ERROR; import static cn.axzo.tyr.server.common.constants.CacheConstant.KEY_AUTH_FREE; /** @@ -66,6 +72,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic private final SaasFeatureResourceCacheService saasFeatureResourceCacheService; private final SaasCommonDictService saasCommonDictService; + private final PermissionGroupImpl roleService; + @Override public List listNavByIds(List featureIds) { //按需扩展要查询的字段 @@ -310,7 +318,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .list(); List featureIds = featureDescendant.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); - // 删除自己及自己的子集 featureResourceDao.lambdaUpdate() .eq(BaseEntity::getIsDelete,0) @@ -339,7 +346,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic List parallelIds = parallelFeature.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); int index = parallelIds.indexOf(featureId); Assert.isTrue(index >= 0, "未查询到元素下标"); - Integer offsetIndex = index + offset; + int offsetIndex = index + offset; if (offsetIndex < 0) { offsetIndex = 0; } @@ -409,7 +416,9 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .eq(SaasFeatureResource::getFeatureCode, featureResource.getFeatureCode()) .eq(BaseEntity::getIsDelete, 0) .one(); - Assert.isTrue(exist != null && !exist.getId().equals(featureResource.getId()), "存在重复的FeatureCode"); + if (exist != null && !exist.getId().equals(featureResource.getId())) { + Throws.bizException(BaseCode.BAD_REQUEST, "菜单: " + featureResource.getFeatureName() + " 存在重复的code"); + } } From 6ebc341033a3dc4aab5dc417050798d9a0843a59 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Fri, 12 Apr 2024 14:49:54 +0800 Subject: [PATCH 059/130] =?UTF-8?q?fix(2227-NavTree):=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PermissionQueryServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 44b24420..364d588e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -235,9 +235,13 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .build()); List result = new ArrayList<>(); for (WorkspaceOUPair ow : context.getWorkspaceOUPairs()) { - List owPermission = permissions.stream().map(p -> WorkspaceFeatureRelation.builder().workspaceId(ow.getWorkspaceId()) - .productUnitType(SaasCooperateShipCooperateTypeEnum.OMS.code) - .build()).collect(Collectors.toList()); + List owPermission = permissions.stream() + .map(p -> WorkspaceFeatureRelation.builder() + .workspaceId(ow.getWorkspaceId()) + .productUnitType(SaasCooperateShipCooperateTypeEnum.OMS.code) + .featureId(p.getId()) + .build()) + .collect(Collectors.toList()); result.addAll(owPermission); } return result; From d1f63a5aebc20a3605c120f5231d75605c9a247c Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 12 Apr 2024 16:59:44 +0800 Subject: [PATCH 060/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=A7=92=E8=89=B2=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 5 +- .../tyr/client/model/vo/DeleteRoleVO.java | 36 ++++++ .../controller/role/SaasRoleController.java | 13 +- .../axzo/tyr/server/service/RoleService.java | 10 +- .../server/service/impl/RoleServiceImpl.java | 117 ++++++++++++------ 5 files changed, 136 insertions(+), 45 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 98518200..511e0286 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -11,7 +11,6 @@ import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.req.TreeRoleReq; -import cn.axzo.tyr.client.model.req.UpdateRoleGroupOffsetReq; import cn.axzo.tyr.client.model.req.UpdateRoleOffsetReq; import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; @@ -20,6 +19,7 @@ import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -77,8 +77,7 @@ public interface TyrSaasRoleApi { * 删除 */ @PostMapping("/api/saasRole/delete") - @Deprecated - ApiResult delete(@RequestBody List id); + ApiResult delete(@RequestBody DeleteRoleVO request); /** diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java new file mode 100644 index 00000000..96f0c10d --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeleteRoleVO.java @@ -0,0 +1,36 @@ +package cn.axzo.tyr.client.model.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeleteRoleVO { + /** + * 待删除角色集合 + */ + @NotEmpty(message = "roleIds不能为空") + private List roleIds; + + /** + * 待删除角色所属workSpaceId 历史接口需要 + */ + private Long workSpaceId; + + /** + * 待删除角色所属单位ID 历史接口需要 + */ + private Long outId; + + /** + * 历史接口对已经有user绑定到role有进行check,不能删除 + */ + private boolean needUsedCheck; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 985a3469..d2667ed0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -25,6 +25,7 @@ import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -135,13 +136,21 @@ public class SaasRoleController implements TyrSaasRoleApi { @Override public ApiResult deleteRole(List roleIds, Long workSpaceId, Long outId) { - roleService.deleteRole(roleIds, workSpaceId, outId); + DeleteRoleVO deleteRoleParam = DeleteRoleVO.builder() + .roleIds(roleIds) + .workSpaceId(workSpaceId) + .outId(outId) + .needUsedCheck(true) + .build(); + roleService.deleteRole(deleteRoleParam); permissionCacheService.markTempDisable(PermissionCacheKey.builder().disableAll(true).build()); return ApiResult.ok(); } @Override - public ApiResult delete(List roleIds) { + public ApiResult delete(DeleteRoleVO reqeust) { + roleService.deleteRole(reqeust); + permissionCacheService.markTempDisable(PermissionCacheKey.builder().disableAll(true).build()); return ApiResult.ok(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 69af777c..8e7631aa 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -17,6 +17,7 @@ import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; @@ -100,11 +101,9 @@ public interface RoleService extends IService { /** * 删除角色列表 - * @param roleIds 待删除角色集合 - * @param workSpaceId 待删除角色所属workSpaceId - * @param outId 待删除角色所属单位ID + * @param deleteRoleParam */ - void deleteRole(List roleIds,Long workSpaceId,Long outId); + void deleteRole(DeleteRoleVO deleteRoleParam); List queryRoleByFeatures(Set matchedFeatureIds); @@ -142,6 +141,9 @@ public interface RoleService extends IService { @CriteriaField(field = "isDisplay", operator = Operator.EQ) private Boolean isDisplay; + @CriteriaField(field = "roleCode", operator = Operator.EQ) + private String roleCode; + @CriteriaField(ignore = true) private Boolean needPermission; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 6ac8177d..9bcc3fe8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -27,6 +27,7 @@ import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.res.SaasPermissionRes; import cn.axzo.tyr.client.model.res.SaasRoleGroupRes; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.DeleteRoleVO; import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; @@ -459,12 +460,39 @@ public class RoleServiceImpl extends ServiceImpl return saasRoleDao.listRoleUserByPermissionGroup(permissionGroupIdList, workspaceIds); } + private void checkRoleCode(SaveOrUpdateRoleVO saveOrUpdateRole) { + + if (StringUtils.isBlank(saveOrUpdateRole.getRoleCode())) { + return; + } + List oldSaasRoles = this.list(ListSaasRoleParam.builder() + .roleCode(saveOrUpdateRole.getRoleCode()) + .build()); + if (CollectionUtils.isNotEmpty(oldSaasRoles)) { + throw new ServiceException("角色编码已存在"); + } + } + + /** + * roleType = 自定义,common,workspaceType = saveOrUpdateRole.workspaceType + * 其他就从角色组取,没有就saveOrUpdateRole.workspaceType + * @param saveOrUpdateRole + * @return + */ + private Integer resolveWorkspaceType(SaveOrUpdateRoleVO saveOrUpdateRole) { + if (COMMON_ROLE_TYPES.contains(saveOrUpdateRole.getRoleType()) || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { + return saveOrUpdateRole.getWorkspaceType(); + } + return Integer.parseInt(saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode()); + } + private SaasRole validAndBuildRole(SaveOrUpdateRoleVO saveOrUpdateRole, Date now) { SaasRole saasRole; if (Objects.isNull(saveOrUpdateRole.getId())) { saasRole = new SaasRole(); saasRole.setCreateBy(saveOrUpdateRole.getOperatorId()); saasRole.setCreateAt(now); + checkRoleCode(saveOrUpdateRole); } else { saasRole = saasRoleDao.getById(saveOrUpdateRole.getId()); if (Objects.isNull(saasRole)) { @@ -479,14 +507,9 @@ public class RoleServiceImpl extends ServiceImpl saasRole.setRoleType(saveOrUpdateRole.getRoleType()); saasRole.setWorkspaceId(saveOrUpdateRole.getWorkspaceId()); saasRole.setOwnerOuId(saveOrUpdateRole.getOwnerOuId()); - // roleType = 自定义,common,workspaceType = saveOrUpdateRole.workspaceType - // 其他就从角色组取,没有就saveOrUpdateRole.workspaceType - Integer workspaceType = null; - if (COMMON_ROLE_TYPES.contains(saveOrUpdateRole.getRoleType()) || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { - workspaceType = saveOrUpdateRole.getWorkspaceType(); - } else { - workspaceType = Integer.parseInt(saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode()); - } + Integer workspaceType = resolveWorkspaceType(saveOrUpdateRole); + saasRole.setWorkspaceType(workspaceType); + if (CollectionUtils.isNotEmpty(saveOrUpdateRole.getGroupTree())) { saasRole.setProductUnitType(setProductUnitType(saveOrUpdateRole.getGroupTree().get(0))); } else { @@ -509,6 +532,7 @@ public class RoleServiceImpl extends ServiceImpl systemAndCustomWorkspaceCodes.add(Long.valueOf(workspaceType)); systemAndCustomWorkspaceCodes.add(-1L); + List systemAndCustomOuIds = new ArrayList<>(); systemAndCustomOuIds.add(saveOrUpdateRole.getOwnerOuId()); systemAndCustomOuIds.add(-1L); @@ -542,14 +566,19 @@ public class RoleServiceImpl extends ServiceImpl } }); } - saasRole.setSort(saveOrUpdateRole.getSort()); assembleSort(saveOrUpdateRole, saasRole); return saasRole; } private void assembleSort(SaveOrUpdateRoleVO saveOrUpdateRole, SaasRole saasRole) { - if (saasRole.getSort() != null || saasRole.getId() != null || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { + if (saveOrUpdateRole.getSort() != null) { + saasRole.setSort(saveOrUpdateRole.getSort()); + return; + } + + // 新增时且没有传sort时,才自动维护一个最大的sort + if (saasRole.getId() != null || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { return; } @@ -834,20 +863,26 @@ public class RoleServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) - public void deleteRole(List roleIds, Long workSpaceId, Long ouId) { - List saasRoleUserRelations = roleUserRelationDao.lambdaQuery() - .in(CollectionUtil.isNotEmpty(roleIds), SaasRoleUserRelation::getRoleId, roleIds) - .eq(workSpaceId != null, SaasRoleUserRelation::getWorkspaceId, workSpaceId) - .eq(ouId != null, SaasRoleUserRelation::getOuId, ouId) - .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .list(); + public void deleteRole(DeleteRoleVO deleteRoleParam) { - if (CollectionUtil.isNotEmpty(saasRoleUserRelations)) { - throw new cn.axzo.basics.common.exception.ServiceException("当前角色已被用户使用,无法删除!"); + if (BooleanUtils.isTrue(deleteRoleParam.isNeedUsedCheck())) { + List saasRoleUserRelations = roleUserRelationDao.lambdaQuery() + .in(CollectionUtil.isNotEmpty(deleteRoleParam.getRoleIds()), SaasRoleUserRelation::getRoleId, deleteRoleParam.getRoleIds()) + .eq(deleteRoleParam.getWorkSpaceId() != null, SaasRoleUserRelation::getWorkspaceId, deleteRoleParam.getWorkSpaceId()) + .eq(deleteRoleParam.getOutId() != null, SaasRoleUserRelation::getOuId, deleteRoleParam.getOutId()) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + + if (CollectionUtil.isNotEmpty(saasRoleUserRelations)) { + throw new cn.axzo.basics.common.exception.ServiceException("当前角色已被用户使用,无法删除!"); + } } - saasRoleDao.delete(roleIds); - roleUserRelationDao.deleteByRoleId(roleIds); - roleGroupRelationDao.deleteGroupRelation(roleIds); + + saasRoleDao.delete(deleteRoleParam.getRoleIds()); + // 未根据id进行更新,会存在死锁的风险,但是角色的操作频率很低,可以先不考虑 + roleUserRelationDao.deleteByRoleId(deleteRoleParam.getRoleIds()); + roleGroupRelationDao.deleteGroupRelation(deleteRoleParam.getRoleIds()); + saasPgroupRoleRelationDao.deleteByRoleId(deleteRoleParam.getRoleIds()); } @Override @@ -1162,14 +1197,7 @@ public class RoleServiceImpl extends ServiceImpl return permissionIds.stream() .map(permissionId -> { SaasPermissionRes saasPermissionRes = resourcePermissions.get(permissionId); - if (saasPermissionRes == null) { - return null; - } - return SaasPermissionWrapper.builder() - .id(saasPermissionRes.getId()) - .featureCode(saasPermissionRes.getFeatureCode()) - .roleId(e.getRoleId()) - .build(); + return SaasPermissionWrapper.from(e, saasPermissionRes); }) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -1196,6 +1224,18 @@ public class RoleServiceImpl extends ServiceImpl private String featureCode; private Long roleId; + + public static SaasPermissionWrapper from(SaasPgroupRoleRelation saasPgroupRoleRelation, + SaasPermissionRes saasPermissionRes) { + if (saasPermissionRes == null) { + return null; + } + return SaasPermissionWrapper.builder() + .id(saasPermissionRes.getId()) + .featureCode(saasPermissionRes.getFeatureCode()) + .roleId(saasPgroupRoleRelation.getRoleId()) + .build(); + } } private Map> listRoleGroups(PageSaasRoleParam param, @@ -1220,18 +1260,23 @@ public class RoleServiceImpl extends ServiceImpl .collect(Collectors.toMap(SaasRoleGroup::getId, Function.identity())); return roleGroupRelations.stream() + .filter(e -> saasRoleGroups.get(e.getSaasRoleGroupId()) != null) .collect(Collectors.groupingBy(SaasRoleGroupRelation::getRoleId, Collectors.mapping(e -> { SaasRoleGroup saasRoleGroup = saasRoleGroups.get(e.getSaasRoleGroupId()); - if (saasRoleGroup == null) { - return null; - } - SaasRoleGroupRes saasRoleGroupRes = SaasRoleGroupRes.builder().build(); - BeanUtils.copyProperties(saasRoleGroup, saasRoleGroupRes); - return saasRoleGroupRes; + return toRoleGroupRes(saasRoleGroup); }, Collectors.toList()))); } + private SaasRoleGroupRes toRoleGroupRes(SaasRoleGroup saasRoleGroup) { + if (saasRoleGroup == null) { + return null; + } + SaasRoleGroupRes saasRoleGroupRes = SaasRoleGroupRes.builder().build(); + BeanUtils.copyProperties(saasRoleGroup, saasRoleGroupRes); + return saasRoleGroupRes; + } + @Transactional(rollbackFor = Exception.class) public void saveOrUpdateFeatureRoleRelation(List req, Long operatorId) { for (FeatureRoleRelationReq item : req) { From c54fe0e6349c1b0686ff5cb2740ca48b10814db4 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Fri, 12 Apr 2024 17:28:14 +0800 Subject: [PATCH 061/130] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=88=A0=E9=99=A4=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=9B=B8=E5=85=B3=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/SaasPgroupPermissionRelationService.java | 2 ++ .../service/impl/SaasFeatureResourceServiceImpl.java | 5 +++-- .../impl/SaasPgroupPermissionRelationServiceImpl.java | 11 +++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java index a32f8627..21ecc4e7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java @@ -6,4 +6,6 @@ import java.util.List; public interface SaasPgroupPermissionRelationService { void saveOrUpdate(List groupIds, List relations); + + void deleteByFeatureIds(List featureIds); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index d349f242..77b7d5c0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -26,6 +26,7 @@ import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasCommonDictService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; import cn.azxo.framework.common.utils.StringUtils; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; @@ -72,7 +73,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic private final SaasFeatureResourceCacheService saasFeatureResourceCacheService; private final SaasCommonDictService saasCommonDictService; - private final PermissionGroupImpl roleService; + private final SaasPgroupPermissionRelationService pgroupPermissionRelationService; @Override public List listNavByIds(List featureIds) { @@ -317,7 +318,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .apply("FIND_IN_SET('" + featureId + "', path)") .list(); List featureIds = featureDescendant.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); - + pgroupPermissionRelationService.deleteByFeatureIds(featureIds); // 删除自己及自己的子集 featureResourceDao.lambdaUpdate() .eq(BaseEntity::getIsDelete,0) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java index 65106522..9ad46caf 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import cn.hutool.core.collection.CollectionUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -46,4 +47,14 @@ public class SaasPgroupPermissionRelationServiceImpl implements SaasPgroupPermis saasPgroupPermissionRelationDao.removeByIds(deleteList.stream().map(SaasPgroupPermissionRelation::getId).sorted().collect(Collectors.toList())); } } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByFeatureIds(List featureIds) { + if (CollectionUtil.isEmpty(featureIds)) { + return; + } + saasPgroupPermissionRelationDao.removeByPermissionPointIds(featureIds); + + } } From 43ee7c4beae3583e97a37fe550c8a1a41fd6a8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Fri, 12 Apr 2024 17:31:10 +0800 Subject: [PATCH 062/130] =?UTF-8?q?feat(2227-userRole):=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A7=92=E8=89=B2=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=B1=95=E7=A4=BA=E8=A7=92=E8=89=B2=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java | 5 +++++ .../server/service/impl/SaasRoleUserRelationServiceImpl.java | 1 + 2 files changed, 6 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java index e90e314e..de34a173 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java @@ -84,4 +84,9 @@ public class SaasRoleUserDTO { * 资源Id */ private Long resourceId; + + /** + * 是否展示角色 + */ + private Boolean displayRole; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 18354252..ff99b73e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -61,6 +61,7 @@ public class SaasRoleUserRelationServiceImpl implements SaasRoleUserRelationServ userRole.setRoleName(role.getName()); userRole.setDescription(role.getDescription()); userRole.setRoleType(RoleTypeEnum.getRoleType(role.getRoleType())); + userRole.setDisplayRole(role.getIsDisplay()); return userRole; }).collect(Collectors.toList()); } From 6a10e43dd6ed2c69b03e90a068cdf58f7ae2fdee Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 15 Apr 2024 10:27:58 +0800 Subject: [PATCH 063/130] =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=94=B9=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8D=95=E4=B8=AA=E9=A1=B5=E9=9D=A2=E7=9A=84=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9EId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 2 +- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 2 +- .../permission/FeatureResourceController.java | 7 ++-- .../controller/role/SaasRoleController.java | 2 +- .../axzo/tyr/server/service/RoleService.java | 2 +- .../service/SaasFeatureResourceService.java | 4 +- .../server/service/impl/RoleServiceImpl.java | 39 ++++++++----------- .../impl/SaasFeatureResourceServiceImpl.java | 14 ++++++- 8 files changed, 41 insertions(+), 31 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 3b9c4267..72f9f84d 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -36,7 +36,7 @@ public interface FeatureResourceApi { ApiResult syncFromBase(@RequestBody @Valid ResourceSyncReq req); @PostMapping("/api/featureResource/saveOrUpdate") - ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); + ApiResult saveMenu(@RequestBody FeatureResourceTreeSaveReq req); /** 查询功能资源树 **/ @PostMapping("/api/featureResource/getTree") diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 511e0286..f897b06a 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -57,7 +57,7 @@ public interface TyrSaasRoleApi { /** 角色和组件页面的关联关系 **/ @PostMapping("/api/saasRoleGroup/relation/query") - ApiResult> queryFeatureRoleRelation(@RequestParam Long featureId); + ApiResult queryFeatureRoleRelation(@RequestParam Long featureId); /** * 根据id查询详情 diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index f987f67e..5b3f736e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -49,10 +49,11 @@ public class FeatureResourceController implements FeatureResourceApi { } @Override - public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { + public ApiResult saveMenu(FeatureResourceTreeSaveReq req) { log.info("save feature resource req : " + req.toString()); - featureResourceService.saveOrUpdateMenu(req); - return ApiResult.ok(); + Long featureId = featureResourceService.saveOrUpdateMenu(req); + log.info("save feature resource resp : " + featureId.toString()); + return ApiResult.ok(featureId); } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index d2667ed0..5a5905dc 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -112,7 +112,7 @@ public class SaasRoleController implements TyrSaasRoleApi { } @Override - public ApiResult> queryFeatureRoleRelation(Long featureId) { + public ApiResult queryFeatureRoleRelation(Long featureId) { return ApiResult.ok(roleService.queryFeatureRoleRelation(featureId)); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 8e7631aa..db295c7b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -124,7 +124,7 @@ public interface RoleService extends IService { void saveOrUpdateFeatureRoleRelation(List req, Long operatorId); - List queryFeatureRoleRelation(Long featureId); + FeatureRoleRelationResp queryFeatureRoleRelation(Long featureId); @SuperBuilder @Data diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index c5d29eab..c4a612a9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -19,13 +19,15 @@ import java.util.List; */ public interface SaasFeatureResourceService { - void saveOrUpdateMenu(FeatureResourceTreeSaveReq req); + Long saveOrUpdateMenu(FeatureResourceTreeSaveReq req); void updateFeatureAuthType(Long featureId, Integer authType); /**递归的**/ List listDescendant(Long featureId); + SaasFeatureResource featureResourceById(Long featureId); + FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId); /**删除指定菜单**/ diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 9bcc3fe8..b413f6c2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -68,6 +68,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -92,6 +93,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -1277,6 +1279,7 @@ public class RoleServiceImpl extends ServiceImpl return saasRoleGroupRes; } + @Override @Transactional(rollbackFor = Exception.class) public void saveOrUpdateFeatureRoleRelation(List req, Long operatorId) { for (FeatureRoleRelationReq item : req) { @@ -1314,30 +1317,22 @@ public class RoleServiceImpl extends ServiceImpl } @Override - public List queryFeatureRoleRelation(Long featureId) { - List list = saasFeatureResourceService.listDescendant(featureId); - List featureIds = list.stream().map(SaasFeatureResource::getId).collect(Collectors.toList()); - - List pgroupPermissionRelations = saasPgroupPermissionRelationDao.queryByFeatureIds(featureIds); - Map> permissionMap = pgroupPermissionRelations.stream().collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getFeatureId)); - List groupIds = pgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); - List relations = saasPgroupRoleRelationDao.listByGroupIds(groupIds); - - List resps = new ArrayList<>(); - list.forEach(item -> { - FeatureRoleRelationResp resp = new FeatureRoleRelationResp(); - resp.setFeatureId(item.getId()); - resp.setAuthType(item.getAuthType()); - List groups = permissionMap.get(item.getId()); - if (CollectionUtil.isNotEmpty(groups)) { - List itemGroupIds = groups.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); - List itemRoles = relations.stream().filter(role -> itemGroupIds.contains(role.getGroupId())).collect(Collectors.toList()); - List roleIds = itemRoles.stream().map(SaasPgroupRoleRelation::getRoleId).collect(Collectors.toList()); + public FeatureRoleRelationResp queryFeatureRoleRelation(Long featureId) { + SaasFeatureResource featureResource = saasFeatureResourceService.featureResourceById(featureId); + Assert.notNull(featureResource, "菜单不存在"); + FeatureRoleRelationResp resp = new FeatureRoleRelationResp(); + resp.setFeatureId(featureId); + resp.setAuthType(featureResource.getAuthType()); + List pgroupPermissionRelations = saasPgroupPermissionRelationDao.queryByFeatureIds(Collections.singletonList(featureId)); + if (CollectionUtil.isNotEmpty(pgroupPermissionRelations)) { + List groupIds = pgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()); + List relations = saasPgroupRoleRelationDao.listByGroupIds(groupIds); + if (CollectionUtil.isNotEmpty(relations)) { + List roleIds = relations.stream().map(SaasPgroupRoleRelation::getRoleId).collect(Collectors.toList()); resp.setRoleIds(roleIds); } - resps.add(resp); - }); - return resps; + } + return resp; } private void validPermission(Set permissionIds) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 77b7d5c0..98d49f94 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -192,7 +192,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) - public void saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { + public Long saveOrUpdateMenu(FeatureResourceTreeSaveReq req) { SaasFeatureResource baseResource = BeanMapper.copyBean(req, SaasFeatureResource.class); baseResource.setUpdateBy(req.getOperatorId()); // 新增时候 @@ -223,6 +223,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } else { deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); } + return baseResource.getId(); } @Override @@ -306,6 +307,17 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .list(); } + @Override + public SaasFeatureResource featureResourceById(Long featureId) { + if (featureId == null) { + return null; + } + return featureResourceDao.lambdaQuery() + .eq(BaseEntity::getIsDelete,0) + .eq(SaasFeatureResource::getId, featureId) + .one(); + } + @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) From b33f5d10d343a505423c9f069bd5a215c1a697d5 Mon Sep 17 00:00:00 2001 From: lilong Date: Mon, 15 Apr 2024 11:18:56 +0800 Subject: [PATCH 064/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B8=85=E6=B4=97=E8=A7=92=E8=89=B2=E3=80=81=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=BB=84=E9=A1=BA=E5=BA=8F=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/PrivateController.java | 151 ++++++++++++++++++ .../server/service/SaasRoleGroupService.java | 4 +- .../impl/SaasRoleGroupServiceImpl.java | 5 +- 3 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java new file mode 100644 index 00000000..865ae3c8 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -0,0 +1,151 @@ +package cn.axzo.tyr.server.controller; + +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; +import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRole; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasCommonDictService; +import cn.axzo.tyr.server.service.SaasRoleGroupService; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +@RestController +@RequiredArgsConstructor +public class PrivateController { + + @Autowired + private SaasCommonDictService saasCommonDictService; + @Autowired + private SaasRoleGroupService saasRoleGroupService; + @Autowired + private SaasRoleGroupRelationDao saasRoleGroupRelationDao; + @Autowired + private RoleService roleService; + + /** + * 统一层级的roleGroup按照id升序,sort从1递增 + * @return + * @throws Exception + */ + @PostMapping("/private/role/group/sort/refresh") + public Object refreshRoleGroupSort() { + List commonDicts = saasCommonDictService.query(CommonDictQueryReq.builder() + .scope("role") + .build()); + + if (CollectionUtils.isEmpty(commonDicts)) { + return "ok"; + } + + Map> roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder() + .workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode)) + .build()) + .stream() + .collect(Collectors.groupingBy(SaasRoleGroupVO::getWorkspaceTypeCode)); + + roleGroups.entrySet() + .forEach(e -> { + List saasRoleGroups = e.getValue().stream() + .sorted(Comparator.comparing(SaasRoleGroupVO::getId)) + .collect(Collectors.toList()); + + List update = IntStream.range(0, saasRoleGroups.size()) + .mapToObj(i -> { + SaasRoleGroupVO saasRoleGroup = saasRoleGroups.get(i); + SaasRoleGroup result = SaasRoleGroup.builder() + .sort(i + 1) + .build(); + result.setId(saasRoleGroup.getId()); + return result; + }) + .collect(Collectors.toList()); + + saasRoleGroupService.updateBatchById(update); + }); + + return "ok"; + } + + /** + * 刷新role的sort, + * @return + * @throws Exception + */ + @PostMapping("/private/role/sort/refresh") + public Object refreshRoleSort() { + List commonDicts = saasCommonDictService.query(CommonDictQueryReq.builder() + .scope("role") + .build()); + + if (CollectionUtils.isEmpty(commonDicts)) { + return "ok"; + } + + List roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder() + .workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode)) + .build()); + + List roleGroupIds = roleGroups.stream().map(SaasRoleGroupVO::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(roleGroupIds)) { + return "ok"; + } + + List saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupIds); + if (CollectionUtils.isEmpty(saasRoleGroupRelations)) { + return "ok"; + } + + Map saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() + .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) + .build()) + .stream() + .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); + + List updateSaasRoles = saasRoleGroupRelations.stream() + .collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId)) + .values() + .stream() + .map(e -> { + List sortedRoles = e.stream() + .map(rr -> saasRoles.get(rr.getRoleId())) + .filter(Objects::nonNull) + .sorted(Comparator.comparing(SaasRoleRes::getId)) + .collect(Collectors.toList()); + + List update = IntStream.range(0, sortedRoles.size()) + .mapToObj(i -> { + SaasRoleRes saasRole = sortedRoles.get(i); + SaasRole result = new SaasRole(); + result.setSort(i + 1); + result.setId(saasRole.getId()); + return result; + }) + .collect(Collectors.toList()); + return update; + }) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + + roleService.updateBatchById(updateSaasRoles); + return "ok"; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java index 29936bef..653745b7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java @@ -2,6 +2,8 @@ package cn.axzo.tyr.server.service; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; +import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** @@ -10,7 +12,7 @@ import java.util.List; * @description * @date 2023/12/1 16:37 */ -public interface SaasRoleGroupService { +public interface SaasRoleGroupService extends IService { List getList(QuerySaasRoleGroupReq req); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 7ccc9388..9087e0b0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -8,8 +8,10 @@ import cn.axzo.tyr.server.repository.dao.SaasRoleGroupDao; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupMapper; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -28,7 +30,8 @@ import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @Service -public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { +public class SaasRoleGroupServiceImpl extends ServiceImpl + implements SaasRoleGroupService { private final SaasRoleGroupDao saasRoleGroupDao; private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; From 2f1d43f20c18d7719ae035289143d65944afbd0b Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 13:39:52 +0800 Subject: [PATCH 065/130] =?UTF-8?q?fix(2227-NavTree):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=8F=9C=E5=8D=95=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java | 3 +++ .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java index f73f8fd4..4abafe9e 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/NavTreeResp.java @@ -36,6 +36,9 @@ public class NavTreeResp implements IBaseTree { private Long parentId; /** 页面路由 **/ private String linkUrl; + /** 图标 **/ + private String icon; + /** 子级 **/ private List children; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index d349f242..3043dfef 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -82,7 +82,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource::getParentId, SaasFeatureResource::getFeatureCode, SaasFeatureResource::getFeatureName, - SaasFeatureResource::getFeatureType) + SaasFeatureResource::getFeatureType, + SaasFeatureResource::getIcon) .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) .in(SaasFeatureResource::getId, featureIds) .in(SaasFeatureResource::getFeatureType, FeatureResourceType.navTypes()) From e9e609c7683a15d12b9bb561e6ddd9b8e68a7ef3 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 15 Apr 2024 15:12:37 +0800 Subject: [PATCH 066/130] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 2 +- .../model/req/FeatureRoleRelationReq.java | 26 ++++++++++++++----- .../controller/role/SaasRoleController.java | 4 +-- .../axzo/tyr/server/service/RoleService.java | 2 +- .../server/service/impl/RoleServiceImpl.java | 4 +-- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index f897b06a..5e68f370 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -53,7 +53,7 @@ public interface TyrSaasRoleApi { /** OMS编辑菜单时给角色赋权限 **/ @PostMapping("/api/saasRoleGroup/relation/saveOrUpdate") - ApiResult saveOrUpdateFeatureRoleRelation(@RequestParam List saasFeatureRoleRelationReq, @RequestParam Long operatorId); + ApiResult saveOrUpdateFeatureRoleRelation(@RequestBody @Validated FeatureRoleRelationReq saasFeatureRoleRelationReq); /** 角色和组件页面的关联关系 **/ @PostMapping("/api/saasRoleGroup/relation/query") diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java index f5a922c3..89109db0 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/FeatureRoleRelationReq.java @@ -5,6 +5,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; @Data @@ -13,12 +15,24 @@ import java.util.List; @NoArgsConstructor public class FeatureRoleRelationReq { - /** 功能Id **/ - private Long featureId; + @NotNull(message = "操作人不能为空") + private Long operatorId; - /** 应用的角色Id列表 **/ - private List roleIds; + @NotEmpty(message = "配置信息不能为空") + private List roleSettings; - /** 授权类型 0-全部角色 1-指定角色 **/ - private Integer authType; + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class RelationRoleSettings { + /** 功能Id **/ + private Long featureId; + + /** 应用的角色Id列表 **/ + private List roleIds; + + /** 授权类型 0-全部角色 1-指定角色 **/ + private Integer authType; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 5a5905dc..aa6e8282 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -106,8 +106,8 @@ public class SaasRoleController implements TyrSaasRoleApi { } @Override - public ApiResult saveOrUpdateFeatureRoleRelation(List saasFeatureRoleRelationReq, Long operatorId) { - roleService.saveOrUpdateFeatureRoleRelation(saasFeatureRoleRelationReq, operatorId); + public ApiResult saveOrUpdateFeatureRoleRelation(FeatureRoleRelationReq saasFeatureRoleRelationReq) { + roleService.saveOrUpdateFeatureRoleRelation(saasFeatureRoleRelationReq.getRoleSettings(), saasFeatureRoleRelationReq.getOperatorId()); return ApiResult.ok(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index db295c7b..12e28413 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -122,7 +122,7 @@ public interface RoleService extends IService { Page page(PageSaasRoleParam param); - void saveOrUpdateFeatureRoleRelation(List req, Long operatorId); + void saveOrUpdateFeatureRoleRelation(List req, Long operatorId); FeatureRoleRelationResp queryFeatureRoleRelation(Long featureId); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index b413f6c2..bf77a04b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1281,8 +1281,8 @@ public class RoleServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) - public void saveOrUpdateFeatureRoleRelation(List req, Long operatorId) { - for (FeatureRoleRelationReq item : req) { + public void saveOrUpdateFeatureRoleRelation(List req, Long operatorId) { + for (FeatureRoleRelationReq.RelationRoleSettings item : req) { saasFeatureResourceService.updateFeatureAuthType(item.getFeatureId(), item.getAuthType()); if (CollectionUtil.isEmpty(item.getRoleIds()) || item.getAuthType() == 0) { saasPgroupPermissionRelationDao.removeByPermissionPointIds(Collections.singletonList(item.getFeatureId())); From b073981767466444733214da5ae1a38f7e32fff0 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 15 Apr 2024 16:03:06 +0800 Subject: [PATCH 067/130] =?UTF-8?q?componentTyp=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java index e141ec7d..aad00da3 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/base/BaseFeatureResourceDO.java @@ -35,4 +35,7 @@ public class BaseFeatureResourceDO { /** 端类型 **/ private String terminal; + + /** 组件类型 **/ + private Integer componentType; } From 138ca5ae2164d3010d62c65482c192c71feb71b1 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 16:34:29 +0800 Subject: [PATCH 068/130] =?UTF-8?q?fix(2227-NavTree):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E9=A1=B5=E9=9D=A2=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index b3eef5ad..f6883a69 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -84,6 +84,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource::getFeatureCode, SaasFeatureResource::getFeatureName, SaasFeatureResource::getFeatureType, + SaasFeatureResource::getLinkUrl, SaasFeatureResource::getIcon) .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) .in(SaasFeatureResource::getId, featureIds) From ae4a935db37675684c7c62ed322f709a4109382d Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 15 Apr 2024 16:47:21 +0800 Subject: [PATCH 069/130] parentId --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index b3eef5ad..a98788eb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -202,11 +202,12 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic baseResource.setCreateBy(req.getOperatorId()); baseResource.setDisplayOrder(0); List parallelResources = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getParentId, req.getParentId()).list(); + SaasFeatureResource parent = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getId,req.getParentId()).one(); if (CollectionUtil.isNotEmpty(parallelResources)) { SaasFeatureResource maxOrderResource = parallelResources.stream().max(Comparator.comparingInt(SaasFeatureResource::getDisplayOrder)).orElse(new SaasFeatureResource()); baseResource.setDisplayOrder(maxOrderResource.getDisplayOrder() + 1); } - newResource(baseResource, ""); + newResource(baseResource, parent == null ? "" : parent.getPath()); } else { featureResourceDao.updateById(baseResource); } From 5d75d6abf08aa4c690fec00ec78113c123077289 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 15 Apr 2024 17:03:26 +0800 Subject: [PATCH 070/130] =?UTF-8?q?parentId=E8=AE=BE=E7=BD=AE=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 372d058c..553c69de 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -241,6 +241,9 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } private void newResource(SaasFeatureResource resource, String parentPath) { + if (resource.getParentId() != null && resource.getParentId() < 0) { + resource.setParentId(0L); + } featureResourceDao.save(resource); //path追加自身ID resource.setPath(StringUtils.isBlank(parentPath) ? resource.getId().toString() : parentPath + "," + resource.getId()); @@ -269,7 +272,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic if (!CollectionUtil.isEmpty(children)) { for (int i = 0; i < children.size(); i++) { FeatureComponentSaveReq childComponent = children.get(i); - if (childComponent.getParentId() != null) { + if (childComponent.getParentId() == null) { childComponent.setParentId(saasFeatureResource.getId()); } // 递归新增修改删除子节点 From 68b33b07dc45913e8c4ec12194023b3f9ab345a6 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 17:19:38 +0800 Subject: [PATCH 071/130] =?UTF-8?q?feat(2227-permissionQuery):=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PermissionQueryServiceImpl.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 364d588e..c21bfe03 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -9,10 +9,12 @@ import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.base.WorkspaceOUPair; import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.req.IdentityAuthReq; import cn.axzo.tyr.client.model.req.NavTreeReq; import cn.axzo.tyr.client.model.req.PagePermissionReq; import cn.axzo.tyr.client.model.req.PagePermissionResp; import cn.axzo.tyr.client.model.req.PermissionCheckReq; +import cn.axzo.tyr.client.model.res.IdentityAuthRes; import cn.axzo.tyr.client.model.res.NavTreeResp; import cn.axzo.tyr.server.model.PermissionDO; import cn.axzo.tyr.server.model.PermissionQueryContext; @@ -26,8 +28,10 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.service.PermissionQueryService; import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.service.TyrSaasAuthService; import cn.axzo.tyr.server.util.KeyUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -58,6 +62,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { private final SaasFeatureResourceService featureResourceService; private final RoleUserService roleUserService; private final RoleService roleService; + private final TyrSaasAuthService saasAuthService; @Override public List getNavTree(NavTreeReq req) { @@ -87,6 +92,10 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { @Override public boolean hasPermission(PermissionCheckReq req) { + //这里暂时硬编码-非OMS端鉴权请求 直接转老接口处理 + if (!StrUtil.equals("NT_OMS_WEB" ,req.getTerminal())) { + return hasPermissionV2(req); + } //权限编码转ID List resourcePermissions = featureResourceService.permissionQuery( ResourcePermissionQueryDTO.builder().featureCodes(req.getFeatureCodes()).build()); @@ -106,6 +115,20 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { return resourcePermissions.stream().anyMatch(r -> featureIds.contains(r.getId())); } + private boolean hasPermissionV2(PermissionCheckReq req) { + //包装请求老鉴权接口 + IdentityAuthReq authReq = IdentityAuthReq.builder() + .personId(req.getPersonId()) + .workspaceOusPairs(Collections.singletonList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(req.getWorkspaceId()) + .ouId(req.getOuId()).build())) + .featureCode(new HashSet<>(req.getFeatureCodes())) + .terminal(Collections.singletonList(req.getTerminal())) + .build(); + IdentityAuthRes.WorkspacePermission permissions = saasAuthService.findIdentityAuthMix(authReq).getPermissions().get(0); + return CollectionUtil.isNotEmpty(permissions.getPermissionPoint()); + } + @Override public List getPagePermission(PagePermissionReq req) { //这里没有区分是否为页面的组件或菜单树下级 同时包含了页面自身 From d3348b5f152ad8c2d6d4d7113353a64a71a8cfdf Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Mon, 15 Apr 2024 17:27:44 +0800 Subject: [PATCH 072/130] =?UTF-8?q?parentId=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 553c69de..46f60817 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -241,9 +241,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } private void newResource(SaasFeatureResource resource, String parentPath) { - if (resource.getParentId() != null && resource.getParentId() < 0) { - resource.setParentId(0L); - } featureResourceDao.save(resource); //path追加自身ID resource.setPath(StringUtils.isBlank(parentPath) ? resource.getId().toString() : parentPath + "," + resource.getId()); From 419956b14e1b83d7a9075231833d36a68f55032e Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 20:12:05 +0800 Subject: [PATCH 073/130] =?UTF-8?q?feat(2227-saveResource):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=BB=84=E4=BB=B6path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 46f60817..57f392e7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -210,6 +210,9 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } newResource(baseResource, parent == null ? "" : parent.getPath()); } else { + //补充path + SaasFeatureResource dbResource = featureResourceDao.getById(req.getId()); + baseResource.setPath(dbResource.getPath()); featureResourceDao.updateById(baseResource); } From 260bd8993c6311dbbbbf7aaae94a9f95dfe2453a Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 20:49:30 +0800 Subject: [PATCH 074/130] =?UTF-8?q?feat(2227-saveResource):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=BB=84=E4=BB=B6=E5=AD=90=E7=BA=A7path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 57f392e7..5843aa39 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -258,6 +258,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic saasFeatureResource.setDisplayOrder(displayOrder); validFeatureCode(saasFeatureResource); if (saasFeatureResource.getId() != null) { + SaasFeatureResource dbResource = featureResourceDao.getById(saasFeatureResource.getId()); + saasFeatureResource.setPath(dbResource.getPath()); featureResourceDao.updateById(saasFeatureResource); } else { saasFeatureResource.setCreateBy(operatorId); From 89058c6e28574cace3296b5ec55a3e151926a566 Mon Sep 17 00:00:00 2001 From: lilong Date: Mon, 15 Apr 2024 21:02:41 +0800 Subject: [PATCH 075/130] =?UTF-8?q?feat:(REQ-2227)=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=BB=84=E6=97=B6sort=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E5=90=8C=E4=B8=80=E6=9C=8D=E5=8A=A1=E7=9A=84?= =?UTF-8?q?=E5=88=86=E7=BB=84=E6=9D=A5=E9=80=92=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 9087e0b0..b636970b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -187,6 +187,7 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl Date: Mon, 15 Apr 2024 21:22:30 +0800 Subject: [PATCH 076/130] =?UTF-8?q?feat:(REQ-2227)=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=BB=84=E6=97=B6=E5=8E=BB=E6=8E=89productUn?= =?UTF-8?q?itType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index bf77a04b..f015d6d4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -93,7 +93,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -511,13 +510,6 @@ public class RoleServiceImpl extends ServiceImpl saasRole.setOwnerOuId(saveOrUpdateRole.getOwnerOuId()); Integer workspaceType = resolveWorkspaceType(saveOrUpdateRole); saasRole.setWorkspaceType(workspaceType); - - if (CollectionUtils.isNotEmpty(saveOrUpdateRole.getGroupTree())) { - saasRole.setProductUnitType(setProductUnitType(saveOrUpdateRole.getGroupTree().get(0))); - } else { - saasRole.setProductUnitType(saveOrUpdateRole.getProductUnitType()); - } - saasRole.setUpdateBy(saveOrUpdateRole.getOperatorId()); saasRole.setUpdateAt(now); String message = "角色校验异常"; From 9f868419bba2af4fd26dbb7470dcd6c7690e9ead Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 22:03:14 +0800 Subject: [PATCH 077/130] =?UTF-8?q?feat(2227-permissionQuery):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dauth=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 5843aa39..ac777628 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -113,7 +113,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic public boolean isAuthFree(Long featureId) { if (BooleanUtil.isTrue(RedisClient.KeyOps.hasKey(KEY_AUTH_FREE))) { - return RedisClient.SetOps.sIsMember(KEY_AUTH_FREE, featureId); + return RedisClient.SetOps.sIsMember(KEY_AUTH_FREE, String.valueOf(featureId)); } //load from DB From b809351a54ffb71fbcd811d74ab99e7ea2fe2003 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 22:13:22 +0800 Subject: [PATCH 078/130] =?UTF-8?q?feat(2227-permissionQuery):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=BB=98=E8=AE=A4=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/PermissionQueryServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index c21bfe03..54f67a02 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -213,7 +213,10 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { String key = relation.getWorkspaceId() + "-" + relation.getOuId(); PermissionDO permission = result.getOrDefault(key, - PermissionDO.builder().ouId(relation.getOuId()).workspaceId(relation.getWorkspaceId()).build()); + PermissionDO.builder() + .ouId(relation.getOuId()) + .workspaceId(relation.getWorkspaceId()) + .featureIds(new HashSet<>()).build()); if (RoleTypeEnum.isAdmin(role.getRoleType())) { //管理员和超管类权限 permission.getFeatureIds().addAll(buildAdminPermission(role, allFeatures)); From fff04954fcab42a07c9fd67df3853926298e69e7 Mon Sep 17 00:00:00 2001 From: lilong Date: Mon, 15 Apr 2024 22:19:16 +0800 Subject: [PATCH 079/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=A7=BB=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/role/SaasRoleController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index aa6e8282..7352f439 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -260,15 +260,15 @@ public class SaasRoleController implements TyrSaasRoleApi { if (exchangeRole == null) { throw new ServiceException("未找到可以移动的位置"); } - roleService.saveOrUpdate(SaveOrUpdateRoleVO.builder() - .id(saasRole.getId()) - .sort(exchangeRole.getSort()) - .build()); + SaasRole newSaasRole = new SaasRole(); + newSaasRole.setId(saasRole.getId()); + newSaasRole.setSort(exchangeRole.getSort()); + roleService.updateById(newSaasRole); - roleService.saveOrUpdate(SaveOrUpdateRoleVO.builder() - .id(exchangeRole.getId()) - .sort(saasRole.getSort()) - .build()); + SaasRole oldSaasRole = new SaasRole(); + oldSaasRole.setId(exchangeRole.getId()); + oldSaasRole.setSort(saasRole.getSort()); + roleService.updateById(oldSaasRole); return ApiResult.ok(); } From 137f8e0d1ad3706928b6acea797fc30eba7a6c34 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 22:28:21 +0800 Subject: [PATCH 080/130] =?UTF-8?q?feat(2227-permissionQuery):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=9D=83=E9=99=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PermissionQueryServiceImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 54f67a02..863ff70c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -75,8 +75,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { //查询权限 - //List permissions = queryUserPermission(context); - List permissions = queryAllPermission(context); + List permissions = queryUserPermission(context); +// List permissions = queryAllPermission(context); if (CollectionUtil.isEmpty(permissions)) { return Collections.emptyList(); } @@ -146,8 +146,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .build() .appendPersonId(req.getPersonId()); //查询权限 -// List permissions = queryUserPermission(context); - List permissions = queryAllPermission(context); + List permissions = queryUserPermission(context); +// List permissions = queryAllPermission(context); Set featureIds = permissions.stream().map(PermissionDO::getFeatureIds).flatMap(Set::stream).collect(Collectors.toSet()); //权限过滤 return resourceList.stream() @@ -231,7 +231,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { result.put(key, permission); } - return null; + return new ArrayList<>(result.values()); } private List buildNormalPermission(RoleWithFeature role, List allFeatures) { From 3940b0c39454cf4e1092962cbf9701e6ca1f1a8a Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 22:55:14 +0800 Subject: [PATCH 081/130] =?UTF-8?q?feat(2227-permissionQuery):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=9D=83=E9=99=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java | 2 +- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java index b3818ac9..e3857d2e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/model/ResourcePermissionQueryDTO.java @@ -28,7 +28,7 @@ public class ResourcePermissionQueryDTO { private List terminals; - private List authType; + private List authTypes; /** 路径包含 **/ private Long inPath; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index ac777628..0dc69631 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -104,6 +104,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .in(CollectionUtil.isNotEmpty(param.getFeatureTypes()), SaasFeatureResource::getFeatureType, param.getFeatureTypes()) .in(CollectionUtil.isNotEmpty(param.getFeatureCodes()), SaasFeatureResource::getFeatureCode, param.getFeatureCodes()) .in(CollectionUtil.isNotEmpty(param.getTerminals()), SaasFeatureResource::getTerminal, param.getTerminals()) + .in(CollectionUtil.isNotEmpty(param.getAuthTypes()), SaasFeatureResource::getAuthType, param.getAuthTypes()) .apply(Objects.nonNull(param.getInPath()), " FIND_IN_SET(" + param.getInPath() + ", path)") .list(); return BeanMapper.copyList(resourceList, ResourcePermission.class); @@ -118,7 +119,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic //load from DB String[] featureIds = this.permissionQuery(ResourcePermissionQueryDTO.builder() - .authType(Collections.singletonList(FeatureResourceAuthType.ALL_ROLE.getCode())) + .authTypes(Collections.singletonList(FeatureResourceAuthType.ALL_ROLE.getCode())) .build()) .stream() .map(ResourcePermission::getId).map(String::valueOf) From 346dab82473987455170818ace74b0b1397c2176 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Mon, 15 Apr 2024 23:06:57 +0800 Subject: [PATCH 082/130] =?UTF-8?q?feat(2227-permissionQuery):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=85=8D=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PermissionQueryServiceImpl.java | 9 ++++++++- .../service/impl/SaasFeatureResourceServiceImpl.java | 11 ++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 863ff70c..225b04ea 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -6,6 +6,7 @@ import cn.axzo.basics.common.util.NumberUtil; import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.framework.auth.domain.TerminalInfo; import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum; +import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.base.WorkspaceOUPair; import cn.axzo.tyr.client.model.enums.IdentityType; @@ -235,13 +236,19 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { } private List buildNormalPermission(RoleWithFeature role, List allFeatures) { + Set featureIds = featureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder() + .authTypes(Collections.singletonList(FeatureResourceAuthType.ALL_ROLE.getCode())) + .build()) + .stream() + .map(ResourcePermission::getId) + .collect(Collectors.toSet()); //普通角色:角色同类型的租户产品权限已分配 且角色上已分配 + 免授权 Set roleFeatures = role.getFeatureIds(); return allFeatures.stream() .filter(f -> Objects.equals(f.getProductUnitType(), role.getProductUnitType()) || !NumberUtil.isPositiveNumber(role.getProductUnitType())) .map(WorkspaceFeatureRelation::getFeatureId) - .filter(id -> roleFeatures.contains(id) || featureResourceService.isAuthFree(id)) + .filter(id -> roleFeatures.contains(id) || featureIds.contains(id)) .collect(Collectors.toList()); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 0dc69631..7e919c7e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -44,6 +44,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; @@ -118,16 +119,12 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } //load from DB - String[] featureIds = this.permissionQuery(ResourcePermissionQueryDTO.builder() + Set featureIds = this.permissionQuery(ResourcePermissionQueryDTO.builder() .authTypes(Collections.singletonList(FeatureResourceAuthType.ALL_ROLE.getCode())) .build()) .stream() - .map(ResourcePermission::getId).map(String::valueOf) - .toArray(String[]::new); - RedisClient.SetOps.sAdd(KEY_AUTH_FREE, featureIds); - RedisClient.KeyOps.expire(KEY_AUTH_FREE, 120L, TimeUnit.MINUTES); - - return RedisClient.SetOps.sIsMember(KEY_AUTH_FREE, featureId); + .map(ResourcePermission::getId).collect(Collectors.toSet()); + return false; } @Override From db3c2bd4c6fbb9a930ce1219b29a6860b0aad14f Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 16 Apr 2024 10:22:27 +0800 Subject: [PATCH 083/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=A7=BB=E4=BD=8D=E6=97=B6=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=8E=9F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=9C=89bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/role/SaasRoleController.java | 23 +++++++++++-------- .../service/SaasRoleGroupRelationService.java | 6 ++++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 7352f439..0c899335 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -239,7 +239,7 @@ public class SaasRoleController implements TyrSaasRoleApi { } List saasRoleGroupRelations = saasRoleGroupRelationService.list(SaasRoleGroupRelationService.ListSaasRoleGroupRelationParam.builder() - .roleId(Lists.newArrayList(saasRole.getId())) + .roleIds(Lists.newArrayList(saasRole.getId())) .build()); if (CollectionUtils.isEmpty(saasRoleGroupRelations)) { throw new ServiceException("角色分组信息不存在"); @@ -249,14 +249,19 @@ public class SaasRoleController implements TyrSaasRoleApi { throw new ServiceException("角色分组信息不唯一,请检查异常"); } - List saasRoles = roleService.query(QuerySaasRoleReq.builder() - .sassRoleGroupIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getSaasRoleGroupId)) - .build()) + List saasRoleGroupRelationAll = saasRoleGroupRelationService.list(SaasRoleGroupRelationService.ListSaasRoleGroupRelationParam.builder() + .saasRoleGroupIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getSaasRoleGroupId)) + .build()); + + List saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() + .roleIds(Lists.transform(saasRoleGroupRelationAll, SaasRoleGroupRelation::getRoleId)) + .build()) .stream() - .sorted(Comparator.comparing(SaasRoleVO::getSort)) + .sorted(Comparator.comparing(SaasRoleRes::getSort)) .collect(Collectors.toList()); - SaasRoleVO exchangeRole = findExchangeRole(request, saasRoles); + + SaasRoleRes exchangeRole = findExchangeRole(request, saasRoles); if (exchangeRole == null) { throw new ServiceException("未找到可以移动的位置"); } @@ -286,10 +291,10 @@ public class SaasRoleController implements TyrSaasRoleApi { * @param roles * @return */ - private SaasRoleVO findExchangeRole(UpdateRoleOffsetReq request, - List roles) { + private SaasRoleRes findExchangeRole(UpdateRoleOffsetReq request, + List roles) { List ids = roles.stream() - .map(SaasRoleVO::getId) + .map(SaasRoleRes::getId) .collect(Collectors.toList()); int currentIndex = ids.indexOf(request.getId()); // 下移一位 diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java index 20b9f57c..4579b5ff 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java @@ -27,7 +27,11 @@ public interface SaasRoleGroupRelationService extends IService roleId; + private List roleIds; + + @CriteriaField(field = "saasRoleGroupId", operator = Operator.IN) + private List saasRoleGroupIds; + } @SuperBuilder From 70b9bf8955611fde73812f224283a22661f8de34 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 16 Apr 2024 10:59:34 +0800 Subject: [PATCH 084/130] =?UTF-8?q?feat(2227-permissionQuery):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=AF=BC=E8=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/PermissionQueryServiceImpl.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index 225b04ea..ef623460 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -7,6 +7,7 @@ import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.framework.auth.domain.TerminalInfo; import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum; import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.base.WorkspaceOUPair; import cn.axzo.tyr.client.model.enums.IdentityType; @@ -87,6 +88,12 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .collect(Collectors.toList()); //反查资源信息 List resourceList = featureResourceService.listNavByIds(featureIds); + List menuIds = resourceList.stream() + .filter(r -> FeatureResourceType.PAGE.apply(r.getFeatureType())) + .map(SaasFeatureResource::getParentId) + .collect(Collectors.toList()); + List menus = featureResourceService.listNavByIds(menuIds); + resourceList.addAll(menus); //组装导航树 return TreeUtil.buildTree(BeanMapper.copyList(resourceList, NavTreeResp.class)); } From e2a4600e50db875d507b2c2826686caa2ce16c14 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 16 Apr 2024 11:52:18 +0800 Subject: [PATCH 085/130] =?UTF-8?q?feat(2227-permissionQuery):=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=85=8D=E6=8E=88=E6=9D=83=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/SaasFeatureResourceService.java | 3 +++ .../service/impl/PermissionQueryServiceImpl.java | 14 +++++--------- .../impl/SaasFeatureResourceServiceImpl.java | 8 +++++++- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index c4a612a9..9f631a73 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -9,6 +9,7 @@ import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq; import io.swagger.models.auth.In; import java.util.List; +import java.util.Set; /** * 功能资源服务 @@ -49,4 +50,6 @@ public interface SaasFeatureResourceService { List getTree(GetFeatureResourceTreeReq req); SaasFeatureResource getByCode(String featureCode); + + Set listAuthFree(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index ef623460..ab004aea 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -205,6 +205,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .collect(Collectors.toMap(RoleWithFeature::getRoleId, Function.identity())); Map> workspaceMap = workspaceFeatureRelations.stream() .collect(Collectors.groupingBy(WorkspaceFeatureRelation::getWorkspaceId)); + //免授权 + Set authFreeFeatureIds = featureResourceService.listAuthFree(); //按拥有的角色构建权限结果 Map result = new HashMap<>(); for (SaasRoleUserRelation relation : userRoleRelations) { @@ -234,7 +236,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { } } else { //普通角色权限 - permission.getFeatureIds().addAll(buildNormalPermission(role, allFeatures)); + permission.getFeatureIds().addAll(buildNormalPermission(role, allFeatures, authFreeFeatureIds)); } result.put(key, permission); @@ -242,20 +244,14 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { return new ArrayList<>(result.values()); } - private List buildNormalPermission(RoleWithFeature role, List allFeatures) { - Set featureIds = featureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder() - .authTypes(Collections.singletonList(FeatureResourceAuthType.ALL_ROLE.getCode())) - .build()) - .stream() - .map(ResourcePermission::getId) - .collect(Collectors.toSet()); + private List buildNormalPermission(RoleWithFeature role, List allFeatures, Set authFreeFeatureIds) { //普通角色:角色同类型的租户产品权限已分配 且角色上已分配 + 免授权 Set roleFeatures = role.getFeatureIds(); return allFeatures.stream() .filter(f -> Objects.equals(f.getProductUnitType(), role.getProductUnitType()) || !NumberUtil.isPositiveNumber(role.getProductUnitType())) .map(WorkspaceFeatureRelation::getFeatureId) - .filter(id -> roleFeatures.contains(id) || featureIds.contains(id)) + .filter(id -> roleFeatures.contains(id) || authFreeFeatureIds.contains(id)) .collect(Collectors.toList()); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 7e919c7e..59053c3d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -440,5 +440,11 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } } - + @Override + public Set listAuthFree() { + return featureResourceDao.lambdaQuery() + .select(SaasFeatureResource::getId) + .eq(SaasFeatureResource::getAuthType, FeatureResourceAuthType.ALL_ROLE.getCode()) + .list().stream().map(SaasFeatureResource::getId).collect(Collectors.toSet()); + } } From ebfa886d70dd91080ae76ea5f32edbfda936db3b Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 16 Apr 2024 13:50:54 +0800 Subject: [PATCH 086/130] =?UTF-8?q?feat(2227-permissionQuery):=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=8E=92=E5=BA=8F=E3=80=81=E5=8E=BB=E9=87=8D=EF=BC=9B?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E8=A7=92=E8=89=B2=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/PermissionQueryServiceImpl.java | 7 ++++++- .../cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 7 +++++-- .../service/impl/SaasFeatureResourceServiceImpl.java | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index ab004aea..a685071a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -94,8 +94,13 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .collect(Collectors.toList()); List menus = featureResourceService.listNavByIds(menuIds); resourceList.addAll(menus); + //去重 + Set distinctSet = new HashSet<>(); + List finalResources = resourceList.stream() + .filter(r -> distinctSet.add(r.getId())) + .collect(Collectors.toList()); //组装导航树 - return TreeUtil.buildTree(BeanMapper.copyList(resourceList, NavTreeResp.class)); + return TreeUtil.buildTree(BeanMapper.copyList(finalResources, NavTreeResp.class)); } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index f015d6d4..f249d3b9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1091,9 +1091,12 @@ public class RoleServiceImpl extends ServiceImpl public List listWithFeatures(Set roleIds, Set featureIds) { List result = new ArrayList<>(); - List roles = saasRoleDao.listByIds(roleIds); + List roles = saasRoleDao.lambdaQuery() + .in(SaasRole::getId, roleIds) + .eq(SaasRole::getEnabled, true) + .list(); if (CollectionUtil.isEmpty(roles)) { - log.warn("no roles found for ids:{}", roles); + log.warn("no enabled roles found for ids:{}", roles); return result; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 59053c3d..6339f506 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -90,6 +90,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) .in(SaasFeatureResource::getId, featureIds) .in(SaasFeatureResource::getFeatureType, FeatureResourceType.navTypes()) + .orderByAsc(SaasFeatureResource::getDisplayOrder) .list(); } From f8aa4b70eff2bf1ff7c24c28958194c728cbda68 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Tue, 16 Apr 2024 13:50:58 +0800 Subject: [PATCH 087/130] =?UTF-8?q?terminals=E4=BD=BF=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java | 2 +- .../axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java | 2 +- .../server/service/impl/SaasFeatureResourceCacheService.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java index 2c2438d3..c8a33df3 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/GetFeatureResourceTreeReq.java @@ -20,7 +20,7 @@ public class GetFeatureResourceTreeReq { private String keyword; /** 端 **/ - private String terminal; + private List terminals; /** 展示状态 默认不传返回全部 0-隐藏 1-显示 **/ private Integer status; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java index 89382aa8..9af58cd8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureResourceDao.java @@ -37,7 +37,7 @@ public class SaasFeatureResourceDao extends ServiceImpl getByResourceTreeParam (GetFeatureResourceTreeReq req) { log.info("get feature resource tree has not user cache!"); return featureResourceDao.getByResourceTreeParam(req); From 7df39ce166508c0cdf3fb0cdcae329ff0bed3509 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 16 Apr 2024 14:09:20 +0800 Subject: [PATCH 088/130] =?UTF-8?q?feat(2227-permissionQuery):=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=86=85=E5=AD=98=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/PermissionQueryServiceImpl.java | 4 +++- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index a685071a..dd26d6da 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -40,6 +40,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -94,10 +95,11 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .collect(Collectors.toList()); List menus = featureResourceService.listNavByIds(menuIds); resourceList.addAll(menus); - //去重 + //去重-排序 Set distinctSet = new HashSet<>(); List finalResources = resourceList.stream() .filter(r -> distinctSet.add(r.getId())) + .sorted(Comparator.comparingInt(SaasFeatureResource::getDisplayOrder)) .collect(Collectors.toList()); //组装导航树 return TreeUtil.buildTree(BeanMapper.copyList(finalResources, NavTreeResp.class)); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 6339f506..c8fa83a3 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -86,11 +86,11 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource::getFeatureName, SaasFeatureResource::getFeatureType, SaasFeatureResource::getLinkUrl, - SaasFeatureResource::getIcon) + SaasFeatureResource::getIcon, + SaasFeatureResource::getDisplayOrder) .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) .in(SaasFeatureResource::getId, featureIds) .in(SaasFeatureResource::getFeatureType, FeatureResourceType.navTypes()) - .orderByAsc(SaasFeatureResource::getDisplayOrder) .list(); } From af815aa38454c9582ea191530c27ec04b00464ad Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 16 Apr 2024 16:19:11 +0800 Subject: [PATCH 089/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E6=B5=8B=EF=BC=8C=E4=BF=AE=E6=94=B9=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=A0=91=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/model/req/TreeRoleReq.java | 20 +++ tyr-server/pom.xml | 16 +++ .../controller/role/SaasRoleController.java | 33 ++++- .../axzo/tyr/server/service/RoleService.java | 6 + tyr-server/src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/logback-spring.xml | 2 +- .../axzo/tyr/server/permission/BaseTest.java | 101 ++++++++++++++ .../axzo/tyr/server/permission/DemoTest.java | 26 ++++ .../server/permission/MysqlDataLoader.java | 132 ++++++++++++++++++ .../tyr/server/permission/TestConfig.java | 35 +++++ .../test/resources/application-unittest.yml | 34 +++++ tyr-server/src/test/resources/mysql/data.sql | 1 + .../src/test/resources/mysql/schema.sql | 56 ++++++++ 13 files changed, 458 insertions(+), 6 deletions(-) create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/BaseTest.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/MysqlDataLoader.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/TestConfig.java create mode 100644 tyr-server/src/test/resources/application-unittest.yml create mode 100644 tyr-server/src/test/resources/mysql/data.sql create mode 100644 tyr-server/src/test/resources/mysql/schema.sql diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java index 7afc7c11..9821433c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java @@ -5,6 +5,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @Builder @NoArgsConstructor @@ -21,4 +23,22 @@ public class TreeRoleReq { * '是否显示' */ private Boolean isDisplay; + + /** + * 项目部id(不传或者传-1查询的是标准分组) + */ + private List workspaceIds; + + /** + * 单位id(不传或者传-1查询的是标准分组) + */ + private List ouIds; + + /** + * 端,会转成workspaceTypeCode去过滤根节点 + * NT_OMS_WEB -> 6 + * NT_CMS_WEB_GENERAL -> 1,2 + * NT_CMP_APP_GENERAL -> 1,2 + */ + private String terminal; } \ No newline at end of file diff --git a/tyr-server/pom.xml b/tyr-server/pom.xml index e60566e2..68216753 100644 --- a/tyr-server/pom.xml +++ b/tyr-server/pom.xml @@ -105,6 +105,22 @@ cn.axzo.pokonyan pokonyan + + + com.h2database + h2 + 2.0.202 + test + + + + + com.github.caryyu + spring-embedded-redis-server + 1.1 + pom + + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 0c899335..23de4e19 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -44,6 +44,7 @@ import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -59,6 +60,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -98,6 +100,16 @@ public class SaasRoleController implements TyrSaasRoleApi { private static final String ROLE_TYPE = "ROLE"; private static final String ROLE_GROUP_TYPE = "ROLE_GROUP"; + /** + * 没有统一维护的地方 + */ + private static final Map> TERMINAL_WORKSPACE_CODES = Maps.newHashMap(); + static { + TERMINAL_WORKSPACE_CODES.put("NT_OMS_WEB", Lists.newArrayList("6")); + TERMINAL_WORKSPACE_CODES.put("NT_CMS_WEB_GENERAL", Lists.newArrayList("1", "2")); + TERMINAL_WORKSPACE_CODES.put("NT_CMP_APP_GENERAL", Lists.newArrayList("1", "2")); + } + @Override public ApiResult saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) { Long result = roleService.saveOrUpdate(saveOrUpdateRole); @@ -334,6 +346,8 @@ public class SaasRoleController implements TyrSaasRoleApi { .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) .isDisplay(req.getIsDisplay()) .workspaceType(req.getWorkspaceType()) + .workspaceIds(req.getWorkspaceIds()) + .ouIds(req.getOuIds()) .build()) .stream() .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); @@ -358,11 +372,13 @@ public class SaasRoleController implements TyrSaasRoleApi { return Collections.emptyMap(); } - List roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder() + List roleGroups = saasRoleGroupService.getRoleGroupList(QuerySaasRoleGroupReq.builder() .workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode)) + .workspaceIds(req.getWorkspaceIds()) + .ouIds(req.getOuIds()) .build()) .stream() - .sorted(Comparator.comparing(SaasRoleGroupVO::getSort)) + .sorted(Comparator.comparing(e -> Optional.ofNullable(e.getSort()).orElse(1))) .collect(Collectors.toList()); Map> roles = listRole(roleGroups, req); @@ -425,9 +441,18 @@ public class SaasRoleController implements TyrSaasRoleApi { } private List listRootRole(TreeRoleReq req) { - return saasCommonDictService.query(CommonDictQueryReq.builder() + CommonDictQueryReq commonDictQueryReq = CommonDictQueryReq.builder() .codes(StringUtils.isBlank(req.getWorkspaceTypeCode()) ? null : Lists.newArrayList(req.getWorkspaceTypeCode())) .scope("role") - .build()); + .build(); + if (StringUtils.isNotBlank(req.getTerminal())) { + List workspaceTypeCodes = TERMINAL_WORKSPACE_CODES.get(req.getTerminal()); + if (CollectionUtils.isEmpty(workspaceTypeCodes)) { + return Collections.emptyList(); + } + commonDictQueryReq.setCodes(workspaceTypeCodes); + } + + return saasCommonDictService.query(commonDictQueryReq); } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 12e28413..540f39e7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -144,6 +144,12 @@ public interface RoleService extends IService { @CriteriaField(field = "roleCode", operator = Operator.EQ) private String roleCode; + @CriteriaField(field = "workspaceId", operator = Operator.EQ) + private List workspaceIds; + + @CriteriaField(field = "ownerOuId", operator = Operator.EQ) + private List ouIds; + @CriteriaField(ignore = true) private Boolean needPermission; diff --git a/tyr-server/src/main/resources/bootstrap.yml b/tyr-server/src/main/resources/bootstrap.yml index 9a6a3cb1..60b3f0d7 100644 --- a/tyr-server/src/main/resources/bootstrap.yml +++ b/tyr-server/src/main/resources/bootstrap.yml @@ -76,7 +76,7 @@ spring: cloud: nacos: config: - server-addr: ${NACOS_HOST:test-nacos.axzo.cn}:${NACOS_PORT:80} + server-addr: ${NACOS_HOST:https://test-nacos.axzo.cn}:${NACOS_PORT:443} file-extension: yaml namespace: ${NACOS_NAMESPACE_ID:f3c0f0d2-bac4-4498-bee7-9c3636b3afdf} --- diff --git a/tyr-server/src/main/resources/logback-spring.xml b/tyr-server/src/main/resources/logback-spring.xml index 922ff245..977ff74a 100644 --- a/tyr-server/src/main/resources/logback-spring.xml +++ b/tyr-server/src/main/resources/logback-spring.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/BaseTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/BaseTest.java new file mode 100644 index 00000000..7110fb2f --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/BaseTest.java @@ -0,0 +1,101 @@ +package cn.axzo.tyr.server.permission; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import com.google.common.io.Files; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.util.AopTestUtils; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ResourceUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = {TestConfig.class}) +@AutoConfigureMockMvc +@Transactional +@ActiveProfiles("unittest") +public abstract class BaseTest { + private static final String JSON_FILE_CLASSPATH = "classpath:json/"; + + /** + * 记录对象原始的 field 值. 因为这些值可能被mock替换, 在每次执行单元测试前统一进行一次替换恢复 + * 避免影响后续的单元测试. + */ + private static Table ORIGIN_FIELD_TABLE = HashBasedTable.create(); + + @Autowired + protected MockMvc mockMvc; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + } + + @AfterEach + public void teardown() { + // restore origin value of field. + ORIGIN_FIELD_TABLE.cellSet().stream().forEach(e -> { + ReflectionTestUtils.setField(e.getRowKey(), e.getColumnKey(), e.getValue()); + }); + } + + protected T unwrapProxy(Object bean) { + return AopTestUtils.getUltimateTargetObject(bean); + } + + protected List parseListContent(MvcResult result, Class contentClazz) throws UnsupportedEncodingException { + JSONObject response = JSONObject.parseObject(result.getResponse().getContentAsString()); + return JSON.parseObject(response.getString("content"), new TypeReference>(contentClazz) { + }); + } + + public static T loadJson(String fileName, Class clz) { + try { + String jsonString = Files.asCharSource(ResourceUtils.getFile(JSON_FILE_CLASSPATH + fileName), StandardCharsets.UTF_8).read(); + return JSON.parseObject(jsonString, clz); + } catch (IOException e) { + throw new RuntimeException("loadJson got error", e); + } + } + + public static List loadJsonAsList(String fileName, Class clz) { + try { + String jsonString = Files.asCharSource(ResourceUtils.getFile(JSON_FILE_CLASSPATH + fileName), StandardCharsets.UTF_8).read(); + return JSONArray.parseArray(jsonString, clz); + } catch (IOException e) { + throw new RuntimeException("loadJsonAsList got error", e); + } + } + + /** + * 设置对象field为mock对象. teardown时恢复成原spring代理的对象 + */ + protected void setMockField(Object targetObject, String fieldName, Object value) { + // 保存一份默认值 + Object oldField = ReflectionTestUtils.getField(targetObject, fieldName); + ReflectionTestUtils.setField(targetObject, fieldName, value); + + if (!ORIGIN_FIELD_TABLE.contains(targetObject, fieldName) && oldField != null) { + ORIGIN_FIELD_TABLE.put(targetObject, fieldName, oldField); + } + } +} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java new file mode 100644 index 00000000..3926bde8 --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java @@ -0,0 +1,26 @@ +package cn.axzo.tyr.server.permission; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode; +import cn.axzo.tyr.client.model.permission.PermissionPointTreeQueryReq; +import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; +import cn.axzo.tyr.server.repository.entity.SaasFeature; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Arrays; +import java.util.List; + +public class DemoTest extends BaseTest { + + @Autowired + private SaasFeatureDao saasFeatureDao; + + @Test + void ff() { + List saasFeatures = saasFeatureDao.listByIds(Arrays.asList(206L, 207L, 208L)); + System.out.println(JSON.toJSONString(saasFeatures)); + } +} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/MysqlDataLoader.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/MysqlDataLoader.java new file mode 100644 index 00000000..4c2bfb95 --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/MysqlDataLoader.java @@ -0,0 +1,132 @@ +package cn.axzo.tyr.server.permission; + +import com.google.common.base.Joiner; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Multimap; +import com.google.common.io.Files; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.util.ResourceUtils; + +import java.io.File; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * mysql 测试数据加载 + *

+ * 测试数据后缀.sql, 默认加载 DEFAULT section 的数据. 如果需要加载指定section的数据需要带上sectionName + * + *

+ * 文件中通过 "#-->"来定义section. loader可以加载指定section的数据. + *

+ *

+ * 文件路径: test/resources/mysql/${testClassName}.sql. + *

+ * 数据格式如下 + *

+ * #-->DEFAULT
+ * sql statement1;
+ * sql statement2;
+ *
+ * #-->section1
+ * sql statement3;
+ * sql statement4;
+ *
+ * #-->section2
+ * sql statement5;
+ * 
+ * + * @author chenjun + */ +@Slf4j +public class MysqlDataLoader { + + private final static String MYSQL_DATA_PATH = "classpath:mysql/"; + private final static String MYSQL_FILE_SUFFIX = ".sql"; + private final static String DEFAULT_SECTION = "DEFAULT"; + + @Autowired + private JdbcTemplate jdbcTemplate; + + private LoadingCache> sqlFileCaches = CacheBuilder.newBuilder() + .build(new CacheLoader>() { + @SuppressWarnings("NullableProblems") + public Multimap load(File file) throws Exception { + List lines = Files.asCharSource(file, Charset.forName("utf-8")).readLines(); + String sectionFlag = "#-->"; + Multimap sections = LinkedListMultimap.create(); + String currentSectionName = ""; + // 按照section分组. + for (String line : lines) { + line = line.trim(); + if (StringUtils.isAllBlank(line)) { + continue; + } + String sectionName = StringUtils.substringAfter(line, sectionFlag); + if (org.apache.logging.log4j.util.Strings.isNotBlank(sectionName)) { + currentSectionName = sectionName; + } else { + sections.put(currentSectionName, line); + } + } + return sections; + } + }); + + public void loadFromClassName(String className) { + String locationPattern = MYSQL_DATA_PATH + className + MYSQL_FILE_SUFFIX; + File file = getFile(locationPattern); + execStatements(file, ImmutableList.of(DEFAULT_SECTION)); + } + + + public void loadFromClassName(String className, List includeSections) { + String locationPattern = MYSQL_DATA_PATH + className + MYSQL_FILE_SUFFIX; + File file = getFile(locationPattern); + execStatements(file, includeSections); + } + + public void load(String filePath) { + String locationPattern = MYSQL_DATA_PATH + filePath; + File file = getFile(locationPattern); + execStatements(file, ImmutableList.of(DEFAULT_SECTION)); + } + + public void load(String filePath, List includeSections) { + String locationPattern = MYSQL_DATA_PATH + filePath; + File file = getFile(locationPattern); + execStatements(file, includeSections); + } + + private File getFile(String locationPattern) { + File file; + try { + file = ResourceUtils.getFile(locationPattern); + } catch (Exception ex) { + throw new RuntimeException("try get file error", ex); + } + return file; + } + + private void execStatements(File file, List includeSections) { + Multimap sections = sqlFileCaches.getUnchecked(file); + List statements = sections.entries().stream() + .filter(e -> includeSections.isEmpty() || includeSections.contains(e.getKey())) + .map(Map.Entry::getValue) + .collect(Collectors.toList()); + String sql = Joiner.on("\n").join(statements); + log.info("\n>>>>>>>>>>>>>>> Execute SQL {}\n {}", Joiner.on(",").join(includeSections), sql); + jdbcTemplate.update(sql); + log.info("<<<<<<<<<<<<< Execute DONE\n"); + } + +} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/TestConfig.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/TestConfig.java new file mode 100644 index 00000000..d279315e --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/TestConfig.java @@ -0,0 +1,35 @@ +package cn.axzo.tyr.server.permission; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.util.ResourceUtils; +import redis.embedded.RedisServer; +import redis.embedded.exceptions.OsDetectionException; +import redis.embedded.util.OS; +import redis.embedded.util.OSDetector; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +@Slf4j +@TestConfiguration +public class TestConfig { + + private RedisServer redisServer; + + @PostConstruct + public void postConstruct() throws IOException { + redisServer = new RedisServer(16379); + // redis server会在后台启动一个redis server的进程,默认IP=127.0.0.1 + redisServer.start(); + } + + @PreDestroy + public void preDestroy() { + // 测试结束后必须调用redisServer.stop(), 否则后台运行的redis server进程会一直存在并占用6379端口 + redisServer.stop(); + } +} \ No newline at end of file diff --git a/tyr-server/src/test/resources/application-unittest.yml b/tyr-server/src/test/resources/application-unittest.yml new file mode 100644 index 00000000..662b23ce --- /dev/null +++ b/tyr-server/src/test/resources/application-unittest.yml @@ -0,0 +1,34 @@ +spring: + datasource: + url: jdbc:h2:mem:demo;MODE=MySQL;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=0; + driver-class-name: org.h2.Driver + schema: classpath:/mysql/schema.sql + data: classpath:/mysql/data.sql + + redis: + host: 127.0.0.1 + port: 16379 + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +xxl: + job: + admin: + # 地址为刚刚配置的调度中心的访问地址 + addresses: http://xxl-job:8080/xxl-job-admin + executor: + # 自定义appName(执行器名称) + appname: tyr + # ip 可以写 (程序跑在的机器ip上),也可以不写 + ip: + port: 9999 + # 执行器日志文件存储路径 + # logpath: /data/applogs/xxl-job/jobhandler + # 设置日志过期时间 -1表示永不过期 + logretentiondays: -1 + accessToken: +flush: + role1052: + saasPreTempalteIdOfProject: 5 + saasPreTempalteIdOfOu: 43 \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/data.sql b/tyr-server/src/test/resources/mysql/data.sql new file mode 100644 index 00000000..9e13a3ef --- /dev/null +++ b/tyr-server/src/test/resources/mysql/data.sql @@ -0,0 +1 @@ +select 1; \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/schema.sql b/tyr-server/src/test/resources/mysql/schema.sql new file mode 100644 index 00000000..af9f78a3 --- /dev/null +++ b/tyr-server/src/test/resources/mysql/schema.sql @@ -0,0 +1,56 @@ +CREATE TABLE `demo` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `code` VARCHAR(64) NOT NULL COMMENT 'Code, 唯一', + `name` VARCHAR(128) NOT NULL COMMENT '名称', + -- `tags` JSON NULL COMMENT 'tags, jsonArray', + `tags` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'json tags', + `features` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'features功能列表', + `description` VARCHAR(512) NOT NULL DEFAULT '' COMMENT '描述', + `status` VARCHAR(16) NOT NULL DEFAULT 'ENABLED' COMMENT '状态: ENABLED', + -- `ext` JSON NULL COMMENT '额外信息, 使用json便于查询', + `ext` VARCHAR(2048) NOT NULL DEFAULT '{}' COMMENT '额外信息', + `creator` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '创建人', + `create_time` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `modifier` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '更新人', + `modify_time` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`), + UNIQUE KEY `uk_demo_code` (`code`) +) COMMENT ='demo'; + + +CREATE TABLE `saas_feature` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `feature_name` varchar(128) NOT NULL DEFAULT '' COMMENT '名称', + `feature_code` varchar(128) NOT NULL DEFAULT '' COMMENT 'code', + `icon` varchar(256) NOT NULL DEFAULT '' COMMENT '图标地址', + `parent_id` bigint NOT NULL DEFAULT '0' COMMENT '菜单上级id', + `parent_module_id` bigint NOT NULL DEFAULT '0' COMMENT '产品板块Id', + `link_url` varchar(256) NOT NULL DEFAULT '' COMMENT '链接地址', + `link_type` tinyint NOT NULL DEFAULT '1' COMMENT '1:CMS 2:小程序 4:原生', + `link_ext` text COMMENT '扩展字段', + `micro_app_item_id` varchar(50) NOT NULL DEFAULT '' COMMENT '小程序id 关联micro_app_item id', + `path` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '路径', + `description` varchar(128) NOT NULL DEFAULT '' COMMENT '描述', + `sort` int NOT NULL DEFAULT '5' COMMENT '排序', + `terminal` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单适用于平台 0:企业工作台 1:项目工作台 ', + `feature_type` tinyint NOT NULL DEFAULT '0' COMMENT '类型 0.模块 1.菜单 2页面 3功能', + `is_delete` bigint NOT NULL DEFAULT '0' COMMENT '是否删除', + `create_by` bigint NOT NULL DEFAULT '0' COMMENT '创建人id', + `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `update_by` bigint DEFAULT '0' COMMENT '修改人id', + `legacy_layout` varchar(255) NOT NULL DEFAULT '', + `operate_type` tinyint DEFAULT NULL COMMENT '0:查看 1:操作', + `old_id` bigint DEFAULT NULL COMMENT '为了迁移菜单用的,迁移后将废弃', + `fit_ou_type_bit` bigint NOT NULL DEFAULT '65535' COMMENT '适用单位类型-65535:所有 1:总包 2:建设单位 4:监理单位 8:劳务分包 16:专业分包', + `fit_ou_node_type_bit` bigint NOT NULL DEFAULT '65535' COMMENT '适用节点类型65535:所有 1:部门 2:班组 4:小组', + `app_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '网关专属字段,所属应用', + `feature_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '网关专属字段 ,功能URL,对应后端接口url', + `need_cert` tinyint(1) NOT NULL DEFAULT '1' COMMENT '网关专属字段,是否认证 0:无需要认证 1:需要认证', + `need_auth` tinyint(1) NOT NULL DEFAULT '1' COMMENT '网关专属字段,是否授权 0:无需要授权 1:需要授权', + `business_no` varchar(64) DEFAULT NULL COMMENT '业务id,用于环境同步作为唯一键', + `parent_business_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '0' COMMENT '父级业务id', + `delegated_type` tinyint DEFAULT NULL COMMENT '授权策略类型,允许为空 1-平台授权型 2-客户授权型 3-免授权型', + PRIMARY KEY (`id`), + KEY `IDX_CODE` (`feature_code`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=4618 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='saas-菜单页面表'; From c62bcac8d9b89acc6c031ebc9ab7e4c4e325cff0 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 16 Apr 2024 16:59:03 +0800 Subject: [PATCH 090/130] =?UTF-8?q?feat(2227-roleGroup):=E7=8F=AD=E7=BB=84?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=BB=84=E6=9F=A5=E8=AF=A2=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/ListPermissionFromRoleGroupReq.java | 3 +++ .../repository/dao/SaasRoleGroupDao.java | 2 ++ .../service/SaasFeatureResourceService.java | 3 --- .../server/service/SaasRoleGroupService.java | 7 ++++++ .../server/service/impl/RoleServiceImpl.java | 11 ++++++++-- .../impl/SaasFeatureResourceServiceImpl.java | 16 -------------- .../impl/SaasRoleGroupServiceImpl.java | 22 ++++++++++++++++++- .../service/impl/TyrSaasAuthServiceImpl.java | 8 +++++++ .../resources/mapper/TyrSaasAuthMapper.xml | 5 ++++- 9 files changed, 54 insertions(+), 23 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListPermissionFromRoleGroupReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListPermissionFromRoleGroupReq.java index 35f184fa..dd07edee 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListPermissionFromRoleGroupReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListPermissionFromRoleGroupReq.java @@ -41,6 +41,9 @@ public class ListPermissionFromRoleGroupReq { @Builder.Default private Boolean findFeatureInfo = false; + /** 角色组ID **/ + private List roleGroupIds; + @Data @Builder @AllArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java index ffcd7dd6..cfc9921a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java @@ -53,6 +53,8 @@ public class SaasRoleGroupDao extends ServiceImpl listByCategoryCode(List categoryCode) { return lambdaQuery().eq(BaseEntity::getIsDelete, 0L) .in(SaasRoleGroup::getCategoryCode, categoryCode).list(); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index 9f631a73..ef4cfa6c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -43,9 +43,6 @@ public interface SaasFeatureResourceService { /** 资源权限通用查询 **/ List permissionQuery(ResourcePermissionQueryDTO param); - /** 是否免授权 **/ - boolean isAuthFree(Long featureId); - /** 查询资源树 **/ List getTree(GetFeatureResourceTreeReq req); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java index 653745b7..1aebfe41 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java @@ -34,4 +34,11 @@ public interface SaasRoleGroupService extends IService { * @return */ List listByCategoryCode(List categoryCode); + + /** + * 根据code查询角色组 + * @param codes 角色组编码 + * @param type 1-仅查当前code 2-对应code角色组及子级角色组 3-仅对应code角色组的子级 + * **/ + List listByCodes(List codes, int type); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index f249d3b9..57027880 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -895,7 +895,8 @@ public class RoleServiceImpl extends ServiceImpl return new ArrayList<>(); } List result = new ArrayList<>(); - List saasRoleGroups = saasRoleGroupDao.listByCategoryCode(categoryCodes); + //category code转code 查询对应code及子级 + List saasRoleGroups = saasRoleGroupService.listByCodes(categoryCodes, 3); Set roleGroupId = saasRoleGroups.stream().map(BaseEntity::getId).collect(Collectors.toSet()); List roleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupId); @@ -917,7 +918,13 @@ public class RoleServiceImpl extends ServiceImpl Map roleMap = roleInfos.stream().collect(Collectors.toMap(BaseEntity::getId, Function.identity())); Map permissionGroupMap = permissionGroups.stream().collect(Collectors.toMap(BaseEntity::getId, Function.identity())); - Map> groupsByCategory = saasRoleGroups.stream().collect(Collectors.groupingBy(SaasRoleGroup::getCategoryCode)); + Map> allGroupMap = saasRoleGroups.stream().collect(Collectors.groupingBy(SaasRoleGroup::getParentId)); + List categoryRoleGroups = saasRoleGroupService.listByCodes(categoryCodes, 1); + Map> groupMap = categoryRoleGroups.stream().collect(Collectors.groupingBy(SaasRoleGroup::getCode)); + for (Map.Entry> entry : groupMap.entrySet()) { + + } + return groupsByCategory.entrySet().stream() .map(entry -> { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index c8fa83a3..b2438101 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -112,22 +112,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic return BeanMapper.copyList(resourceList, ResourcePermission.class); } - @Override - public boolean isAuthFree(Long featureId) { - - if (BooleanUtil.isTrue(RedisClient.KeyOps.hasKey(KEY_AUTH_FREE))) { - return RedisClient.SetOps.sIsMember(KEY_AUTH_FREE, String.valueOf(featureId)); - } - - //load from DB - Set featureIds = this.permissionQuery(ResourcePermissionQueryDTO.builder() - .authTypes(Collections.singletonList(FeatureResourceAuthType.ALL_ROLE.getCode())) - .build()) - .stream() - .map(ResourcePermission::getId).collect(Collectors.toSet()); - return false; - } - @Override public SaasFeatureResource getByCode(String featureCode) { return featureResourceDao.getByCode(featureCode); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index b636970b..5dacb92d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -11,6 +11,7 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupMapper; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -20,6 +21,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; @@ -175,7 +177,7 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl listByCategoryCode(List categoryCode) { - return BeanUtil.copyToList(saasRoleGroupDao.listByCategoryCode(categoryCode), SaasRoleGroupVO.class); + return BeanUtil.copyToList(this.listByCodes(categoryCode, 3), SaasRoleGroupVO.class); } private void assembleSort(SaasRoleGroup saasRoleGroup) { @@ -212,4 +214,22 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl listByCodes(List codes, int type) { + List groups = saasRoleGroupDao.listByCodes(codes); + if (CollectionUtil.isEmpty(groups) || type == 1) { + return Collections.emptyList(); + } + List parentIds = groups.stream().map(SaasRoleGroup::getId).collect(Collectors.toList()); + List children = saasRoleGroupDao.lambdaQuery().eq(SaasRoleGroup::getParentId, parentIds).list(); + if (type == 2) { + groups.addAll(children); + return groups; + } + if (type == 3) { + return children; + } + return Collections.emptyList(); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index 53edc01d..00610f6d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -34,6 +34,7 @@ import cn.axzo.tyr.server.service.PermissionCacheService; import cn.axzo.tyr.server.service.PermissionPointService; import cn.axzo.tyr.server.service.ProductFeatureRelationService; import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.TyrSaasAuthService; import cn.axzo.tyr.server.util.KeyUtil; import cn.axzo.tyr.server.utils.RpcExternalUtil; @@ -92,6 +93,7 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { private final PermissionPointService permissionPointService; private final PermissionCacheService permissionCacheService; + private final SaasRoleGroupService roleGroupService; /** @@ -787,6 +789,12 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { @Override public List listAuthByResourceAndRoleGroup(ListPermissionFromRoleGroupReq listPermissionFromRoleGroupReq) { + //确定角色group_id: code对应角色组及其下级 + List groups = roleGroupService.listByCodes(Collections.singletonList(listPermissionFromRoleGroupReq.getCategoryCode()), 2); + if (CollectionUtil.isEmpty(groups)) { + log.warn("no role group found for code :{}", listPermissionFromRoleGroupReq.getCategoryCode()); + return Collections.emptyList(); + } List permissionInfo = saasAuthMapper.listAuthByResourceAndRoleGroup(listPermissionFromRoleGroupReq); if (CollectionUtil.isEmpty(permissionInfo)) { return new ArrayList<>(); diff --git a/tyr-server/src/main/resources/mapper/TyrSaasAuthMapper.xml b/tyr-server/src/main/resources/mapper/TyrSaasAuthMapper.xml index 51fdfb63..c35f0179 100644 --- a/tyr-server/src/main/resources/mapper/TyrSaasAuthMapper.xml +++ b/tyr-server/src/main/resources/mapper/TyrSaasAuthMapper.xml @@ -128,7 +128,10 @@ INNER JOIN saas_role_user_relation t5 ON t3.id = t5.role_id WHERE - t1.category_code = #{req.categoryCode} + t1.id IN + + #{id} + AND T1.IS_DELETE = 0 AND T2.IS_DELETE = 0 AND T3.IS_DELETE=0 AND T4.IS_DELETE = 0 AND T5.IS_DELETE = 0 From 4922e6cd5f4ac4d9e285ca1b7ef7069f88d501fe Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 16 Apr 2024 17:02:44 +0800 Subject: [PATCH 091/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/{server/permission => base}/BaseTest.java | 2 +- .../permission => base}/MysqlDataLoader.java | 2 +- .../{server/permission => base}/TestConfig.java | 15 ++++++++------- .../cn/axzo/tyr/server/permission/DemoTest.java | 14 +++++++------- tyr-server/src/test/resources/mysql/schema.sql | 10 +++++----- 5 files changed, 22 insertions(+), 21 deletions(-) rename tyr-server/src/test/java/cn/axzo/tyr/{server/permission => base}/BaseTest.java (99%) rename tyr-server/src/test/java/cn/axzo/tyr/{server/permission => base}/MysqlDataLoader.java (99%) rename tyr-server/src/test/java/cn/axzo/tyr/{server/permission => base}/TestConfig.java (73%) diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/BaseTest.java b/tyr-server/src/test/java/cn/axzo/tyr/base/BaseTest.java similarity index 99% rename from tyr-server/src/test/java/cn/axzo/tyr/server/permission/BaseTest.java rename to tyr-server/src/test/java/cn/axzo/tyr/base/BaseTest.java index 7110fb2f..7e02fd28 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/BaseTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/base/BaseTest.java @@ -1,4 +1,4 @@ -package cn.axzo.tyr.server.permission; +package cn.axzo.tyr.base; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/MysqlDataLoader.java b/tyr-server/src/test/java/cn/axzo/tyr/base/MysqlDataLoader.java similarity index 99% rename from tyr-server/src/test/java/cn/axzo/tyr/server/permission/MysqlDataLoader.java rename to tyr-server/src/test/java/cn/axzo/tyr/base/MysqlDataLoader.java index 4c2bfb95..05b69c40 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/MysqlDataLoader.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/base/MysqlDataLoader.java @@ -1,4 +1,4 @@ -package cn.axzo.tyr.server.permission; +package cn.axzo.tyr.base; import com.google.common.base.Joiner; import com.google.common.cache.CacheBuilder; diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/TestConfig.java b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java similarity index 73% rename from tyr-server/src/test/java/cn/axzo/tyr/server/permission/TestConfig.java rename to tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java index d279315e..1433b2a6 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/TestConfig.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java @@ -1,18 +1,14 @@ -package cn.axzo.tyr.server.permission; +package cn.axzo.tyr.base; +import cn.axzo.tyr.base.MysqlDataLoader; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.util.ResourceUtils; +import org.springframework.context.annotation.Bean; import redis.embedded.RedisServer; -import redis.embedded.exceptions.OsDetectionException; -import redis.embedded.util.OS; -import redis.embedded.util.OSDetector; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; @Slf4j @TestConfiguration @@ -32,4 +28,9 @@ public class TestConfig { // 测试结束后必须调用redisServer.stop(), 否则后台运行的redis server进程会一直存在并占用6379端口 redisServer.stop(); } + + @Bean + public MysqlDataLoader mysqlDataLoader() { + return new MysqlDataLoader(); + } } \ No newline at end of file diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java index 3926bde8..1ebaa892 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/DemoTest.java @@ -1,12 +1,10 @@ package cn.axzo.tyr.server.permission; -import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode; -import cn.axzo.tyr.client.model.permission.PermissionPointTreeQueryReq; +import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.entity.SaasFeature; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.serializer.SerializerFeature; +import org.junit.Assert; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -19,8 +17,10 @@ public class DemoTest extends BaseTest { private SaasFeatureDao saasFeatureDao; @Test - void ff() { - List saasFeatures = saasFeatureDao.listByIds(Arrays.asList(206L, 207L, 208L)); - System.out.println(JSON.toJSONString(saasFeatures)); + void test() { + + saasFeatureDao.save(SaasFeature.builder().appName("dd").build()); + List saasFeatures = saasFeatureDao.list(); + Assert.assertEquals(saasFeatures.size(), 1); } } diff --git a/tyr-server/src/test/resources/mysql/schema.sql b/tyr-server/src/test/resources/mysql/schema.sql index af9f78a3..a3b42c2d 100644 --- a/tyr-server/src/test/resources/mysql/schema.sql +++ b/tyr-server/src/test/resources/mysql/schema.sql @@ -29,7 +29,7 @@ CREATE TABLE `saas_feature` ( `link_type` tinyint NOT NULL DEFAULT '1' COMMENT '1:CMS 2:小程序 4:原生', `link_ext` text COMMENT '扩展字段', `micro_app_item_id` varchar(50) NOT NULL DEFAULT '' COMMENT '小程序id 关联micro_app_item id', - `path` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '路径', + `path` varchar(1024) NOT NULL DEFAULT '' COMMENT '路径', `description` varchar(128) NOT NULL DEFAULT '' COMMENT '描述', `sort` int NOT NULL DEFAULT '5' COMMENT '排序', `terminal` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单适用于平台 0:企业工作台 1:项目工作台 ', @@ -44,13 +44,13 @@ CREATE TABLE `saas_feature` ( `old_id` bigint DEFAULT NULL COMMENT '为了迁移菜单用的,迁移后将废弃', `fit_ou_type_bit` bigint NOT NULL DEFAULT '65535' COMMENT '适用单位类型-65535:所有 1:总包 2:建设单位 4:监理单位 8:劳务分包 16:专业分包', `fit_ou_node_type_bit` bigint NOT NULL DEFAULT '65535' COMMENT '适用节点类型65535:所有 1:部门 2:班组 4:小组', - `app_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '网关专属字段,所属应用', - `feature_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '网关专属字段 ,功能URL,对应后端接口url', + `app_name` varchar(50) NOT NULL DEFAULT '' COMMENT '网关专属字段,所属应用', + `feature_url` varchar(500) NOT NULL DEFAULT '' COMMENT '网关专属字段 ,功能URL,对应后端接口url', `need_cert` tinyint(1) NOT NULL DEFAULT '1' COMMENT '网关专属字段,是否认证 0:无需要认证 1:需要认证', `need_auth` tinyint(1) NOT NULL DEFAULT '1' COMMENT '网关专属字段,是否授权 0:无需要授权 1:需要授权', `business_no` varchar(64) DEFAULT NULL COMMENT '业务id,用于环境同步作为唯一键', - `parent_business_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '0' COMMENT '父级业务id', + `parent_business_no` varchar(64) DEFAULT '0' COMMENT '父级业务id', `delegated_type` tinyint DEFAULT NULL COMMENT '授权策略类型,允许为空 1-平台授权型 2-客户授权型 3-免授权型', PRIMARY KEY (`id`), - KEY `IDX_CODE` (`feature_code`) USING BTREE + KEY `IDX_CODE` (`feature_code`) ) ENGINE=InnoDB AUTO_INCREMENT=4618 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='saas-菜单页面表'; From fc19267ef6be96246d7585eb0d325f4e5167b6a2 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Tue, 16 Apr 2024 18:14:57 +0800 Subject: [PATCH 092/130] =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index c8fa83a3..f1ebd83a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -437,7 +437,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .eq(BaseEntity::getIsDelete, 0) .one(); if (exist != null && !exist.getId().equals(featureResource.getId())) { - Throws.bizException(BaseCode.BAD_REQUEST, "菜单: " + featureResource.getFeatureName() + " 存在重复的code"); + Throws.bizException(BaseCode.BAD_REQUEST, "菜单: " + featureResource.getFeatureName() + "-存在重复的权限码code"); } } From c114695861eac8440b377b4c6cd3dc6188a1829a Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Tue, 16 Apr 2024 18:24:27 +0800 Subject: [PATCH 093/130] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index f1ebd83a..d1749f51 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -431,13 +431,13 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } void validFeatureCode(SaasFeatureResource featureResource) { - Assert.notNull(featureResource.getFeatureCode(), "featureCode 不能为空"); + Assert.notNull(featureResource.getFeatureCode(), "权限码code不能为空"); SaasFeatureResource exist = featureResourceDao.lambdaQuery() .eq(SaasFeatureResource::getFeatureCode, featureResource.getFeatureCode()) .eq(BaseEntity::getIsDelete, 0) .one(); if (exist != null && !exist.getId().equals(featureResource.getId())) { - Throws.bizException(BaseCode.BAD_REQUEST, "菜单: " + featureResource.getFeatureName() + "-存在重复的权限码code"); + Throws.bizException(BaseCode.BAD_REQUEST, featureResource.getFeatureName() + "-存在重复的权限码code"); } } From 2fef653f9ffe43abe76e991b5f11c275bf189984 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Tue, 16 Apr 2024 18:42:59 +0800 Subject: [PATCH 094/130] =?UTF-8?q?feat:(2227-roleGroup):=E7=8F=AD?= =?UTF-8?q?=E7=BB=84=E8=A7=92=E8=89=B2=E7=BB=84=E6=9D=83=E9=99=90=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/RoleServiceImpl.java | 24 ++++++++++++++----- .../impl/SaasRoleGroupServiceImpl.java | 1 + 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 57027880..0d23d744 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -96,6 +96,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -894,10 +895,11 @@ public class RoleServiceImpl extends ServiceImpl if (CollectionUtils.isEmpty(categoryCodes)) { return new ArrayList<>(); } - List result = new ArrayList<>(); - //category code转code 查询对应code及子级 - List saasRoleGroups = saasRoleGroupService.listByCodes(categoryCodes, 3); + //category code转code 查询对应code及子级 + List saasRoleGroups = saasRoleGroupService.listByCodes(categoryCodes, 2); + + //查询角色组相关角色及配置的权限 Set roleGroupId = saasRoleGroups.stream().map(BaseEntity::getId).collect(Collectors.toSet()); List roleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupId); @@ -918,11 +920,21 @@ public class RoleServiceImpl extends ServiceImpl Map roleMap = roleInfos.stream().collect(Collectors.toMap(BaseEntity::getId, Function.identity())); Map permissionGroupMap = permissionGroups.stream().collect(Collectors.toMap(BaseEntity::getId, Function.identity())); + //按查询的code分组所有group Map> allGroupMap = saasRoleGroups.stream().collect(Collectors.groupingBy(SaasRoleGroup::getParentId)); List categoryRoleGroups = saasRoleGroupService.listByCodes(categoryCodes, 1); - Map> groupMap = categoryRoleGroups.stream().collect(Collectors.groupingBy(SaasRoleGroup::getCode)); - for (Map.Entry> entry : groupMap.entrySet()) { - + Map categoryMap = categoryRoleGroups.stream().collect(Collectors.toMap(SaasRoleGroup::getCode, Function.identity())); + Map> groupsByCategory = new HashMap<>(); + for (Map.Entry entry : categoryMap.entrySet()) { + SaasRoleGroup parent = entry.getValue(); + List groups = groupsByCategory.getOrDefault(entry.getKey(), new ArrayList<>()); + //父级和子级 + groups.add(parent); + List children = allGroupMap.get(parent.getId()); + if (CollectionUtil.isEmpty(children)) { + groups.addAll(children); + } + groupsByCategory.put(entry.getKey(), groups); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 5dacb92d..db9bd274 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -221,6 +221,7 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl parentIds = groups.stream().map(SaasRoleGroup::getId).collect(Collectors.toList()); List children = saasRoleGroupDao.lambdaQuery().eq(SaasRoleGroup::getParentId, parentIds).list(); if (type == 2) { From eafda003f1b94923d106c272d519621484ce1f51 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 16 Apr 2024 19:05:14 +0800 Subject: [PATCH 095/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2tree=E7=9A=84=E6=9F=A5=E8=AF=A2=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/tyr/server/service/RoleService.java | 4 ++-- tyr-server/src/main/resources/logback-spring.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 540f39e7..fc8890e0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -144,10 +144,10 @@ public interface RoleService extends IService { @CriteriaField(field = "roleCode", operator = Operator.EQ) private String roleCode; - @CriteriaField(field = "workspaceId", operator = Operator.EQ) + @CriteriaField(field = "workspaceId", operator = Operator.IN) private List workspaceIds; - @CriteriaField(field = "ownerOuId", operator = Operator.EQ) + @CriteriaField(field = "ownerOuId", operator = Operator.IN) private List ouIds; @CriteriaField(ignore = true) diff --git a/tyr-server/src/main/resources/logback-spring.xml b/tyr-server/src/main/resources/logback-spring.xml index 977ff74a..922ff245 100644 --- a/tyr-server/src/main/resources/logback-spring.xml +++ b/tyr-server/src/main/resources/logback-spring.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file From 600482a7e814563d0b5a92cbb24ba0bb436dbc72 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 17 Apr 2024 10:03:30 +0800 Subject: [PATCH 096/130] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=90=8D=E5=AD=97?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasFeatureResourceServiceImpl.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index d1749f51..f7cd99ab 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -198,6 +198,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic baseResource.setUpdateBy(req.getOperatorId()); // 新增时候 validFeatureCode(baseResource); + validFeatureName(baseResource); if (req.getId() == null) { baseResource.setCreateBy(req.getOperatorId()); baseResource.setDisplayOrder(0); @@ -256,6 +257,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic saasFeatureResource.setUpdateBy(operatorId); saasFeatureResource.setDisplayOrder(displayOrder); validFeatureCode(saasFeatureResource); + validFeatureName(saasFeatureResource); if (saasFeatureResource.getId() != null) { SaasFeatureResource dbResource = featureResourceDao.getById(saasFeatureResource.getId()); saasFeatureResource.setPath(dbResource.getPath()); @@ -441,6 +443,19 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } } + void validFeatureName(SaasFeatureResource featureResource) { + Assert.notNull(featureResource.getFeatureName(), "名称不能为空"); + SaasFeatureResource exist = featureResourceDao.lambdaQuery() + .eq(SaasFeatureResource::getParentId, featureResource.getParentId() == null ? 0 : featureResource.getParentId()) + .eq(SaasFeatureResource::getTerminal, featureResource.getTerminal()) + .eq(SaasFeatureResource::getFeatureName, featureResource.getFeatureName()) + .eq(BaseEntity::getIsDelete, 0) + .one(); + if (exist != null && !exist.getId().equals(featureResource.getId())) { + Throws.bizException(BaseCode.BAD_REQUEST, featureResource.getFeatureName() + "-存在重复的名称"); + } + } + @Override public Set listAuthFree() { return featureResourceDao.lambdaQuery() From 27eed8cf4dceba4e69be9905d7219e6cef5d0b52 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 17 Apr 2024 10:30:54 +0800 Subject: [PATCH 097/130] =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E5=8F=AA?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AD=90=E7=BB=84=E4=BB=B6=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E6=9F=A5=E5=AD=90=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/permission/FeatureResourceController.java | 3 ++- .../axzo/tyr/server/service/SaasFeatureResourceService.java | 2 +- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 5b3f736e..763f2640 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -78,7 +78,8 @@ public class FeatureResourceController implements FeatureResourceApi { @Override public ApiResult detail(Long featureId) { - return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(featureId)); + // 详情只查子集组件 + return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(featureId, 4)); } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index ef4cfa6c..2a84685d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -29,7 +29,7 @@ public interface SaasFeatureResourceService { SaasFeatureResource featureResourceById(Long featureId); - FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId); + FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId, Integer featureType); /**删除指定菜单**/ void deleteMenuFeature(Long featureId, Long operatorId); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 4f7da7b6..cf42dc6d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -31,6 +31,7 @@ import cn.azxo.framework.common.utils.StringUtils; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjectUtil; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -159,9 +160,10 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } @Override - public FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId) { + public FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId, Integer featureType) { List descendants = featureResourceDao.lambdaQuery() .eq(BaseEntity::getIsDelete,0) + .eq(ObjectUtil.isNotNull(featureType), SaasFeatureResource::getFeatureType, featureType) .apply("FIND_IN_SET('" + featureId + "', path)") .list(); if (CollectionUtil.isEmpty(descendants)) { From bf9874ebc732c69df5a0d07e14462465e2907bc7 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 17 Apr 2024 10:40:47 +0800 Subject: [PATCH 098/130] =?UTF-8?q?=E5=88=A0=E5=8E=BB=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/client/feign/FeatureResourceApi.java | 5 ----- .../controller/permission/FeatureResourceController.java | 6 ------ 2 files changed, 11 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index 72f9f84d..ef3833f4 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -51,11 +51,6 @@ public interface FeatureResourceApi { @PostMapping("/api/featureResource/reorder") ApiResult reorderFeatureTree(@RequestParam Long featureId, @RequestParam Integer offset); - - /** 获取菜单/页面/组件 及子孙节点 **/ - @PostMapping("/api/featureResource/list") - ApiResult> listFeatureDescendant(@RequestParam Long featureId); - /** 菜单详情 **/ @PostMapping("/api/featureResource/detail") ApiResult detail(@RequestParam Long featureId); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 763f2640..f7dba065 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -70,12 +70,6 @@ public class FeatureResourceController implements FeatureResourceApi { return ApiResult.ok(); } - @Override - public ApiResult> listFeatureDescendant(Long featureId) { - - return null; - } - @Override public ApiResult detail(Long featureId) { // 详情只查子集组件 From c649fd741bf56fa9577f529b9d7beb9b352222e4 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 17 Apr 2024 10:42:05 +0800 Subject: [PATCH 099/130] =?UTF-8?q?=E7=BB=84=E4=BB=B6=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/permission/FeatureResourceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index f7dba065..4818a562 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -73,7 +73,7 @@ public class FeatureResourceController implements FeatureResourceApi { @Override public ApiResult detail(Long featureId) { // 详情只查子集组件 - return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(featureId, 4)); + return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(featureId, null)); } @Override From a280ecbc2f606411795ec1503e92d87bd6ee0cce Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 17 Apr 2024 10:48:56 +0800 Subject: [PATCH 100/130] =?UTF-8?q?fix:(2227-roleGroup):=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index 00610f6d..c36cc491 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -795,6 +795,8 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { log.warn("no role group found for code :{}", listPermissionFromRoleGroupReq.getCategoryCode()); return Collections.emptyList(); } + //转为基于group id查询 + listPermissionFromRoleGroupReq.setRoleGroupIds(groups.stream().map(SaasRoleGroup::getId).collect(Collectors.toList())); List permissionInfo = saasAuthMapper.listAuthByResourceAndRoleGroup(listPermissionFromRoleGroupReq); if (CollectionUtil.isEmpty(permissionInfo)) { return new ArrayList<>(); From 0a5c2653e9918060cb0aa6ebcc2a445f2734e73f Mon Sep 17 00:00:00 2001 From: lilong Date: Wed, 17 Apr 2024 11:35:24 +0800 Subject: [PATCH 101/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=9B=E5=BB=BA=E6=97=B6workspaceType?= =?UTF-8?q?=E7=9A=84=E8=A7=A3=E6=9E=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/RoleServiceImpl.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 0d23d744..443d4f61 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -157,8 +157,6 @@ public class RoleServiceImpl extends ServiceImpl @Value("${groupLeader.code:projectTeamGPLeader}") private String groupLeaderCode; - private static final Set COMMON_ROLE_TYPES = Sets.newHashSet(RoleTypeEnum.COMMON.getValue(), RoleTypeEnum.AUTO_OWN.getValue()); - @Override public List queryByIdentityIdType(Long identityId, Integer identityType, Long workspaceId, Long ouId, Boolean includePermissionGroup) { // 查询人关联的角色id @@ -476,16 +474,22 @@ public class RoleServiceImpl extends ServiceImpl } /** - * roleType = 自定义,common,workspaceType = saveOrUpdateRole.workspaceType - * 其他就从角色组取,没有就saveOrUpdateRole.workspaceType + * * @param saveOrUpdateRole * @return */ private Integer resolveWorkspaceType(SaveOrUpdateRoleVO saveOrUpdateRole) { - if (COMMON_ROLE_TYPES.contains(saveOrUpdateRole.getRoleType()) || CollectionUtils.isEmpty(saveOrUpdateRole.getGroupTree())) { - return saveOrUpdateRole.getWorkspaceType(); + if (CollectionUtils.isNotEmpty(saveOrUpdateRole.getGroupTree())) { + String workspaceTypeCode = saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode(); + if (StringUtils.isBlank(workspaceTypeCode)) { + throw new ServiceException("角色分组workspaceType不能为空"); + } + return Integer.parseInt(workspaceTypeCode); } - return Integer.parseInt(saveOrUpdateRole.getGroupTree().get(0).getWorkspaceTypeCode()); + if (saveOrUpdateRole.getWorkspaceType() == null) { + throw new ServiceException("角色workspaceType不能为空"); + } + return saveOrUpdateRole.getWorkspaceType(); } private SaasRole validAndBuildRole(SaveOrUpdateRoleVO saveOrUpdateRole, Date now) { From 5fa71feafe4740a039bceaf7fb5ae4581400f473 Mon Sep 17 00:00:00 2001 From: lilong Date: Wed, 17 Apr 2024 13:37:29 +0800 Subject: [PATCH 102/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=9B=E5=BB=BA=E6=97=B6pids=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 443d4f61..f0398d11 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -358,7 +358,7 @@ public class RoleServiceImpl extends ServiceImpl || CollectionUtils.isNotEmpty(saveOrUpdateRole.getPermissionIds())) { List pids = Optional.ofNullable(saveOrUpdateRole.getSelectedPPIds()) - .orElse(Lists.newArrayList(saveOrUpdateRole.getPermissionIds())); + .orElseGet(() -> Lists.newArrayList(saveOrUpdateRole.getPermissionIds())); // 保存权限集和权限点映射关系 List pgpRelations = pids.stream().map(ppId -> { From 4cf6494758a9ab3f4194910eb6711940d84f0279 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 17 Apr 2024 13:53:48 +0800 Subject: [PATCH 103/130] =?UTF-8?q?feat:(2227-superAdmin):=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E8=B6=85=E7=AE=A1=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PermissionQueryServiceImpl.java | 1 + .../server/service/impl/RoleUserService.java | 58 ++++++++++++++----- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index dd26d6da..cefcf931 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -89,6 +89,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .collect(Collectors.toList()); //反查资源信息 List resourceList = featureResourceService.listNavByIds(featureIds); + //TODO: 默认只支持两级 List menuIds = resourceList.stream() .filter(r -> FeatureResourceType.PAGE.apply(r.getFeatureType())) .map(SaasFeatureResource::getParentId) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index 85eb749c..e9fb9024 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -26,6 +26,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.nacos.common.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -67,6 +68,9 @@ public class RoleUserService implements SaasRoleUserService { @Value("${platWorkerLeaderRoleId:100001}") private Long projWorkerLeaderRoleId; + @Value("${axzo.role.superAdmin: {1:\"entSuperAdmin\", 2: \"projSuperAdmin\", 6:\"omsSuperAdmin\"}}") + private Map superAdminCodes; + /** * 获取分包负责人等特殊角色 * @return @@ -173,31 +177,29 @@ public class RoleUserService implements SaasRoleUserService { @Transactional(rollbackFor = Exception.class) public void createSuperAdminRole(CreateSuperAdminRoleParam param) { //获取超管角色 - SaasRole saasRole = saasRoleDao - .findRoleByTypeAndWorkspaceIdAndOuId(RoleTypeEnum.SUPER_ADMIN.getValue(), - param.getWorkspaceId(), param.getOuId()); - if (saasRole == null) { - saasRole = new SaasRole(); - saasRole.setDescription(RoleTypeEnum.SUPER_ADMIN.getDesc()); - saasRole.setName(RoleTypeEnum.SUPER_ADMIN.getDesc()); - saasRole.setWorkspaceId(param.getWorkspaceId()); - saasRole.setWorkspaceType(param.getWorkspaceType()); - saasRole.setOwnerOuId(param.getOuId()); - saasRole.setRoleType(RoleTypeEnum.SUPER_ADMIN.getValue()); - saasRole.setIsDelete(0L); + SaasRole superAdmin = findSuperAdmin(param.getWorkspaceId(), param.getOuId(), param.getWorkspaceType()); + if (superAdmin == null) { + superAdmin = new SaasRole(); + superAdmin.setDescription(RoleTypeEnum.SUPER_ADMIN.getDesc()); + superAdmin.setName(RoleTypeEnum.SUPER_ADMIN.getDesc()); + superAdmin.setWorkspaceId(param.getWorkspaceId()); + superAdmin.setWorkspaceType(param.getWorkspaceType()); + superAdmin.setOwnerOuId(param.getOuId()); + superAdmin.setRoleType(RoleTypeEnum.SUPER_ADMIN.getValue()); + superAdmin.setIsDelete(0L); DictWorkSpaceTypeEnum dictWorkSpaceTypeEnum = DictWorkSpaceTypeEnum.getByValueWorkspaceType(param.getWorkspaceType()); - saasRole.setProductUnitType(dictWorkSpaceTypeEnum == null ? 0 : dictWorkSpaceTypeEnum.getSuperAdminProductType()); + superAdmin.setProductUnitType(dictWorkSpaceTypeEnum == null ? 0 : dictWorkSpaceTypeEnum.getSuperAdminProductType()); checkRoleName(RoleTypeEnum.SUPER_ADMIN.getDesc(), param.getWorkspaceId(), param.getOuId()); - saasRoleDao.save(saasRole); + saasRoleDao.save(superAdmin); } //删除当前超管角色 - roleUserRelationDao.deleteByRoleId(Lists.newArrayList(saasRole.getId())); + removeOldSuperAdmin(superAdmin.getId(), param.getWorkspaceId(), param.getOuId()); //新增关联关系 SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); saasRoleUserRelation.setIdentityId(param.getIdentityId()); - saasRoleUserRelation.setRoleId(saasRole.getId()); + saasRoleUserRelation.setRoleId(superAdmin.getId()); saasRoleUserRelation.setIdentityType(param.getIdentityType().getCode()); saasRoleUserRelation.setNaturalPersonId(param.getNaturalPersonId()); saasRoleUserRelation.setOuId(param.getOuId()); @@ -205,6 +207,30 @@ public class RoleUserService implements SaasRoleUserService { roleUserRelationDao.save(saasRoleUserRelation); } + private void removeOldSuperAdmin(Long id, Long workspaceId, Long ouId) { + saasRoleDao.remove(new LambdaQueryWrapper() + .eq(SaasRole::getId, id) + .eq(SaasRole::getWorkspaceId, workspaceId) + .eq(SaasRole::getOwnerOuId, ouId)); + } + + private SaasRole findSuperAdmin(Long workspaceId, Long ouId, Integer workspaceType) { + //优先取租户超管 没有再取标准角色超管 + //租户超管 + SaasRole superAdmin = saasRoleDao + .findRoleByTypeAndWorkspaceIdAndOuId(RoleTypeEnum.SUPER_ADMIN.getValue(), + workspaceId, ouId); + if (superAdmin != null) { + return superAdmin; + } + //标准角超管 + String superAdminCode = superAdminCodes.get(workspaceType); + if (StrUtil.isBlank(superAdminCode)) { + throw new ServiceException("租户类型[" + workspaceType + "]未配置超管编码"); + } + return saasRoleDao.lambdaQuery().eq(SaasRole::getRoleCode, superAdminCode).one(); + } + private void checkRoleName(String name, Long workspaceId, Long ouId) { List saasRoles = saasRoleDao.listCommonRoleByNameAndWorkspaceIdAndOuId(name, workspaceId, ouId); From 6979d66a26c80a64e3fa166a88980b00e322f749 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 17 Apr 2024 14:29:38 +0800 Subject: [PATCH 104/130] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=97=B6=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=88=A0=E9=99=A4=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index cf42dc6d..760eb6ab 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -212,9 +212,9 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic // 递归新增修改删除子节点 saveOrUpdateFeatureComponent(childComponent, baseResource.getPath(), req.getOperatorId(), i); } - } else { - deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); } + deleteComponentRecursionById(baseResource.getId(), req.getComponentSaveReqList(), req.getOperatorId()); + return baseResource.getId(); } From 3d35e4695d572bf5a29a56637060e9d4285f7545 Mon Sep 17 00:00:00 2001 From: lilong Date: Wed, 17 Apr 2024 15:07:36 +0800 Subject: [PATCH 105/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2tree=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/model/req/TreeRoleReq.java | 10 ++++++++++ .../controller/role/SaasRoleController.java | 2 ++ .../cn/axzo/tyr/server/service/RoleService.java | 6 ++++++ .../tyr/server/service/impl/RoleServiceImpl.java | 16 +++++++++++----- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java index 9821433c..13d76654 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java @@ -41,4 +41,14 @@ public class TreeRoleReq { * NT_CMP_APP_GENERAL -> 1,2 */ private String terminal; + + /** + * '是否启用' + */ + private Boolean enabled; + + /** + * 角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 + */ + private List roleTypes; } \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 23de4e19..35a6b90d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -348,6 +348,8 @@ public class SaasRoleController implements TyrSaasRoleApi { .workspaceType(req.getWorkspaceType()) .workspaceIds(req.getWorkspaceIds()) .ouIds(req.getOuIds()) + .enabled(req.getEnabled()) + .roleTypes(req.getRoleTypes()) .build()) .stream() .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index fc8890e0..0725c84b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -150,6 +150,12 @@ public interface RoleService extends IService { @CriteriaField(field = "ownerOuId", operator = Operator.IN) private List ouIds; + @CriteriaField(field = "enabled", operator = Operator.EQ) + private Boolean enabled; + + @CriteriaField(field = "roleType", operator = Operator.IN) + private List roleTypes; + @CriteriaField(ignore = true) private Boolean needPermission; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index f0398d11..a056d7f1 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -517,6 +517,7 @@ public class RoleServiceImpl extends ServiceImpl saasRole.setWorkspaceType(workspaceType); saasRole.setUpdateBy(saveOrUpdateRole.getOperatorId()); saasRole.setUpdateAt(now); + saasRole.setProductUnitType(setProductUnitType(saveOrUpdateRole)); String message = "角色校验异常"; List relations = Lists.newArrayList(); //系统预设角色分组 同分组内角色名称不能重复 @@ -601,11 +602,16 @@ public class RoleServiceImpl extends ServiceImpl /** * 产品单位类型 */ - private Integer setProductUnitType(SaveOrUpdateRoleVO.GroupInfoVO groupInfoVO) { - SaasRoleGroup saasRoleGroup = saasRoleGroupDao.lambdaQuery() - .in(SaasRoleGroup::getId, groupInfoVO.getId()) - .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).one(); - return Integer.parseInt(saasRoleGroup.getOuTypeCode()); + private Integer setProductUnitType(SaveOrUpdateRoleVO saveOrUpdateRoleVO) { + + if (CollectionUtils.isNotEmpty(saveOrUpdateRoleVO.getGroupTree())) { + SaasRoleGroup saasRoleGroup = saasRoleGroupDao.lambdaQuery() + .in(SaasRoleGroup::getId, saveOrUpdateRoleVO.getGroupTree().get(0).getId()) + .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).one(); + return Integer.parseInt(saasRoleGroup.getOuTypeCode()); + } + + return saveOrUpdateRoleVO.getProductUnitType(); } private void validFeature(List featureIds) { From 93f018565c80c9eadf87b147c3ee27efb97ff449 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 17 Apr 2024 15:35:26 +0800 Subject: [PATCH 106/130] =?UTF-8?q?fix:(2227-superAdmin):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=B6=85=E7=AE=A1=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/server/service/impl/RoleUserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index e9fb9024..f0e9d3d9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -68,7 +68,7 @@ public class RoleUserService implements SaasRoleUserService { @Value("${platWorkerLeaderRoleId:100001}") private Long projWorkerLeaderRoleId; - @Value("${axzo.role.superAdmin: {1:\"entSuperAdmin\", 2: \"projSuperAdmin\", 6:\"omsSuperAdmin\"}}") + @Value("${axzo.role.superAdmin") private Map superAdminCodes; /** From 4e48411a59d72d33f8614b3b8464b9481de51af2 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 17 Apr 2024 15:38:58 +0800 Subject: [PATCH 107/130] =?UTF-8?q?fix:(2227-superAdmin):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=B6=85=E7=AE=A1=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/server/service/impl/RoleUserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index f0e9d3d9..cdc7b933 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -68,7 +68,7 @@ public class RoleUserService implements SaasRoleUserService { @Value("${platWorkerLeaderRoleId:100001}") private Long projWorkerLeaderRoleId; - @Value("${axzo.role.superAdmin") + @Value("#{${axzo.role.superAdmin}}") private Map superAdminCodes; /** From 0f98b5cf446c6d4f0839265528bfdfd6806dd98f Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 17 Apr 2024 16:32:35 +0800 Subject: [PATCH 108/130] =?UTF-8?q?fix:(2227-superAdmin):=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=B6=85=E7=AE=A1=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/server/service/impl/RoleUserService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index cdc7b933..f461f446 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -208,10 +208,10 @@ public class RoleUserService implements SaasRoleUserService { } private void removeOldSuperAdmin(Long id, Long workspaceId, Long ouId) { - saasRoleDao.remove(new LambdaQueryWrapper() - .eq(SaasRole::getId, id) - .eq(SaasRole::getWorkspaceId, workspaceId) - .eq(SaasRole::getOwnerOuId, ouId)); + roleUserRelationDao.remove(new LambdaQueryWrapper() + .eq(SaasRoleUserRelation::getRoleId, id) + .eq(SaasRoleUserRelation::getWorkspaceId, workspaceId) + .eq(SaasRoleUserRelation::getOuId, ouId)); } private SaasRole findSuperAdmin(Long workspaceId, Long ouId, Integer workspaceType) { From a2e3d4506041456d3942968f4bf742b585b6e8b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Wed, 17 Apr 2024 17:16:54 +0800 Subject: [PATCH 109/130] =?UTF-8?q?feat(2227-userRole):=20=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=A0=91=E7=BC=93=E5=AD=98key=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceCacheService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java index 32fe44a5..7eaa7f63 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java @@ -23,7 +23,7 @@ public class SaasFeatureResourceCacheService { private final SaasFeatureResourceDao featureResourceDao; - @Cacheable(value = CACHE_FEATURE_RESOURCE_TREE, key = "#req.keyword + '_' + #req.terminals+ '_' + #req.featureTypes", unless = "#result.isEmpty()") + @Cacheable(value = CACHE_FEATURE_RESOURCE_TREE, key = "#req.keyword + '_' + #req.terminals+ '_' + #req.featureTypes+ '_' + #req.status", unless = "#result.isEmpty()") public List getByResourceTreeParam (GetFeatureResourceTreeReq req) { log.info("get feature resource tree has not user cache!"); return featureResourceDao.getByResourceTreeParam(req); From 6b67cce2452ddd9c1e7abaac3e87678c96c091e8 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 17 Apr 2024 17:21:09 +0800 Subject: [PATCH 110/130] =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 760eb6ab..b856b6b2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -288,7 +288,8 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .eq(BaseEntity::getIsDelete,0) .apply("FIND_IN_SET('" + deleteChild.getId() + "', path)") .set(SaasFeatureResource::getUpdateBy, operatorId) - .set(BaseEntity::getIsDelete,1); + .set(BaseEntity::getIsDelete,1) + .update(); } } } From 6976a96bd79ca3c3c2e902a95dfdda3284ff65f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Wed, 17 Apr 2024 17:23:12 +0800 Subject: [PATCH 111/130] =?UTF-8?q?feat(2227-userRole):=20=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=A0=91=E7=BC=93=E5=AD=98key=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceCacheService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java index 7eaa7f63..00347ee0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java @@ -23,7 +23,7 @@ public class SaasFeatureResourceCacheService { private final SaasFeatureResourceDao featureResourceDao; - @Cacheable(value = CACHE_FEATURE_RESOURCE_TREE, key = "#req.keyword + '_' + #req.terminals+ '_' + #req.featureTypes+ '_' + #req.status", unless = "#result.isEmpty()") + @Cacheable(value = CACHE_FEATURE_RESOURCE_TREE, key = "#req.terminals+ '_' + #req.featureTypes+ '_' + #req.status", unless = "#result.isEmpty()") public List getByResourceTreeParam (GetFeatureResourceTreeReq req) { log.info("get feature resource tree has not user cache!"); return featureResourceDao.getByResourceTreeParam(req); From d764eadbc6bb716b437c8362636c2a222248ac18 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Wed, 17 Apr 2024 17:30:31 +0800 Subject: [PATCH 112/130] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index b856b6b2..898554a0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -223,7 +223,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic if (featureId != null && authType != null) { featureResourceDao.lambdaUpdate() .eq(SaasFeatureResource::getId, featureId) - .eq(BaseEntity::getIsDelete,1) + .eq(BaseEntity::getIsDelete,0) .set(SaasFeatureResource::getAuthType, authType) .update(); } From e528e179ee9c4e565dd9ea9a30e3cdb5ad2d02d6 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 17 Apr 2024 18:13:08 +0800 Subject: [PATCH 113/130] =?UTF-8?q?feat:(2227-navTree):=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E5=A4=9A=E7=BA=A7=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/FeatureResourceType.java | 6 +++++ .../service/SaasFeatureResourceService.java | 4 +++- .../impl/PermissionQueryServiceImpl.java | 18 +++++++++------ .../impl/SaasFeatureResourceServiceImpl.java | 22 +++++++++++++++++-- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java index d38a8461..bdecbbf9 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/FeatureResourceType.java @@ -52,4 +52,10 @@ public enum FeatureResourceType { FeatureResourceType.PAGE.getCode(), FeatureResourceType.APP_ENTRY.getCode()); } + + public static List pageTypes() { + return Arrays.asList( + FeatureResourceType.PAGE.getCode(), + FeatureResourceType.APP_ENTRY.getCode()); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index 2a84685d..ec83e928 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -38,7 +38,7 @@ public interface SaasFeatureResourceService { void reorderMenuFeature(Long featureId, Integer offset); /** 根据ID查询导航菜单页面信息 仅可显示 - 限制查询字段 **/ - List listNavByIds(List featureIds); + List listNavByIds(List featureIds, List featureTypes); /** 资源权限通用查询 **/ List permissionQuery(ResourcePermissionQueryDTO param); @@ -49,4 +49,6 @@ public interface SaasFeatureResourceService { SaasFeatureResource getByCode(String featureCode); Set listAuthFree(); + + List listNavMenu(String terminal); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index cefcf931..fb2f7a37 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -39,6 +39,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -87,14 +88,15 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .map(PermissionDO::getFeatureIds) .flatMap(Set::stream) .collect(Collectors.toList()); - //反查资源信息 - List resourceList = featureResourceService.listNavByIds(featureIds); - //TODO: 默认只支持两级 + //反查资源信息-仅页面 + List resourceList = featureResourceService.listNavByIds(featureIds, FeatureResourceType.pageTypes()); + //查所有上级菜单 List menuIds = resourceList.stream() - .filter(r -> FeatureResourceType.PAGE.apply(r.getFeatureType())) - .map(SaasFeatureResource::getParentId) + .map(SaasFeatureResource::splitPath) + .flatMap(List::stream) .collect(Collectors.toList()); - List menus = featureResourceService.listNavByIds(menuIds); + List menus = featureResourceService.listNavByIds(menuIds, Collections.singletonList(FeatureResourceType.MENU.getCode())); + resourceList.addAll(menus); //去重-排序 Set distinctSet = new HashSet<>(); @@ -103,7 +105,9 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .sorted(Comparator.comparingInt(SaasFeatureResource::getDisplayOrder)) .collect(Collectors.toList()); //组装导航树 - return TreeUtil.buildTree(BeanMapper.copyList(finalResources, NavTreeResp.class)); + List navTreeList = TreeUtil.buildTree(BeanMapper.copyList(finalResources, NavTreeResp.class)); + //过滤顶级孤儿节点 + return navTreeList.stream().filter(t -> !NumberUtil.isPositiveNumber(t.getParentId())).collect(Collectors.toList()); } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 760eb6ab..20c98870 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -78,7 +78,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic private final SaasPgroupPermissionRelationService pgroupPermissionRelationService; @Override - public List listNavByIds(List featureIds) { + public List listNavByIds(List featureIds, List featureTypes) { //按需扩展要查询的字段 return featureResourceDao.lambdaQuery() .select(SaasFeatureResource::getId, @@ -91,7 +91,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource::getDisplayOrder) .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) .in(SaasFeatureResource::getId, featureIds) - .in(SaasFeatureResource::getFeatureType, FeatureResourceType.navTypes()) + .in(SaasFeatureResource::getFeatureType, featureTypes) .list(); } @@ -449,4 +449,22 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic .eq(SaasFeatureResource::getAuthType, FeatureResourceAuthType.ALL_ROLE.getCode()) .list().stream().map(SaasFeatureResource::getId).collect(Collectors.toSet()); } + + @Override + public List listNavMenu(String terminal) { + //按需扩展要查询的字段 + return featureResourceDao.lambdaQuery() + .select(SaasFeatureResource::getId, + SaasFeatureResource::getParentId, + SaasFeatureResource::getFeatureCode, + SaasFeatureResource::getFeatureName, + SaasFeatureResource::getFeatureType, + SaasFeatureResource::getLinkUrl, + SaasFeatureResource::getIcon) + .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) + .eq(SaasFeatureResource::getFeatureType, FeatureResourceType.MENU.getCode()) + .eq(SaasFeatureResource::getTerminal, terminal) + .orderByAsc(SaasFeatureResource::getDisplayOrder) + .list(); + } } From d649e199671990a826d3fc3c09c5ac81f3b12fd8 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Wed, 17 Apr 2024 18:22:46 +0800 Subject: [PATCH 114/130] =?UTF-8?q?feat:(2227-navTree):=E8=A1=A5=E5=85=85p?= =?UTF-8?q?ath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/SaasFeatureResourceServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 45ab120c..b955e9af 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -88,6 +88,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic SaasFeatureResource::getFeatureType, SaasFeatureResource::getLinkUrl, SaasFeatureResource::getIcon, + SaasFeatureResource::getPath, SaasFeatureResource::getDisplayOrder) .eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode()) .in(SaasFeatureResource::getId, featureIds) From af5af22c3e4051583dc1812323dd12440be3e8e6 Mon Sep 17 00:00:00 2001 From: lilong Date: Wed, 17 Apr 2024 19:46:51 +0800 Subject: [PATCH 115/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=9D=A1=E4=BB=B6=EF=BC=8C=E8=A7=92=E8=89=B2=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E6=97=B6=E5=88=A4=E6=96=AD=E8=A7=92=E8=89=B2=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E5=94=AF=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/model/req/QuerySaasRoleReq.java | 14 ++++++++++++++ .../cn/axzo/tyr/server/service/RoleService.java | 3 +++ .../tyr/server/service/impl/RoleServiceImpl.java | 7 ++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java index a0eb00dd..0ad25f9c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java @@ -68,6 +68,20 @@ public class QuerySaasRoleReq { */ private Boolean includeSpecialRole; + /** + * '是否显示' + */ + private Boolean isDisplay; + /** + * '是否启用' + */ + private Boolean enabled; + + /** + * 角色类型:common 自定义角色 admin管理员 init标准角色 + */ + private List roleTypesNotIn; + public QuerySaasRoleReq buildDefault() { if (this.workspaceId == null) { this.workspaceId = new ArrayList<>(); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 0725c84b..a8b18798 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -156,6 +156,9 @@ public interface RoleService extends IService { @CriteriaField(field = "roleType", operator = Operator.IN) private List roleTypes; + @CriteriaField(field = "id", operator = Operator.NE) + private Long idNE; + @CriteriaField(ignore = true) private Boolean needPermission; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index a056d7f1..472c32ea 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -276,6 +276,9 @@ public class RoleServiceImpl extends ServiceImpl .in(CollectionUtils.isNotEmpty(req.getRoleType()), SaasRole::getRoleType, req.getRoleType()) .in(CollectionUtils.isEmpty(req.getIds()) && CollectionUtils.isNotEmpty(req.getWorkspaceId()), SaasRole::getWorkspaceId, req.getWorkspaceId()) .in(CollectionUtils.isEmpty(req.getIds()) && CollectionUtils.isNotEmpty(req.getOuId()), SaasRole::getOwnerOuId, req.getOuId()) + .eq(Objects.nonNull(req.getIsDisplay()), SaasRole::getIsDisplay, req.getIsDisplay()) + .eq(Objects.nonNull(req.getEnabled()), SaasRole::getEnabled, req.getEnabled()) + .notIn(CollectionUtils.isNotEmpty(req.getRoleTypesNotIn()), SaasRole::getRoleType, req.getRoleTypesNotIn()) .orderByDesc(BaseEntity::getId) .list(); return getByIds(list.stream().map(BaseEntity::getId).collect(Collectors.toList()), req.getIsCommon(), req.getWorkspaceId(), req.getOuId(), req.getIncludePermissionGroup(), req.getIncludeSpecialRole()); @@ -467,7 +470,9 @@ public class RoleServiceImpl extends ServiceImpl } List oldSaasRoles = this.list(ListSaasRoleParam.builder() .roleCode(saveOrUpdateRole.getRoleCode()) + .idNE(saveOrUpdateRole.getId()) .build()); + if (CollectionUtils.isNotEmpty(oldSaasRoles)) { throw new ServiceException("角色编码已存在"); } @@ -494,11 +499,11 @@ public class RoleServiceImpl extends ServiceImpl private SaasRole validAndBuildRole(SaveOrUpdateRoleVO saveOrUpdateRole, Date now) { SaasRole saasRole; + checkRoleCode(saveOrUpdateRole); if (Objects.isNull(saveOrUpdateRole.getId())) { saasRole = new SaasRole(); saasRole.setCreateBy(saveOrUpdateRole.getOperatorId()); saasRole.setCreateAt(now); - checkRoleCode(saveOrUpdateRole); } else { saasRole = saasRoleDao.getById(saveOrUpdateRole.getId()); if (Objects.isNull(saasRole)) { From 055c69bb01eed36449b6a2001d0f2bfa64c4eead Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 18 Apr 2024 09:42:30 +0800 Subject: [PATCH 116/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=90=AF=E7=94=A8=E5=92=8C=E9=9A=90=E8=97=8F=E8=BF=94?= =?UTF-8?q?=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/client/model/res/RoleWithUserRes.java | 9 +++++++++ .../cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 2 ++ 2 files changed, 11 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleWithUserRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleWithUserRes.java index dc5479f1..e915b949 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleWithUserRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleWithUserRes.java @@ -26,6 +26,15 @@ public class RoleWithUserRes { /** 角色下用户 **/ private List users; + /** + * '是否显示' + */ + private Boolean isDisplay; + /** + * '是否启用' + */ + private Boolean enabled; + @Data public static class UserVO { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 472c32ea..d4bee6fa 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -755,6 +755,8 @@ public class RoleServiceImpl extends ServiceImpl roleWithUser.setRoleId(role.getId()); roleWithUser.setRoleName(role.getName()); roleWithUser.setRoleType(role.getRoleType()); + roleWithUser.setIsDisplay(role.getIsDisplay()); + roleWithUser.setEnabled(role.getEnabled()); List relations = relationMap.get(role.getId()); if (CollectionUtil.isNotEmpty(relations)) { From 0465c43acfa6260bef0858c3edc0a4d25cbe8c03 Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 18 Apr 2024 10:10:24 +0800 Subject: [PATCH 117/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0productUn?= =?UTF-8?q?itType=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java | 6 ++++++ .../cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 1 + 2 files changed, 7 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java index 0ad25f9c..99f9e464 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java @@ -82,6 +82,12 @@ public class QuerySaasRoleReq { */ private List roleTypesNotIn; + /** + * 产品单位类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + */ + private Integer productUnitType; + public QuerySaasRoleReq buildDefault() { if (this.workspaceId == null) { this.workspaceId = new ArrayList<>(); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index d4bee6fa..b4c594fe 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -279,6 +279,7 @@ public class RoleServiceImpl extends ServiceImpl .eq(Objects.nonNull(req.getIsDisplay()), SaasRole::getIsDisplay, req.getIsDisplay()) .eq(Objects.nonNull(req.getEnabled()), SaasRole::getEnabled, req.getEnabled()) .notIn(CollectionUtils.isNotEmpty(req.getRoleTypesNotIn()), SaasRole::getRoleType, req.getRoleTypesNotIn()) + .eq(Objects.nonNull(req.getProductUnitType()), SaasRole::getProductUnitType, req.getProductUnitType()) .orderByDesc(BaseEntity::getId) .list(); return getByIds(list.stream().map(BaseEntity::getId).collect(Collectors.toList()), req.getIsCommon(), req.getWorkspaceId(), req.getOuId(), req.getIncludePermissionGroup(), req.getIncludeSpecialRole()); From 07c2f0d9619bbe0c7e74120a04f522c167784381 Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Thu, 18 Apr 2024 10:58:34 +0800 Subject: [PATCH 118/130] =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasFeatureResourceServiceImpl.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 898554a0..d26d88ed 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -219,6 +219,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } @Override + @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) public void updateFeatureAuthType(Long featureId, Integer authType) { if (featureId != null && authType != null) { featureResourceDao.lambdaUpdate() @@ -277,15 +278,22 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic submitChildren = Collections.emptyList(); } // 删除前端没带过来的 - List existChild = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getParentId, resourceId).list(); + List existChild = featureResourceDao.lambdaQuery() + .eq(SaasFeatureResource::getFeatureType, FeatureResourceType.COMPONENT.getCode()) + .eq(SaasFeatureResource::getParentId, resourceId) + .list(); List updateChildIds = submitChildren.stream().map(FeatureComponentSaveReq::getId).filter(Objects::nonNull).collect(Collectors.toList()); - List deleteChildren = existChild.stream().filter(item -> !updateChildIds.contains(item.getId())).collect(Collectors.toList()); + List updateChildCodes = submitChildren.stream().map(FeatureComponentSaveReq::getFeatureCode).collect(Collectors.toList()); + List deleteChildren = existChild.stream() + .filter(item -> (!updateChildIds.contains(item.getId()) && !updateChildCodes.contains(item.getFeatureCode()))) + .collect(Collectors.toList()); // 前端没传但是数据库中有的,需要删除 if (!CollectionUtil.isEmpty(deleteChildren)) { for (SaasFeatureResource deleteChild : deleteChildren) { - // 删除自己及自己的子集 + // 删除自己及自己的子集组件 featureResourceDao.lambdaUpdate() .eq(BaseEntity::getIsDelete,0) + .eq(SaasFeatureResource::getFeatureType, FeatureResourceType.COMPONENT.getCode()) .apply("FIND_IN_SET('" + deleteChild.getId() + "', path)") .set(SaasFeatureResource::getUpdateBy, operatorId) .set(BaseEntity::getIsDelete,1) From 370a370b1118880c5869babbfbfd9b50bcabc70a Mon Sep 17 00:00:00 2001 From: lvshaohua <764616596@qq.com> Date: Thu, 18 Apr 2024 11:30:04 +0800 Subject: [PATCH 119/130] =?UTF-8?q?redis=E6=B5=8B=E8=AF=95=E5=9C=B0?= =?UTF-8?q?=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java index 22bff94e..2e39e1cb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java @@ -19,8 +19,6 @@ import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication(scanBasePackages = "cn.axzo") public class TyrApplication { public static void main(String[] args) { - System.setProperty("spring.redis.port","31270"); - System.setProperty("spring.redis.host","123.249.44.111"); ConfigurableApplicationContext run = SpringApplication.run(TyrApplication.class, args); Environment env = run.getEnvironment(); From 1b2b867285ca7d06086e3dd94c314e51fb1c9b0a Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 18 Apr 2024 15:21:27 +0800 Subject: [PATCH 120/130] =?UTF-8?q?feat:(REQ-2227)=20=E6=B4=97=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0/api=E5=89=8D?= =?UTF-8?q?=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/server/controller/PrivateController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java index 865ae3c8..add17cc0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -46,7 +46,7 @@ public class PrivateController { * @return * @throws Exception */ - @PostMapping("/private/role/group/sort/refresh") + @PostMapping("/api/private/role/group/sort/refresh") public Object refreshRoleGroupSort() { List commonDicts = saasCommonDictService.query(CommonDictQueryReq.builder() .scope("role") @@ -90,7 +90,7 @@ public class PrivateController { * @return * @throws Exception */ - @PostMapping("/private/role/sort/refresh") + @PostMapping("/api/private/role/sort/refresh") public Object refreshRoleSort() { List commonDicts = saasCommonDictService.query(CommonDictQueryReq.builder() .scope("role") From cfa33ab124caa3d731fc43b45d76abd6420b94a3 Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 18 Apr 2024 17:10:01 +0800 Subject: [PATCH 121/130] =?UTF-8?q?feat:(REQ-2227)=20=E5=A2=9E=E5=8A=A0req?= =?UTF-8?q?uestbody?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java index 3cf00349..dc6962c2 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java @@ -33,5 +33,5 @@ public interface PermissionQueryApi { /** 鉴权接口 **/ @PostMapping(value = "/api/v3/permission/query/hasPermission") - ApiResult hasPermission(PermissionCheckReq req); + ApiResult hasPermission(@RequestBody @Valid PermissionCheckReq req); } From 4255dabb641c8237c356375b6c13c33909a51277 Mon Sep 17 00:00:00 2001 From: zhansihu Date: Fri, 19 Apr 2024 10:38:03 +0800 Subject: [PATCH 122/130] =?UTF-8?q?fix(2227-roleGroup):=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=A4=9A=E7=88=B6=E7=BA=A7=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index db9bd274..f11ecd84 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -223,7 +223,7 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl parentIds = groups.stream().map(SaasRoleGroup::getId).collect(Collectors.toList()); - List children = saasRoleGroupDao.lambdaQuery().eq(SaasRoleGroup::getParentId, parentIds).list(); + List children = saasRoleGroupDao.lambdaQuery().in(SaasRoleGroup::getParentId, parentIds).list(); if (type == 2) { groups.addAll(children); return groups; From 4e594c02a4ac4399e493e8753458dcfb0ae40f75 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 19 Apr 2024 14:19:30 +0800 Subject: [PATCH 123/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=80=9A=E8=BF=87category=E6=9F=A5=E8=AF=A2=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/server/service/impl/RoleServiceImpl.java | 3 ++- .../server/service/impl/SaasRoleGroupServiceImpl.java | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index b4c594fe..87870007 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -949,7 +949,7 @@ public class RoleServiceImpl extends ServiceImpl //父级和子级 groups.add(parent); List children = allGroupMap.get(parent.getId()); - if (CollectionUtil.isEmpty(children)) { + if (CollectionUtil.isNotEmpty(children)) { groups.addAll(children); } groupsByCategory.put(entry.getKey(), groups); @@ -968,6 +968,7 @@ public class RoleServiceImpl extends ServiceImpl List groupIdList = g.getValue().stream().map(SaasRoleGroup::getId).collect(Collectors.toList()); List roleGroupRelationList = groupIdList.stream().map(groupByGroupId::get) + .filter(Objects::nonNull) .flatMap((Function, Stream>) saasRoleGroupRelations -> saasRoleGroupRelations.stream().map(saasRoleGroupRelation -> saasRoleGroupRelation)) .collect(Collectors.toList()); List roleIdList = roleGroupRelationList.stream().map(SaasRoleGroupRelation::getRoleId).collect(Collectors.toList()); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index f11ecd84..921b37f2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -215,11 +215,19 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl listByCodes(List codes, int type) { List groups = saasRoleGroupDao.listByCodes(codes); if (CollectionUtil.isEmpty(groups) || type == 1) { - return Collections.emptyList(); + return groups; } //TODO: 未支持多层级 List parentIds = groups.stream().map(SaasRoleGroup::getId).collect(Collectors.toList()); From e1e7480caea85b33e44ba2fe2c20d03f6f71de57 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 19 Apr 2024 15:49:29 +0800 Subject: [PATCH 124/130] =?UTF-8?q?feat:(REQ-2227)=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E9=89=B4=E6=9D=83=E6=97=B6=EF=BC=8Cterminal=E4=BC=A0=E7=A9=BA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=BC=82=E5=B8=B8=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/PermissionQueryServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java index fb2f7a37..3e8c2c32 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImpl.java @@ -36,10 +36,10 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -143,7 +143,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .workspaceId(req.getWorkspaceId()) .ouId(req.getOuId()).build())) .featureCode(new HashSet<>(req.getFeatureCodes())) - .terminal(Collections.singletonList(req.getTerminal())) + .terminal(StringUtils.isBlank(req.getTerminal()) ? null : Collections.singletonList(req.getTerminal())) .build(); IdentityAuthRes.WorkspacePermission permissions = saasAuthService.findIdentityAuthMix(authReq).getPermissions().get(0); return CollectionUtil.isNotEmpty(permissions.getPermissionPoint()); From eadc22ead5e94bde5468a9e699b4bb6ea0d71ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Fri, 19 Apr 2024 17:04:11 +0800 Subject: [PATCH 125/130] =?UTF-8?q?feat(2227-userRole):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=A7=92=E8=89=B2=E8=BF=94=E5=9B=9E=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java | 5 +++++ .../server/service/impl/SaasRoleUserRelationServiceImpl.java | 1 + 2 files changed, 6 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java index de34a173..336d11f0 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserDTO.java @@ -89,4 +89,9 @@ public class SaasRoleUserDTO { * 是否展示角色 */ private Boolean displayRole; + + /** + * '是否启用' + */ + private Boolean enabled; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index ff99b73e..3a7c4ef7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -62,6 +62,7 @@ public class SaasRoleUserRelationServiceImpl implements SaasRoleUserRelationServ userRole.setDescription(role.getDescription()); userRole.setRoleType(RoleTypeEnum.getRoleType(role.getRoleType())); userRole.setDisplayRole(role.getIsDisplay()); + userRole.setEnabled(role.getEnabled()); return userRole; }).collect(Collectors.toList()); } From a959be8552189430e38f497bdf5f14b687b4c441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=86=E9=B9=8F?= Date: Tue, 23 Apr 2024 13:50:31 +0800 Subject: [PATCH 126/130] =?UTF-8?q?feat(2227-userRole):=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=AE=8C=E8=8F=9C=E5=8D=95=E6=B8=85=E9=99=A4=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/FeatureResourceSyncServiceImpl.java | 5 ++++- .../service/impl/SaasFeatureResourceCacheService.java | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java index fe3a347a..a820b5ce 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java @@ -42,6 +42,8 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic private final BaseFeatureResourceApi baseFeatureResourceApi; + private final SaasFeatureResourceCacheService saasFeatureResourceCacheService; + @Qualifier("asyncExecutor") @Autowired private ExecutorService asyncExecutor; @@ -76,10 +78,11 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic public void syncFromBase(ResourceSyncReq req) { if (req.getIds().size() > 1) { //超过一个异步处理 - CompletableFuture.runAsync(() -> doSyncFromBase(req), asyncExecutor); + CompletableFuture.runAsync(() -> doSyncFromBase(req), asyncExecutor).whenComplete((t, ex) -> saasFeatureResourceCacheService.clearCache()); return; } doSyncFromBase(req); + saasFeatureResourceCacheService.clearCache(); } private void doSyncFromBase(ResourceSyncReq req) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java index 00347ee0..0ca97c28 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceCacheService.java @@ -5,6 +5,7 @@ import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; @@ -28,4 +29,9 @@ public class SaasFeatureResourceCacheService { log.info("get feature resource tree has not user cache!"); return featureResourceDao.getByResourceTreeParam(req); } + + @CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true) + public void clearCache() { + log.info("clear saas featureResource cache"); + } } From e8caebbd47a375eb1544c405df990ab051d7b5a3 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 23 Apr 2024 19:08:24 +0800 Subject: [PATCH 127/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E6=9F=A5=E8=AF=A2=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/tyr/server/config/FeignConfig.java | 8 +++++++- .../tyr/server/service/impl/SaasRoleGroupServiceImpl.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/FeignConfig.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/FeignConfig.java index f3c5dfed..4a3e4ed1 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/FeignConfig.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/FeignConfig.java @@ -22,7 +22,7 @@ import java.util.Objects; **/ @Component @Slf4j -@Profile({"dev", "local"}) +@Profile({"dev", "test", "local", "pre", "live"}) public class FeignConfig implements RequestInterceptor, EnvironmentAware { private Environment environment; @Value("${msgCenterEnvUrl:http://dev-app.axzo.cn/msg-center}") @@ -61,6 +61,12 @@ public class FeignConfig implements RequestInterceptor, EnvironmentAware { if(Objects.equals(profile, "test") && url.contains("dev-app.axzo.cn")) { url = url.replace("dev-app", "test-api"); } + if(Objects.equals(profile, "pre") && url.contains("dev-app.axzo.cn")) { + url = url.replace("dev-app", "pre-api"); + } + if(Objects.equals(profile, "live") && url.contains("dev-app.axzo.cn")) { + url = url.replace("dev-app", "live-api"); + } requestTemplate.target(url); Field field = ReflectUtil.getField(target.getClass(), "url"); field.setAccessible(true); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 921b37f2..b96d4762 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -177,7 +177,7 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl listByCategoryCode(List categoryCode) { - return BeanUtil.copyToList(this.listByCodes(categoryCode, 3), SaasRoleGroupVO.class); + return BeanUtil.copyToList(this.listByCodes(categoryCode, 2), SaasRoleGroupVO.class); } private void assembleSort(SaasRoleGroup saasRoleGroup) { From dee4ce0652e7a67368e5209aecf74ccf42eccfcc Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 23 Apr 2024 19:36:46 +0800 Subject: [PATCH 128/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E6=9F=A5=E8=AF=A2=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 2 +- .../axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 87870007..7a4f7260 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -915,7 +915,7 @@ public class RoleServiceImpl extends ServiceImpl } //category code转code 查询对应code及子级 - List saasRoleGroups = saasRoleGroupService.listByCodes(categoryCodes, 2); + List saasRoleGroups = saasRoleGroupService.listByCodes(categoryCodes, 3); //查询角色组相关角色及配置的权限 Set roleGroupId = saasRoleGroups.stream().map(BaseEntity::getId).collect(Collectors.toSet()); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index b96d4762..921b37f2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -177,7 +177,7 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl listByCategoryCode(List categoryCode) { - return BeanUtil.copyToList(this.listByCodes(categoryCode, 2), SaasRoleGroupVO.class); + return BeanUtil.copyToList(this.listByCodes(categoryCode, 3), SaasRoleGroupVO.class); } private void assembleSort(SaasRoleGroup saasRoleGroup) { From 344d032f9bc6815b6c3b22bf6dee1c32f25d9505 Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 23 Apr 2024 19:41:26 +0800 Subject: [PATCH 129/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E6=9F=A5=E8=AF=A2=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index c36cc491..12688bf9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -790,7 +790,7 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { @Override public List listAuthByResourceAndRoleGroup(ListPermissionFromRoleGroupReq listPermissionFromRoleGroupReq) { //确定角色group_id: code对应角色组及其下级 - List groups = roleGroupService.listByCodes(Collections.singletonList(listPermissionFromRoleGroupReq.getCategoryCode()), 2); + List groups = roleGroupService.listByCodes(Collections.singletonList(listPermissionFromRoleGroupReq.getCategoryCode()), 3); if (CollectionUtil.isEmpty(groups)) { log.warn("no role group found for code :{}", listPermissionFromRoleGroupReq.getCategoryCode()); return Collections.emptyList(); From ac9b6a31aaf974b59c9ccd56b405a431631e377d Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 23 Apr 2024 20:04:01 +0800 Subject: [PATCH 130/130] =?UTF-8?q?feat:(REQ-2227)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E6=9F=A5=E8=AF=A2=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 7a4f7260..ead5ac42 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -946,8 +946,6 @@ public class RoleServiceImpl extends ServiceImpl for (Map.Entry entry : categoryMap.entrySet()) { SaasRoleGroup parent = entry.getValue(); List groups = groupsByCategory.getOrDefault(entry.getKey(), new ArrayList<>()); - //父级和子级 - groups.add(parent); List children = allGroupMap.get(parent.getId()); if (CollectionUtil.isNotEmpty(children)) { groups.addAll(children);