feat:(REQ-2545) 增加刷产品权限点的权限点类型接口

This commit is contained in:
lilong 2024-07-01 17:15:06 +08:00
parent 93dcbda32d
commit c13110a46f
11 changed files with 492 additions and 13 deletions

View File

@ -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<String> sort;
@CriteriaField(field = "id", operator = Operator.IN)
private List<Long> ids;
}

View File

@ -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<SaasPgroupPermissionRelation> 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<SaasPgroupPermissionRelation> saasPgroupPermissionRelations) {
private void updateNewRoleFeature(List<SaasPgroupPermissionRelation> saasPgroupPermissionRelations) {
List<SaasPgroupPermissionRelation> 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<SaasPgroupPermissionRelation> saasPgroupPermissionRelations) {
private void updateOldRoleFeature(List<SaasPgroupPermissionRelation> saasPgroupPermissionRelations) {
List<SaasPgroupPermissionRelation> 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
* 1type = 0的数据从saas_feature中查询
* 2type = 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<SaasProductModuleFeatureRelation> 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<SaasProductModuleFeatureRelation> saasProductModuleFeatureRelations) {
List<SaasProductModuleFeatureRelation> newFeatureRelations = saasProductModuleFeatureRelations.stream()
.filter(e -> Objects.equals(e.getFeatureType(), NEW_FEATURE))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(newFeatureRelations)) {
return;
}
Map<Long, SaasFeatureResource> saasFeatureResourceMap = saasFeatureResourceDao.listByIds(Lists.transform(newFeatureRelations, SaasProductModuleFeatureRelation::getFeatureId))
.stream()
.collect(Collectors.toMap(SaasFeatureResource::getId, Function.identity()));
List<SaasProductModuleFeatureRelation> 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<SaasProductModuleFeatureRelation> saasProductModuleFeatureRelations) {
List<SaasProductModuleFeatureRelation> oldFeatureRelations = saasProductModuleFeatureRelations.stream()
.filter(e -> Objects.equals(e.getFeatureType(), OLD_FEATURE))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(oldFeatureRelations)) {
return;
}
Map<Long, SaasFeature> saasFeatureMap = saasFeatureDao.listByIds(Lists.transform(oldFeatureRelations, SaasProductModuleFeatureRelation::getFeatureId))
.stream()
.collect(Collectors.toMap(SaasFeature::getId, Function.identity()));
List<SaasProductModuleFeatureRelation> 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<Long> ids;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class RefreshProductPermissionFeatureParam {
private List<Long> ids;
}
}

View File

@ -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<SaasProductModuleFeatureRelation> {
ApiResult<List<ProductFeatureRelationVO>> featureList(ProductFeatureRelationSearchReq req);
ApiResult<Boolean> updateFeatureRelation(List<ProductFeatureRelationUpdateReq> req);
@ -52,4 +55,8 @@ public interface ProductFeatureRelationService {
* @return
*/
SaasProductModuleFeatureRelation getOneByProductId(Long productId);
PageResp<SaasProductModuleFeatureRelation> page(PageProductFeatureRelationReq param);
List<SaasProductModuleFeatureRelation> list(PageProductFeatureRelationReq param);
}

View File

@ -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());
}

View File

@ -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<SaasProductModuleFeatureRelationMapper, SaasProductModuleFeatureRelation>
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<SaasProductModuleFeatureRelation> page(PageProductFeatureRelationReq param) {
QueryWrapper<SaasProductModuleFeatureRelation> wrapper = QueryWrapperHelper.fromBean(param, SaasProductModuleFeatureRelation.class);
wrapper.eq("is_delete", 0);
IPage<SaasProductModuleFeatureRelation> page = this.page(PageConverter.toMybatis(param, SaasProductModuleFeatureRelation.class), wrapper);
return PageConverter.toResp(page, Function.identity());
}
@Override
public List<SaasProductModuleFeatureRelation> list(PageProductFeatureRelationReq param) {
return PageConverter.drainAll(pageNumber -> {
param.setPage(pageNumber);
param.setPageSize(500);
return page(param);
});
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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<ProductModule> list = productModuleDao.list();
log.info("size:{}", list.size());
System.out.println("size+" + list.size());
new Thread(() -> {
synchronized (this) {
List<ProductModule> 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());
}
}

View File

@ -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

View File

@ -1,2 +1,2 @@
### DEFAULT
#-->DEFAULT

View File

@ -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`;
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 '关联类型0saas_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 '关联类型0saas_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='角色权限集中间表';