From 54ef6c6652069cbb61ca99b45eebb0cbf9819fe8 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Thu, 3 Jul 2025 22:03:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(crud):=20CrudRequestMapping=20=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E5=A2=9E=E5=8A=A0=20ignoreAuth=E3=80=81ignorePermissi?= =?UTF-8?q?on=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/crud/annotation/CrudApi.java | 12 +++++++ .../crud/annotation/CrudRequestMapping.java | 18 ++++++++++ .../aop/CrudApiAnnotationInterceptor.java | 23 +++++++++++- .../CrudRequestMappingHandlerMapping.java | 36 +++++++++++++++++-- 4 files changed, 85 insertions(+), 4 deletions(-) diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudApi.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudApi.java index 33f05f01..3d064a45 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudApi.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudApi.java @@ -23,6 +23,8 @@ import java.lang.annotation.*; /** * CRUD(增删改查)API * + *

{@link CrudRequestMapping#apis} 优先级高于方法上的 @CrudApi

+ * * @author Charles7c * @since 2.7.5 */ @@ -35,4 +37,14 @@ public @interface CrudApi { * API 类型 */ Api value() default Api.LIST; + + /** + * 是否忽略认证 + */ + boolean ignoreAuth() default false; + + /** + * 是否忽略权限校验 + */ + boolean ignorePermission() default false; } diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudRequestMapping.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudRequestMapping.java index 10a058c0..9f9658d8 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudRequestMapping.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/annotation/CrudRequestMapping.java @@ -36,8 +36,26 @@ public @interface CrudRequestMapping { */ String value() default ""; + /** + * API 列表 + *

优先级高于 {@link #api}

+ */ + CrudApi[] apis() default {}; + /** * API 列表 */ Api[] api() default {Api.PAGE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE, Api.EXPORT}; + + /** + * 是否忽略认证 + *

全部忽略,优先级低于 {@link CrudApi#ignoreAuth}

+ */ + boolean ignoreAuth() default false; + + /** + * 是否忽略权限校验 + *

全部忽略,优先级低于 {@link CrudApi#ignorePermission}

+ */ + boolean ignorePermission() default false; } diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java index b7338d5a..74b6273b 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java @@ -16,6 +16,7 @@ package top.continew.starter.extension.crud.aop; +import cn.hutool.core.util.ArrayUtil; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.support.AopUtils; @@ -23,9 +24,11 @@ import org.springframework.core.BridgeMethodResolver; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.util.ClassUtils; import top.continew.starter.extension.crud.annotation.CrudApi; +import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.controller.AbstractCrudController; import java.lang.reflect.Method; +import java.util.Arrays; import java.util.Objects; /** @@ -44,10 +47,28 @@ public class CrudApiAnnotationInterceptor implements MethodInterceptor { Method specificMethod = ClassUtils.getMostSpecificMethod(invocation.getMethod(), targetClass); Method targetMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); // 获取 @CrudApi 注解 - CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(targetMethod, CrudApi.class); + CrudApi crudApi = this.getCrudApi(targetMethod, targetClass); // 执行处理 AbstractCrudController crudController = (AbstractCrudController)invocation.getThis(); crudController.preHandle(crudApi, invocation.getArguments(), targetMethod, targetClass); return invocation.proceed(); } + + /** + * 获取 @CrudApi 注解 + * + * @param targetMethod 目标方法 + * @param targetClass 目标类 + * @return @CrudApi 注解 + */ + private CrudApi getCrudApi(Method targetMethod, Class targetClass) { + CrudRequestMapping crudRequestMapping = AnnotatedElementUtils + .findMergedAnnotation(targetClass, CrudRequestMapping.class); + CrudApi[] crudApis = crudRequestMapping.apis(); + CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(targetMethod, CrudApi.class); + if (ArrayUtil.isEmpty(crudApis)) { + return crudApi; + } + return Arrays.stream(crudApis).filter(api -> api.value() == crudApi.value()).findFirst().orElse(null); + } } diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java index a0f56629..3c230c0b 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java @@ -31,6 +31,7 @@ import top.continew.starter.extension.crud.enums.Api; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; +import java.util.Arrays; /** * CRUD 请求映射器处理器映射器 @@ -51,10 +52,10 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi return requestMappingInfo; } CrudRequestMapping crudRequestMapping = handlerType.getDeclaredAnnotation(CrudRequestMapping.class); - // 过滤 API,如果非本类中定义,且 API 列表中不包含,则忽略 - Api[] apiArr = crudRequestMapping.api(); CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(method, CrudApi.class); - if (method.getDeclaringClass() != handlerType && !ArrayUtil.contains(apiArr, ExceptionUtils + // 过滤 API:如果非本类中定义,且 API 列表中不包含,则忽略 + Api[] apis = this.getApis(crudRequestMapping); + if (method.getDeclaringClass() != handlerType && !ArrayUtil.contains(apis, ExceptionUtils .exToNull(crudApi::value))) { return null; } @@ -62,6 +63,29 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi return this.getMappingForMethodWrapper(method, handlerType, crudRequestMapping); } + /** + * 获取 API 列表 + * + * @param crudRequestMapping CRUD 请求映射 + * @return API 列表 + */ + private Api[] getApis(CrudRequestMapping crudRequestMapping) { + Api[] apiArr = crudRequestMapping.api(); + CrudApi[] crudApiArr = crudRequestMapping.apis(); + if (ArrayUtil.isEmpty(crudApiArr)) { + return apiArr; + } + return Arrays.stream(crudApiArr).map(CrudApi::value).toArray(Api[]::new); + } + + /** + * 获取请求映射信息 + * + * @param method 方法 + * @param handlerType 处理程序类型 + * @param crudRequestMapping CRUD 请求映射 + * @return 请求映射信息 + */ private RequestMappingInfo getMappingForMethodWrapper(@NonNull Method method, @NonNull Class handlerType, CrudRequestMapping crudRequestMapping) { @@ -81,6 +105,12 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi return info; } + /** + * 构建请求映射信息 + * + * @param element 元素 + * @return 请求映射信息 + */ private RequestMappingInfo buildRequestMappingInfo(AnnotatedElement element) { RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class); RequestCondition condition = (element instanceof Class clazz