mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 00:57:13 +08:00 
			
		
		
		
	build: continew-starter 2.12.2 => 2.13.0
1.引入 continew-starter-validation(从 core 拆分)、sa-token-sign(从 sa-token-core 拆分并调整了部分 API) 2.Starter import 包路径调整 - EasyExcel 替换为 FastExcel:com.alibaba.excel(EasyExcel) => cn.idev.excel(FastExcel) - top.continew.starter.file.excel => top.continew.starter.excel - top.continew.starter.core.validation.constraints => top.continew.starter.validation.constraints - top.continew.starter.core.validation.ValidationUtils、CheckUtils、Validator => top.continew.starter.core.util.validation - cn.dev33.satoken.sign => cn.dev33.satoken.sign.template - top.continew.starter.core.autoconfigure.project => top.continew.starter.core.autoconfigure.application - top.continew.starter.data.core、top.continew.starter.data.mp => top.continew.starter.data - top.continew.starter.data.mp.base.BaseMapper => top.continew.starter.data.mapper.BaseMapper 2.Starter 基础类命名调整 CRUD:AbstractBaseController => AbstractCrudController,BaseService => CrudService,BaseServiceImpl => CrudServiceImpl Core:ProjectProperties(项目配置,project.xxx) => ApplicationProperties(应用配置更为贴切,且变量 application.xx 可以和 Maven 变量显著区分开) 3.groupId 调整:top.continew.starter、top.continew.admin(避免部分童鞋全局替换包名时出现把 starter 也一起替换了!) 4.Admin import 包路径调整:BaseController、BaseDO等 => common.base 5.新增 BaseService、BaseServiceImpl 替代 Starter 原 BaseXxx,方便用户根据项目实际需要重写或新增全局通用接口、方法 6.snail-job server 数据库脚本更新至 v1.5.0 7.Valid 及 Validated 使用梳理(CrudService 支持通过在实现类添加 Validated 注解来实现 Service 层基础校验)
This commit is contained in:
		| @@ -4,7 +4,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-admin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
| @@ -55,15 +55,27 @@ | ||||
|             <artifactId>postgresql</artifactId> | ||||
|         </dependency>--> | ||||
|  | ||||
|         <!-- ContiNew Starter 扩展模块 - CURD(增删改查) --> | ||||
|         <!-- ContiNew Starter JSON 模块 - Jackson --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-extension-crud-mp</artifactId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-json-jackson</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 验证模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-validation</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 缓存模块 - JetCache --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-cache-jetcache</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 认证模块 - SaToken --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-auth-satoken</artifactId> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
| @@ -72,28 +84,63 @@ | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <!-- API 接口参数签名 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.dev33</groupId> | ||||
|             <artifactId>sa-token-sign</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 认证模块 - JustAuth --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-auth-justauth</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 缓存模块 - JetCache --> | ||||
|         <!-- ContiNew Starter 安全模块 - 密码编码器 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-cache-jetcache</artifactId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-security-password</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 数据权限模块 - MyBatis Plus --> | ||||
|         <!-- ContiNew Starter 安全模块 - 加密 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-extension-datapermission-mp</artifactId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-security-crypto</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 安全模块 - 脱敏 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-security-mask</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 限流模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-ratelimiter</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 验证码模块 - 图形验证码 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-captcha-graphic</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 验证码模块 - 行为验证码 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-captcha-behavior</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 消息模块 - 邮件 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-messaging-mail</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 消息模块 - WebSocket --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-messaging-websocket</artifactId> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
| @@ -103,58 +150,22 @@ | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 消息模块 - 邮件 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-messaging-mail</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 验证码模块 - 图形验证码 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-captcha-graphic</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 验证码模块 - 行为验证码 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-captcha-behavior</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 限流模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-ratelimiter</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 安全模块 - 加密 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-security-crypto</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 安全模块 - 脱敏 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-security-mask</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 安全模块 - 密码编码器 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-security-password</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter JSON 模块 - Jackson --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <artifactId>continew-starter-json-jackson</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 日志模块 - 拦截器版(Spring Boot Actuator HttpTrace 增强版) --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-log-interceptor</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 数据权限模块 - MyBatis Plus --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-extension-datapermission-mp</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 扩展模块 - CURD(增删改查) --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-extension-crud-mp</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| </project> | ||||
| @@ -14,21 +14,21 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.controller; | ||||
| package top.continew.admin.common.base.controller; | ||||
| 
 | ||||
| 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.sign.template.SaSignTemplate; | ||||
| import cn.dev33.satoken.stp.StpUtil; | ||||
| import cn.hutool.core.annotation.AnnotationUtil; | ||||
| import cn.hutool.core.text.CharSequenceUtil; | ||||
| import top.continew.admin.common.base.service.BaseService; | ||||
| 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.controller.AbstractCrudController; | ||||
| import top.continew.starter.extension.crud.enums.Api; | ||||
| import top.continew.starter.extension.crud.service.BaseService; | ||||
| 
 | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.Collection; | ||||
| @@ -36,32 +36,52 @@ import java.util.Collection; | ||||
| /** | ||||
|  * 控制器基类 | ||||
|  *  | ||||
|  * <p> | ||||
|  * 根据实际项目需要,自行重写 CRUD 接口或增加自定义通用业务接口 | ||||
|  * </p> | ||||
|  * | ||||
|  * @param <S> 业务接口 | ||||
|  * @param <L> 列表类型 | ||||
|  * @param <D> 详情类型 | ||||
|  * @param <Q> 查询条件 | ||||
|  * @param <C> 创建或修改参数类型 | ||||
|  * @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 AbstractBaseController<S, L, D, Q, C> { | ||||
| public class BaseController<S extends BaseService<L, D, Q, C>, L, D, Q, C> extends AbstractCrudController<S, L, D, Q, C> { | ||||
| 
 | ||||
|     @Override | ||||
|     public void preHandle(CrudApi crudApi, Object[] args, Method targetMethod, Class<?> targetClass) throws Exception { | ||||
|         // 忽略带 sign 请求权限校验 | ||||
|         SaRequest saRequest = SaHolder.getRequest(); | ||||
|         Collection<String> paramNames = saRequest.getParamNames(); | ||||
|         if (paramNames.stream().anyMatch(SaSignTemplate.sign::equals)) { | ||||
|             return; | ||||
|         } | ||||
|         // 忽略接口类或接口方法上带 @SaIgnore 注解的权限校验 | ||||
|         if (AnnotationUtil.hasAnnotation(targetMethod, SaIgnore.class) || AnnotationUtil | ||||
|             .hasAnnotation(targetClass, SaIgnore.class)) { | ||||
|             return; | ||||
|         } | ||||
|         // 校验权限,例如:创建用户接口(POST /system/user) => 校验 system:user:create 权限 | ||||
|         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(); | ||||
|         String apiName = this.getApiName(crudApi.value()); | ||||
|         StpUtil.checkPermission("%s:%s".formatted(prefix, apiName.toLowerCase())); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 获取 API 名称 | ||||
|      * | ||||
|      * @param api API | ||||
|      * @return API 名称 | ||||
|      */ | ||||
|     private String getApiName(Api api) { | ||||
|         return switch (api) { | ||||
|             case PAGE, TREE, LIST -> Api.LIST.name(); | ||||
|             case DELETE, BATCH_DELETE -> Api.DELETE.name(); | ||||
|             default -> api.name(); | ||||
|         }; | ||||
|     } | ||||
| } | ||||
| @@ -14,13 +14,13 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.config.mybatis; | ||||
| package top.continew.admin.common.base.mapper; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.core.conditions.Wrapper; | ||||
| import com.baomidou.mybatisplus.core.metadata.IPage; | ||||
| import com.baomidou.mybatisplus.core.toolkit.Constants; | ||||
| import org.apache.ibatis.annotations.Param; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
| import top.continew.starter.extension.datapermission.annotation.DataPermission; | ||||
| 
 | ||||
| import java.io.Serializable; | ||||
| @@ -14,7 +14,7 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.model.entity; | ||||
| package top.continew.admin.common.base.model.entity; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.annotation.FieldFill; | ||||
| import com.baomidou.mybatisplus.annotation.TableField; | ||||
| @@ -14,7 +14,7 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.model.entity; | ||||
| package top.continew.admin.common.base.model.entity; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.annotation.FieldFill; | ||||
| import com.baomidou.mybatisplus.annotation.TableField; | ||||
| @@ -14,7 +14,7 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.model.entity; | ||||
| package top.continew.admin.common.base.model.entity; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.annotation.FieldFill; | ||||
| import com.baomidou.mybatisplus.annotation.TableField; | ||||
| @@ -14,7 +14,7 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.model.req; | ||||
| package top.continew.admin.common.base.model.req; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| @@ -14,12 +14,12 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.model.resp; | ||||
| package top.continew.admin.common.base.model.resp; | ||||
| 
 | ||||
| import cn.crane4j.annotation.Assemble; | ||||
| import cn.crane4j.annotation.Mapping; | ||||
| import cn.crane4j.annotation.condition.ConditionOnPropertyNotNull; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import cn.idev.excel.annotation.ExcelProperty; | ||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| @@ -14,11 +14,11 @@ | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| package top.continew.admin.common.model.resp; | ||||
| package top.continew.admin.common.base.model.resp; | ||||
| 
 | ||||
| import cn.crane4j.annotation.Assemble; | ||||
| import cn.crane4j.annotation.Mapping; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import cn.idev.excel.annotation.ExcelProperty; | ||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | ||||
| import com.fasterxml.jackson.annotation.JsonInclude; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| @@ -0,0 +1,36 @@ | ||||
| /* | ||||
|  * 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.service; | ||||
|  | ||||
| import top.continew.starter.extension.crud.service.CrudService; | ||||
|  | ||||
| /** | ||||
|  * 业务接口基类 | ||||
|  * | ||||
|  * <p> | ||||
|  * 根据实际项目需要,自行重写 CRUD 接口或增加自定义通用业务方法 | ||||
|  * </p> | ||||
|  *  | ||||
|  * @param <L> 列表类型 | ||||
|  * @param <D> 详情类型 | ||||
|  * @param <Q> 查询条件类型 | ||||
|  * @param <C> 创建或修改请求参数类型 | ||||
|  * @author Charles7c | ||||
|  * @since 2024/12/6 20:30 | ||||
|  */ | ||||
| public interface BaseService<L, D, Q, C> extends CrudService<L, D, Q, C> { | ||||
| } | ||||
| @@ -0,0 +1,41 @@ | ||||
| /* | ||||
|  * 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.service; | ||||
|  | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
| import top.continew.starter.extension.crud.model.entity.BaseIdDO; | ||||
| import top.continew.starter.extension.crud.service.CrudServiceImpl; | ||||
|  | ||||
| /** | ||||
|  * 业务实现基类 | ||||
|  * | ||||
|  * | ||||
|  * <p> | ||||
|  * 根据实际项目需要,自行重写 CRUD 接口或增加自定义通用业务方法实现 | ||||
|  * </p> | ||||
|  *  | ||||
|  * @param <M> Mapper 接口 | ||||
|  * @param <T> 实体类型 | ||||
|  * @param <L> 列表类型 | ||||
|  * @param <D> 详情类型 | ||||
|  * @param <Q> 查询条件类型 | ||||
|  * @param <C> 创建或修改请求参数类型 | ||||
|  * @author Charles7c | ||||
|  * @since 2024/12/6 20:30 | ||||
|  */ | ||||
| public class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdDO, L, D, Q, C> extends CrudServiceImpl<M, T, L, D, Q, C> implements BaseService<L, D, Q, C> { | ||||
| } | ||||
| @@ -19,11 +19,11 @@ package top.continew.admin.common.config.excel; | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.convert.Convert; | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| import com.alibaba.excel.converters.Converter; | ||||
| import com.alibaba.excel.metadata.GlobalConfiguration; | ||||
| import com.alibaba.excel.metadata.data.ReadCellData; | ||||
| import com.alibaba.excel.metadata.data.WriteCellData; | ||||
| import com.alibaba.excel.metadata.property.ExcelContentProperty; | ||||
| import cn.idev.excel.converters.Converter; | ||||
| import cn.idev.excel.metadata.GlobalConfiguration; | ||||
| import cn.idev.excel.metadata.data.ReadCellData; | ||||
| import cn.idev.excel.metadata.data.WriteCellData; | ||||
| import cn.idev.excel.metadata.property.ExcelContentProperty; | ||||
| import top.continew.admin.common.service.CommonDictItemService; | ||||
| import top.continew.starter.core.constant.StringConstants; | ||||
| import top.continew.starter.extension.crud.model.resp.LabelValueResp; | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import cn.hutool.core.util.ObjectUtil; | ||||
| import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; | ||||
| import org.apache.ibatis.reflection.MetaObject; | ||||
| import top.continew.admin.common.context.UserContextHolder; | ||||
| import top.continew.admin.common.model.entity.BaseDO; | ||||
| import top.continew.admin.common.base.model.entity.BaseDO; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
|   | ||||
| @@ -22,7 +22,7 @@ import cn.hutool.crypto.asymmetric.KeyType; | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| import top.continew.admin.common.config.properties.RsaProperties; | ||||
| import top.continew.starter.core.exception.BusinessException; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.security.crypto.autoconfigure.CryptoProperties; | ||||
| import top.continew.starter.security.crypto.encryptor.AesEncryptor; | ||||
| import top.continew.starter.security.crypto.encryptor.IEncryptor; | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-extension</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
| @@ -17,7 +17,7 @@ | ||||
|  | ||||
|     <properties> | ||||
|         <!-- SnailJob 服务端 --> | ||||
|         <snail-job.version>1.4.0</snail-job.version> | ||||
|         <snail-job.version>1.5.0</snail-job.version> | ||||
|     </properties> | ||||
|  | ||||
|     <dependencies> | ||||
|   | ||||
| @@ -1,14 +1,14 @@ | ||||
| -- liquibase formatted sql | ||||
|  | ||||
| -- changeset snail-job-server:1.1.0 | ||||
| -- 默认命名空间:Default | ||||
| INSERT INTO `sj_namespace` (`id`, `name`, `unique_id`, `create_dt`, `update_dt`, `deleted`) | ||||
| VALUES (1, 'Default', '764d604ec6fc45f68cd92514c40e9e1a', NOW(), NOW(), 0); | ||||
|  | ||||
| -- changeset snail-job-server:1.5.0 | ||||
| -- 默认用户:admin/admin | ||||
| INSERT INTO `sj_system_user` (username, password, role) | ||||
| VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2); | ||||
|  | ||||
| -- 默认命名空间:Default | ||||
| INSERT INTO `sj_namespace` (`id`, `name`, `unique_id`, `create_dt`, `update_dt`, `deleted`) | ||||
| VALUES (1, 'Default', '764d604ec6fc45f68cd92514c40e9e1a', NOW(), NOW(), 0); | ||||
|  | ||||
| -- 默认分组:continew-admin | ||||
| INSERT INTO `sj_group_config` (`id`, `namespace_id`, `group_name`, `description`, `token`, `group_status`, `version`, `group_partition`, `id_generator_mode`, `init_scene`, `create_dt`, `update_dt`) | ||||
| VALUES (1, '764d604ec6fc45f68cd92514c40e9e1a', 'continew-admin', '默认分组', 'SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj', 1, 1, 0, 2, 1, NOW(), NOW()); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| -- liquibase formatted sql | ||||
|  | ||||
| -- changeset snail-job-server:1.1.0 | ||||
| -- changeset snail-job-server:1.5.0 | ||||
| SET NAMES utf8mb4; | ||||
|  | ||||
| CREATE TABLE `sj_namespace` | ||||
| @@ -84,10 +84,14 @@ CREATE TABLE `sj_retry_dead_letter` | ||||
|     `id`              bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', | ||||
|     `namespace_id`    varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', | ||||
|     `group_name`      varchar(64)         NOT NULL COMMENT '组名称', | ||||
|     `group_id`        bigint(20)          NOT NULL COMMENT '组Id', | ||||
|     `scene_name`      varchar(64)         NOT NULL COMMENT '场景名称', | ||||
|     `scene_id`        bigint(20)          NOT NULL COMMENT '场景ID', | ||||
|     `idempotent_id`   varchar(64)         NOT NULL COMMENT '幂等id', | ||||
|     `biz_no`          varchar(64)         NOT NULL DEFAULT '' COMMENT '业务编号', | ||||
|     `executor_name`   varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称', | ||||
|     -- jackson 兼容历史数据 预计1.8.0默认改为fury | ||||
|     `serializer_name` varchar(32)         NOT NULL DEFAULT 'jackson' COMMENT '执行方法参数序列化器名称', | ||||
|     `args_str`        text                NOT NULL COMMENT '执行方法参数', | ||||
|     `ext_attrs`       text                NOT NULL COMMENT '扩展字段', | ||||
|     `create_dt`       datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||
| @@ -106,12 +110,16 @@ CREATE TABLE `sj_retry` | ||||
|     `id`              bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', | ||||
|     `namespace_id`    varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', | ||||
|     `group_name`      varchar(64)         NOT NULL COMMENT '组名称', | ||||
|     `group_id`        bigint(20)          NOT NULL COMMENT '组Id', | ||||
|     `scene_name`      varchar(64)         NOT NULL COMMENT '场景名称', | ||||
|     `scene_id`        bigint(20)          NOT NULL COMMENT '场景ID', | ||||
|     `idempotent_id`   varchar(64)         NOT NULL COMMENT '幂等id', | ||||
|     `biz_no`          varchar(64)         NOT NULL DEFAULT '' COMMENT '业务编号', | ||||
|     `executor_name`   varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称', | ||||
|     `args_str`        text                NOT NULL COMMENT '执行方法参数', | ||||
|     `ext_attrs`       text                NOT NULL COMMENT '扩展字段', | ||||
|     -- jackson 兼容历史数据 预计1.8.0默认改为fury | ||||
|     `serializer_name` varchar(32)         NOT NULL DEFAULT 'jackson' COMMENT '执行方法参数序列化器名称', | ||||
|     `next_trigger_at` bigint(13)          NOT NULL COMMENT '下次触发时间', | ||||
|     `retry_count`     int(11)             NOT NULL DEFAULT 0 COMMENT '重试次数', | ||||
|     `retry_status`    tinyint(4)          NOT NULL DEFAULT 0 COMMENT '重试状态 0、重试中 1、成功 2、最大重试次数', | ||||
| @@ -122,13 +130,12 @@ CREATE TABLE `sj_retry` | ||||
|     `create_dt`       datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||
|     `update_dt`       datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', | ||||
|     PRIMARY KEY (`id`), | ||||
|     KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`), | ||||
|     KEY `idx_namespace_id_group_name_retry_status` (`namespace_id`, `group_name`, `retry_status`), | ||||
|     KEY `idx_idempotent_id` (`idempotent_id`), | ||||
|     KEY `idx_biz_no` (`biz_no`), | ||||
|     KEY `idx_idempotent_id` (`idempotent_id`), | ||||
|     KEY `idx_retry_status_bucket_index` (`retry_status`, `bucket_index`), | ||||
|     KEY `idx_parent_id` (`parent_id`), | ||||
|     KEY `idx_create_dt` (`create_dt`), | ||||
|     UNIQUE KEY `uk_name_task_type_idempotent_id_deleted` (`namespace_id`, `group_name`, `task_type`, `idempotent_id`, `deleted`) | ||||
|     UNIQUE KEY `uk_scene_tasktype_idempotentid_deleted` (`scene_id`, `task_type`, `idempotent_id`, `deleted`) | ||||
| ) ENGINE = InnoDB | ||||
|   AUTO_INCREMENT = 0 | ||||
|   DEFAULT CHARSET = utf8mb4 COMMENT ='重试信息表' | ||||
| @@ -196,6 +203,8 @@ CREATE TABLE `sj_retry_scene_config` | ||||
|     `cb_trigger_type`     tinyint(4)          NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式', | ||||
|     `cb_max_count`        int(11)             NOT NULL DEFAULT 16 COMMENT '回调的最大执行次数', | ||||
|     `cb_trigger_interval` varchar(16)         NOT NULL DEFAULT '' COMMENT '回调的最大执行次数', | ||||
|     `owner_id`            bigint(20)          NULL     DEFAULT NULL COMMENT '负责人id', | ||||
|     `labels`              varchar(512)        NULL     DEFAULT '' COMMENT '标签', | ||||
|     `description`         varchar(256)        NOT NULL DEFAULT '' COMMENT '描述', | ||||
|     `create_dt`           datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||
|     `update_dt`           datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', | ||||
| @@ -217,6 +226,7 @@ CREATE TABLE `sj_server_node` | ||||
|     `expire_at`    datetime            NOT NULL COMMENT '过期时间', | ||||
|     `node_type`    tinyint(4)          NOT NULL COMMENT '节点类型 1、客户端 2、是服务端', | ||||
|     `ext_attrs`    varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段', | ||||
|     `labels`       varchar(512)        NULL     DEFAULT '' COMMENT '标签', | ||||
|     `create_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||
|     `update_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', | ||||
|     PRIMARY KEY (`id`), | ||||
| @@ -268,19 +278,6 @@ CREATE TABLE `sj_system_user_permission` | ||||
| ) ENGINE = InnoDB | ||||
|   DEFAULT CHARSET = utf8mb4 COMMENT ='系统用户权限表'; | ||||
|  | ||||
| CREATE TABLE `sj_sequence_alloc` | ||||
| ( | ||||
|     `id`           bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', | ||||
|     `namespace_id` varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', | ||||
|     `group_name`   varchar(64)         NOT NULL DEFAULT '' COMMENT '组名称', | ||||
|     `max_id`       bigint(20)          NOT NULL DEFAULT 1 COMMENT '最大id', | ||||
|     `step`         int(11)             NOT NULL DEFAULT 100 COMMENT '步长', | ||||
|     `update_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | ||||
|     PRIMARY KEY (`id`), | ||||
|     UNIQUE KEY `uk_namespace_id_group_name` (`namespace_id`, `group_name`) | ||||
| ) ENGINE = InnoDB | ||||
|   DEFAULT CHARSET = utf8mb4 COMMENT ='号段模式序号ID分配表'; | ||||
|  | ||||
| -- 分布式调度DDL | ||||
| CREATE TABLE `sj_job` | ||||
| ( | ||||
| @@ -306,7 +303,8 @@ CREATE TABLE `sj_job` | ||||
|     `bucket_index`     int(11)             NOT NULL DEFAULT 0 COMMENT 'bucket', | ||||
|     `resident`         tinyint(4)          NOT NULL DEFAULT 0 COMMENT '是否是常驻任务', | ||||
|     `notify_ids`       varchar(128)        NOT NULL DEFAULT '' COMMENT '通知告警场景配置id列表', | ||||
|     `owner_id`         bigint(20)          NULL                 COMMENT '负责人id', | ||||
|     `owner_id`         bigint(20)          NULL     DEFAULT NULL COMMENT '负责人id', | ||||
|     `labels`           varchar(512)        NULL     DEFAULT '' COMMENT '标签', | ||||
|     `description`      varchar(256)        NOT NULL DEFAULT '' COMMENT '描述', | ||||
|     `ext_attrs`        varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段', | ||||
|     `deleted`          tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除', | ||||
| @@ -459,6 +457,7 @@ CREATE TABLE `sj_workflow` | ||||
|     `notify_ids`       varchar(128)        NOT NULL DEFAULT '' COMMENT '通知告警场景配置id列表', | ||||
|     `bucket_index`     int(11)             NOT NULL DEFAULT 0 COMMENT 'bucket', | ||||
|     `version`          int(11)             NOT NULL COMMENT '版本号', | ||||
|     `owner_id`         bigint(20)          NULL     DEFAULT NULL COMMENT '负责人id', | ||||
|     `ext_attrs`        varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段', | ||||
|     `deleted`          tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除', | ||||
|     `create_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||
| @@ -519,3 +518,19 @@ CREATE TABLE `sj_workflow_task_batch` | ||||
| ) ENGINE = InnoDB | ||||
|   AUTO_INCREMENT = 0 | ||||
|   DEFAULT CHARSET = utf8mb4 COMMENT ='工作流批次'; | ||||
|  | ||||
| CREATE TABLE `sj_job_executor` | ||||
| ( | ||||
|     `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', | ||||
|     `namespace_id`  varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', | ||||
|     `group_name`    varchar(64)         NOT NULL COMMENT '组名称', | ||||
|     `executor_info` varchar(256)        NOT NULL COMMENT '任务执行器名称', | ||||
|     `executor_type` varchar(3)          NOT NULL COMMENT '1:java 2:python 3:go', | ||||
|     `create_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||
|     `update_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', | ||||
|     PRIMARY KEY (`id`), | ||||
|     KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`), | ||||
|     KEY `idx_create_dt` (`create_dt`) | ||||
| ) ENGINE = InnoDB | ||||
|   AUTO_INCREMENT = 0 | ||||
|   DEFAULT CHARSET = utf8mb4 COMMENT ='任务执行器信息'; | ||||
| @@ -1,14 +1,14 @@ | ||||
| -- liquibase formatted sql | ||||
|  | ||||
| -- changeset snail-job-server:1.1.0 | ||||
| -- 默认命名空间:Default | ||||
| INSERT INTO sj_namespace (id, name, unique_id, create_dt, update_dt, deleted) | ||||
| VALUES (1, 'Default', '764d604ec6fc45f68cd92514c40e9e1a', NOW(), NOW(), 0); | ||||
|  | ||||
| -- changeset snail-job-server:1.5.0 | ||||
| -- 默认用户:admin/admin | ||||
| INSERT INTO sj_system_user (username, password, role) | ||||
| VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2); | ||||
|  | ||||
| -- 默认命名空间:Default | ||||
| INSERT INTO sj_namespace (id, name, unique_id, create_dt, update_dt, deleted) | ||||
| VALUES (1, 'Default', '764d604ec6fc45f68cd92514c40e9e1a', NOW(), NOW(), 0); | ||||
|  | ||||
| -- 默认分组:continew-admin | ||||
| INSERT INTO sj_group_config (id, namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) | ||||
| VALUES (1, '764d604ec6fc45f68cd92514c40e9e1a', 'continew-admin', '默认分组', 'SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj', 1, 1, 0, 2, 1, NOW(), NOW()); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| -- liquibase formatted sql | ||||
|  | ||||
| -- changeset snail-job-server:1.1.0 | ||||
| -- changeset snail-job-server:1.5.0 | ||||
| -- sj_namespace | ||||
| CREATE TABLE sj_namespace | ||||
| ( | ||||
| @@ -125,10 +125,13 @@ CREATE TABLE sj_retry_dead_letter | ||||
|     id              bigserial PRIMARY KEY, | ||||
|     namespace_id    varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', | ||||
|     group_name      varchar(64)  NOT NULL, | ||||
|     group_id        bigint       NOT NULL, | ||||
|     scene_name      varchar(64)  NOT NULL, | ||||
|     scene_id        bigint       NOT NULL, | ||||
|     idempotent_id   varchar(64)  NOT NULL, | ||||
|     biz_no          varchar(64)  NOT NULL DEFAULT '', | ||||
|     executor_name   varchar(512) NOT NULL DEFAULT '', | ||||
|     serializer_name varchar(32)  NOT NULL DEFAULT 'jackson', | ||||
|     args_str        text         NOT NULL, | ||||
|     ext_attrs       text         NOT NULL, | ||||
|     create_dt       timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP | ||||
| @@ -142,10 +145,13 @@ CREATE INDEX idx_sj_retry_dead_letter_04 ON sj_retry_dead_letter (create_dt); | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.id IS '主键'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.namespace_id IS '命名空间id'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.group_name IS '组名称'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.group_id IS '组Id'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.scene_name IS '场景名称'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.scene_id IS '场景ID'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.idempotent_id IS '幂等id'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.biz_no IS '业务编号'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.executor_name IS '执行器名称'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.serializer_name IS '执行方法参数序列化器名称'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.args_str IS '执行方法参数'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.ext_attrs IS '扩展字段'; | ||||
| COMMENT ON COLUMN sj_retry_dead_letter.create_dt IS '创建时间'; | ||||
| @@ -157,12 +163,15 @@ CREATE TABLE sj_retry | ||||
|     id              bigserial PRIMARY KEY, | ||||
|     namespace_id    varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', | ||||
|     group_name      varchar(64)  NOT NULL, | ||||
|     group_id        bigint       NOT NULL, | ||||
|     scene_name      varchar(64)  NOT NULL, | ||||
|     scene_id        bigint       NOT NULL, | ||||
|     idempotent_id   varchar(64)  NOT NULL, | ||||
|     biz_no          varchar(64)  NOT NULL DEFAULT '', | ||||
|     executor_name   varchar(512) NOT NULL DEFAULT '', | ||||
|     args_str        text         NOT NULL, | ||||
|     ext_attrs       text         NOT NULL, | ||||
|     serializer_name varchar(32)  NOT NULL DEFAULT 'jackson', | ||||
|     next_trigger_at bigint       NOT NULL, | ||||
|     retry_count     int          NOT NULL DEFAULT 0, | ||||
|     retry_status    smallint     NOT NULL DEFAULT 0, | ||||
| @@ -174,24 +183,26 @@ CREATE TABLE sj_retry | ||||
|     update_dt       timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP | ||||
| ); | ||||
|  | ||||
| CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted); | ||||
| CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (scene_id, task_type, idempotent_id, deleted); | ||||
|  | ||||
| CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name); | ||||
| CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status); | ||||
| CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id); | ||||
| CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no); | ||||
| CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id); | ||||
| CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt); | ||||
| CREATE INDEX idx_sj_retry_01 ON sj_retry (biz_no); | ||||
| CREATE INDEX idx_sj_retry_02 ON sj_retry (idempotent_id); | ||||
| CREATE INDEX idx_sj_retry_03 ON sj_retry (retry_status, bucket_index); | ||||
| CREATE INDEX idx_sj_retry_04 ON sj_retry (parent_id); | ||||
| CREATE INDEX idx_sj_retry_05 ON sj_retry (create_dt); | ||||
|  | ||||
| COMMENT ON COLUMN sj_retry.id IS '主键'; | ||||
| COMMENT ON COLUMN sj_retry.namespace_id IS '命名空间id'; | ||||
| COMMENT ON COLUMN sj_retry.group_name IS '组名称'; | ||||
| COMMENT ON COLUMN sj_retry.group_id IS '组Id'; | ||||
| COMMENT ON COLUMN sj_retry.scene_name IS '场景名称'; | ||||
| COMMENT ON COLUMN sj_retry.scene_id IS '场景ID'; | ||||
| COMMENT ON COLUMN sj_retry.idempotent_id IS '幂等id'; | ||||
| COMMENT ON COLUMN sj_retry.biz_no IS '业务编号'; | ||||
| COMMENT ON COLUMN sj_retry.executor_name IS '执行器名称'; | ||||
| COMMENT ON COLUMN sj_retry.args_str IS '执行方法参数'; | ||||
| COMMENT ON COLUMN sj_retry.ext_attrs IS '扩展字段'; | ||||
| COMMENT ON COLUMN sj_retry.serializer_name IS '执行方法参数序列化器名称'; | ||||
| COMMENT ON COLUMN sj_retry.next_trigger_at IS '下次触发时间'; | ||||
| COMMENT ON COLUMN sj_retry.retry_count IS '重试次数'; | ||||
| COMMENT ON COLUMN sj_retry.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数'; | ||||
| @@ -287,6 +298,8 @@ CREATE TABLE sj_retry_scene_config | ||||
|     cb_trigger_type     smallint     NOT NULL DEFAULT 1, | ||||
|     cb_max_count        int          NOT NULL DEFAULT 16, | ||||
|     cb_trigger_interval varchar(16)  NOT NULL DEFAULT '', | ||||
|     owner_id            bigint       NULL     DEFAULT NULL, | ||||
|     labels              varchar(512) NULL     DEFAULT '', | ||||
|     description         varchar(256) NOT NULL DEFAULT '', | ||||
|     create_dt           timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
|     update_dt           timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP | ||||
| @@ -311,6 +324,8 @@ COMMENT ON COLUMN sj_retry_scene_config.cb_status IS '回调状态 0、不开启 | ||||
| COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_type IS '1、默认等级 2、固定间隔时间 3、CRON 表达式'; | ||||
| COMMENT ON COLUMN sj_retry_scene_config.cb_max_count IS '回调的最大执行次数'; | ||||
| COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_interval IS '回调的最大执行次数'; | ||||
| COMMENT ON COLUMN sj_retry_scene_config.owner_id IS '负责人id'; | ||||
| COMMENT ON COLUMN sj_retry_scene_config.labels IS '标签'; | ||||
| COMMENT ON COLUMN sj_retry_scene_config.description IS '描述'; | ||||
| COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间'; | ||||
| COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间'; | ||||
| @@ -328,6 +343,7 @@ CREATE TABLE sj_server_node | ||||
|     expire_at    timestamp    NOT NULL, | ||||
|     node_type    smallint     NOT NULL, | ||||
|     ext_attrs    varchar(256) NULL     DEFAULT '', | ||||
|     labels       varchar(512) NULL     DEFAULT '', | ||||
|     create_dt    timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
|     update_dt    timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP | ||||
| ); | ||||
| @@ -346,6 +362,7 @@ COMMENT ON COLUMN sj_server_node.host_port IS '机器端口'; | ||||
| COMMENT ON COLUMN sj_server_node.expire_at IS '过期时间'; | ||||
| COMMENT ON COLUMN sj_server_node.node_type IS '节点类型 1、客户端 2、是服务端'; | ||||
| COMMENT ON COLUMN sj_server_node.ext_attrs IS '扩展字段'; | ||||
| COMMENT ON COLUMN sj_server_node.labels IS '标签'; | ||||
| COMMENT ON COLUMN sj_server_node.create_dt IS '创建时间'; | ||||
| COMMENT ON COLUMN sj_server_node.update_dt IS '修改时间'; | ||||
| COMMENT ON TABLE sj_server_node IS '服务器节点'; | ||||
| @@ -353,7 +370,7 @@ COMMENT ON TABLE sj_server_node IS '服务器节点'; | ||||
| -- sj_distributed_lock | ||||
| CREATE TABLE sj_distributed_lock | ||||
| ( | ||||
|     name       varchar(64)  NOT NULL, | ||||
|     name       varchar(64)  NOT NULL PRIMARY KEY, | ||||
|     lock_until timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), | ||||
|     locked_at  timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), | ||||
|     locked_by  varchar(255) NOT NULL, | ||||
| @@ -409,27 +426,6 @@ COMMENT ON COLUMN sj_system_user_permission.create_dt IS '创建时间'; | ||||
| COMMENT ON COLUMN sj_system_user_permission.update_dt IS '修改时间'; | ||||
| COMMENT ON TABLE sj_system_user_permission IS '系统用户权限表'; | ||||
|  | ||||
| -- sj_sequence_alloc | ||||
| CREATE TABLE sj_sequence_alloc | ||||
| ( | ||||
|     id           bigserial PRIMARY KEY, | ||||
|     namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', | ||||
|     group_name   varchar(64) NOT NULL DEFAULT '', | ||||
|     max_id       bigint      NOT NULL DEFAULT 1, | ||||
|     step         int         NOT NULL DEFAULT 100, | ||||
|     update_dt    timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP | ||||
| ); | ||||
|  | ||||
| CREATE UNIQUE INDEX uk_sj_sequence_alloc_01 ON sj_sequence_alloc (namespace_id, group_name); | ||||
|  | ||||
| COMMENT ON COLUMN sj_sequence_alloc.id IS '主键'; | ||||
| COMMENT ON COLUMN sj_sequence_alloc.namespace_id IS '命名空间id'; | ||||
| COMMENT ON COLUMN sj_sequence_alloc.group_name IS '组名称'; | ||||
| COMMENT ON COLUMN sj_sequence_alloc.max_id IS '最大id'; | ||||
| COMMENT ON COLUMN sj_sequence_alloc.step IS '步长'; | ||||
| COMMENT ON COLUMN sj_sequence_alloc.update_dt IS '更新时间'; | ||||
| COMMENT ON TABLE sj_sequence_alloc IS '号段模式序号ID分配表'; | ||||
|  | ||||
| -- sj_job | ||||
| CREATE TABLE sj_job | ||||
| ( | ||||
| @@ -455,7 +451,8 @@ CREATE TABLE sj_job | ||||
|     bucket_index     int          NOT NULL DEFAULT 0, | ||||
|     resident         smallint     NOT NULL DEFAULT 0, | ||||
|     notify_ids       varchar(128) NOT NULL DEFAULT '', | ||||
|     owner_id         bigint       NULL, | ||||
|     owner_id         bigint       NULL     DEFAULT NULL, | ||||
|     labels           varchar(512) NULL     DEFAULT '', | ||||
|     description      varchar(256) NOT NULL DEFAULT '', | ||||
|     ext_attrs        varchar(256) NULL     DEFAULT '', | ||||
|     deleted          smallint     NOT NULL DEFAULT 0, | ||||
| @@ -490,6 +487,7 @@ COMMENT ON COLUMN sj_job.bucket_index IS 'bucket'; | ||||
| COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务'; | ||||
| COMMENT ON COLUMN sj_job.notify_ids IS '通知告警场景配置id列表'; | ||||
| COMMENT ON COLUMN sj_job.owner_id IS '负责人id'; | ||||
| COMMENT ON COLUMN sj_job.labels IS '标签'; | ||||
| COMMENT ON COLUMN sj_job.description IS '描述'; | ||||
| COMMENT ON COLUMN sj_job.ext_attrs IS '扩展字段'; | ||||
| COMMENT ON COLUMN sj_job.deleted IS '逻辑删除 1、删除'; | ||||
| @@ -716,6 +714,7 @@ CREATE TABLE sj_workflow | ||||
|     notify_ids       varchar(128) NOT NULL DEFAULT '', | ||||
|     bucket_index     int          NOT NULL DEFAULT 0, | ||||
|     version          int          NOT NULL, | ||||
|     owner_id         bigint       NULL     DEFAULT NULL, | ||||
|     ext_attrs        varchar(256) NULL     DEFAULT '', | ||||
|     deleted          smallint     NOT NULL DEFAULT 0, | ||||
|     create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
| @@ -741,6 +740,7 @@ COMMENT ON COLUMN sj_workflow.wf_context IS '上下文'; | ||||
| COMMENT ON COLUMN sj_workflow.notify_ids IS '通知告警场景配置id列表'; | ||||
| COMMENT ON COLUMN sj_workflow.bucket_index IS 'bucket'; | ||||
| COMMENT ON COLUMN sj_workflow.version IS '版本号'; | ||||
| COMMENT ON COLUMN sj_workflow.owner_id IS '负责人id'; | ||||
| COMMENT ON COLUMN sj_workflow.ext_attrs IS '扩展字段'; | ||||
| COMMENT ON COLUMN sj_workflow.deleted IS '逻辑删除 1、删除'; | ||||
| COMMENT ON COLUMN sj_workflow.create_dt IS '创建时间'; | ||||
| @@ -829,3 +829,27 @@ COMMENT ON COLUMN sj_workflow_task_batch.deleted IS '逻辑删除 1、删除'; | ||||
| COMMENT ON COLUMN sj_workflow_task_batch.create_dt IS '创建时间'; | ||||
| COMMENT ON COLUMN sj_workflow_task_batch.update_dt IS '修改时间'; | ||||
| COMMENT ON TABLE sj_workflow_task_batch IS '工作流批次'; | ||||
|  | ||||
| -- sj_job_executor | ||||
| CREATE TABLE sj_job_executor | ||||
| ( | ||||
|     id            bigserial PRIMARY KEY, | ||||
|     namespace_id  varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', | ||||
|     group_name    varchar(64)  NOT NULL, | ||||
|     executor_info varchar(256) NOT NULL, | ||||
|     executor_type varchar(3)   NOT NULL, | ||||
|     create_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
|     update_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP | ||||
| ); | ||||
|  | ||||
| CREATE INDEX idx_sj_job_executor_01 ON sj_job_executor (namespace_id, group_name); | ||||
| CREATE INDEX idx_sj_job_executor_02 ON sj_job_executor (create_dt); | ||||
|  | ||||
| COMMENT ON COLUMN sj_job_executor.id IS '主键'; | ||||
| COMMENT ON COLUMN sj_job_executor.namespace_id IS '命名空间id'; | ||||
| COMMENT ON COLUMN sj_job_executor.group_name IS '组名称'; | ||||
| COMMENT ON COLUMN sj_job_executor.executor_info IS '任务执行器名称'; | ||||
| COMMENT ON COLUMN sj_job_executor.executor_type IS '1:java 2:python 3:go'; | ||||
| COMMENT ON COLUMN sj_job_executor.create_dt IS '创建时间'; | ||||
| COMMENT ON COLUMN sj_job_executor.update_dt IS '修改时间'; | ||||
| COMMENT ON TABLE sj_job_executor IS '任务执行器信息'; | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-admin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-plugin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
| @@ -18,7 +18,7 @@ | ||||
|     <dependencies> | ||||
|         <!-- 系统管理模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.admin</groupId> | ||||
|             <artifactId>continew-system</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|   | ||||
| @@ -21,7 +21,7 @@ import cn.hutool.core.map.MapUtil; | ||||
| import lombok.Data; | ||||
| import org.springframework.boot.context.properties.ConfigurationProperties; | ||||
| import org.springframework.stereotype.Component; | ||||
| import top.continew.starter.data.core.enums.DatabaseType; | ||||
| import top.continew.starter.data.enums.DatabaseType; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|   | ||||
| @@ -22,8 +22,8 @@ import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import top.continew.admin.generator.model.entity.FieldConfigDO; | ||||
| import top.continew.admin.generator.model.entity.GenConfigDO; | ||||
| @@ -46,7 +46,6 @@ import java.util.List; | ||||
|  * @since 2023/8/3 22:58 | ||||
|  */ | ||||
| @Tag(name = "代码生成 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @RequestMapping("/code/generator") | ||||
| @@ -58,7 +57,7 @@ public class GeneratorController { | ||||
|     @Operation(summary = "分页查询生成配置", description = "分页查询生成配置列表") | ||||
|     @SaCheckPermission("code:generator:list") | ||||
|     @GetMapping("/config") | ||||
|     public PageResp<GenConfigDO> pageGenConfig(GenConfigQuery query, @Validated PageQuery pageQuery) { | ||||
|     public PageResp<GenConfigDO> pageGenConfig(@Valid GenConfigQuery query, @Valid PageQuery pageQuery) { | ||||
|         return baseService.pageGenConfig(query, pageQuery); | ||||
|     } | ||||
|  | ||||
| @@ -84,7 +83,7 @@ public class GeneratorController { | ||||
|     @Parameter(name = "tableName", description = "表名称", required = true, example = "sys_user", in = ParameterIn.PATH) | ||||
|     @SaCheckPermission("code:generator:config") | ||||
|     @PostMapping("/config/{tableName}") | ||||
|     public void saveConfig(@Validated @RequestBody GenConfigReq req, @PathVariable String tableName) { | ||||
|     public void saveConfig(@RequestBody @Valid GenConfigReq req, @PathVariable String tableName) { | ||||
|         baseService.saveConfig(req, tableName); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import org.apache.ibatis.annotations.Mapper; | ||||
| import org.apache.ibatis.annotations.Param; | ||||
| import org.apache.ibatis.annotations.Select; | ||||
| import top.continew.admin.generator.model.entity.FieldConfigDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.generator.mapper; | ||||
|  | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import top.continew.admin.generator.model.entity.GenConfigDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| /** | ||||
|  * 生成配置 Mapper | ||||
|   | ||||
| @@ -53,13 +53,13 @@ import top.continew.admin.generator.model.query.GenConfigQuery; | ||||
| import top.continew.admin.generator.model.req.GenConfigReq; | ||||
| import top.continew.admin.generator.model.resp.GeneratePreviewResp; | ||||
| import top.continew.admin.generator.service.GeneratorService; | ||||
| import top.continew.starter.core.autoconfigure.project.ProjectProperties; | ||||
| import top.continew.starter.core.autoconfigure.application.ApplicationProperties; | ||||
| import top.continew.starter.core.constant.StringConstants; | ||||
| import top.continew.starter.core.enums.BaseEnum; | ||||
| import top.continew.starter.core.exception.BusinessException; | ||||
| import top.continew.starter.core.validation.CheckUtils; | ||||
| import top.continew.starter.data.core.enums.DatabaseType; | ||||
| import top.continew.starter.data.core.util.MetaUtils; | ||||
| import top.continew.starter.core.util.validation.CheckUtils; | ||||
| import top.continew.starter.data.enums.DatabaseType; | ||||
| import top.continew.starter.data.util.MetaUtils; | ||||
| import top.continew.starter.extension.crud.model.query.PageQuery; | ||||
| import top.continew.starter.extension.crud.model.resp.PageResp; | ||||
| import top.continew.starter.core.util.FileUploadUtils; | ||||
| @@ -84,7 +84,7 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|  | ||||
|     private final DataSource dataSource; | ||||
|     private final GeneratorProperties generatorProperties; | ||||
|     private final ProjectProperties projectProperties; | ||||
|     private final ApplicationProperties applicationProperties; | ||||
|     private final FieldConfigMapper fieldConfigMapper; | ||||
|     private final GenConfigMapper genConfigMapper; | ||||
|     private static final List<String> TIME_PACKAGE_CLASS = Arrays.asList("LocalDate", "LocalTime", "LocalDateTime"); | ||||
| @@ -235,7 +235,7 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|         try { | ||||
|             String tempDir = SystemUtil.getUserInfo().getTempDir(); | ||||
|             // 删除旧代码 | ||||
|             FileUtil.del(tempDir + projectProperties.getAppName()); | ||||
|             FileUtil.del(tempDir + applicationProperties.getId()); | ||||
|             tableNames.forEach(tableName -> { | ||||
|                 // 初始化配置及数据 | ||||
|                 List<GeneratePreviewResp> generatePreviewList = this.preview(tableName); | ||||
| @@ -243,7 +243,7 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|                 this.generateCode(generatePreviewList, genConfigMapper.selectById(tableName)); | ||||
|             }); | ||||
|             // 打包下载 | ||||
|             File tempDirFile = new File(tempDir, projectProperties.getAppName()); | ||||
|             File tempDirFile = new File(tempDir, applicationProperties.getId()); | ||||
|             String zipFilePath = tempDirFile.getPath() + jodd.io.ZipUtil.ZIP_EXT; | ||||
|             ZipUtil.zip(tempDirFile.getPath(), zipFilePath); | ||||
|             FileUploadUtils.download(response, new File(zipFilePath)); | ||||
| @@ -358,7 +358,7 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|         if (StringUtils.isBlank(dictCode)) { | ||||
|             return fieldConfig; | ||||
|         } | ||||
|         Set<Class<?>> classSet = ClassUtil.scanPackageBySuper(projectProperties.getBasePackage(), BaseEnum.class); | ||||
|         Set<Class<?>> classSet = ClassUtil.scanPackageBySuper(applicationProperties.getBasePackage(), BaseEnum.class); | ||||
|         Optional<Class<?>> clazzOptional = classSet.stream() | ||||
|             .filter(s -> StrUtil.toUnderlineCase(s.getSimpleName()).toLowerCase().equals(dictCode)) | ||||
|             .findFirst(); | ||||
| @@ -383,8 +383,8 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|                                 GeneratorProperties.TemplateConfig templateConfig) { | ||||
|         // 获取前后端基础路径 | ||||
|         String backendBasicPackagePath = this.buildBackendBasicPackagePath(genConfig, templateConfig); | ||||
|         String frontendBasicPackagePath = String.join(File.separator, projectProperties.getAppName(), projectProperties | ||||
|             .getAppName() + "-ui"); | ||||
|         String frontendBasicPackagePath = String.join(File.separator, applicationProperties | ||||
|             .getId(), applicationProperties.getId() + "-ui"); | ||||
|         String packagePath; | ||||
|         if (generatePreview.isBackend()) { | ||||
|             // 例如:continew-admin/continew-system/src/main/java/top/continew/admin/system/service/impl | ||||
| @@ -432,7 +432,7 @@ public class GeneratorServiceImpl implements GeneratorService { | ||||
|                                                 GeneratorProperties.TemplateConfig templateConfig) { | ||||
|         String extension = templateConfig.getExtension(); | ||||
|         // 例如:continew-admin/continew-system/src/main/java/top/continew/admin/system | ||||
|         return String.join(File.separator, projectProperties.getAppName(), projectProperties.getAppName(), genConfig | ||||
|         return String.join(File.separator, applicationProperties.getId(), applicationProperties.getId(), genConfig | ||||
|             .getModuleName(), "src", "main", FileNameUtil.EXT_JAVA.equals(extension) | ||||
|                 ? "java" | ||||
|                 : "resources") + (FileNameUtil.EXT_JAVA.equals(extension) | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
|  | ||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import ${packageName}.model.query.${classNamePrefix}Query; | ||||
| import ${packageName}.model.req.${classNamePrefix}Req; | ||||
| import ${packageName}.model.resp.${classNamePrefix}DetailResp; | ||||
|   | ||||
| @@ -4,11 +4,11 @@ import lombok.Data; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
|  | ||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import cn.idev.excel.annotation.ExcelProperty; | ||||
|  | ||||
| import top.continew.admin.common.model.resp.BaseDetailResp; | ||||
| import top.continew.starter.file.excel.converter.ExcelBaseEnumConverter; | ||||
| import top.continew.starter.excel.converter.ExcelBaseEnumConverter; | ||||
| <#if imports??> | ||||
|     <#list imports as className> | ||||
| import ${className}; | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package ${packageName}.${subPackageName}; | ||||
|  | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import ${packageName}.model.entity.${classNamePrefix}DO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| /** | ||||
| * ${businessName} Mapper | ||||
|   | ||||
| @@ -4,8 +4,8 @@ import lombok.Data; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
|  | ||||
| import top.continew.starter.data.core.annotation.Query; | ||||
| import top.continew.starter.data.core.enums.QueryType; | ||||
| import top.continew.starter.data.annotation.Query; | ||||
| import top.continew.starter.data.enums.QueryType; | ||||
| <#if imports??> | ||||
|     <#list imports as className> | ||||
| import ${className}; | ||||
|   | ||||
| @@ -1,10 +1,12 @@ | ||||
| package ${packageName}.${subPackageName}; | ||||
|  | ||||
| import top.continew.starter.extension.crud.service.BaseService; | ||||
| import top.continew.admin.common.base.service.BaseService; | ||||
| import ${packageName}.model.entity.${classNamePrefix}DO; | ||||
| import ${packageName}.model.query.${classNamePrefix}Query; | ||||
| import ${packageName}.model.req.${classNamePrefix}Req; | ||||
| import ${packageName}.model.resp.${classNamePrefix}DetailResp; | ||||
| import ${packageName}.model.resp.${classNamePrefix}Resp; | ||||
| import top.continew.starter.data.service.IService; | ||||
|  | ||||
| /** | ||||
|  * ${businessName}业务接口 | ||||
| @@ -12,4 +14,4 @@ import ${packageName}.model.resp.${classNamePrefix}Resp; | ||||
|  * @author ${author} | ||||
|  * @since ${datetime} | ||||
|  */ | ||||
| public interface ${className} extends BaseService<${classNamePrefix}Resp, ${classNamePrefix}DetailResp, ${classNamePrefix}Query, ${classNamePrefix}Req> {} | ||||
| public interface ${className} extends BaseService<${classNamePrefix}Resp, ${classNamePrefix}DetailResp, ${classNamePrefix}Query, ${classNamePrefix}Req>, IService<${classNamePrefix}DO> {} | ||||
| @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; | ||||
|  | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import top.continew.starter.extension.crud.service.BaseServiceImpl; | ||||
| import top.continew.admin.common.base.service.BaseServiceImpl; | ||||
| import ${packageName}.mapper.${classNamePrefix}Mapper; | ||||
| import ${packageName}.model.entity.${classNamePrefix}DO; | ||||
| import ${packageName}.model.query.${classNamePrefix}Query; | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-plugin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
|   | ||||
| @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PatchMapping; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.open.model.query.AppQuery; | ||||
| import top.continew.admin.open.model.req.AppReq; | ||||
| import top.continew.admin.open.model.resp.AppDetailResp; | ||||
|   | ||||
| @@ -21,7 +21,7 @@ import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface; | ||||
| import org.springframework.stereotype.Component; | ||||
| import top.continew.admin.open.util.OpenApiUtils; | ||||
|  | ||||
| import java.lang.reflect.Method; | ||||
| import java.lang.reflect.AnnotatedElement; | ||||
|  | ||||
| import static cn.dev33.satoken.annotation.handler.SaCheckPermissionHandler._checkMethod; | ||||
|  | ||||
| @@ -40,9 +40,10 @@ public class SaCheckPermissionHandler implements SaAnnotationHandlerInterface<Sa | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void checkMethod(SaCheckPermission at, Method method) { | ||||
|     public void checkMethod(SaCheckPermission saCheckPermission, AnnotatedElement annotatedElement) { | ||||
|         if (!OpenApiUtils.isSignParamExists()) { | ||||
|             _checkMethod(at.type(), at.value(), at.mode(), at.orRole()); | ||||
|             _checkMethod(saCheckPermission.type(), saCheckPermission.value(), saCheckPermission | ||||
|                 .mode(), saCheckPermission.orRole()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import org.apache.ibatis.annotations.Mapper; | ||||
| import org.apache.ibatis.annotations.Param; | ||||
| import org.apache.ibatis.annotations.Select; | ||||
| import top.continew.admin.open.model.entity.AppDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
| import top.continew.starter.security.crypto.annotation.FieldEncrypt; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -19,7 +19,7 @@ package top.continew.admin.open.model.entity; | ||||
| import com.baomidou.mybatisplus.annotation.TableName; | ||||
| import lombok.Data; | ||||
| import top.continew.admin.common.enums.DisEnableStatusEnum; | ||||
| import top.continew.admin.common.model.entity.BaseDO; | ||||
| import top.continew.admin.common.base.model.entity.BaseDO; | ||||
| import top.continew.starter.security.crypto.annotation.FieldEncrypt; | ||||
|  | ||||
| import java.io.Serial; | ||||
|   | ||||
| @@ -18,8 +18,8 @@ package top.continew.admin.open.model.query; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import top.continew.starter.data.core.annotation.Query; | ||||
| import top.continew.starter.data.core.enums.QueryType; | ||||
| import top.continew.starter.data.annotation.Query; | ||||
| import top.continew.starter.data.enums.QueryType; | ||||
|  | ||||
| import java.io.Serial; | ||||
| import java.io.Serializable; | ||||
|   | ||||
| @@ -16,13 +16,13 @@ | ||||
|  | ||||
| package top.continew.admin.open.model.resp; | ||||
|  | ||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import cn.idev.excel.annotation.ExcelProperty; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import top.continew.admin.common.model.resp.BaseDetailResp; | ||||
| import top.continew.admin.common.base.model.resp.BaseDetailResp; | ||||
| import top.continew.admin.common.enums.DisEnableStatusEnum; | ||||
| import top.continew.starter.file.excel.converter.ExcelBaseEnumConverter; | ||||
| import top.continew.starter.excel.converter.ExcelBaseEnumConverter; | ||||
|  | ||||
| import java.io.Serial; | ||||
| import java.time.LocalDateTime; | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.open.model.resp; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import top.continew.admin.common.model.resp.BaseDetailResp; | ||||
| import top.continew.admin.common.base.model.resp.BaseDetailResp; | ||||
| import top.continew.admin.common.enums.DisEnableStatusEnum; | ||||
|  | ||||
| import java.io.Serial; | ||||
|   | ||||
| @@ -16,13 +16,13 @@ | ||||
|  | ||||
| package top.continew.admin.open.service; | ||||
|  | ||||
| import top.continew.admin.common.base.service.BaseService; | ||||
| import top.continew.admin.open.model.entity.AppDO; | ||||
| import top.continew.admin.open.model.query.AppQuery; | ||||
| import top.continew.admin.open.model.req.AppReq; | ||||
| import top.continew.admin.open.model.resp.AppDetailResp; | ||||
| import top.continew.admin.open.model.resp.AppResp; | ||||
| import top.continew.admin.open.model.resp.AppSecretResp; | ||||
| import top.continew.starter.extension.crud.service.BaseService; | ||||
|  | ||||
| /** | ||||
|  * 应用业务接口 | ||||
|   | ||||
| @@ -19,8 +19,8 @@ package top.continew.admin.open.service.impl; | ||||
| import cn.hutool.core.codec.Base64; | ||||
| import cn.hutool.core.util.IdUtil; | ||||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.stereotype.Service; | ||||
| import top.continew.admin.common.base.service.BaseServiceImpl; | ||||
| import top.continew.admin.open.mapper.AppMapper; | ||||
| import top.continew.admin.open.model.entity.AppDO; | ||||
| import top.continew.admin.open.model.query.AppQuery; | ||||
| @@ -30,7 +30,6 @@ import top.continew.admin.open.model.resp.AppResp; | ||||
| import top.continew.admin.open.model.resp.AppSecretResp; | ||||
| import top.continew.admin.open.service.AppService; | ||||
| import top.continew.starter.core.constant.StringConstants; | ||||
| import top.continew.starter.extension.crud.service.BaseServiceImpl; | ||||
|  | ||||
| /** | ||||
|  * 应用业务实现 | ||||
| @@ -40,7 +39,6 @@ import top.continew.starter.extension.crud.service.BaseServiceImpl; | ||||
|  * @since 2024/10/17 16:03 | ||||
|  */ | ||||
| @Service | ||||
| @RequiredArgsConstructor | ||||
| public class AppServiceImpl extends BaseServiceImpl<AppMapper, AppDO, AppResp, AppDetailResp, AppQuery, AppReq> implements AppService { | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -17,13 +17,13 @@ | ||||
| package top.continew.admin.open.sign; | ||||
|  | ||||
| import cn.dev33.satoken.secure.SaSecureUtil; | ||||
| import cn.dev33.satoken.sign.SaSignTemplate; | ||||
| import cn.dev33.satoken.sign.template.SaSignTemplate; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.stereotype.Component; | ||||
| import top.continew.admin.common.enums.DisEnableStatusEnum; | ||||
| import top.continew.admin.open.model.entity.AppDO; | ||||
| import top.continew.admin.open.service.AppService; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.open.util; | ||||
|  | ||||
| import cn.dev33.satoken.context.SaHolder; | ||||
| import cn.dev33.satoken.context.model.SaRequest; | ||||
| import cn.dev33.satoken.sign.SaSignTemplate; | ||||
| import cn.dev33.satoken.sign.template.SaSignTemplate; | ||||
|  | ||||
| import java.util.Collection; | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-plugin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
|   | ||||
| @@ -22,7 +22,7 @@ import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import top.continew.admin.schedule.api.JobClient; | ||||
| import top.continew.starter.core.autoconfigure.project.ProjectProperties; | ||||
| import top.continew.starter.core.autoconfigure.application.ApplicationProperties; | ||||
|  | ||||
| /** | ||||
|  * Feign 配置 | ||||
| @@ -34,7 +34,7 @@ import top.continew.starter.core.autoconfigure.project.ProjectProperties; | ||||
| @RequiredArgsConstructor | ||||
| public class FeignConfiguration { | ||||
|  | ||||
|     private final ProjectProperties projectProperties; | ||||
|     private final ApplicationProperties applicationProperties; | ||||
|  | ||||
|     @Value("${snail-job.server.api.url}") | ||||
|     private String baseUrl; | ||||
| @@ -58,6 +58,6 @@ public class FeignConfiguration { | ||||
|      */ | ||||
|     @Bean | ||||
|     public Logger.Level feignLoggerLevel() { | ||||
|         return projectProperties.isProduction() ? Logger.Level.BASIC : Logger.Level.FULL; | ||||
|         return applicationProperties.isProduction() ? Logger.Level.BASIC : Logger.Level.FULL; | ||||
|     } | ||||
| } | ||||
| @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| @@ -44,7 +45,6 @@ import java.util.List; | ||||
|  * @since 2024/6/25 22:24 | ||||
|  */ | ||||
| @Tag(name = " 任务 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @RequestMapping("/schedule/job") | ||||
| @@ -62,7 +62,8 @@ public class JobController { | ||||
|     @Operation(summary = "新增任务", description = "新增任务") | ||||
|     @SaCheckPermission("schedule:job:create") | ||||
|     @PostMapping | ||||
|     public void create(@Validated(CrudValidationGroup.Create.class) @RequestBody JobReq req) { | ||||
|     @Validated(CrudValidationGroup.Create.class) | ||||
|     public void create(@RequestBody @Valid JobReq req) { | ||||
|         baseService.create(req); | ||||
|     } | ||||
|  | ||||
| @@ -70,14 +71,15 @@ public class JobController { | ||||
|     @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH) | ||||
|     @SaCheckPermission("schedule:job:update") | ||||
|     @PutMapping("/{id}") | ||||
|     public void update(@Validated(CrudValidationGroup.Update.class) @RequestBody JobReq req, @PathVariable Long id) { | ||||
|     @Validated(CrudValidationGroup.Update.class) | ||||
|     public void update(@RequestBody @Valid JobReq req, @PathVariable Long id) { | ||||
|         baseService.update(req, id); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "修改任务状态", description = "修改任务状态") | ||||
|     @SaCheckPermission("schedule:job:update") | ||||
|     @PatchMapping("/{id}/status") | ||||
|     public void updateStatus(@Validated @RequestBody JobStatusReq req, @PathVariable Long id) { | ||||
|     public void updateStatus(@RequestBody @Valid JobStatusReq req, @PathVariable Long id) { | ||||
|         baseService.updateStatus(req, id); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -21,8 +21,8 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import top.continew.admin.schedule.model.JobInstanceLogPageResult; | ||||
| import top.continew.admin.schedule.model.query.JobInstanceLogQuery; | ||||
| @@ -43,7 +43,6 @@ import java.util.List; | ||||
|  * @since 2024/6/27 22:24 | ||||
|  */ | ||||
| @Tag(name = " 任务日志 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @RequestMapping("/schedule/log") | ||||
| @@ -54,7 +53,7 @@ public class JobLogController { | ||||
|     @Operation(summary = "分页查询任务日志列表", description = "分页查询任务日志列表") | ||||
|     @SaCheckPermission("schedule:log:list") | ||||
|     @GetMapping | ||||
|     public PageResp<JobLogResp> page(JobLogQuery query) { | ||||
|     public PageResp<JobLogResp> page(@Valid JobLogQuery query) { | ||||
|         return baseService.page(query); | ||||
|     } | ||||
|  | ||||
| @@ -77,14 +76,14 @@ public class JobLogController { | ||||
|     @Operation(summary = "查询任务实例列表", description = "查询任务实例列表") | ||||
|     @SaCheckPermission("schedule:log:list") | ||||
|     @GetMapping("/instance") | ||||
|     public List<JobInstanceResp> listInstance(JobInstanceQuery query) { | ||||
|     public List<JobInstanceResp> listInstance(@Valid JobInstanceQuery query) { | ||||
|         return baseService.listInstance(query); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "分页查询任务实例日志列表", description = "分页查询任务实例日志列表") | ||||
|     @SaCheckPermission("schedule:log:list") | ||||
|     @GetMapping("/instance/log") | ||||
|     public JobInstanceLogPageResult pageInstanceLog(JobInstanceLogQuery query) { | ||||
|     public JobInstanceLogPageResult pageInstanceLog(@Valid JobInstanceLogQuery query) { | ||||
|         return baseService.pageInstanceLog(query); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.Size; | ||||
| import lombok.Data; | ||||
| import top.continew.admin.schedule.enums.JobExecuteStatusEnum; | ||||
| import top.continew.starter.core.validation.constraints.EnumValue; | ||||
| import top.continew.starter.validation.constraints.EnumValue; | ||||
|  | ||||
| import java.io.Serial; | ||||
| import java.time.LocalDateTime; | ||||
|   | ||||
| @@ -19,7 +19,7 @@ package top.continew.admin.schedule.model.query; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import top.continew.admin.schedule.enums.JobStatusEnum; | ||||
| import top.continew.starter.core.validation.constraints.EnumValue; | ||||
| import top.continew.starter.validation.constraints.EnumValue; | ||||
|  | ||||
| import java.io.Serial; | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-admin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
| @@ -24,7 +24,7 @@ | ||||
|     <dependencies> | ||||
|         <!-- 公共模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.admin</groupId> | ||||
|             <artifactId>continew-common</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-admin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
| @@ -30,31 +30,31 @@ | ||||
|     <dependencies> | ||||
|         <!-- 系统管理模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.admin</groupId> | ||||
|             <artifactId>continew-system</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 任务调度插件 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.admin</groupId> | ||||
|             <artifactId>continew-plugin-schedule</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 能力开放插件 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.admin</groupId> | ||||
|             <artifactId>continew-plugin-open</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 代码生成器插件 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.admin</groupId> | ||||
|             <artifactId>continew-plugin-generator</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ContiNew Starter 链路追踪模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.starter</groupId> | ||||
|             <artifactId>continew-starter-trace</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|   | ||||
| @@ -29,12 +29,13 @@ import org.dromara.x.file.storage.spring.EnableFileStorage; | ||||
| import org.springframework.boot.ApplicationArguments; | ||||
| import org.springframework.boot.ApplicationRunner; | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.SpringBootVersion; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| import org.springframework.boot.autoconfigure.web.ServerProperties; | ||||
| import org.springframework.cloud.openfeign.EnableFeignClients; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.starter.core.autoconfigure.project.ProjectProperties; | ||||
| import top.continew.starter.core.autoconfigure.application.ApplicationProperties; | ||||
| import top.continew.starter.extension.crud.annotation.EnableCrudRestController; | ||||
| import top.continew.starter.web.annotation.EnableGlobalResponse; | ||||
| import top.continew.starter.web.model.R; | ||||
| @@ -56,7 +57,7 @@ import top.continew.starter.web.model.R; | ||||
| @RequiredArgsConstructor | ||||
| public class ContiNewAdminApplication implements ApplicationRunner { | ||||
|  | ||||
|     private final ProjectProperties projectProperties; | ||||
|     private final ApplicationProperties applicationProperties; | ||||
|     private final ServerProperties serverProperties; | ||||
|  | ||||
|     public static void main(String[] args) { | ||||
| @@ -67,7 +68,7 @@ public class ContiNewAdminApplication implements ApplicationRunner { | ||||
|     @SaIgnore | ||||
|     @GetMapping("/") | ||||
|     public R index() { | ||||
|         return R.ok(projectProperties); | ||||
|         return R.ok(applicationProperties); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -76,18 +77,19 @@ public class ContiNewAdminApplication implements ApplicationRunner { | ||||
|         Integer port = serverProperties.getPort(); | ||||
|         String contextPath = serverProperties.getServlet().getContextPath(); | ||||
|         String baseUrl = URLUtil.normalize("%s:%s%s".formatted(hostAddress, port, contextPath)); | ||||
|         log.info("----------------------------------------------"); | ||||
|         log.info("{} service started successfully.", projectProperties.getName()); | ||||
|         log.info("Profile: {}", SpringUtil.getProperty("spring.profiles.active")); | ||||
|         log.info("项目版本: v{} (ContiNew Starter: v{})", projectProperties.getVersion(), SpringUtil | ||||
|             .getProperty("project.starter")); | ||||
|         log.info("API 地址: {}", baseUrl); | ||||
|         log.info("-----------------------------------------------------"); | ||||
|         log.info("{} server started successfully.", applicationProperties.getName()); | ||||
|         log.info("ContiNew Starter: v{} (Spring Boot: v{})", SpringUtil | ||||
|             .getProperty("application.starter"), SpringBootVersion.getVersion()); | ||||
|         log.info("当前版本: v{} (Profile: {})", applicationProperties.getVersion(), SpringUtil | ||||
|             .getProperty("spring.profiles.active")); | ||||
|         log.info("服务地址: {}", baseUrl); | ||||
|         Knife4jProperties knife4jProperties = SpringUtil.getBean(Knife4jProperties.class); | ||||
|         if (!knife4jProperties.isProduction()) { | ||||
|             log.info("API 文档: {}/doc.html", baseUrl); | ||||
|             log.info("接口文档: {}/doc.html", baseUrl); | ||||
|         } | ||||
|         log.info("在线文档: https://continew.top"); | ||||
|         log.info("常见问题: https://continew.top/admin/faq.html"); | ||||
|         log.info("----------------------------------------------"); | ||||
|         log.info("-----------------------------------------------------"); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -16,14 +16,14 @@ | ||||
|  | ||||
| package top.continew.admin.config.satoken; | ||||
|  | ||||
| import cn.dev33.satoken.SaManager; | ||||
| import cn.dev33.satoken.annotation.SaIgnore; | ||||
| import cn.dev33.satoken.context.SaHolder; | ||||
| import cn.dev33.satoken.context.model.SaRequest; | ||||
| import cn.dev33.satoken.interceptor.SaInterceptor; | ||||
| import cn.dev33.satoken.router.SaRouter; | ||||
| import cn.dev33.satoken.sign.SaSignTemplate; | ||||
| import cn.dev33.satoken.sign.SaSignUtil; | ||||
| import cn.dev33.satoken.sign.SaSignManager; | ||||
| import cn.dev33.satoken.sign.template.SaSignTemplate; | ||||
| import cn.dev33.satoken.sign.template.SaSignUtil; | ||||
| import cn.dev33.satoken.stp.StpInterface; | ||||
| import cn.dev33.satoken.stp.StpUtil; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| @@ -41,7 +41,7 @@ import top.continew.admin.open.sign.OpenApiSignTemplate; | ||||
| import top.continew.starter.auth.satoken.autoconfigure.SaTokenExtensionProperties; | ||||
| import top.continew.starter.core.constant.StringConstants; | ||||
| import top.continew.starter.core.exception.BusinessException; | ||||
| import top.continew.starter.core.validation.CheckUtils; | ||||
| import top.continew.starter.core.util.validation.CheckUtils; | ||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||
|  | ||||
| import java.util.*; | ||||
| @@ -75,7 +75,7 @@ public class SaTokenConfiguration { | ||||
|      */ | ||||
|     @Bean | ||||
|     public SaInterceptor saInterceptor() { | ||||
|         SaManager.setSaSignTemplate(signTemplate); | ||||
|         SaSignManager.setSaSignTemplate(signTemplate); | ||||
|         return new SaExtensionInterceptor(handle -> SaRouter.match(StringConstants.PATH_PATTERN) | ||||
|             .notMatch(properties.getSecurity().getExcludes()) | ||||
|             .check(r -> { | ||||
| @@ -101,7 +101,7 @@ public class SaTokenConfiguration { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 配置 sa-token SaIgnore 注解排除路径 | ||||
|      * 配置 sa-token {@link SaIgnore} 注解排除路径 | ||||
|      * <p>主要针对 @CrudRequestMapping 注解</p> | ||||
|      */ | ||||
|     @EventListener(ApplicationReadyEvent.class) | ||||
| @@ -113,11 +113,11 @@ public class SaTokenConfiguration { | ||||
|             if (AopUtils.isAopProxy(bean)) { | ||||
|                 clazz = AopProxyUtils.ultimateTargetClass(bean); | ||||
|             } | ||||
|             // 使用 @CrudRequestMapping 的 Controller,如果使用了 @SaIgnore 注解,则表示忽略校验 | ||||
|             CrudRequestMapping crudRequestMapping = AnnotationUtils.findAnnotation(clazz, CrudRequestMapping.class); | ||||
|             SaIgnore saIgnore = AnnotationUtils.findAnnotation(clazz, SaIgnore.class); | ||||
|  | ||||
|             if (crudRequestMapping != null && saIgnore != null) { | ||||
|                 return crudRequestMapping.value() + "/**"; | ||||
|                 return crudRequestMapping.value() + StringConstants.PATH_PATTERN; | ||||
|             } | ||||
|             return null; | ||||
|         }).filter(Objects::nonNull).toList(); | ||||
|   | ||||
| @@ -52,16 +52,16 @@ import top.continew.admin.system.service.OptionService; | ||||
| import top.continew.admin.system.service.SmsConfigService; | ||||
| import top.continew.starter.cache.redisson.util.RedisUtils; | ||||
| import top.continew.starter.captcha.graphic.core.GraphicCaptchaService; | ||||
| import top.continew.starter.core.autoconfigure.project.ProjectProperties; | ||||
| import top.continew.starter.core.autoconfigure.application.ApplicationProperties; | ||||
| import top.continew.starter.core.util.TemplateUtils; | ||||
| import top.continew.starter.core.validation.CheckUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.validation.constraints.Mobile; | ||||
| import top.continew.starter.core.util.validation.CheckUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.log.annotation.Log; | ||||
| import top.continew.starter.messaging.mail.util.MailUtils; | ||||
| import top.continew.starter.ratelimiter.annotation.RateLimiter; | ||||
| import top.continew.starter.ratelimiter.annotation.RateLimiters; | ||||
| import top.continew.starter.ratelimiter.enums.LimitType; | ||||
| import top.continew.starter.validation.constraints.Mobile; | ||||
| import top.continew.starter.web.model.R; | ||||
|  | ||||
| import java.time.Duration; | ||||
| @@ -84,7 +84,7 @@ import java.util.concurrent.TimeUnit; | ||||
| @RequestMapping("/captcha") | ||||
| public class CaptchaController { | ||||
|  | ||||
|     private final ProjectProperties projectProperties; | ||||
|     private final ApplicationProperties applicationProperties; | ||||
|     private final CaptchaProperties captchaProperties; | ||||
|     private final CaptchaService behaviorCaptchaService; | ||||
|     private final GraphicCaptchaService graphicCaptchaService; | ||||
| @@ -162,12 +162,12 @@ public class CaptchaController { | ||||
|         Long expirationInMinutes = captchaMail.getExpirationInMinutes(); | ||||
|         Map<String, String> siteConfig = optionService.getByCategory(OptionCategoryEnum.SITE); | ||||
|         String content = TemplateUtils.render(captchaMail.getTemplatePath(), Dict.create() | ||||
|             .set("siteUrl", projectProperties.getUrl()) | ||||
|             .set("siteUrl", applicationProperties.getUrl()) | ||||
|             .set("siteTitle", siteConfig.get("SITE_TITLE")) | ||||
|             .set("siteCopyright", siteConfig.get("SITE_COPYRIGHT")) | ||||
|             .set("captcha", captcha) | ||||
|             .set("expiration", expirationInMinutes)); | ||||
|         MailUtils.sendHtml(email, "【%s】邮箱验证码".formatted(projectProperties.getName()), content); | ||||
|         MailUtils.sendHtml(email, "【%s】邮箱验证码".formatted(applicationProperties.getName()), content); | ||||
|         // 保存验证码 | ||||
|         String captchaKey = CacheConstants.CAPTCHA_KEY_PREFIX + email; | ||||
|         RedisUtils.set(captchaKey, captcha, Duration.ofMinutes(expirationInMinutes)); | ||||
|   | ||||
| @@ -35,7 +35,7 @@ import top.continew.admin.system.enums.OptionCategoryEnum; | ||||
| import top.continew.admin.system.model.query.*; | ||||
| import top.continew.admin.system.model.resp.file.FileUploadResp; | ||||
| import top.continew.admin.system.service.*; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.extension.crud.model.query.SortQuery; | ||||
| import top.continew.starter.extension.crud.model.resp.LabelValueResp; | ||||
| import top.continew.starter.log.annotation.Log; | ||||
| @@ -68,7 +68,7 @@ public class CommonController { | ||||
|     @Operation(summary = "上传文件", description = "上传文件") | ||||
|     @Parameter(name = "parentPath", description = "上级目录", example = "/", in = ParameterIn.QUERY) | ||||
|     @PostMapping("/file") | ||||
|     public FileUploadResp upload(@NotNull(message = "文件不能为空") @RequestPart MultipartFile file, | ||||
|     public FileUploadResp upload(@RequestPart @NotNull(message = "文件不能为空") MultipartFile file, | ||||
|                                  @RequestParam(required = false) String parentPath) throws IOException { | ||||
|         ValidationUtils.throwIf(file::isEmpty, "文件不能为空"); | ||||
|         FileInfo fileInfo = fileService.upload(file, parentPath); | ||||
|   | ||||
| @@ -25,7 +25,6 @@ import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| @@ -36,7 +35,7 @@ import top.continew.admin.system.model.resp.dashboard.DashboardChartCommonResp; | ||||
| import top.continew.admin.system.model.resp.dashboard.DashboardNoticeResp; | ||||
| import top.continew.admin.system.model.resp.dashboard.DashboardOverviewCommonResp; | ||||
| import top.continew.admin.system.service.DashboardService; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.log.annotation.Log; | ||||
|  | ||||
| import java.io.IOException; | ||||
| @@ -50,7 +49,6 @@ import java.util.List; | ||||
|  */ | ||||
| @Tag(name = "仪表盘 API") | ||||
| @Log(ignore = true) | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @RequestMapping("/dashboard") | ||||
|   | ||||
| @@ -22,13 +22,13 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import top.continew.admin.auth.model.query.OnlineUserQuery; | ||||
| import top.continew.admin.auth.model.resp.OnlineUserResp; | ||||
| import top.continew.admin.auth.service.OnlineUserService; | ||||
| import top.continew.starter.core.validation.CheckUtils; | ||||
| import top.continew.starter.core.util.validation.CheckUtils; | ||||
| import top.continew.starter.extension.crud.model.query.PageQuery; | ||||
| import top.continew.starter.extension.crud.model.resp.PageResp; | ||||
|  | ||||
| @@ -49,7 +49,7 @@ public class OnlineUserController { | ||||
|     @Operation(summary = "分页查询列表", description = "分页查询列表") | ||||
|     @SaCheckPermission("monitor:online:list") | ||||
|     @GetMapping | ||||
|     public PageResp<OnlineUserResp> page(OnlineUserQuery query, @Validated PageQuery pageQuery) { | ||||
|     public PageResp<OnlineUserResp> page(@Valid OnlineUserQuery query, @Valid PageQuery pageQuery) { | ||||
|         return baseService.page(query, pageQuery); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,6 @@ | ||||
|  | |___| (_) || | | || |_ | || |\  ||  __/ \ V  V /|_____|/ ___ \| (_| || | | | | || || | | | | ||||
|   \____|\___/ |_| |_| \__||_||_| \_| \___|  \_/\_/       /_/   \_\\__,_||_| |_| |_||_||_| |_| | ||||
|  | ||||
|  :: ${project.name}   ::                                               v${project.version} | ||||
|  :: ContiNew Starter ::                                               v${project.starter} | ||||
|  :: ${application.name}   ::                                               v${application.version} (Profile: ${spring.profiles.active}) | ||||
|  :: ContiNew Starter ::                                               v${application.starter} | ||||
|  :: Spring Boot      ::                                               v${spring-boot.version} | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| --- ### 项目配置 | ||||
| project: | ||||
| --- ### 应用配置 | ||||
| application: | ||||
|   # URL(跨域配置默认放行此 URL,第三方登录回调默认使用此 URL 为前缀,请注意更改为你实际的前端 URL) | ||||
|   url: http://localhost:5173 | ||||
|  | ||||
| @@ -234,11 +234,11 @@ justauth: | ||||
|     GITEE: | ||||
|       client-id: 5d271b7f638941812aaf8bfc2e2f08f06d6235ef934e0e39537e2364eb8452c4 | ||||
|       client-secret: 1f7d08**********5b7**********29e | ||||
|       redirect-uri: ${project.url}/social/callback?source=gitee | ||||
|       redirect-uri: ${application.url}/social/callback?source=gitee | ||||
|     GITHUB: | ||||
|       client-id: 38080dad08cfbdfacca9 | ||||
|       client-secret: 1f7d08**********5b7**********29e | ||||
|       redirect-uri: ${project.url}/social/callback?source=github | ||||
|       redirect-uri: ${application.url}/social/callback?source=github | ||||
|   cache: | ||||
|     type: REDIS | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| --- ### 项目配置 | ||||
| project: | ||||
| --- ### 应用配置 | ||||
| application: | ||||
|   # URL(跨域配置默认放行此 URL,第三方登录回调默认使用此 URL 为前缀,请注意更改为你实际的前端 URL) | ||||
|   url: https://admin.continew.top | ||||
|   # 是否为生产环境 | ||||
| @@ -99,14 +99,14 @@ jetcache: | ||||
| ## 接口文档增强配置 | ||||
| knife4j: | ||||
|   # 开启生产环境屏蔽 | ||||
|   production: ${project.production} | ||||
|   production: ${application.production} | ||||
|  | ||||
| --- ### 跨域配置 | ||||
| continew-starter.web.cors: | ||||
|   enabled: true | ||||
|   # 配置允许跨域的域名 | ||||
|   allowed-origins: | ||||
|     - ${project.url} | ||||
|     - ${application.url} | ||||
|   # 配置允许跨域的请求方式 | ||||
|   allowed-methods: '*' | ||||
|   # 配置允许跨域的请求头 | ||||
| @@ -213,7 +213,7 @@ continew-starter.messaging.websocket: | ||||
|   path: /websocket | ||||
|   # 配置允许跨域的域名 | ||||
|   allowed-origins: | ||||
|     - ${project.url} | ||||
|     - ${application.url} | ||||
|  | ||||
| --- ### Sa-Token 扩展配置 | ||||
| sa-token.extension: | ||||
| @@ -236,11 +236,11 @@ justauth: | ||||
|     GITEE: | ||||
|       client-id: 5d271b7f638941812aaf8bfc2e2f08f06d6235ef934e0e39537e2364eb8452c4 | ||||
|       client-secret: 1f7d08**********5b7**********29e | ||||
|       redirect-uri: ${project.url}/social/callback?source=gitee | ||||
|       redirect-uri: ${application.url}/social/callback?source=gitee | ||||
|     GITHUB: | ||||
|       client-id: 38080dad08cfbdfacca9 | ||||
|       client-secret: 1f7d08**********5b7**********29e | ||||
|       redirect-uri: ${project.url}/social/callback?source=github | ||||
|       redirect-uri: ${application.url}/social/callback?source=github | ||||
|   cache: | ||||
|     type: REDIS | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,13 @@ | ||||
| --- ### 项目配置 | ||||
| project: | ||||
| --- ### 应用配置 | ||||
| application: | ||||
|   id: continew-admin | ||||
|   # 名称 | ||||
|   name: ContiNew Admin | ||||
|   # 应用名称 | ||||
|   app-name: continew-admin | ||||
|   # 版本 | ||||
|   version: 4.0.0-SNAPSHOT | ||||
|   starter: 2.12.2 | ||||
|   # 描述 | ||||
|   description: 持续迭代优化的前后端分离中后台管理系统框架,开箱即用,持续提供舒适的开发体验。 | ||||
|   # 版本 | ||||
|   version: 4.0.0-SNAPSHOT | ||||
|   starter: 2.13.0 | ||||
|   # 基本包 | ||||
|   base-package: top.continew.admin | ||||
|   ## 作者信息配置 | ||||
| @@ -44,7 +43,7 @@ server: | ||||
| --- ### Spring 项目配置 | ||||
| spring: | ||||
|   application: | ||||
|     name: ${project.app-name} | ||||
|     name: ${application.id} | ||||
|   ## 环境配置 | ||||
|   profiles: | ||||
|     # 启用的环境 | ||||
| @@ -133,7 +132,7 @@ knife4j: | ||||
|     # 是否自定义 footer(默认 false,非自定义) | ||||
|     enable-footer-custom: true | ||||
|     # 自定义 footer 内容,支持 Markdown 语法 | ||||
|     footer-custom-content: 'Copyright © 2022-present [${project.contact.name}](${project.contact.url}) ⋅ [${project.name}](${project.url}) v${project.version}' | ||||
|     footer-custom-content: 'Copyright © 2022-present [${application.contact.name}](${application.contact.url}) ⋅ [${application.name}](${application.url}) v${application.version}' | ||||
|  | ||||
| --- ### 全局响应配置 | ||||
| continew-starter.web: | ||||
| @@ -236,7 +235,7 @@ mybatis-plus: | ||||
|   # Mapper XML 文件目录配置 | ||||
|   mapper-locations: classpath*:/mapper/**/*Mapper.xml | ||||
|   # 类型别名扫描包配置 | ||||
|   type-aliases-package: ${project.base-package}.**.model | ||||
|   type-aliases-package: ${application.base-package}.**.model | ||||
|   ## MyBatis 配置 | ||||
|   configuration: | ||||
|     # MyBatis 自动映射策略 | ||||
| @@ -255,7 +254,7 @@ mybatis-plus: | ||||
|   extension: | ||||
|     enabled: true | ||||
|     # Mapper 接口扫描包配置 | ||||
|     mapper-package: ${project.base-package}.**.mapper | ||||
|     mapper-package: ${application.base-package}.**.mapper | ||||
|     # ID 生成器配置 | ||||
|     id-generator: | ||||
|       type: COSID | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>top.continew</groupId> | ||||
|         <groupId>top.continew.admin</groupId> | ||||
|         <artifactId>continew-admin</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
| @@ -18,7 +18,7 @@ | ||||
|     <dependencies> | ||||
|         <!-- 公共模块 --> | ||||
|         <dependency> | ||||
|             <groupId>top.continew</groupId> | ||||
|             <groupId>top.continew.admin</groupId> | ||||
|             <artifactId>continew-common</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|   | ||||
| @@ -36,8 +36,8 @@ import top.continew.admin.system.service.DeptService; | ||||
| import top.continew.admin.system.service.OptionService; | ||||
| import top.continew.admin.system.service.RoleService; | ||||
| import top.continew.admin.system.service.UserService; | ||||
| import top.continew.starter.core.validation.CheckUtils; | ||||
| import top.continew.starter.core.validation.Validator; | ||||
| import top.continew.starter.core.util.validation.CheckUtils; | ||||
| import top.continew.starter.core.util.validation.Validator; | ||||
| import top.continew.starter.core.util.ServletUtils; | ||||
|  | ||||
| import java.util.Set; | ||||
|   | ||||
| @@ -20,18 +20,17 @@ import cn.dev33.satoken.annotation.SaIgnore; | ||||
| import cn.dev33.satoken.stp.StpUtil; | ||||
| import cn.hutool.core.bean.BeanUtil; | ||||
| import com.xkcoding.justauth.autoconfigure.JustAuthProperties; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import me.zhyd.oauth.AuthRequestBuilder; | ||||
| import me.zhyd.oauth.config.AuthConfig; | ||||
| import me.zhyd.oauth.request.AuthRequest; | ||||
| import me.zhyd.oauth.utils.AuthStateUtils; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import top.continew.admin.auth.model.req.LoginReq; | ||||
| import top.continew.admin.auth.model.resp.LoginResp; | ||||
| @@ -56,7 +55,6 @@ import java.util.List; | ||||
|  */ | ||||
| @Tag(name = "认证 API") | ||||
| @Log(module = "登录") | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @RequestMapping("/auth") | ||||
| @@ -69,7 +67,7 @@ public class AuthController { | ||||
|     @SaIgnore | ||||
|     @Operation(summary = "登录", description = "用户登录") | ||||
|     @PostMapping("/login") | ||||
|     public LoginResp login(@Validated @RequestBody LoginReq req, HttpServletRequest request) { | ||||
|     public LoginResp login(@RequestBody @Valid LoginReq req, HttpServletRequest request) { | ||||
|         return authService.login(req, request); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -37,8 +37,8 @@ import top.continew.admin.system.model.entity.user.UserDO; | ||||
| import top.continew.admin.system.model.resp.ClientResp; | ||||
| import top.continew.starter.cache.redisson.util.RedisUtils; | ||||
| import top.continew.starter.core.util.ExceptionUtils; | ||||
| import top.continew.starter.core.validation.CheckUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.CheckUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| import java.time.Duration; | ||||
|  | ||||
|   | ||||
| @@ -26,7 +26,7 @@ import top.continew.admin.common.constant.CacheConstants; | ||||
| import top.continew.admin.system.model.entity.user.UserDO; | ||||
| import top.continew.admin.system.model.resp.ClientResp; | ||||
| import top.continew.starter.cache.redisson.util.RedisUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| /** | ||||
|  * 邮箱登录处理器 | ||||
|   | ||||
| @@ -26,7 +26,7 @@ import top.continew.admin.common.constant.CacheConstants; | ||||
| import top.continew.admin.system.model.entity.user.UserDO; | ||||
| import top.continew.admin.system.model.resp.ClientResp; | ||||
| import top.continew.starter.cache.redisson.util.RedisUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| /** | ||||
|  * 手机号登录处理器 | ||||
|   | ||||
| @@ -50,9 +50,9 @@ import top.continew.admin.system.model.resp.ClientResp; | ||||
| import top.continew.admin.system.service.MessageService; | ||||
| import top.continew.admin.system.service.UserRoleService; | ||||
| import top.continew.admin.system.service.UserSocialService; | ||||
| import top.continew.starter.core.autoconfigure.project.ProjectProperties; | ||||
| import top.continew.starter.core.autoconfigure.application.ApplicationProperties; | ||||
| import top.continew.starter.core.exception.BadRequestException; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.Collections; | ||||
| @@ -72,7 +72,7 @@ public class SocialLoginHandler extends AbstractLoginHandler<SocialLoginReq> { | ||||
|     private final UserSocialService userSocialService; | ||||
|     private final UserRoleService userRoleService; | ||||
|     private final MessageService messageService; | ||||
|     private final ProjectProperties projectProperties; | ||||
|     private final ApplicationProperties applicationProperties; | ||||
|  | ||||
|     @Override | ||||
|     public LoginResp login(SocialLoginReq req, ClientResp client, HttpServletRequest request) { | ||||
| @@ -166,7 +166,7 @@ public class SocialLoginHandler extends AbstractLoginHandler<SocialLoginReq> { | ||||
|     private void sendSecurityMsg(UserDO user) { | ||||
|         MessageTemplateEnum template = MessageTemplateEnum.SOCIAL_REGISTER; | ||||
|         MessageReq req = new MessageReq(MessageTypeEnum.SECURITY); | ||||
|         req.setTitle(template.getTitle().formatted(projectProperties.getName())); | ||||
|         req.setTitle(template.getTitle().formatted(applicationProperties.getName())); | ||||
|         req.setContent(template.getContent().formatted(user.getNickname())); | ||||
|         messageService.add(req, CollUtil.toList(user.getId().toString())); | ||||
|     } | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotBlank; | ||||
| import lombok.Data; | ||||
| import org.hibernate.validator.constraints.Length; | ||||
| import top.continew.starter.core.validation.constraints.Mobile; | ||||
| import top.continew.starter.validation.constraints.Mobile; | ||||
|  | ||||
| import java.io.Serial; | ||||
|  | ||||
|   | ||||
| @@ -40,7 +40,7 @@ import top.continew.admin.system.model.resp.MenuResp; | ||||
| import top.continew.admin.system.service.ClientService; | ||||
| import top.continew.admin.system.service.MenuService; | ||||
| import top.continew.admin.system.service.RoleService; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.extension.crud.annotation.TreeField; | ||||
| import top.continew.starter.extension.crud.autoconfigure.CrudProperties; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.controller; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.ClientQuery; | ||||
| import top.continew.admin.system.model.req.ClientReq; | ||||
| import top.continew.admin.system.model.resp.ClientResp; | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.controller; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.DeptQuery; | ||||
| import top.continew.admin.system.model.req.DeptReq; | ||||
| import top.continew.admin.system.model.resp.DeptResp; | ||||
|   | ||||
| @@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.DeleteMapping; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.constant.CacheConstants; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.DictQuery; | ||||
| import top.continew.admin.system.model.req.DictReq; | ||||
| import top.continew.admin.system.model.resp.DictResp; | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.controller; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.DictItemQuery; | ||||
| import top.continew.admin.system.model.req.DictItemReq; | ||||
| import top.continew.admin.system.model.resp.DictItemResp; | ||||
|   | ||||
| @@ -25,9 +25,10 @@ import jakarta.validation.Valid; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.dromara.x.file.storage.core.FileInfo; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.FileQuery; | ||||
| import top.continew.admin.system.model.req.FileReq; | ||||
| import top.continew.admin.system.model.resp.file.FileDirCalcSizeResp; | ||||
| @@ -35,7 +36,7 @@ import top.continew.admin.system.model.resp.file.FileResp; | ||||
| import top.continew.admin.system.model.resp.file.FileStatisticsResp; | ||||
| import top.continew.admin.system.model.resp.file.FileUploadResp; | ||||
| import top.continew.admin.system.service.FileService; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||
| import top.continew.starter.extension.crud.enums.Api; | ||||
| import top.continew.starter.extension.crud.model.resp.IdResp; | ||||
| @@ -50,6 +51,7 @@ import java.io.IOException; | ||||
|  * @since 2023/12/23 10:38 | ||||
|  */ | ||||
| @Tag(name = "文件管理 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @CrudRequestMapping(value = "/system/file", api = {Api.PAGE, Api.UPDATE, Api.DELETE}) | ||||
| @@ -85,7 +87,7 @@ public class FileController extends BaseController<FileService, FileResp, FileRe | ||||
|     @Operation(summary = "创建文件夹", description = "创建文件夹") | ||||
|     @SaCheckPermission("system:file:createDir") | ||||
|     @PostMapping("/dir") | ||||
|     public IdResp<Long> createDir(@Valid @RequestBody FileReq req) { | ||||
|     public IdResp<Long> createDir(@RequestBody @Valid FileReq req) { | ||||
|         ValidationUtils.throwIfBlank(req.getParentPath(), "上级目录不能为空"); | ||||
|         return new IdResp<>(baseService.createDir(req)); | ||||
|     } | ||||
|   | ||||
| @@ -23,8 +23,8 @@ import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| @@ -56,7 +56,7 @@ public class LogController { | ||||
|     @Operation(summary = "分页查询列表", description = "分页查询列表") | ||||
|     @SaCheckPermission("monitor:log:list") | ||||
|     @GetMapping | ||||
|     public PageResp<LogResp> page(LogQuery query, @Validated PageQuery pageQuery) { | ||||
|     public PageResp<LogResp> page(@Valid LogQuery query, @Valid PageQuery pageQuery) { | ||||
|         return baseService.page(query, pageQuery); | ||||
|     } | ||||
|  | ||||
| @@ -73,7 +73,7 @@ public class LogController { | ||||
|     @Operation(summary = "导出登录日志", description = "导出登录日志") | ||||
|     @SaCheckPermission("monitor:log:export") | ||||
|     @GetMapping("/export/login") | ||||
|     public void exportLoginLog(LogQuery query, SortQuery sortQuery, HttpServletResponse response) { | ||||
|     public void exportLoginLog(@Valid LogQuery query, @Valid SortQuery sortQuery, HttpServletResponse response) { | ||||
|         baseService.exportLoginLog(query, sortQuery, response); | ||||
|     } | ||||
|  | ||||
| @@ -81,7 +81,7 @@ public class LogController { | ||||
|     @Operation(summary = "导出操作日志", description = "导出操作日志") | ||||
|     @SaCheckPermission("monitor:log:export") | ||||
|     @GetMapping("/export/operation") | ||||
|     public void exportOperationLog(LogQuery query, SortQuery sortQuery, HttpServletResponse response) { | ||||
|     public void exportOperationLog(@Valid LogQuery query, @Valid SortQuery sortQuery, HttpServletResponse response) { | ||||
|         baseService.exportOperationLog(query, sortQuery, response); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -24,7 +24,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.web.bind.annotation.DeleteMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.constant.CacheConstants; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.MenuQuery; | ||||
| import top.continew.admin.system.model.req.MenuReq; | ||||
| import top.continew.admin.system.model.resp.MenuResp; | ||||
| @@ -32,7 +32,7 @@ import top.continew.admin.system.service.MenuService; | ||||
| import top.continew.starter.cache.redisson.util.RedisUtils; | ||||
| import top.continew.starter.core.constant.StringConstants; | ||||
| import top.continew.starter.core.util.URLUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.extension.crud.annotation.CrudApi; | ||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||
| import top.continew.starter.extension.crud.enums.Api; | ||||
|   | ||||
| @@ -19,7 +19,7 @@ package top.continew.admin.system.controller; | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.enums.NoticeMethodEnum; | ||||
| import top.continew.admin.system.enums.NoticeScopeEnum; | ||||
| import top.continew.admin.system.model.query.NoticeQuery; | ||||
| @@ -27,7 +27,7 @@ import top.continew.admin.system.model.req.NoticeReq; | ||||
| import top.continew.admin.system.model.resp.notice.NoticeDetailResp; | ||||
| import top.continew.admin.system.model.resp.notice.NoticeResp; | ||||
| import top.continew.admin.system.service.NoticeService; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.extension.crud.annotation.CrudApi; | ||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||
| import top.continew.starter.extension.crud.enums.Api; | ||||
|   | ||||
| @@ -22,7 +22,6 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import top.continew.admin.system.model.query.OptionQuery; | ||||
| import top.continew.admin.system.model.req.OptionReq; | ||||
| @@ -39,7 +38,6 @@ import java.util.List; | ||||
|  * @since 2023/8/26 19:38 | ||||
|  */ | ||||
| @Tag(name = "参数管理 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @RequestMapping("/system/option") | ||||
| @@ -51,7 +49,7 @@ public class OptionController { | ||||
|     @SaCheckPermission(value = {"system:siteConfig:get", "system:securityConfig:get", "system:loginConfig:get", | ||||
|         "system:mailConfig:get"}, mode = SaMode.OR) | ||||
|     @GetMapping | ||||
|     public List<OptionResp> list(@Validated OptionQuery query) { | ||||
|     public List<OptionResp> list(@Valid OptionQuery query) { | ||||
|         return baseService.list(query); | ||||
|     } | ||||
|  | ||||
| @@ -59,7 +57,7 @@ public class OptionController { | ||||
|     @SaCheckPermission(value = {"system:siteConfig:update", "system:securityConfig:update", "system:loginConfig:update", | ||||
|         "system:mailConfig:update"}, mode = SaMode.OR) | ||||
|     @PutMapping | ||||
|     public void update(@Valid @RequestBody List<OptionReq> options) { | ||||
|     public void update(@RequestBody @Valid List<OptionReq> options) { | ||||
|         baseService.update(options); | ||||
|     } | ||||
|  | ||||
| @@ -67,7 +65,7 @@ public class OptionController { | ||||
|     @SaCheckPermission(value = {"system:siteConfig:update", "system:securityConfig:update", "system:loginConfig:update", | ||||
|         "system:mailConfig:update"}, mode = SaMode.OR) | ||||
|     @PatchMapping("/value") | ||||
|     public void resetValue(@Validated @RequestBody OptionResetValueReq req) { | ||||
|     public void resetValue(@RequestBody @Valid OptionResetValueReq req) { | ||||
|         baseService.resetValue(req); | ||||
|     } | ||||
| } | ||||
| @@ -21,11 +21,12 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.validation.Valid; | ||||
| import jakarta.validation.constraints.NotEmpty; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.RoleQuery; | ||||
| import top.continew.admin.system.model.query.RoleUserQuery; | ||||
| import top.continew.admin.system.model.req.RoleReq; | ||||
| @@ -60,7 +61,7 @@ public class RoleController extends BaseController<RoleService, RoleResp, RoleDe | ||||
|     @Operation(summary = "修改权限", description = "修改角色的功能权限") | ||||
|     @SaCheckPermission("system:role:updatePermission") | ||||
|     @PutMapping("/{id}/permission") | ||||
|     public void updatePermission(@PathVariable("id") Long id, @Validated @RequestBody RoleUpdatePermissionReq req) { | ||||
|     public void updatePermission(@PathVariable("id") Long id, @RequestBody @Valid RoleUpdatePermissionReq req) { | ||||
|         baseService.updatePermission(id, req); | ||||
|     } | ||||
|  | ||||
| @@ -69,8 +70,8 @@ public class RoleController extends BaseController<RoleService, RoleResp, RoleDe | ||||
|     @SaCheckPermission("system:role:list") | ||||
|     @GetMapping("/{id}/user") | ||||
|     public PageResp<RoleUserResp> pageUser(@PathVariable("id") Long id, | ||||
|                                            @Validated RoleUserQuery query, | ||||
|                                            @Validated PageQuery pageQuery) { | ||||
|                                            @Valid RoleUserQuery query, | ||||
|                                            @Valid PageQuery pageQuery) { | ||||
|         query.setRoleId(id); | ||||
|         return userRoleService.pageUser(query, pageQuery); | ||||
|     } | ||||
| @@ -79,14 +80,14 @@ public class RoleController extends BaseController<RoleService, RoleResp, RoleDe | ||||
|     @SaCheckPermission("system:role:assign") | ||||
|     @PostMapping("/{id}/user") | ||||
|     public void assignToUsers(@PathVariable("id") Long id, | ||||
|                               @Validated @NotEmpty(message = "用户ID列表不能为空") @RequestBody List<Long> userIds) { | ||||
|                               @RequestBody @NotEmpty(message = "用户ID列表不能为空") List<Long> userIds) { | ||||
|         baseService.assignToUsers(id, userIds); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "取消分配用户", description = "批量取消分配角色给用户") | ||||
|     @SaCheckPermission("system:role:unassign") | ||||
|     @DeleteMapping("/user") | ||||
|     public void unassignFromUsers(@Validated @NotEmpty(message = "用户列表不能为空") @RequestBody List<Long> userRoleIds) { | ||||
|     public void unassignFromUsers(@RequestBody @NotEmpty(message = "用户列表不能为空") List<Long> userRoleIds) { | ||||
|         userRoleService.deleteByIds(userRoleIds); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -21,11 +21,10 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| 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.PutMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.SmsConfigQuery; | ||||
| import top.continew.admin.system.model.req.SmsConfigReq; | ||||
| import top.continew.admin.system.model.resp.SmsConfigResp; | ||||
| @@ -41,7 +40,6 @@ import top.continew.starter.extension.crud.enums.Api; | ||||
|  * @since 2025/03/15 18:41 | ||||
|  */ | ||||
| @Tag(name = "短信配置管理 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @CrudRequestMapping(value = "/system/smsConfig", api = {Api.PAGE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE}) | ||||
| public class SmsConfigController extends BaseController<SmsConfigService, SmsConfigResp, SmsConfigResp, SmsConfigQuery, SmsConfigReq> { | ||||
|   | ||||
| @@ -17,9 +17,8 @@ | ||||
| package top.continew.admin.system.controller; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.system.model.query.SmsLogQuery; | ||||
| import top.continew.admin.system.model.req.SmsLogReq; | ||||
| import top.continew.admin.system.model.resp.SmsLogResp; | ||||
| @@ -35,7 +34,6 @@ import top.continew.starter.extension.crud.enums.Api; | ||||
|  * @since 2025/03/15 22:15 | ||||
|  */ | ||||
| @Tag(name = "短信日志管理 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @CrudRequestMapping(value = "/system/smsLog", api = {Api.PAGE, Api.GET, Api.DELETE, Api.EXPORT}) | ||||
| public class SmsLogController extends BaseController<SmsLogService, SmsLogResp, SmsLogResp, SmsLogQuery, SmsLogReq> { | ||||
|   | ||||
| @@ -21,13 +21,13 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import jakarta.validation.Valid; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.PutMapping; | ||||
| import org.springframework.web.bind.annotation.RequestBody; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.model.req.CommonStatusUpdateReq; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.common.base.model.req.CommonStatusUpdateReq; | ||||
| import top.continew.admin.system.model.query.StorageQuery; | ||||
| import top.continew.admin.system.model.req.StorageReq; | ||||
| import top.continew.admin.system.model.resp.StorageResp; | ||||
| @@ -42,7 +42,6 @@ import top.continew.starter.extension.crud.enums.Api; | ||||
|  * @since 2023/12/26 22:09 | ||||
|  */ | ||||
| @Tag(name = "存储管理 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @CrudRequestMapping(value = "/system/storage", api = {Api.LIST, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE}) | ||||
| public class StorageController extends BaseController<StorageService, StorageResp, StorageResp, StorageQuery, StorageReq> { | ||||
| @@ -51,7 +50,7 @@ public class StorageController extends BaseController<StorageService, StorageRes | ||||
|     @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH) | ||||
|     @SaCheckPermission("system:storage:updateStatus") | ||||
|     @PutMapping({"/{id}/status"}) | ||||
|     public void updateStatus(@Validated @RequestBody CommonStatusUpdateReq req, @PathVariable("id") Long id) { | ||||
|     public void updateStatus(@RequestBody @Valid CommonStatusUpdateReq req, @PathVariable("id") Long id) { | ||||
|         baseService.updateStatus(req, id); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -23,14 +23,15 @@ import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.validation.Valid; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| import top.continew.admin.common.base.controller.BaseController; | ||||
| import top.continew.admin.common.constant.RegexConstants; | ||||
| import top.continew.admin.common.controller.BaseController; | ||||
| import top.continew.admin.common.util.SecureUtils; | ||||
| import top.continew.admin.system.model.query.UserQuery; | ||||
| import top.continew.admin.system.model.req.user.UserImportReq; | ||||
| @@ -43,11 +44,10 @@ import top.continew.admin.system.model.resp.user.UserImportResp; | ||||
| import top.continew.admin.system.model.resp.user.UserResp; | ||||
| import top.continew.admin.system.service.UserService; | ||||
| import top.continew.starter.core.util.ExceptionUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||
| import top.continew.starter.extension.crud.enums.Api; | ||||
| import top.continew.starter.extension.crud.model.resp.IdResp; | ||||
| import top.continew.starter.extension.crud.validation.CrudValidationGroup; | ||||
|  | ||||
| import java.io.IOException; | ||||
|  | ||||
| @@ -67,7 +67,7 @@ public class UserController extends BaseController<UserService, UserResp, UserDe | ||||
|  | ||||
|     @Override | ||||
|     @Operation(summary = "新增数据", description = "新增数据") | ||||
|     public IdResp<Long> create(@Validated(CrudValidationGroup.Create.class) @RequestBody UserReq req) { | ||||
|     public IdResp<Long> create(@RequestBody @Valid UserReq req) { | ||||
|         String rawPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getPassword())); | ||||
|         ValidationUtils.throwIfNull(rawPassword, "密码解密失败"); | ||||
|         ValidationUtils.throwIf(!ReUtil | ||||
| @@ -86,7 +86,7 @@ public class UserController extends BaseController<UserService, UserResp, UserDe | ||||
|     @Operation(summary = "解析导入数据", description = "解析导入数据") | ||||
|     @SaCheckPermission("system:user:import") | ||||
|     @PostMapping("/import/parse") | ||||
|     public UserImportParseResp parseImport(@NotNull(message = "文件不能为空") @RequestPart MultipartFile file) { | ||||
|     public UserImportParseResp parseImport(@RequestPart @NotNull(message = "文件不能为空") MultipartFile file) { | ||||
|         ValidationUtils.throwIf(file::isEmpty, "文件不能为空"); | ||||
|         return baseService.parseImport(file); | ||||
|     } | ||||
| @@ -94,7 +94,7 @@ public class UserController extends BaseController<UserService, UserResp, UserDe | ||||
|     @Operation(summary = "导入数据", description = "导入数据") | ||||
|     @SaCheckPermission("system:user:import") | ||||
|     @PostMapping(value = "/import") | ||||
|     public UserImportResp importUser(@Validated @RequestBody UserImportReq req) { | ||||
|     public UserImportResp importUser(@RequestBody @Valid UserImportReq req) { | ||||
|         return baseService.importUser(req); | ||||
|     } | ||||
|  | ||||
| @@ -102,7 +102,7 @@ public class UserController extends BaseController<UserService, UserResp, UserDe | ||||
|     @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH) | ||||
|     @SaCheckPermission("system:user:resetPwd") | ||||
|     @PatchMapping("/{id}/password") | ||||
|     public void resetPassword(@Validated @RequestBody UserPasswordResetReq req, @PathVariable Long id) { | ||||
|     public void resetPassword(@RequestBody @Valid UserPasswordResetReq req, @PathVariable Long id) { | ||||
|         String rawNewPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getNewPassword())); | ||||
|         ValidationUtils.throwIfNull(rawNewPassword, "新密码解密失败"); | ||||
|         ValidationUtils.throwIf(!ReUtil | ||||
| @@ -115,7 +115,7 @@ public class UserController extends BaseController<UserService, UserResp, UserDe | ||||
|     @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH) | ||||
|     @SaCheckPermission("system:user:updateRole") | ||||
|     @PatchMapping("/{id}/role") | ||||
|     public void updateRole(@Validated @RequestBody UserRoleUpdateReq updateReq, @PathVariable Long id) { | ||||
|     public void updateRole(@RequestBody @Valid UserRoleUpdateReq updateReq, @PathVariable Long id) { | ||||
|         baseService.updateRole(updateReq, id); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -20,8 +20,8 @@ import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import top.continew.admin.common.context.UserContextHolder; | ||||
| import top.continew.admin.system.enums.NoticeMethodEnum; | ||||
| @@ -36,7 +36,7 @@ import top.continew.admin.system.model.resp.notice.NoticeResp; | ||||
| import top.continew.admin.system.model.resp.notice.NoticeUnreadCountResp; | ||||
| import top.continew.admin.system.service.MessageService; | ||||
| import top.continew.admin.system.service.NoticeService; | ||||
| import top.continew.starter.core.validation.CheckUtils; | ||||
| import top.continew.starter.core.util.validation.CheckUtils; | ||||
| import top.continew.starter.extension.crud.model.query.PageQuery; | ||||
| import top.continew.starter.extension.crud.model.req.IdsReq; | ||||
| import top.continew.starter.extension.crud.model.resp.BasePageResp; | ||||
| @@ -53,7 +53,6 @@ import java.util.List; | ||||
|  * @since 2025/4/5 21:30 | ||||
|  */ | ||||
| @Tag(name = "个人消息 API") | ||||
| @Validated | ||||
| @RestController | ||||
| @RequiredArgsConstructor | ||||
| @RequestMapping("/user/message") | ||||
| @@ -72,7 +71,7 @@ public class UserMessageController { | ||||
|  | ||||
|     @Operation(summary = "分页查询消息列表", description = "分页查询消息列表") | ||||
|     @GetMapping | ||||
|     public PageResp<MessageResp> page(MessageQuery query, @Validated PageQuery pageQuery) { | ||||
|     public PageResp<MessageResp> page(@Valid MessageQuery query, @Valid PageQuery pageQuery) { | ||||
|         query.setUserId(UserContextHolder.getUserId()); | ||||
|         return messageService.page(query, pageQuery); | ||||
|     } | ||||
| @@ -91,13 +90,13 @@ public class UserMessageController { | ||||
|  | ||||
|     @Operation(summary = "删除消息", description = "删除消息") | ||||
|     @DeleteMapping | ||||
|     public void delete(@Validated @RequestBody IdsReq req) { | ||||
|     public void delete(@RequestBody @Valid IdsReq req) { | ||||
|         messageService.delete(req.getIds()); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "消息标记为已读", description = "将消息标记为已读状态") | ||||
|     @PatchMapping("/read") | ||||
|     public void read(@Validated @RequestBody IdsReq req) { | ||||
|     public void read(@RequestBody @Valid IdsReq req) { | ||||
|         messageService.readMessage(req.getIds(), UserContextHolder.getUserId()); | ||||
|     } | ||||
|  | ||||
| @@ -125,7 +124,7 @@ public class UserMessageController { | ||||
|  | ||||
|     @Operation(summary = "分页查询公告列表", description = "分页查询公告列表") | ||||
|     @GetMapping("/notice") | ||||
|     public BasePageResp<NoticeResp> pageNotice(@Validated NoticeQuery query, @Validated PageQuery pageQuery) { | ||||
|     public BasePageResp<NoticeResp> pageNotice(@Valid NoticeQuery query, @Valid PageQuery pageQuery) { | ||||
|         query.setUserId(UserContextHolder.getUserId()); | ||||
|         return noticeService.page(query, pageQuery); | ||||
|     } | ||||
|   | ||||
| @@ -49,7 +49,7 @@ import top.continew.admin.system.service.UserSocialService; | ||||
| import top.continew.starter.cache.redisson.util.RedisUtils; | ||||
| import top.continew.starter.core.exception.BadRequestException; | ||||
| import top.continew.starter.core.util.ExceptionUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.util.List; | ||||
| @@ -83,13 +83,13 @@ public class UserProfileController { | ||||
|  | ||||
|     @Operation(summary = "修改基础信息", description = "修改用户基础信息") | ||||
|     @PatchMapping("/basic/info") | ||||
|     public void updateBasicInfo(@Validated @RequestBody UserBasicInfoUpdateReq req) { | ||||
|     public void updateBasicInfo(@RequestBody @Valid UserBasicInfoUpdateReq req) { | ||||
|         userService.updateBasicInfo(req, UserContextHolder.getUserId()); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "修改密码", description = "修改用户登录密码") | ||||
|     @PatchMapping("/password") | ||||
|     public void updatePassword(@Validated @RequestBody UserPasswordUpdateReq updateReq) { | ||||
|     public void updatePassword(@RequestBody @Valid UserPasswordUpdateReq updateReq) { | ||||
|         String rawOldPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq | ||||
|             .getOldPassword())); | ||||
|         ValidationUtils.throwIfNull(rawOldPassword, DECRYPT_FAILED); | ||||
| @@ -101,7 +101,7 @@ public class UserProfileController { | ||||
|  | ||||
|     @Operation(summary = "修改手机号", description = "修改手机号") | ||||
|     @PatchMapping("/phone") | ||||
|     public void updatePhone(@Validated @RequestBody UserPhoneUpdateReq updateReq) { | ||||
|     public void updatePhone(@RequestBody @Valid UserPhoneUpdateReq updateReq) { | ||||
|         String rawOldPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq | ||||
|             .getOldPassword())); | ||||
|         ValidationUtils.throwIfBlank(rawOldPassword, DECRYPT_FAILED); | ||||
| @@ -115,7 +115,7 @@ public class UserProfileController { | ||||
|  | ||||
|     @Operation(summary = "修改邮箱", description = "修改用户邮箱") | ||||
|     @PatchMapping("/email") | ||||
|     public void updateEmail(@Valid @RequestBody UserEmailUpdateReq updateReq) { | ||||
|     public void updateEmail(@RequestBody @Valid UserEmailUpdateReq updateReq) { | ||||
|         String rawOldPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq | ||||
|             .getOldPassword())); | ||||
|         ValidationUtils.throwIfBlank(rawOldPassword, DECRYPT_FAILED); | ||||
|   | ||||
| @@ -29,7 +29,7 @@ import top.continew.admin.common.constant.SysConstants; | ||||
| import top.continew.admin.system.model.entity.user.UserDO; | ||||
| import top.continew.admin.system.service.OptionService; | ||||
| import top.continew.admin.system.service.UserPasswordHistoryService; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
|   | ||||
| @@ -26,7 +26,7 @@ import top.continew.admin.system.validation.ValidationGroup; | ||||
| import top.continew.starter.core.constant.StringConstants; | ||||
| import top.continew.starter.core.enums.BaseEnum; | ||||
| import top.continew.starter.core.util.URLUtils; | ||||
| import top.continew.starter.core.validation.ValidationUtils; | ||||
| import top.continew.starter.core.util.validation.ValidationUtils; | ||||
|  | ||||
| /** | ||||
|  * 存储类型枚举 | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.mapper; | ||||
|  | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import top.continew.admin.system.model.entity.ClientDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| /** | ||||
|  * 客户端 Mapper | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.mapper; | ||||
|  | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import top.continew.admin.system.model.entity.DeptDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| /** | ||||
|  * 部门 Mapper | ||||
|   | ||||
| @@ -21,7 +21,7 @@ import org.apache.ibatis.annotations.Mapper; | ||||
| import org.apache.ibatis.annotations.Param; | ||||
| import top.continew.admin.common.constant.CacheConstants; | ||||
| import top.continew.admin.system.model.entity.DictItemDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
| import top.continew.starter.extension.crud.model.resp.LabelValueResp; | ||||
|  | ||||
| import java.util.List; | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.mapper; | ||||
|  | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import top.continew.admin.system.model.entity.DictDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| /** | ||||
|  * 字典 Mapper | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import org.apache.ibatis.annotations.Mapper; | ||||
| import org.apache.ibatis.annotations.Select; | ||||
| import top.continew.admin.system.model.entity.FileDO; | ||||
| import top.continew.admin.system.model.resp.file.FileStatisticsResp; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
|   | ||||
| @@ -29,7 +29,7 @@ import top.continew.admin.system.model.resp.dashboard.DashboardAccessTrendResp; | ||||
| import top.continew.admin.system.model.resp.dashboard.DashboardChartCommonResp; | ||||
| import top.continew.admin.system.model.resp.dashboard.DashboardOverviewCommonResp; | ||||
| import top.continew.admin.system.model.resp.log.LogResp; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
|   | ||||
| @@ -19,7 +19,7 @@ package top.continew.admin.system.mapper; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import org.apache.ibatis.annotations.Param; | ||||
| import top.continew.admin.system.model.entity.MenuDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.mapper; | ||||
|  | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import top.continew.admin.system.model.entity.MessageLogDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| /** | ||||
|  * 消息日志 Mapper | ||||
|   | ||||
| @@ -24,7 +24,7 @@ import top.continew.admin.system.model.entity.MessageDO; | ||||
| import top.continew.admin.system.model.query.MessageQuery; | ||||
| import top.continew.admin.system.model.resp.message.MessageDetailResp; | ||||
| import top.continew.admin.system.model.resp.message.MessageResp; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ package top.continew.admin.system.mapper; | ||||
|  | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import top.continew.admin.system.model.entity.NoticeLogDO; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| /** | ||||
|  * 公告日志 Mapper | ||||
|   | ||||
| @@ -24,7 +24,7 @@ import top.continew.admin.system.model.entity.NoticeDO; | ||||
| import top.continew.admin.system.model.query.NoticeQuery; | ||||
| import top.continew.admin.system.model.resp.dashboard.DashboardNoticeResp; | ||||
| import top.continew.admin.system.model.resp.notice.NoticeResp; | ||||
| import top.continew.starter.data.mp.base.BaseMapper; | ||||
| import top.continew.starter.data.mapper.BaseMapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user