chore: continew-starter 2.7.4 => 2.7.5

1.BaseServiceImpl 所在包调整
2.BaseController 改为在 Admin common 模块编写(重构权限校验 checkPermission 处理)
3.CRUD ValidateGroup => CrudValidationGroup
4.Admin ValidateGroup => ValidationGroup
5.修复 Query 查询数组范围报错

Closes #IB8711
This commit is contained in:
2024-12-06 22:06:23 +08:00
parent 61fe39d439
commit d7ae7b4e42
33 changed files with 153 additions and 116 deletions

View File

@@ -13,7 +13,7 @@
<img src="https://sonarcloud.io/api/project_badges/measure?project=Charles7c_continew-admin&metric=alert_status" alt="Sonar Status" /> <img src="https://sonarcloud.io/api/project_badges/measure?project=Charles7c_continew-admin&metric=alert_status" alt="Sonar Status" />
</a> </a>
<a href="https://github.com/continew-org/continew-starter" target="_blank"> <a href="https://github.com/continew-org/continew-starter" target="_blank">
<img src="https://img.shields.io/badge/ContiNew Starter-2.7.4-%236CB52D.svg" alt="ContiNew Starter" /> <img src="https://img.shields.io/badge/ContiNew Starter-2.7.5-%236CB52D.svg" alt="ContiNew Starter" />
</a> </a>
<a href="https://spring.io/projects/spring-boot" target="_blank"> <a href="https://spring.io/projects/spring-boot" target="_blank">
<img src="https://img.shields.io/badge/Spring Boot-3.2.10-%236CB52D.svg?logo=Spring-Boot" alt="Spring Boot" /> <img src="https://img.shields.io/badge/Spring Boot-3.2.10-%236CB52D.svg?logo=Spring-Boot" alt="Spring Boot" />
@@ -225,7 +225,7 @@ public class DeptController extends BaseController<DeptService, DeptResp, DeptDe
| <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design</a> | 2.56.0 | 字节跳动推出的前端 UI 框架,年轻化的色彩和组件设计。 | | <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design</a> | 2.56.0 | 字节跳动推出的前端 UI 框架,年轻化的色彩和组件设计。 |
| <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 5.0.4 | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 | | <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 5.0.4 | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 |
| <a href="https://cn.vitejs.dev/" target="_blank">Vite</a> | 5.1.5 | 下一代的前端工具链,为开发提供极速响应。 | | <a href="https://cn.vitejs.dev/" target="_blank">Vite</a> | 5.1.5 | 下一代的前端工具链,为开发提供极速响应。 |
| [ContiNew Starter](https://github.com/continew-org/continew-starter) | 2.7.4 | ContiNew Starter 包含了一系列经过企业实践优化的依赖包(如 MyBatis-Plus、SaToken可轻松集成到应用中为开发人员减少手动引入依赖及配置的麻烦为 Spring Boot Web 项目的灵活快速构建提供支持。 | | [ContiNew Starter](https://github.com/continew-org/continew-starter) | 2.7.5 | ContiNew Starter 包含了一系列经过企业实践优化的依赖包(如 MyBatis-Plus、SaToken可轻松集成到应用中为开发人员减少手动引入依赖及配置的麻烦为 Spring Boot Web 项目的灵活快速构建提供支持。 |
| <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 3.2.10 | 简化 Spring 应用的初始搭建和开发过程基于“约定优于配置”的理念使开发人员不再需要定义样板化的配置。Spring Boot 3.0 开始,要求 Java 17 作为最低版本) | | <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 3.2.10 | 简化 Spring 应用的初始搭建和开发过程基于“约定优于配置”的理念使开发人员不再需要定义样板化的配置。Spring Boot 3.0 开始,要求 Java 17 作为最低版本) |
| <a href="https://undertow.io/" target="_blank">Undertow</a> | 2.3.13.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 | | <a href="https://undertow.io/" target="_blank">Undertow</a> | 2.3.13.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 |
| <a href="https://sa-token.dev33.cn/" target="_blank">Sa-Token + JWT</a> | 1.39.0 | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。 | | <a href="https://sa-token.dev33.cn/" target="_blank">Sa-Token + JWT</a> | 1.39.0 | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。 |

View File

@@ -58,30 +58,36 @@
<artifactId>continew-starter-extension-crud-mp</artifactId> <artifactId>continew-starter-extension-crud-mp</artifactId>
</dependency> </dependency>
<!-- ContiNew Starter 认证模块 - SaToken -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-auth-satoken</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- ContiNew Starter 认证模块 - JustAuth --> <!-- ContiNew Starter 认证模块 - JustAuth -->
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
<artifactId>continew-starter-auth-justauth</artifactId> <artifactId>continew-starter-auth-justauth</artifactId>
</dependency> </dependency>
<!-- ContiNew Starter 数据权限模块 - MyBatis Plus -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-extension-datapermission-mp</artifactId>
</dependency>
<!-- ContiNew Starter 数据访问模块 - MyBatis Plus -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-data-mp</artifactId>
</dependency>
<!-- ContiNew Starter 缓存模块 - JetCache --> <!-- ContiNew Starter 缓存模块 - JetCache -->
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
<artifactId>continew-starter-cache-jetcache</artifactId> <artifactId>continew-starter-cache-jetcache</artifactId>
</dependency> </dependency>
<!-- ContiNew Starter 数据权限模块 - MyBatis Plus -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-extension-datapermission-mp</artifactId>
</dependency>
<!-- ContiNew Starter 消息模块 - WebSocket --> <!-- ContiNew Starter 消息模块 - WebSocket -->
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
@@ -112,12 +118,6 @@
<artifactId>continew-starter-captcha-behavior</artifactId> <artifactId>continew-starter-captcha-behavior</artifactId>
</dependency> </dependency>
<!-- ContiNew Starter 文件处理模块 - Excel -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-file-excel</artifactId>
</dependency>
<!-- ContiNew Starter 安全模块 - 限流器 --> <!-- ContiNew Starter 安全模块 - 限流器 -->
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
@@ -142,12 +142,6 @@
<artifactId>continew-starter-security-password</artifactId> <artifactId>continew-starter-security-password</artifactId>
</dependency> </dependency>
<!-- ContiNew Starter API 文档模块 -->
<dependency>
<groupId>top.continew</groupId>
<artifactId>continew-starter-api-doc</artifactId>
</dependency>
<!-- ContiNew Starter JSON 模块 - Jackson --> <!-- ContiNew Starter JSON 模块 - Jackson -->
<dependency> <dependency>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>

View File

@@ -0,0 +1,68 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.continew.admin.common.base;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.sign.SaSignTemplate;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.text.CharSequenceUtil;
import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.extension.crud.annotation.CrudApi;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.AbstractBaseController;
import top.continew.starter.extension.crud.enums.Api;
import top.continew.starter.extension.crud.model.req.BaseReq;
import top.continew.starter.extension.crud.service.BaseService;
import java.lang.reflect.Method;
import java.util.List;
/**
* 控制器基类
*
* @param <S> 业务接口
* @param <L> 列表类型
* @param <D> 详情类型
* @param <Q> 查询条件
* @param <C> 创建或修改参数类型
* @author Charles7c
* @since 2024/12/6 20:30
*/
public class BaseController<S extends BaseService<L, D, Q, C>, L, D, Q, C extends BaseReq> extends AbstractBaseController<S, L, D, Q, C> {
@Override
public void preHandle(CrudApi crudApi, Object[] args, Method targetMethod, Class<?> targetClass) throws Exception {
SaRequest saRequest = SaHolder.getRequest();
List<String> paramNames = saRequest.getParamNames();
if (paramNames.stream().anyMatch(SaSignTemplate.sign::equals)) {
return;
}
if (AnnotationUtil.hasAnnotation(targetMethod, SaIgnore.class) || AnnotationUtil
.hasAnnotation(targetClass, SaIgnore.class)) {
return;
}
CrudRequestMapping crudRequestMapping = targetClass.getDeclaredAnnotation(CrudRequestMapping.class);
String path = crudRequestMapping.value();
String prefix = String.join(StringConstants.COLON, CharSequenceUtil.splitTrim(path, StringConstants.SLASH));
Api api = crudApi.value();
String apiName = Api.PAGE.equals(api) || Api.TREE.equals(api) ? Api.LIST.name() : api.name();
StpUtil.checkPermission("%s:%s".formatted(prefix, apiName.toLowerCase()));
}
}

View File

@@ -25,7 +25,7 @@ import org.hibernate.validator.constraints.Length;
import top.continew.admin.common.constant.RegexConstants; import top.continew.admin.common.constant.RegexConstants;
import top.continew.admin.common.enums.DisEnableStatusEnum; import top.continew.admin.common.enums.DisEnableStatusEnum;
import top.continew.admin.system.enums.StorageTypeEnum; import top.continew.admin.system.enums.StorageTypeEnum;
import top.continew.admin.system.util.ValidateGroup; import top.continew.admin.system.validation.ValidationGroup;
import top.continew.starter.extension.crud.model.req.BaseReq; import top.continew.starter.extension.crud.model.req.BaseReq;
import java.io.Serial; import java.io.Serial;
@@ -71,14 +71,14 @@ public class StorageReq extends BaseReq {
*/ */
@Schema(description = "访问密钥", example = "") @Schema(description = "访问密钥", example = "")
@Length(max = 255, message = "访问密钥长度不能超过 {max} 个字符") @Length(max = 255, message = "访问密钥长度不能超过 {max} 个字符")
@NotBlank(message = "访问密钥不能为空", groups = ValidateGroup.Storage.S3.class) @NotBlank(message = "访问密钥不能为空", groups = ValidationGroup.Storage.S3.class)
private String accessKey; private String accessKey;
/** /**
* 私有密钥 * 私有密钥
*/ */
@Schema(description = "私有密钥", example = "") @Schema(description = "私有密钥", example = "")
@NotBlank(message = "私有密钥不能为空", groups = ValidateGroup.Storage.S3.class) @NotBlank(message = "私有密钥不能为空", groups = ValidationGroup.Storage.S3.class)
private String secretKey; private String secretKey;
/** /**
@@ -86,7 +86,7 @@ public class StorageReq extends BaseReq {
*/ */
@Schema(description = "终端节点", example = "") @Schema(description = "终端节点", example = "")
@Length(max = 255, message = "终端节点长度不能超过 {max} 个字符") @Length(max = 255, message = "终端节点长度不能超过 {max} 个字符")
@NotBlank(message = "终端节点不能为空", groups = ValidateGroup.Storage.S3.class) @NotBlank(message = "终端节点不能为空", groups = ValidationGroup.Storage.S3.class)
private String endpoint; private String endpoint;
/** /**
@@ -94,8 +94,8 @@ public class StorageReq extends BaseReq {
*/ */
@Schema(description = "桶名称", example = "C:/continew-admin/data/file/") @Schema(description = "桶名称", example = "C:/continew-admin/data/file/")
@Length(max = 255, message = "桶名称长度不能超过 {max} 个字符") @Length(max = 255, message = "桶名称长度不能超过 {max} 个字符")
@NotBlank(message = "桶名称不能为空", groups = ValidateGroup.Storage.S3.class) @NotBlank(message = "桶名称不能为空", groups = ValidationGroup.Storage.S3.class)
@NotBlank(message = "存储路径不能为空", groups = ValidateGroup.Storage.Local.class) @NotBlank(message = "存储路径不能为空", groups = ValidationGroup.Storage.Local.class)
private String bucketName; private String bucketName;
/** /**

View File

@@ -25,7 +25,7 @@ import lombok.Data;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
import top.continew.admin.common.constant.RegexConstants; import top.continew.admin.common.constant.RegexConstants;
import top.continew.starter.extension.crud.model.req.BaseReq; import top.continew.starter.extension.crud.model.req.BaseReq;
import top.continew.starter.extension.crud.util.ValidateGroup; import top.continew.starter.extension.crud.validation.CrudValidationGroup;
import java.io.Serial; import java.io.Serial;
@@ -59,7 +59,7 @@ public class UserImportRowReq extends BaseReq {
/** /**
* 密码 * 密码
*/ */
@NotBlank(message = "密码不能为空", groups = ValidateGroup.Crud.Add.class) @NotBlank(message = "密码不能为空", groups = CrudValidationGroup.Add.class)
private String password; private String password;
/** /**

View File

@@ -28,7 +28,7 @@ import top.continew.admin.common.constant.RegexConstants;
import top.continew.admin.common.enums.DisEnableStatusEnum; import top.continew.admin.common.enums.DisEnableStatusEnum;
import top.continew.admin.common.enums.GenderEnum; import top.continew.admin.common.enums.GenderEnum;
import top.continew.starter.extension.crud.model.req.BaseReq; import top.continew.starter.extension.crud.model.req.BaseReq;
import top.continew.starter.extension.crud.util.ValidateGroup; import top.continew.starter.extension.crud.validation.CrudValidationGroup;
import java.io.Serial; import java.io.Serial;
import java.util.List; import java.util.List;
@@ -66,7 +66,7 @@ public class UserReq extends BaseReq {
* 密码(加密) * 密码(加密)
*/ */
@Schema(description = "密码(加密)", example = "E7c72TH+LDxKTwavjM99W1MdI9Lljh79aPKiv3XB9MXcplhm7qJ1BJCj28yaflbdVbfc366klMtjLIWQGqb0qw==") @Schema(description = "密码(加密)", example = "E7c72TH+LDxKTwavjM99W1MdI9Lljh79aPKiv3XB9MXcplhm7qJ1BJCj28yaflbdVbfc366klMtjLIWQGqb0qw==")
@NotBlank(message = "密码不能为空", groups = ValidateGroup.Crud.Add.class) @NotBlank(message = "密码不能为空", groups = CrudValidationGroup.Add.class)
private String password; private String password;
/** /**

View File

@@ -34,7 +34,7 @@ import top.continew.admin.system.service.UserService;
import top.continew.starter.core.validation.CheckUtils; import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.data.core.enums.DatabaseType; import top.continew.starter.data.core.enums.DatabaseType;
import top.continew.starter.data.core.util.MetaUtils; import top.continew.starter.data.core.util.MetaUtils;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -35,7 +35,7 @@ import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.core.enums.BaseEnum; import top.continew.starter.core.enums.BaseEnum;
import top.continew.starter.core.validation.CheckUtils; import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.extension.crud.model.resp.LabelValueResp; import top.continew.starter.extension.crud.model.resp.LabelValueResp;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;

View File

@@ -27,7 +27,7 @@ import top.continew.admin.system.service.DictItemService;
import top.continew.admin.system.service.DictService; import top.continew.admin.system.service.DictService;
import top.continew.starter.core.validation.CheckUtils; import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.extension.crud.model.resp.LabelValueResp; import top.continew.starter.extension.crud.model.resp.LabelValueResp;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;

View File

@@ -44,7 +44,7 @@ import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.core.util.StrUtils; import top.continew.starter.core.util.StrUtils;
import top.continew.starter.core.util.URLUtils; import top.continew.starter.core.util.URLUtils;
import top.continew.starter.core.validation.CheckUtils; import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;

View File

@@ -34,7 +34,7 @@ import top.continew.admin.system.service.MenuService;
import top.continew.starter.cache.redisson.util.RedisUtils; import top.continew.starter.cache.redisson.util.RedisUtils;
import top.continew.starter.core.constant.StringConstants; import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.core.validation.CheckUtils; import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;

View File

@@ -27,7 +27,7 @@ import top.continew.admin.system.model.resp.dashboard.DashboardNoticeResp;
import top.continew.admin.system.model.resp.NoticeDetailResp; import top.continew.admin.system.model.resp.NoticeDetailResp;
import top.continew.admin.system.model.resp.NoticeResp; import top.continew.admin.system.model.resp.NoticeResp;
import top.continew.admin.system.service.NoticeService; import top.continew.admin.system.service.NoticeService;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import java.util.List; import java.util.List;

View File

@@ -42,7 +42,7 @@ import top.continew.admin.system.model.resp.RoleDetailResp;
import top.continew.admin.system.model.resp.RoleResp; import top.continew.admin.system.model.resp.RoleResp;
import top.continew.admin.system.service.*; import top.continew.admin.system.service.*;
import top.continew.starter.core.validation.CheckUtils; import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;

View File

@@ -37,13 +37,13 @@ import top.continew.admin.system.model.req.StorageReq;
import top.continew.admin.system.model.resp.StorageResp; import top.continew.admin.system.model.resp.StorageResp;
import top.continew.admin.system.service.FileService; import top.continew.admin.system.service.FileService;
import top.continew.admin.system.service.StorageService; import top.continew.admin.system.service.StorageService;
import top.continew.admin.system.util.ValidateGroup; import top.continew.admin.system.validation.ValidationGroup;
import top.continew.starter.core.constant.StringConstants; import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.core.util.ExceptionUtils; import top.continew.starter.core.util.ExceptionUtils;
import top.continew.starter.core.util.URLUtils; import top.continew.starter.core.util.URLUtils;
import top.continew.starter.core.validation.CheckUtils; import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.core.validation.ValidationUtils; import top.continew.starter.core.validation.ValidationUtils;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import top.continew.starter.web.util.SpringWebUtils; import top.continew.starter.web.util.SpringWebUtils;
import java.util.Collections; import java.util.Collections;
@@ -129,7 +129,7 @@ public class StorageServiceImpl extends BaseServiceImpl<StorageMapper, StorageDO
String bucketName = req.getBucketName(); String bucketName = req.getBucketName();
StorageTypeEnum type = req.getType(); StorageTypeEnum type = req.getType();
if (StorageTypeEnum.LOCAL.equals(type)) { if (StorageTypeEnum.LOCAL.equals(type)) {
ValidationUtils.validate(req, ValidateGroup.Storage.Local.class); ValidationUtils.validate(req, ValidationGroup.Storage.Local.class);
req.setBucketName(StrUtil.appendIfMissing(bucketName req.setBucketName(StrUtil.appendIfMissing(bucketName
.replace(StringConstants.BACKSLASH, StringConstants.SLASH), StringConstants.SLASH)); .replace(StringConstants.BACKSLASH, StringConstants.SLASH), StringConstants.SLASH));
FileStorageProperties.LocalPlusConfig config = new FileStorageProperties.LocalPlusConfig(); FileStorageProperties.LocalPlusConfig config = new FileStorageProperties.LocalPlusConfig();
@@ -139,7 +139,7 @@ public class StorageServiceImpl extends BaseServiceImpl<StorageMapper, StorageDO
.singletonList(config))); .singletonList(config)));
SpringWebUtils.registerResourceHandler(MapUtil.of(URLUtil.url(req.getDomain()).getPath(), bucketName)); SpringWebUtils.registerResourceHandler(MapUtil.of(URLUtil.url(req.getDomain()).getPath(), bucketName));
} else if (StorageTypeEnum.S3.equals(type)) { } else if (StorageTypeEnum.S3.equals(type)) {
ValidationUtils.validate(req, ValidateGroup.Storage.S3.class); ValidationUtils.validate(req, ValidationGroup.Storage.S3.class);
FileStorageProperties.AmazonS3Config config = new FileStorageProperties.AmazonS3Config(); FileStorageProperties.AmazonS3Config config = new FileStorageProperties.AmazonS3Config();
config.setPlatform(req.getCode()); config.setPlatform(req.getCode());
config.setAccessKey(req.getAccessKey()); config.setAccessKey(req.getAccessKey());

View File

@@ -82,7 +82,7 @@ import top.continew.starter.extension.crud.model.query.PageQuery;
import top.continew.starter.extension.crud.model.query.SortQuery; import top.continew.starter.extension.crud.model.query.SortQuery;
import top.continew.starter.extension.crud.model.resp.PageResp; import top.continew.starter.extension.crud.model.resp.PageResp;
import top.continew.starter.extension.crud.service.CommonUserService; import top.continew.starter.extension.crud.service.CommonUserService;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import top.continew.starter.web.util.FileUploadUtils; import top.continew.starter.web.util.FileUploadUtils;
import java.io.IOException; import java.io.IOException;

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package top.continew.admin.system.util; package top.continew.admin.system.validation;
import jakarta.validation.groups.Default; import jakarta.validation.groups.Default;
@@ -24,12 +24,12 @@ import jakarta.validation.groups.Default;
* @author Charles7c * @author Charles7c
* @since 2024/7/3 22:01 * @since 2024/7/3 22:01
*/ */
public interface ValidateGroup extends Default { public interface ValidationGroup extends Default {
/** /**
* 分组校验-增删改查 * 分组校验-增删改查
*/ */
interface Storage extends ValidateGroup { interface Storage extends ValidationGroup {
/** /**
* 本地存储 * 本地存储
*/ */

View File

@@ -7,7 +7,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import ${packageName}.model.query.${classNamePrefix}Query; import ${packageName}.model.query.${classNamePrefix}Query;
import ${packageName}.model.req.${classNamePrefix}Req; import ${packageName}.model.req.${classNamePrefix}Req;
import ${packageName}.model.resp.${classNamePrefix}DetailResp; import ${packageName}.model.resp.${classNamePrefix}DetailResp;

View File

@@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
import ${packageName}.mapper.${classNamePrefix}Mapper; import ${packageName}.mapper.${classNamePrefix}Mapper;
import ${packageName}.model.entity.${classNamePrefix}DO; import ${packageName}.model.entity.${classNamePrefix}DO;
import ${packageName}.model.query.${classNamePrefix}Query; import ${packageName}.model.query.${classNamePrefix}Query;

View File

@@ -30,7 +30,7 @@ import top.continew.admin.open.model.resp.AppResp;
import top.continew.admin.open.model.resp.AppSecretResp; import top.continew.admin.open.model.resp.AppSecretResp;
import top.continew.admin.open.service.AppService; import top.continew.admin.open.service.AppService;
import top.continew.starter.core.constant.StringConstants; import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import top.continew.starter.extension.crud.service.BaseServiceImpl;
/** /**
* 应用业务实现 * 应用业务实现

View File

@@ -33,7 +33,7 @@ import top.continew.admin.open.model.resp.AppResp;
import top.continew.admin.open.model.resp.AppSecretResp; import top.continew.admin.open.model.resp.AppSecretResp;
import top.continew.admin.open.service.AppService; import top.continew.admin.open.service.AppService;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
/** /**

View File

@@ -63,7 +63,7 @@ public class DemoEnvironmentJob {
private static final Long MESSAGE_FLAG = 0L; private static final Long MESSAGE_FLAG = 0L;
private static final Long[] USER_FLAG = {1L, 547889293968801831L}; private static final Long[] USER_FLAG = {1L, 547889293968801831L};
private static final Long ROLE_FLAG = 547888897925840928L; private static final Long ROLE_FLAG = 547888897925840928L;
private static final Long MENU_FLAG = 10003L; private static final Long MENU_FLAG = 10000L;
private static final Long DEPT_FLAG = 547888580614160409L; private static final Long DEPT_FLAG = 547888580614160409L;
/** /**

View File

@@ -30,7 +30,7 @@ import top.continew.admin.schedule.model.req.JobStatusReq;
import top.continew.admin.schedule.model.resp.JobResp; import top.continew.admin.schedule.model.resp.JobResp;
import top.continew.admin.schedule.service.JobService; import top.continew.admin.schedule.service.JobService;
import top.continew.starter.extension.crud.model.resp.PageResp; import top.continew.starter.extension.crud.model.resp.PageResp;
import top.continew.starter.extension.crud.util.ValidateGroup; import top.continew.starter.extension.crud.validation.CrudValidationGroup;
import top.continew.starter.log.core.annotation.Log; import top.continew.starter.log.core.annotation.Log;
import java.util.List; import java.util.List;
@@ -61,7 +61,7 @@ public class JobController {
@Operation(summary = "新增任务", description = "新增任务") @Operation(summary = "新增任务", description = "新增任务")
@SaCheckPermission("schedule:job:add") @SaCheckPermission("schedule:job:add")
@PostMapping @PostMapping
public void add(@Validated(ValidateGroup.Crud.Add.class) @RequestBody JobReq req) { public void add(@Validated(CrudValidationGroup.Add.class) @RequestBody JobReq req) {
baseService.add(req); baseService.add(req);
} }
@@ -69,7 +69,7 @@ public class JobController {
@Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH) @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH)
@SaCheckPermission("schedule:job:update") @SaCheckPermission("schedule:job:update")
@PutMapping("/{id}") @PutMapping("/{id}")
public void update(@Validated(ValidateGroup.Crud.Update.class) @RequestBody JobReq req, @PathVariable Long id) { public void update(@Validated(CrudValidationGroup.Update.class) @RequestBody JobReq req, @PathVariable Long id) {
baseService.update(req, id); baseService.update(req, id);
} }

View File

@@ -18,12 +18,12 @@ package top.continew.admin.controller.system;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import top.continew.admin.common.base.BaseController;
import top.continew.admin.system.model.query.DeptQuery; import top.continew.admin.system.model.query.DeptQuery;
import top.continew.admin.system.model.req.DeptReq; import top.continew.admin.system.model.req.DeptReq;
import top.continew.admin.system.model.resp.DeptResp; import top.continew.admin.system.model.resp.DeptResp;
import top.continew.admin.system.service.DeptService; import top.continew.admin.system.service.DeptService;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
/** /**

View File

@@ -23,7 +23,7 @@ import top.continew.admin.system.model.req.DictReq;
import top.continew.admin.system.model.resp.DictResp; import top.continew.admin.system.model.resp.DictResp;
import top.continew.admin.system.service.DictService; import top.continew.admin.system.service.DictService;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
/** /**

View File

@@ -23,7 +23,7 @@ import top.continew.admin.system.model.req.DictItemReq;
import top.continew.admin.system.model.resp.DictItemResp; import top.continew.admin.system.model.resp.DictItemResp;
import top.continew.admin.system.service.DictItemService; import top.continew.admin.system.service.DictItemService;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
import top.continew.starter.log.core.annotation.Log; import top.continew.starter.log.core.annotation.Log;

View File

@@ -27,7 +27,7 @@ import top.continew.admin.system.model.resp.FileResp;
import top.continew.admin.system.model.resp.FileStatisticsResp; import top.continew.admin.system.model.resp.FileStatisticsResp;
import top.continew.admin.system.service.FileService; import top.continew.admin.system.service.FileService;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
import top.continew.starter.log.core.annotation.Log; import top.continew.starter.log.core.annotation.Log;

View File

@@ -19,10 +19,8 @@ package top.continew.admin.controller.system;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import top.continew.admin.common.base.BaseController;
import top.continew.admin.system.model.query.MenuQuery; import top.continew.admin.system.model.query.MenuQuery;
import top.continew.admin.system.model.req.MenuReq; import top.continew.admin.system.model.req.MenuReq;
import top.continew.admin.system.model.resp.MenuResp; import top.continew.admin.system.model.resp.MenuResp;
@@ -30,11 +28,11 @@ import top.continew.admin.system.service.MenuService;
import top.continew.starter.core.constant.StringConstants; import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.core.util.URLUtils; import top.continew.starter.core.util.URLUtils;
import top.continew.starter.core.validation.ValidationUtils; import top.continew.starter.core.validation.ValidationUtils;
import top.continew.starter.extension.crud.annotation.CrudApi;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
import top.continew.starter.extension.crud.model.resp.BaseIdResp;
import top.continew.starter.extension.crud.util.ValidateGroup; import java.lang.reflect.Method;
/** /**
* 菜单管理 API * 菜单管理 API
@@ -48,23 +46,13 @@ import top.continew.starter.extension.crud.util.ValidateGroup;
public class MenuController extends BaseController<MenuService, MenuResp, MenuResp, MenuQuery, MenuReq> { public class MenuController extends BaseController<MenuService, MenuResp, MenuResp, MenuQuery, MenuReq> {
@Override @Override
public BaseIdResp<Long> add(@Validated(ValidateGroup.Crud.Add.class) @RequestBody MenuReq req) { public void preHandle(CrudApi crudApi, Object[] args, Method targetMethod, Class<?> targetClass) throws Exception {
this.checkPath(req); super.preHandle(crudApi, args, targetMethod, targetClass);
return super.add(req); Api api = crudApi.value();
if (!(Api.ADD.equals(api) || Api.UPDATE.equals(api))) {
return;
} }
MenuReq req = (MenuReq)args[0];
@Override
public void update(@Validated(ValidateGroup.Crud.Update.class) @RequestBody MenuReq req, @PathVariable Long id) {
this.checkPath(req);
super.update(req, id);
}
/**
* 检查路由地址格式
*
* @param req 创建或修改参数
*/
private void checkPath(MenuReq req) {
Boolean isExternal = ObjectUtil.defaultIfNull(req.getIsExternal(), false); Boolean isExternal = ObjectUtil.defaultIfNull(req.getIsExternal(), false);
String path = req.getPath(); String path = req.getPath();
ValidationUtils.throwIf(Boolean.TRUE.equals(isExternal) && !URLUtils ValidationUtils.throwIf(Boolean.TRUE.equals(isExternal) && !URLUtils

View File

@@ -17,10 +17,8 @@
package top.continew.admin.controller.system; package top.continew.admin.controller.system;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import top.continew.admin.common.base.BaseController;
import top.continew.admin.system.enums.NoticeScopeEnum; import top.continew.admin.system.enums.NoticeScopeEnum;
import top.continew.admin.system.model.query.NoticeQuery; import top.continew.admin.system.model.query.NoticeQuery;
import top.continew.admin.system.model.req.NoticeReq; import top.continew.admin.system.model.req.NoticeReq;
@@ -28,12 +26,11 @@ import top.continew.admin.system.model.resp.NoticeDetailResp;
import top.continew.admin.system.model.resp.NoticeResp; import top.continew.admin.system.model.resp.NoticeResp;
import top.continew.admin.system.service.NoticeService; import top.continew.admin.system.service.NoticeService;
import top.continew.starter.core.validation.ValidationUtils; import top.continew.starter.core.validation.ValidationUtils;
import top.continew.starter.extension.crud.annotation.CrudApi;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
import top.continew.starter.extension.crud.model.resp.BaseIdResp;
import top.continew.starter.extension.crud.util.ValidateGroup;
import java.lang.reflect.Method;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
@@ -48,23 +45,13 @@ import java.time.LocalDateTime;
public class NoticeController extends BaseController<NoticeService, NoticeResp, NoticeDetailResp, NoticeQuery, NoticeReq> { public class NoticeController extends BaseController<NoticeService, NoticeResp, NoticeDetailResp, NoticeQuery, NoticeReq> {
@Override @Override
public BaseIdResp<Long> add(@Validated(ValidateGroup.Crud.Add.class) @RequestBody NoticeReq req) { public void preHandle(CrudApi crudApi, Object[] args, Method targetMethod, Class<?> targetClass) throws Exception {
this.check(req); super.preHandle(crudApi, args, targetMethod, targetClass);
return super.add(req); Api api = crudApi.value();
if (!(Api.ADD.equals(api) || Api.UPDATE.equals(api))) {
return;
} }
NoticeReq req = (NoticeReq)args[0];
@Override
public void update(@Validated(ValidateGroup.Crud.Update.class) @RequestBody NoticeReq req, @PathVariable Long id) {
this.check(req);
super.update(req, id);
}
/**
* 校验
*
* @param req 创建或修改参数
*/
private void check(NoticeReq req) {
// 校验生效时间 // 校验生效时间
LocalDateTime effectiveTime = req.getEffectiveTime(); LocalDateTime effectiveTime = req.getEffectiveTime();
LocalDateTime terminateTime = req.getTerminateTime(); LocalDateTime terminateTime = req.getTerminateTime();

View File

@@ -34,7 +34,7 @@ import top.continew.admin.system.model.resp.RoleResp;
import top.continew.admin.system.service.RoleService; import top.continew.admin.system.service.RoleService;
import top.continew.admin.system.service.UserRoleService; import top.continew.admin.system.service.UserRoleService;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
import java.util.List; import java.util.List;

View File

@@ -23,7 +23,7 @@ import top.continew.admin.system.model.req.StorageReq;
import top.continew.admin.system.model.resp.StorageResp; import top.continew.admin.system.model.resp.StorageResp;
import top.continew.admin.system.service.StorageService; import top.continew.admin.system.service.StorageService;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
/** /**

View File

@@ -44,10 +44,10 @@ import top.continew.admin.system.service.UserService;
import top.continew.starter.core.util.ExceptionUtils; import top.continew.starter.core.util.ExceptionUtils;
import top.continew.starter.core.validation.ValidationUtils; import top.continew.starter.core.validation.ValidationUtils;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping; import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.controller.BaseController; import top.continew.admin.common.base.BaseController;
import top.continew.starter.extension.crud.enums.Api; import top.continew.starter.extension.crud.enums.Api;
import top.continew.starter.extension.crud.model.resp.BaseIdResp; import top.continew.starter.extension.crud.model.resp.BaseIdResp;
import top.continew.starter.extension.crud.util.ValidateGroup; import top.continew.starter.extension.crud.validation.CrudValidationGroup;
import java.io.IOException; import java.io.IOException;
@@ -68,7 +68,7 @@ public class UserController extends BaseController<UserService, UserResp, UserDe
private final UserService userService; private final UserService userService;
@Override @Override
public BaseIdResp<Long> add(@Validated(ValidateGroup.Crud.Add.class) @RequestBody UserReq req) { public BaseIdResp<Long> add(@Validated(CrudValidationGroup.Add.class) @RequestBody UserReq req) {
String rawPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getPassword())); String rawPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getPassword()));
ValidationUtils.throwIfNull(rawPassword, "密码解密失败"); ValidationUtils.throwIfNull(rawPassword, "密码解密失败");
ValidationUtils.throwIf(!ReUtil ValidationUtils.throwIf(!ReUtil

View File

@@ -5,5 +5,5 @@
\____|\___/ |_| |_| \__||_||_| \_| \___| \_/\_/ /_/ \_\\__,_||_| |_| |_||_||_| |_| \____|\___/ |_| |_| \__||_||_| \_| \___| \_/\_/ /_/ \_\\__,_||_| |_| |_||_||_| |_|
:: ${project.name} :: v${project.version} :: ${project.name} :: v${project.version}
:: ContiNew Starter :: v2.7.4 :: ContiNew Starter :: v2.7.5
:: Spring Boot :: v${spring-boot.version} :: Spring Boot :: v${spring-boot.version}

View File

@@ -13,7 +13,7 @@
<parent> <parent>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>
<artifactId>continew-starter</artifactId> <artifactId>continew-starter</artifactId>
<version>2.7.4</version> <version>2.7.5</version>
</parent> </parent>
<groupId>top.continew</groupId> <groupId>top.continew</groupId>