1.修改编辑接口必填项判断BUG

2.修复分组删除时资源信息删除不掉的问题
3.整理添加资源的逻辑
pull/19/MERGE
rays 2021-05-27 17:47:58 +08:00
parent 36064fae90
commit b8e6290940
8 changed files with 175 additions and 40 deletions

View File

@ -24,6 +24,11 @@ public enum ApiResourceExceptionEnum implements AbstractExceptionEnum {
*/
OPERATIONS_RESOURCE_NODESNOT_ALLOWED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + SystemConstants.SYSTEM_EXCEPTION_STEP_CODE + "02", "不允许对资源节点进行操作"),
/**
*
*/
ADDING_VIEW_RESOURCES_NOT_ALLOWED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + SystemConstants.SYSTEM_EXCEPTION_STEP_CODE + "03", "不允许添加视图资源"),
;
/**

View File

@ -23,14 +23,14 @@ public class ApiResourceRequest extends BaseRequest {
/**
*
*/
@NotNull(message = "接口信息主键不能为空", groups = {detail.class, edit.class, delete.class, record.class})
@NotNull(message = "接口信息主键不能为空", groups = {detail.class, reset.class, edit.class, delete.class, record.class})
@ChineseDescription("接口信息主键")
private Long apiResourceId;
/**
*
*/
@NotNull(message = "资源分组数据主键不能为空", groups = {add.class, edit.class})
@NotNull(message = "资源分组数据主键不能为空", groups = {add.class, edit.class, reset.class})
@ChineseDescription("资源分组数据主键")
private Long groupId;
@ -64,7 +64,7 @@ public class ApiResourceRequest extends BaseRequest {
/**
* ,sys_resourcecode
*/
@NotBlank(message = "资源唯一编码,关联sys_resource表的code不能为空", groups = {add.class, allField.class})
@NotBlank(message = "资源唯一编码,关联sys_resource表的code不能为空", groups = {add.class, reset.class, allField.class})
@ChineseDescription("资源唯一编码,关联sys_resource表的code")
private String resourceCode;
@ -125,4 +125,11 @@ public class ApiResourceRequest extends BaseRequest {
public @interface allField {
}
/**
*
*/
public @interface reset {
}
}

View File

@ -109,6 +109,19 @@ public class ApiGroupController {
return new SuccessResponseData(apiGroupTreeWrapperList);
}
/**
*
*
* @return {@link ResponseData}
* @author majianguo
* @date 2021/5/22 11:00
**/
@GetResource(name = "获取分组树", path = "/apiGroup/groupTree")
public ResponseData groupTree(ApiGroupRequest apiGroupRequest) {
List<ApiGroupTreeWrapper> apiGroupTreeWrapperList = apiGroupService.groupTree(apiGroupRequest);
return new SuccessResponseData(apiGroupTreeWrapperList);
}
/**
* ()
*

View File

@ -62,6 +62,18 @@ public class ApiResourceController {
return new SuccessResponseData();
}
/**
*
*
* @return {@link cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData}
* @author majianguo
* @date 2021/5/27 3:33
**/
@PostResource(name = "编辑", path = "/apiResource/reset")
public ResponseData reset(@RequestBody @Validated(ApiResourceRequest.reset.class) ApiResourceRequest apiResourceRequest) {
return new SuccessResponseData(apiResourceService.reset(apiResourceRequest));
}
/**
*
*
@ -107,7 +119,6 @@ public class ApiResourceController {
return new SuccessResponseData(apiResourceService.findPage(apiResourceRequest));
}
/**
*
*

View File

@ -89,4 +89,13 @@ public interface ApiGroupService extends IService<ApiGroup> {
* @date 2021/5/22 11:11
**/
List<ApiGroupTreeWrapper> peersTree(ApiGroupRequest apiGroupRequest);
/**
*
*
* @return {@link List< ApiGroupTreeWrapper>}
* @author majianguo
* @date 2021/5/27 2:49
**/
List<ApiGroupTreeWrapper> groupTree(ApiGroupRequest apiGroupRequest);
}

View File

@ -83,9 +83,16 @@ public interface ApiResourceService extends IService<ApiResource> {
/**
*
*
* @return {@link List<cn.stylefeng.guns.modular.system.apiresourcefield.entity.ApiResourceField>}
* @author majianguo
* @date 2021/5/24 6:45
**/
List<ApiResourceField> allField(ApiResourceRequest apiResourceRequest);
/**
*
*
* @author majianguo
* @date 2021/5/27 3:34
**/
ApiResource reset(ApiResourceRequest apiResourceRequest);
}

View File

@ -75,6 +75,10 @@ public class ApiGroupServiceImpl extends ServiceImpl<ApiGroupMapper, ApiGroup> i
apiGroupLambdaQueryWrapper.like(ApiGroup::getGroupPids, SymbolConstant.LEFT_SQUARE_BRACKETS + apiGroup.getGroupId() + SymbolConstant.RIGHT_SQUARE_BRACKETS);
List<ApiGroup> apiGroups = this.list(apiGroupLambdaQueryWrapper);
// 把分组本身加入进去
apiGroups.add(apiGroup);
// 获取所有分组ID
Set<Long> apiGroupIdSet = null;
if (ObjectUtil.isNotEmpty(apiGroups)) {
apiGroupIdSet = apiGroups.stream().map(ApiGroup::getGroupId).collect(Collectors.toSet());
@ -158,6 +162,51 @@ public class ApiGroupServiceImpl extends ServiceImpl<ApiGroupMapper, ApiGroup> i
@Override
public List<ApiGroupTreeWrapper> peersTree(ApiGroupRequest apiGroupRequest) {
// 结果
List<ApiGroupTreeWrapper> allApiGroupTreeWrapperList = new ArrayList<>();
// 查询所有分组
LambdaQueryWrapper<ApiGroup> wrapper = new LambdaQueryWrapper<>();
if (ObjectUtil.isNotEmpty(apiGroupRequest.getGroupId())) {
wrapper.notLike(ApiGroup::getGroupPids, SymbolConstant.LEFT_SQUARE_BRACKETS + apiGroupRequest.getGroupId() + SymbolConstant.RIGHT_SQUARE_BRACKETS);
wrapper.ne(ApiGroup::getGroupId, apiGroupRequest.getGroupId());
}
List<ApiGroup> apiGroups = this.list(wrapper);
if (ObjectUtil.isNotEmpty(apiGroups)) {
for (ApiGroup apiGroup : apiGroups) {
ApiGroupTreeWrapper item = new ApiGroupTreeWrapper();
item.setId(apiGroup.getGroupId());
item.setPid(apiGroup.getGroupPid());
item.setName(apiGroup.getGroupName());
item.setType(NodeTypeEnums.LEAF_NODE.getType());
item.setSort(apiGroup.getGroupSort());
item.setData(apiGroup);
item.setSlotsValue();
allApiGroupTreeWrapperList.add(item);
}
}
// 查询所有资源
List<ApiResource> apiResourceList = this.apiResourceService.list();
if (ObjectUtil.isNotEmpty(apiResourceList)) {
for (ApiResource apiResource : apiResourceList) {
ApiGroupTreeWrapper item = new ApiGroupTreeWrapper();
item.setId(apiResource.getApiResourceId());
item.setPid(apiResource.getGroupId());
item.setName(apiResource.getApiAlias());
item.setType(NodeTypeEnums.DATA_NODE.getType());
item.setSort(apiResource.getResourceSort());
item.setData(apiResource);
item.setSlotsValue();
allApiGroupTreeWrapperList.add(item);
}
}
return allApiGroupTreeWrapperList;
}
@Override
public List<ApiGroupTreeWrapper> groupTree(ApiGroupRequest apiGroupRequest) {
// 结果
List<ApiGroupTreeWrapper> apiGroupTreeWrapperList = new ArrayList<>();
@ -183,22 +232,7 @@ public class ApiGroupServiceImpl extends ServiceImpl<ApiGroupMapper, ApiGroup> i
}
}
// 查询所有资源
List<ApiResource> apiResourceList = this.apiResourceService.list();
if (ObjectUtil.isNotEmpty(apiResourceList)) {
for (ApiResource apiResource : apiResourceList) {
ApiGroupTreeWrapper item = new ApiGroupTreeWrapper();
item.setId(apiResource.getApiResourceId());
item.setPid(apiResource.getGroupId());
item.setName(apiResource.getApiAlias());
item.setType(NodeTypeEnums.DATA_NODE.getType());
item.setSort(apiResource.getResourceSort());
item.setData(apiResource);
item.setSlotsValue();
apiGroupTreeWrapperList.add(item);
}
}
return apiGroupTreeWrapperList;
return this.createTree(apiGroupTreeWrapperList);
}
@Override

View File

@ -27,6 +27,7 @@ import cn.stylefeng.roses.kernel.system.modular.resource.service.ApiResourceServ
import cn.stylefeng.roses.kernel.system.modular.resource.service.SysResourceService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -71,19 +72,26 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
List<SysResource> resourceList = new ArrayList<>();
// 根据资源CODE查询资源信息
// 资源查询条件
LambdaQueryWrapper<SysResource> sysResourceLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysResourceLambdaQueryWrapper.eq(SysResource::getResourceCode, apiResourceRequest.getResourceCode());
SysResource sysResources = sysResourceService.getOne(sysResourceLambdaQueryWrapper);
// 如果是控制器名称,则查询模块下的所有资源
if (!apiResourceRequest.getResourceCode().contains("$")) {
sysResourceLambdaQueryWrapper.clear();
sysResourceLambdaQueryWrapper.eq(SysResource::getModularCode, apiResourceRequest.getResourceCode());
sysResourceLambdaQueryWrapper.eq(SysResource::getViewFlag, YesOrNotEnum.N.getCode());
List<SysResource> sysResourceList = sysResourceService.list(sysResourceLambdaQueryWrapper);
resourceList.addAll(sysResourceList);
} else {
// 根据资源CODE查询资源信息
sysResourceLambdaQueryWrapper.eq(SysResource::getResourceCode, apiResourceRequest.getResourceCode());
SysResource sysResources = sysResourceService.getOne(sysResourceLambdaQueryWrapper);
// 如果是视图就报错
if (YesOrNotEnum.Y.getCode().equals(sysResources.getViewFlag())) {
throw new SystemModularException(ApiResourceExceptionEnum.ADDING_VIEW_RESOURCES_NOT_ALLOWED);
}
resourceList.add(sysResources);
}
@ -115,7 +123,7 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
apiResource.setResourceCode(sysResource.getResourceCode());
// 设置排序
if (ObjectUtil.isNotEmpty(apiResourceRequest.getResourceSort())) {
if (ObjectUtil.isEmpty(apiResourceRequest.getResourceSort())) {
index = index.add(BigDecimal.ONE);
apiResource.setResourceSort(index);
}
@ -132,7 +140,7 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
// 处理所有请求字段
if (ObjectUtil.isNotEmpty(fillResourceDetail.getParamFieldDescriptions())) {
for (FieldMetadata fieldMetadata : fillResourceDetail.getParamFieldDescriptions()) {
ApiResourceField conversion = this.conversion(apiResource.getApiResourceId(), fieldMetadata);
ApiResourceField conversion = this.conversion(sysResource, apiResource.getApiResourceId(), fieldMetadata);
conversion.setFieldLocation("request");
apiResourceFieldList.add(conversion);
}
@ -141,7 +149,7 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
// 处理所有响应字段
if (ObjectUtil.isNotEmpty(fillResourceDetail.getResponseFieldDescriptions())) {
for (FieldMetadata fieldDescription : fillResourceDetail.getResponseFieldDescriptions()) {
ApiResourceField conversion = this.conversion(apiResource.getApiResourceId(), fieldDescription);
ApiResourceField conversion = this.conversion(sysResource, apiResource.getApiResourceId(), fieldDescription);
conversion.setFieldLocation("response");
apiResourceFieldList.add(conversion);
}
@ -167,6 +175,7 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
}
@Override
@Transactional(rollbackFor = Exception.class)
public void edit(ApiResourceRequest apiResourceRequest) {
// 查询旧数据
@ -283,14 +292,14 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
if (ObjectUtil.isNotEmpty(fillResourceDetail.getParamFieldDescriptions())) {
// 处理所有请求字段
for (FieldMetadata fieldMetadata : fillResourceDetail.getParamFieldDescriptions()) {
ApiResourceField conversion = this.conversion(null, fieldMetadata);
ApiResourceField conversion = this.conversion(sysResources, null, fieldMetadata);
conversion.setFieldLocation("request");
apiResourceFieldList.add(conversion);
}
// 处理所有响应字段
for (FieldMetadata fieldDescription : fillResourceDetail.getResponseFieldDescriptions()) {
ApiResourceField conversion = this.conversion(null, fieldDescription);
ApiResourceField conversion = this.conversion(sysResources, null, fieldDescription);
conversion.setFieldLocation("response");
apiResourceFieldList.add(conversion);
}
@ -298,6 +307,19 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
return apiResourceFieldList;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResource reset(ApiResourceRequest apiResourceRequest) {
// 删除原有的
this.del(apiResourceRequest);
// 新增一个新的
this.add(apiResourceRequest);
// 查询并返回结果
return this.getById(apiResourceRequest.getApiResourceId());
}
@Override
public List<ApiResource> findList(ApiResourceRequest apiResourceRequest) {
LambdaQueryWrapper<ApiResource> wrapper = this.createWrapper(apiResourceRequest);
@ -355,13 +377,13 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
}
/**
*
*
*
* @return {@link ApiResourceField}
* @author majianguo
* @date 2021/5/22 2:44
**/
private ApiResourceField conversion(Long apiResourceId, FieldMetadata fieldMetadata) {
private ApiResourceField conversion(SysResource sysResource, Long apiResourceId, FieldMetadata fieldMetadata) {
ApiResourceField item = new ApiResourceField();
item.setApiResourceId(apiResourceId);
item.setFieldCode(fieldMetadata.getFieldName());
@ -373,16 +395,43 @@ public class ApiResourceServiceImpl extends ServiceImpl<ApiResourceMapper, ApiRe
}
// 是否必填
Set<String> annotations = fieldMetadata.getAnnotations();
if (ObjectUtil.isNotEmpty(annotations)) {
for (String annotationName : annotations) {
if ("NotBlank".equalsIgnoreCase(annotationName) || "NotNull".equalsIgnoreCase(annotationName)) {
item.setFieldRequired(YesOrNotEnum.Y.getCode());
}
}
}
item.setFieldRequired(this.isRequired(sysResource, fieldMetadata) ? YesOrNotEnum.Y.getCode() : YesOrNotEnum.N.getCode());
// 字段校验消息
item.setFieldValidationMsg(fieldMetadata.getValidationMessages());
return item;
}
/**
*
*
* @author majianguo
* @date 2021/5/27 3:15
**/
private boolean isRequired(SysResource sysResource, FieldMetadata fieldMetadata) {
Set<String> annotations = fieldMetadata.getAnnotations();
if (ObjectUtil.isNotEmpty(annotations)) {
// 资源校验注解
Set<String> validateGroups = JSON.parseObject(sysResource.getValidateGroups(), Set.class, Feature.SupportAutoType);
if (ObjectUtil.isNotEmpty(validateGroups)) {
// 注解分组
Map<String, Set<String>> groupValidationMessage = fieldMetadata.getGroupValidationMessage();
for (String annotationName : annotations) {
if ("NotBlank".equalsIgnoreCase(annotationName) || "NotNull".equalsIgnoreCase(annotationName)) {
// 查询注解的所有分组,判断当前资源是否符合
Set<String> annotationGroups = groupValidationMessage.keySet();
for (String group : annotationGroups) {
// 当前分组在资源校验注解中,则设置必填
if (validateGroups.contains(group)) {
return true;
}
}
}
}
}
}
return false;
}
}