diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageProductFeatureRelationReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageProductFeatureRelationReq.java new file mode 100644 index 00000000..f5381af2 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageProductFeatureRelationReq.java @@ -0,0 +1,33 @@ +package cn.axzo.tyr.client.model.req; + +import cn.axzo.foundation.dao.support.wrapper.CriteriaField; +import cn.axzo.foundation.dao.support.wrapper.Operator; +import cn.axzo.foundation.page.IPageReq; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageProductFeatureRelationReq implements IPageReq { + + @CriteriaField(ignore = true) + Integer page; + + @CriteriaField(ignore = true) + Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + List sort; + + @CriteriaField(field = "id", operator = Operator.IN) + private List ids; +} 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 842d1521..c1461483 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 @@ -3,12 +3,13 @@ package cn.axzo.tyr.server.controller; import cn.axzo.basics.common.constant.enums.DeleteEnum; import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.basics.common.util.TreeUtil; +import cn.axzo.foundation.page.PageResp; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; -import cn.axzo.foundation.page.PageResp; import cn.axzo.tyr.client.model.req.CommonDictQueryReq; import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq; +import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq; import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.res.CommonDictResp; @@ -18,15 +19,19 @@ import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; +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.SaasRoleGroupRelationDao; import cn.axzo.tyr.server.repository.entity.SaasFeature; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; +import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; +import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; 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.repository.dao.*; -import cn.axzo.tyr.server.repository.entity.*; +import cn.axzo.tyr.server.service.ProductFeatureRelationService; import cn.axzo.tyr.server.service.ProductPermissionCacheService; import cn.axzo.tyr.server.service.RolePermissionCacheService; import cn.axzo.tyr.server.service.RoleService; @@ -101,7 +106,8 @@ public class PrivateController { private SaasPgroupRoleRelationDao saasPgroupRoleRelationDao; @Autowired private SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; - + @Autowired + private ProductFeatureRelationService productFeatureRelationService; /** @@ -371,9 +377,9 @@ public class PrivateController { PageResp page = saasPgroupPermissionRelationService.page(req); if (CollectionUtils.isNotEmpty(page.getData())) { - updateOldFeature(page.getData()); + updateOldRoleFeature(page.getData()); - updateNewFeature(page.getData()); + updateNewRoleFeature(page.getData()); } if (!page.hasNext()) { @@ -383,7 +389,7 @@ public class PrivateController { return "ok"; } - private void updateNewFeature(List saasPgroupPermissionRelations) { + private void updateNewRoleFeature(List saasPgroupPermissionRelations) { List newFeatureRelations = saasPgroupPermissionRelations.stream() .filter(e -> Objects.equals(e.getFeatureType(), NEW_FEATURE)) .collect(Collectors.toList()); @@ -417,7 +423,7 @@ public class PrivateController { saasPgroupPermissionRelationService.updateBatchById(update); } - private void updateOldFeature(List saasPgroupPermissionRelations) { + private void updateOldRoleFeature(List saasPgroupPermissionRelations) { List oldFeatureRelations = saasPgroupPermissionRelations.stream() .filter(e -> Objects.equals(e.getFeatureType(), OLD_FEATURE)) .collect(Collectors.toList()); @@ -451,6 +457,107 @@ public class PrivateController { saasPgroupPermissionRelationService.updateBatchById(update); } + /** + * 刷新saas_product_module_feature_relation表的featureType + * 1、type = 0的数据从saas_feature中查询 + * 2、type = 1的数据从saas_feature_resource中查询 + * @param request + * @return + */ + @PostMapping("/api/private/ProductPermissionRelation/featureResource/refresh") + public Object reFreshProductFeature(@Validated @RequestBody RefreshProductPermissionFeatureParam request) { + + final Integer DEFAULT_PAGE_SIZE = 100; + Integer pageNumber = 1; + while (true) { + PageProductFeatureRelationReq req = PageProductFeatureRelationReq.builder() + .ids(request.getIds()) + .page(pageNumber++) + .pageSize(DEFAULT_PAGE_SIZE) + .build(); + + PageResp page = productFeatureRelationService.page(req); + if (CollectionUtils.isNotEmpty(page.getData())) { + updateOldProductFeature(page.getData()); + + updateNewProductFeature(page.getData()); + } + + if (!page.hasNext()) { + break; + } + } + return "ok"; + } + + private void updateNewProductFeature(List saasProductModuleFeatureRelations) { + List newFeatureRelations = saasProductModuleFeatureRelations.stream() + .filter(e -> Objects.equals(e.getFeatureType(), NEW_FEATURE)) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(newFeatureRelations)) { + return; + } + + Map saasFeatureResourceMap = saasFeatureResourceDao.listByIds(Lists.transform(newFeatureRelations, SaasProductModuleFeatureRelation::getFeatureId)) + .stream() + .collect(Collectors.toMap(SaasFeatureResource::getId, Function.identity())); + + List update = saasProductModuleFeatureRelations.stream() + .map(e -> { + SaasFeatureResource saasFeatureResource = saasFeatureResourceMap.get(e.getFeatureId()); + if (saasFeatureResource == null) { + return null; + } + + SaasProductModuleFeatureRelation saasProductModuleFeatureRelation = new SaasProductModuleFeatureRelation(); + saasProductModuleFeatureRelation.setId(e.getId()); + saasProductModuleFeatureRelation.setFeatureType(saasFeatureResource.getFeatureType()); + return saasProductModuleFeatureRelation; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(update)) { + return; + } + + productFeatureRelationService.updateBatchById(update); + } + + private void updateOldProductFeature(List saasProductModuleFeatureRelations) { + List oldFeatureRelations = saasProductModuleFeatureRelations.stream() + .filter(e -> Objects.equals(e.getFeatureType(), OLD_FEATURE)) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(oldFeatureRelations)) { + return; + } + + Map saasFeatureMap = saasFeatureDao.listByIds(Lists.transform(oldFeatureRelations, SaasProductModuleFeatureRelation::getFeatureId)) + .stream() + .collect(Collectors.toMap(SaasFeature::getId, Function.identity())); + + List update = saasProductModuleFeatureRelations.stream() + .map(e -> { + SaasFeature saasFeature = saasFeatureMap.get(e.getFeatureId()); + if (saasFeature == null) { + return null; + } + + SaasProductModuleFeatureRelation saasProductModuleFeatureRelation = new SaasProductModuleFeatureRelation(); + saasProductModuleFeatureRelation.setId(e.getId()); + saasProductModuleFeatureRelation.setFeatureType(saasFeature.getFeatureType()); + return saasProductModuleFeatureRelation; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(update)) { + return; + } + + productFeatureRelationService.updateBatchById(update); + } + @Data @Builder @NoArgsConstructor @@ -483,4 +590,13 @@ public class PrivateController { private List ids; } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class RefreshProductPermissionFeatureParam { + + private List ids; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java index ec988bbf..e0e634d9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java @@ -1,11 +1,14 @@ package cn.axzo.tyr.server.service; +import cn.axzo.foundation.page.PageResp; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; +import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq; import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery; import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; +import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; import java.util.Map; @@ -17,7 +20,7 @@ import java.util.Set; * @author wangli * @since 2023/9/7 14:26 */ -public interface ProductFeatureRelationService { +public interface ProductFeatureRelationService extends IService { ApiResult> featureList(ProductFeatureRelationSearchReq req); ApiResult updateFeatureRelation(List req); @@ -52,4 +55,8 @@ public interface ProductFeatureRelationService { * @return */ SaasProductModuleFeatureRelation getOneByProductId(Long productId); + + PageResp page(PageProductFeatureRelationReq param); + + List list(PageProductFeatureRelationReq param); } 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 d55d5177..73003762 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 @@ -611,7 +611,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService { .featureIds(featureIds) .build(); return saasRoleUserRelationService.listV2(listRoleUserRelationParam).stream() - .filter(e -> e.getSaasRole() != null && CollectionUtils.isNotEmpty(e.getSaasRole().getPermissionRelations())) + .filter(e -> e.getSaasRole() != null) .collect(Collectors.toList()); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java index 44f2b717..13321278 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java @@ -1,6 +1,9 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; +import cn.axzo.foundation.dao.support.converter.PageConverter; +import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; +import cn.axzo.foundation.page.PageResp; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.thrones.client.saas.ServicePkgClient; @@ -11,6 +14,7 @@ import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; import cn.axzo.tyr.client.model.req.FeatureIdPair; +import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq; import cn.axzo.tyr.server.repository.dao.ProductModuleDao; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; @@ -19,11 +23,15 @@ import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery; import cn.axzo.tyr.server.repository.entity.SaasFeature; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; +import cn.axzo.tyr.server.repository.mapper.SaasProductModuleFeatureRelationMapper; import cn.axzo.tyr.server.service.ProductFeatureRelationService; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.StopWatch; 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.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -53,7 +61,8 @@ import static cn.axzo.tyr.server.util.RpcInternalUtil.checkAndGetData; @Slf4j @RequiredArgsConstructor @Service -public class ProductFeatureRelationServiceImpl implements ProductFeatureRelationService { +public class ProductFeatureRelationServiceImpl extends ServiceImpl + implements ProductFeatureRelationService { private final SaasProductModuleFeatureRelationDao saasProductModuleFeatureRelationDao; private final ServicePkgClient servicePkgClient; private final SaasFeatureDao saasFeatureDao; @@ -295,4 +304,23 @@ public class ProductFeatureRelationServiceImpl implements ProductFeatureRelation .list(); return org.apache.commons.collections4.CollectionUtils.isEmpty(list) ? null : list.get(0); } + + @Override + public PageResp page(PageProductFeatureRelationReq param) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasProductModuleFeatureRelation.class); + wrapper.eq("is_delete", 0); + + IPage page = this.page(PageConverter.toMybatis(param, SaasProductModuleFeatureRelation.class), wrapper); + + return PageConverter.toResp(page, Function.identity()); + } + + @Override + public List list(PageProductFeatureRelationReq param) { + return PageConverter.drainAll(pageNumber -> { + param.setPage(pageNumber); + param.setPageSize(500); + return page(param); + }); + } } 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 086550ef..e2a75e03 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 @@ -43,6 +43,7 @@ import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleVO; import cn.axzo.tyr.server.model.FilterRoleAuth; import cn.axzo.tyr.server.model.PermissionCacheKey; +import cn.axzo.tyr.server.repository.dao.ProductModuleDao; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.dao.SaasProductModuleFeatureRelationDao; import cn.axzo.tyr.server.repository.entity.ProductFeatureInfo; diff --git a/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java index 1433b2a6..177fd203 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java @@ -1,8 +1,10 @@ package cn.axzo.tyr.base; +import cn.axzo.thrones.client.saas.ServicePkgClient; import cn.axzo.tyr.base.MysqlDataLoader; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import redis.embedded.RedisServer; @@ -33,4 +35,7 @@ public class TestConfig { public MysqlDataLoader mysqlDataLoader() { return new MysqlDataLoader(); } + + @MockBean + private ServicePkgClient servicePkgClient; } \ No newline at end of file diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImplTest.java new file mode 100644 index 00000000..218d3a1a --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/PermissionQueryServiceImplTest.java @@ -0,0 +1,127 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.thrones.client.saas.ServicePkgClient; +import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct; +import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes; +import cn.axzo.tyr.base.BaseTest; +import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.model.req.IdentityAuthReq; +import cn.axzo.tyr.client.model.req.PermissionCheckReq; +import cn.axzo.tyr.client.model.res.IdentityAuthRes; +import cn.axzo.tyr.server.repository.dao.ProductModuleDao; +import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; +import cn.axzo.tyr.server.repository.entity.ProductModule; +import cn.axzo.tyr.server.service.PermissionQueryService; +import cn.axzo.tyr.server.service.TyrSaasAuthService; +import cn.azxo.framework.common.model.CommonResponse; +import cn.hutool.core.collection.CollectionUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +@Slf4j +class PermissionQueryServiceImplTest extends BaseTest { + + @Autowired + private PermissionQueryService permissionQueryService; + @Autowired + private MysqlDataLoader mysqlDataLoader; + @Autowired + private TyrSaasAuthService tyrSaasAuthService; + @Autowired + private SaasFeatureDao saasFeatureDao; + @Autowired + private ServicePkgClient servicePkgClient; + + @Autowired + private ProductModuleDao productModuleDao; + + @BeforeEach + @Override + public void setup() { + super.setup(); + mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); + MockitoAnnotations.initMocks(this); + } + + @Test + void hasPermissionNew() { + ServicePkgDetailRes servicePkgDetailRes = new ServicePkgDetailRes(); + ServicePkgProduct servicePkgProduct = new ServicePkgProduct(); + servicePkgProduct.setProductId(1L); + + ServicePkgProduct servicePkgProduct2 = new ServicePkgProduct(); + servicePkgProduct2.setProductId(6L); + servicePkgDetailRes.setProducts(Lists.newArrayList( + servicePkgProduct, + servicePkgProduct2 + )); + Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.any())) + .thenReturn(CommonResponse.success(Lists.newArrayList(servicePkgDetailRes))); + // 普通角色和产品有旧权限码权限:begin + PermissionCheckReq permissionCheckReq = PermissionCheckReq.builder() + .personId(80792L) + .featureCodes(Lists.newArrayList("cms:ent_contact", "cms:ent_contact_new")) + .ouId(5154L) + .workspaceId(205L) + .build(); + List list = productModuleDao.list(); + log.info("size:{}", list.size()); + System.out.println("size+" + list.size()); + + new Thread(() -> { + synchronized (this) { + List productModules = productModuleDao.list(); + log.info("inner size:{}", productModules.size()); + System.out.println("inner size+" + list.size()); + } + }).start(); + + boolean result = authPermission(permissionCheckReq); + boolean resultOld = authPermissionOld(permissionCheckReq); + Assertions.assertTrue(result); + Assertions.assertTrue(resultOld); + // 普通角色和产品有旧权限码权限:end + + // 管理员角色和产品有旧权限码权限:begin + permissionCheckReq = PermissionCheckReq.builder() + .personId(80792L) + .featureCodes(Lists.newArrayList("cms:ent_contact", "cms:ent_contact_new")) + .ouId(5154L) + .workspaceId(290L) + .build(); + + result = authPermission(permissionCheckReq); + resultOld = authPermissionOld(permissionCheckReq); + Assertions.assertTrue(result); + Assertions.assertTrue(resultOld); + // 管理员角色和产品有旧权限码权限:end + } + + private boolean authPermission(PermissionCheckReq permissionCheckReq) { + return tyrSaasAuthService.authPermission(permissionCheckReq) || tyrSaasAuthService.authNewPermission(permissionCheckReq); + } + + private boolean authPermissionOld(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(StringUtils.isBlank(req.getTerminal()) ? null : Collections.singletonList(req.getTerminal())) + .build(); + IdentityAuthRes.WorkspacePermission permissions = tyrSaasAuthService.findIdentityAuthMix(authReq).getPermissions().get(0); + return CollectionUtil.isNotEmpty(permissions.getPermissionPoint()); + } +} \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/PermissionQueryServiceImplTest.sql b/tyr-server/src/test/resources/mysql/PermissionQueryServiceImplTest.sql new file mode 100644 index 00000000..48d2ac2c --- /dev/null +++ b/tyr-server/src/test/resources/mysql/PermissionQueryServiceImplTest.sql @@ -0,0 +1,50 @@ +#-->DEFAULT + +INSERT INTO saas_feature (id, feature_name, feature_code, icon, parent_id, parent_module_id, link_url, link_type, link_ext, micro_app_item_id, path, description, sort, terminal, feature_type, is_delete, create_by, create_at, update_at, update_by, legacy_layout, operate_type, old_id, fit_ou_type_bit, fit_ou_node_type_bit, app_name, feature_url, need_cert, need_auth, business_no, parent_business_no, delegated_type) + VALUES (965, '总包视角-合同外派工—编辑任务相关字段', 'cms:ent_contact', '', 357, 0, '', 1, '', '', '/0/354/357/', '', 27, 'NT_CMS_WEB_PROJ', 3, 0, 0, '2022-07-22 16:18:34', '2023-12-26 18:40:56', 0, '', null, null, 1, 1, 'apollo', '/webApi/cms/preOrder/batchSaveOrUpdate', 1, 1, '965', '357', 2); +INSERT INTO saas_feature (id, feature_name, feature_code, icon, parent_id, parent_module_id, link_url, link_type, link_ext, micro_app_item_id, path, description, sort, terminal, feature_type, is_delete, create_by, create_at, update_at, update_by, legacy_layout, operate_type, old_id, fit_ou_type_bit, fit_ou_node_type_bit, app_name, feature_url, need_cert, need_auth, business_no, parent_business_no, delegated_type) +VALUES (966, '总包视角-合同外派工—编辑量价相关字段', 'CMS_WEB_PROJ_0326', '', 357, 0, '', 1, '', '', '/0/354/357/', '', 28, 'NT_CMS_WEB_PROJ', 3, 0, 0, '2022-07-22 16:18:48', '2023-12-26 18:41:05', 0, '', null, null, 1, 1, 'apollo', '/webApi/cms/preOrder/batchSaveOrUpdate', 1, 1, '966', '357', 2); + +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290532, 25349, 912, 0, '2023-10-23 17:50:06', '2023-10-23 17:50:06', -1, -1); +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290576, 25397, 956, 0, '2023-10-23 17:50:17', '2023-10-23 17:50:17', -1, -1); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (28543, 912, 965, 0, '2023-10-23 17:50:06', '2023-10-23 17:50:06', -1, -1, 0, 0, ''); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (28550, 912, 966, 0, '2023-10-23 17:50:06', '2023-10-23 17:50:06', -1, -1, 0, 0, ''); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (28551, 956, 966, 0, '2023-10-23 17:50:06', '2023-10-23 17:50:06', -1, -1, 0, 0, ''); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, enabled, sort) +VALUES (25349, '安全总监', '', 'init', '25349', -1, -1, 1, 2, 0, '2023-10-23 17:50:06', '2024-05-29 10:06:36', -1, 2003028, 1, 65535, 0, null, 0, '', 1, 1, 6); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, enabled, sort) +VALUES (25397, '法务部部长', '', 'init', '25397', -1, -1, 7, 1, 0, '2023-10-23 17:50:17', '2024-04-17 11:02:19', -1, 2003041, 1, 65535, 0, null, 0, '', 1, 1, 9); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, enabled, sort) +VALUES (6450, '超级管理员', '', 'super_admin', '6450', 141, 4, 1, 2, 0, '2022-10-19 15:52:33', '2024-04-17 11:02:19', 0, 0, 65535, 65535, 0, 0, 0, '', 1, 1, 1); + + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (179539, 2000028, 25349, 3, 80792, 205, 5154, 0, 0, 0, '2023-06-01 11:04:20', '2023-10-23 17:50:05', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (206831, 2000028, 6450, 3, 80792, 290, 5154, 0, 0, 0, '2024-02-26 16:30:04', '2024-02-26 16:30:04', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (212953, 2000028, 25397, 3, 80792, 205, 5154, 0, 0, 0, '2024-03-20 14:41:13', '2024-03-20 14:41:12', 0, 0, 2); + + +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (1, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695189976949-Snipaste_09-15 16-36.png', 1, '企业基础-自动授权', 1, '1', 0, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-06-14 10:51:19', 0, '', 1, 0, 0, 0, null, null); +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (6, '', 1, '招投标平台-企业总包', 1, '1', 1, 1, '', null, null, 0, 0, '2022-09-04 14:43:18', '2023-09-18 19:54:40', 0, '', 0, 0, 0, 0, null, null); + + +INSERT INTO saas_product_module_feature_relation (product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1, 1, '1', 965, 0, '2024-05-29 15:28:39', '2024-05-29 15:28:38', 0, 0, 1, 7, 'NT_CMS_WEB_GENERAL'); + + +INSERT INTO saas_product_module_feature_relation (product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1, 1, '1', 966, 0, '2024-05-29 15:28:39', '2024-05-29 15:28:38', 0, 0, 1, 7, 'NT_CMS_WEB_GENERAL'); + + +#-->PermissionQueryServiceImplTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/TyrSaasAuthServiceImplTest.sql b/tyr-server/src/test/resources/mysql/TyrSaasAuthServiceImplTest.sql index 7dc4afae..6e2406ee 100644 --- a/tyr-server/src/test/resources/mysql/TyrSaasAuthServiceImplTest.sql +++ b/tyr-server/src/test/resources/mysql/TyrSaasAuthServiceImplTest.sql @@ -1,2 +1,2 @@ -### DEFAULT +#-->DEFAULT diff --git a/tyr-server/src/test/resources/mysql/schema.sql b/tyr-server/src/test/resources/mysql/schema.sql index 1e875627..e485f4dc 100644 --- a/tyr-server/src/test/resources/mysql/schema.sql +++ b/tyr-server/src/test/resources/mysql/schema.sql @@ -140,4 +140,116 @@ CREATE TABLE `saas_feature_resource` ( alter table saas_feature_resource add column `workspace_type` tinyint DEFAULT '0' COMMENT '1:企业工作台 2;项目工作台' after `path`; alter table saas_feature_resource add column `version` int DEFAULT '0' COMMENT '最低版本序列,主要支持版本灰度策略' after `workspace_type`; -alter table saas_feature_resource add column `uni_code` varchar(64) not null default '' comment '唯一编码,用于pre环境菜单同步' after `version`; \ No newline at end of file +alter table saas_feature_resource add column `uni_code` varchar(64) not null default '' comment '唯一编码,用于pre环境菜单同步' after `version`; + +CREATE TABLE `saas_page_element` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键ID', + `group_code` varchar(64) NOT NULL DEFAULT '' COMMENT '元素的父编码', + `code` varchar(64) NOT NULL COMMENT '页面元素编码', + `name` varchar(64) NOT NULL COMMENT '资源元素名称', + `type` varchar(32) NOT NULL DEFAULT '' COMMENT '页面元素类型(PAGE:页面,COMPONENT:组件)', + `link_url` varchar(255) NOT NULL DEFAULT '' COMMENT '页面路由地址', + `terminal` varchar(32) NOT NULL DEFAULT '' COMMENT '资源所属端', + `create_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `is_delete` bigint NOT NULL DEFAULT '0' COMMENT '删除标识', + PRIMARY KEY (`id`), + KEY `idx_page_element_gcode` (`group_code`), + KEY `idx_page_element_code` (`code`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='页面元素表'; + +CREATE TABLE `saas_page_element_feature_resource_relation` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键ID', + `page_element_code` varchar(64) NOT NULL COMMENT '页面元素code', + `feature_resource_uni_code` varchar(64) NOT NULL COMMENT '菜单组件code', + `terminal` varchar(32) NOT NULL DEFAULT '' COMMENT '资源所属端', + `create_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` bigint DEFAULT NULL COMMENT '创建人', + `update_by` bigint DEFAULT NULL COMMENT '更新人', + `is_delete` bigint NOT NULL DEFAULT '0' COMMENT '删除标识', + PRIMARY KEY (`id`), + KEY `idx_page_element_relation_pec` (`page_element_code`), + KEY `idx_page_element_relation_fruc` (`feature_resource_uni_code`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='页面元素与菜单组件关系表'; + +CREATE TABLE `saas_pgroup_permission_relation` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `group_id` bigint NOT NULL DEFAULT '0' COMMENT '权限集id', + `feature_id` bigint NOT NULL DEFAULT '0' COMMENT '功能id', + `is_delete` bigint NOT NULL DEFAULT '0' COMMENT '是否删除:0否,other是', + `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` bigint NOT NULL DEFAULT '0' COMMENT '创建者', + `update_by` bigint NOT NULL DEFAULT '0' COMMENT '更新者', + PRIMARY KEY (`id`), + KEY `IDX_permission_relation_GROUP_ID` (`group_id`,`feature_id`,`is_delete`), + KEY `IDX_permission_relation_FEATURE_ID` (`feature_id`,`group_id`,`is_delete`) +) ENGINE=InnoDB AUTO_INCREMENT=71008 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='权限集功能中间表'; + +alter table saas_pgroup_permission_relation add column type tinyint default 0 not null comment '关联类型(0:saas_feature,1:saas_feature_resource)'; + +alter table saas_pgroup_permission_relation add column feature_type tinyint not null default 0 comment '资源类型1-菜单 2-页面 3-应用入口 4-组件'; + +alter table saas_pgroup_permission_relation add column terminal varchar(32) not null default '' comment '资源所属端'; + +CREATE TABLE `product_module` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `icon` varchar(255) NOT NULL COMMENT '产品 icon 图标', + `product_type` tinyint NOT NULL DEFAULT '0' COMMENT '1:总包企业产品 2:总包项目产品 3:政企产品 4:分包企业产品 5:班组产品', + `product_name` varchar(100) NOT NULL DEFAULT '' COMMENT '产品板块名字', + `dict_workspace_type_id` bigint NOT NULL DEFAULT '0' COMMENT '企业字典中的系统域ID', + `dict_workspace_type_code` varchar(64) NOT NULL DEFAULT '' COMMENT '企业字典中的系统域CODe', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '产品状态 1:启用 0:未启用', + `common_product` tinyint NOT NULL DEFAULT '1' COMMENT '是否基础产品 0:是 1:不是', + `remark` varchar(100) NOT NULL DEFAULT '' COMMENT '产品板块备注', + `auth_type` tinyint DEFAULT NULL COMMENT '产品默认授权方式 1:创建工作台 2:资质认证', + `ou_type` varchar(255) DEFAULT NULL COMMENT '资质序列/单位类型(数组多选)', + `is_delete` bigint NOT NULL DEFAULT '0' COMMENT '是否删除', + `create_by` bigint 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', + `category` varchar(32) NOT NULL DEFAULT '' COMMENT '产品类型 PRODUCT_VERSION:产品版本类型、ADD_VALUE_SERVICE:增值服务类型、GENERAL_SERVICE:通用产品类型、HARD_WARE:硬件产品类型', + `version` int NOT NULL DEFAULT '0' COMMENT '版本升级序列(数字越小,版本越低,不能降级,只能升级) <企业、项目产品>', + `max_person_count` int NOT NULL DEFAULT '0' COMMENT '人数上限 <企业、项目产品>', + `max_workspace_count` int NOT NULL DEFAULT '0' COMMENT '最大项目数 <企业产品>', + `price` bigint NOT NULL DEFAULT '0' COMMENT '价格(单位:分)', + `skus` json DEFAULT NULL COMMENT '产品详情jsonList(skuNameSKU名称、model规格型号、count数量、unit单位)', + `material` json DEFAULT NULL COMMENT '素材<仅硬件产品支持>json类型', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='saas-产品表'; + +CREATE TABLE `saas_product_module_feature_relation` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `product_module_id` bigint NOT NULL DEFAULT '0' COMMENT '产品Id', + `dict_code_id` bigint NOT NULL DEFAULT '0' COMMENT '字典配置第三级业务数据id 第二级默认为ouType', + `dict_code` varchar(64) NOT NULL DEFAULT '' COMMENT '字典配置第三级业务数据code', + `feature_id` bigint NOT NULL DEFAULT '0' COMMENT '功能Id', + `is_delete` bigint NOT NULL DEFAULT '0' COMMENT '是否删除:0否,other是', + `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` bigint NOT NULL DEFAULT '0' COMMENT '创建者', + `update_by` bigint NOT NULL DEFAULT '0' COMMENT '更新者', + `type` tinyint NOT NULL DEFAULT '0' COMMENT '关联类型(0:saas_feature,1:saas_feature_resource)', + PRIMARY KEY (`id`), + KEY `IDX_PRODUCT_RELATION_MODULE_ID` (`product_module_id`,`is_delete`) USING BTREE, + KEY `IDX_PRODUCT_RELATION_FEATURE` (`feature_id`,`product_module_id`,`is_delete`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=315417 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='saas-产品-功能关联表'; + +alter table saas_product_module_feature_relation add column feature_type tinyint not null default 0 comment '资源类型1-菜单 2-页面 3-应用入口 4-组件'; +alter table saas_product_module_feature_relation add column `terminal` varchar(32) not null default '' COMMENT '端'; + +CREATE TABLE `saas_pgroup_role_relation` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `role_id` bigint NOT NULL DEFAULT '0' COMMENT '角色id', + `group_id` bigint NOT NULL DEFAULT '0' COMMENT '权限集id', + `is_delete` bigint NOT NULL DEFAULT '0' COMMENT '是否删除:0否,other是', + `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` bigint NOT NULL DEFAULT '0' COMMENT '创建者', + `update_by` bigint NOT NULL DEFAULT '0' COMMENT '更新者', + PRIMARY KEY (`id`), + KEY `idx_pgroup_relation_role_id` (`role_id`,`is_delete`) USING BTREE, + KEY `idx_group_relation_group_id` (`group_id`,`is_delete`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=5794664 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色权限集中间表'; \ No newline at end of file