mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-11-04 10:57:10 +08:00 
			
		
		
		
	chore: continew-starter 2.7.2 => 2.7.3
1.CrudApi GET => DETAIL(支持详情权限) 2.适配 CharConstants 3.适配 EnumValue 校验器
This commit is contained in:
		@@ -13,7 +13,7 @@
 | 
				
			|||||||
<img src="https://sonarcloud.io/api/project_badges/measure?project=Charles7c_continew-admin&metric=alert_status" alt="Sonar Status" />
 | 
					<img src="https://sonarcloud.io/api/project_badges/measure?project=Charles7c_continew-admin&metric=alert_status" alt="Sonar Status" />
 | 
				
			||||||
</a>
 | 
					</a>
 | 
				
			||||||
<a href="https://github.com/continew-org/continew-starter" target="_blank">
 | 
					<a href="https://github.com/continew-org/continew-starter" target="_blank">
 | 
				
			||||||
<img src="https://img.shields.io/badge/ContiNew Starter-2.7.2-%236CB52D.svg" alt="ContiNew Starter" />
 | 
					<img src="https://img.shields.io/badge/ContiNew Starter-2.7.3-%236CB52D.svg" alt="ContiNew Starter" />
 | 
				
			||||||
</a>
 | 
					</a>
 | 
				
			||||||
<a href="https://spring.io/projects/spring-boot" target="_blank">
 | 
					<a href="https://spring.io/projects/spring-boot" target="_blank">
 | 
				
			||||||
<img src="https://img.shields.io/badge/Spring Boot-3.2.10-%236CB52D.svg?logo=Spring-Boot" alt="Spring Boot" />
 | 
					<img src="https://img.shields.io/badge/Spring Boot-3.2.10-%236CB52D.svg?logo=Spring-Boot" alt="Spring Boot" />
 | 
				
			||||||
@@ -216,7 +216,7 @@ public class DeptController extends BaseController<DeptService, DeptResp, DeptDe
 | 
				
			|||||||
| <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design</a> | 2.56.0       | 字节跳动推出的前端 UI 框架,年轻化的色彩和组件设计。         |
 | 
					| <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design</a> | 2.56.0       | 字节跳动推出的前端 UI 框架,年轻化的色彩和组件设计。         |
 | 
				
			||||||
| <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 5.0.4        | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 |
 | 
					| <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 5.0.4        | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 |
 | 
				
			||||||
| <a href="https://cn.vitejs.dev/" target="_blank">Vite</a>    | 5.1.5        | 下一代的前端工具链,为开发提供极速响应。                     |
 | 
					| <a href="https://cn.vitejs.dev/" target="_blank">Vite</a>    | 5.1.5        | 下一代的前端工具链,为开发提供极速响应。                     |
 | 
				
			||||||
| [ContiNew Starter](https://github.com/continew-org/continew-starter) | 2.7.2        | ContiNew Starter 包含了一系列经过企业实践优化的依赖包(如 MyBatis-Plus、SaToken),可轻松集成到应用中,为开发人员减少手动引入依赖及配置的麻烦,为 Spring Boot Web 项目的灵活快速构建提供支持。 |
 | 
					| [ContiNew Starter](https://github.com/continew-org/continew-starter) | 2.7.3        | ContiNew Starter 包含了一系列经过企业实践优化的依赖包(如 MyBatis-Plus、SaToken),可轻松集成到应用中,为开发人员减少手动引入依赖及配置的麻烦,为 Spring Boot Web 项目的灵活快速构建提供支持。 |
 | 
				
			||||||
| <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 3.2.10       | 简化 Spring 应用的初始搭建和开发过程,基于“约定优于配置”的理念,使开发人员不再需要定义样板化的配置。(Spring Boot 3.0 开始,要求 Java 17 作为最低版本) |
 | 
					| <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 3.2.10       | 简化 Spring 应用的初始搭建和开发过程,基于“约定优于配置”的理念,使开发人员不再需要定义样板化的配置。(Spring Boot 3.0 开始,要求 Java 17 作为最低版本) |
 | 
				
			||||||
| <a href="https://undertow.io/" target="_blank">Undertow</a>  | 2.3.13.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 |
 | 
					| <a href="https://undertow.io/" target="_blank">Undertow</a>  | 2.3.13.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 |
 | 
				
			||||||
| <a href="https://sa-token.dev33.cn/" target="_blank">Sa-Token + JWT</a> | 1.39.0       | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。             |
 | 
					| <a href="https://sa-token.dev33.cn/" target="_blank">Sa-Token + JWT</a> | 1.39.0       | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。             |
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ import org.springframework.core.annotation.Order;
 | 
				
			|||||||
import org.springframework.http.HttpStatus;
 | 
					import org.springframework.http.HttpStatus;
 | 
				
			||||||
import org.springframework.web.bind.annotation.ExceptionHandler;
 | 
					import org.springframework.web.bind.annotation.ExceptionHandler;
 | 
				
			||||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
 | 
					import org.springframework.web.bind.annotation.RestControllerAdvice;
 | 
				
			||||||
 | 
					import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 | 
				
			||||||
import org.springframework.web.multipart.MultipartException;
 | 
					import org.springframework.web.multipart.MultipartException;
 | 
				
			||||||
import top.continew.starter.core.exception.BadRequestException;
 | 
					import top.continew.starter.core.exception.BadRequestException;
 | 
				
			||||||
import top.continew.starter.core.exception.BusinessException;
 | 
					import top.continew.starter.core.exception.BusinessException;
 | 
				
			||||||
@@ -58,6 +59,16 @@ public class GlobalExceptionHandler {
 | 
				
			|||||||
        return R.fail(String.valueOf(HttpStatus.BAD_REQUEST.value()), e.getMessage());
 | 
					        return R.fail(String.valueOf(HttpStatus.BAD_REQUEST.value()), e.getMessage());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 拦截校验异常-方法参数类型不匹配异常
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
 | 
				
			||||||
 | 
					    public R handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e,
 | 
				
			||||||
 | 
					                                                       HttpServletRequest request) {
 | 
				
			||||||
 | 
					        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
 | 
				
			||||||
 | 
					        return R.fail(String.valueOf(HttpStatus.BAD_REQUEST.value()), "参数 '%s' 类型不匹配".formatted(e.getName()));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 拦截文件上传异常-超过上传大小限制
 | 
					     * 拦截文件上传异常-超过上传大小限制
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
 | 
				
			|||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.springframework.stereotype.Component;
 | 
					import org.springframework.stereotype.Component;
 | 
				
			||||||
import top.continew.admin.common.constant.SysConstants;
 | 
					import top.continew.admin.common.constant.SysConstants;
 | 
				
			||||||
 | 
					import top.continew.admin.system.enums.OptionCategoryEnum;
 | 
				
			||||||
import top.continew.admin.system.service.OptionService;
 | 
					import top.continew.admin.system.service.OptionService;
 | 
				
			||||||
import top.continew.starter.messaging.mail.core.MailConfig;
 | 
					import top.continew.starter.messaging.mail.core.MailConfig;
 | 
				
			||||||
import top.continew.starter.messaging.mail.core.MailConfigurer;
 | 
					import top.continew.starter.messaging.mail.core.MailConfigurer;
 | 
				
			||||||
@@ -43,7 +44,7 @@ public class MailConfigurerImpl implements MailConfigurer {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public MailConfig getMailConfig() {
 | 
					    public MailConfig getMailConfig() {
 | 
				
			||||||
        // 查询邮件配置
 | 
					        // 查询邮件配置
 | 
				
			||||||
        Map<String, String> map = optionService.getByCategory("MAIL");
 | 
					        Map<String, String> map = optionService.getByCategory(OptionCategoryEnum.MAIL);
 | 
				
			||||||
        // 封装邮件配置
 | 
					        // 封装邮件配置
 | 
				
			||||||
        MailConfig mailConfig = new MailConfig();
 | 
					        MailConfig mailConfig = new MailConfig();
 | 
				
			||||||
        mailConfig.setProtocol(MapUtil.getStr(map, "MAIL_PROTOCOL"));
 | 
					        mailConfig.setProtocol(MapUtil.getStr(map, "MAIL_PROTOCOL"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -168,7 +168,7 @@ public enum PasswordPolicyEnum {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 策略类别
 | 
					     * 策略类别
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static final String CATEGORY = "PASSWORD";
 | 
					    public static final OptionCategoryEnum CATEGORY = OptionCategoryEnum.PASSWORD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 校验取值范围
 | 
					     * 校验取值范围
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@ package top.continew.admin.system.model.query;
 | 
				
			|||||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
					import io.swagger.v3.oas.annotations.media.Schema;
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
import top.continew.admin.system.enums.OptionCategoryEnum;
 | 
					import top.continew.admin.system.enums.OptionCategoryEnum;
 | 
				
			||||||
 | 
					import top.continew.starter.core.validation.constraints.EnumValue;
 | 
				
			||||||
import top.continew.starter.data.core.annotation.Query;
 | 
					import top.continew.starter.data.core.annotation.Query;
 | 
				
			||||||
import top.continew.starter.data.core.enums.QueryType;
 | 
					import top.continew.starter.data.core.enums.QueryType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,5 +51,6 @@ public class OptionQuery implements Serializable {
 | 
				
			|||||||
     * 类别
 | 
					     * 类别
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Schema(description = "类别", example = "SITE")
 | 
					    @Schema(description = "类别", example = "SITE")
 | 
				
			||||||
    private OptionCategoryEnum category;
 | 
					    @EnumValue(value = OptionCategoryEnum.class, message = "类别非法")
 | 
				
			||||||
 | 
					    private String category;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -16,6 +16,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package top.continew.admin.system.service;
 | 
					package top.continew.admin.system.service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.continew.admin.system.enums.OptionCategoryEnum;
 | 
				
			||||||
import top.continew.admin.system.model.query.OptionQuery;
 | 
					import top.continew.admin.system.model.query.OptionQuery;
 | 
				
			||||||
import top.continew.admin.system.model.req.OptionReq;
 | 
					import top.continew.admin.system.model.req.OptionReq;
 | 
				
			||||||
import top.continew.admin.system.model.req.OptionResetValueReq;
 | 
					import top.continew.admin.system.model.req.OptionResetValueReq;
 | 
				
			||||||
@@ -47,7 +48,7 @@ public interface OptionService {
 | 
				
			|||||||
     * @param category 类别
 | 
					     * @param category 类别
 | 
				
			||||||
     * @return 参数信息
 | 
					     * @return 参数信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    Map<String, String> getByCategory(String category);
 | 
					    Map<String, String> getByCategory(OptionCategoryEnum category);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 修改参数
 | 
					     * 修改参数
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra
 | 
				
			|||||||
import lombok.RequiredArgsConstructor;
 | 
					import lombok.RequiredArgsConstructor;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
import top.continew.admin.common.constant.CacheConstants;
 | 
					import top.continew.admin.common.constant.CacheConstants;
 | 
				
			||||||
 | 
					import top.continew.admin.system.enums.OptionCategoryEnum;
 | 
				
			||||||
import top.continew.admin.system.enums.PasswordPolicyEnum;
 | 
					import top.continew.admin.system.enums.PasswordPolicyEnum;
 | 
				
			||||||
import top.continew.admin.system.mapper.OptionMapper;
 | 
					import top.continew.admin.system.mapper.OptionMapper;
 | 
				
			||||||
import top.continew.admin.system.model.entity.OptionDO;
 | 
					import top.continew.admin.system.model.entity.OptionDO;
 | 
				
			||||||
@@ -64,8 +65,8 @@ public class OptionServiceImpl implements OptionService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    @Cached(key = "#category", name = CacheConstants.OPTION_KEY_PREFIX + "MAP:")
 | 
					    @Cached(key = "#category", name = CacheConstants.OPTION_KEY_PREFIX + "MAP:")
 | 
				
			||||||
    public Map<String, String> getByCategory(String category) {
 | 
					    public Map<String, String> getByCategory(OptionCategoryEnum category) {
 | 
				
			||||||
        return baseMapper.selectByCategory(category)
 | 
					        return baseMapper.selectByCategory(category.name())
 | 
				
			||||||
            .stream()
 | 
					            .stream()
 | 
				
			||||||
            .collect(Collectors.toMap(OptionDO::getCode, o -> StrUtil.emptyIfNull(ObjectUtil.defaultIfNull(o
 | 
					            .collect(Collectors.toMap(OptionDO::getCode, o -> StrUtil.emptyIfNull(ObjectUtil.defaultIfNull(o
 | 
				
			||||||
                .getValue(), o.getDefaultValue())), (oldVal, newVal) -> oldVal));
 | 
					                .getValue(), o.getDefaultValue())), (oldVal, newVal) -> oldVal));
 | 
				
			||||||
@@ -87,8 +88,8 @@ public class OptionServiceImpl implements OptionService {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        // 校验密码策略参数取值范围
 | 
					        // 校验密码策略参数取值范围
 | 
				
			||||||
        Map<String, String> passwordPolicyOptionMap = options.stream()
 | 
					        Map<String, String> passwordPolicyOptionMap = options.stream()
 | 
				
			||||||
            .filter(option -> StrUtil.startWith(option
 | 
					            .filter(option -> StrUtil.startWith(option.getCode(), PasswordPolicyEnum.CATEGORY
 | 
				
			||||||
                .getCode(), PasswordPolicyEnum.CATEGORY + StringConstants.UNDERLINE))
 | 
					                .name() + StringConstants.UNDERLINE))
 | 
				
			||||||
            .collect(Collectors.toMap(OptionReq::getCode, OptionReq::getValue, (oldVal, newVal) -> oldVal));
 | 
					            .collect(Collectors.toMap(OptionReq::getCode, OptionReq::getValue, (oldVal, newVal) -> oldVal));
 | 
				
			||||||
        for (Map.Entry<String, String> passwordPolicyOptionEntry : passwordPolicyOptionMap.entrySet()) {
 | 
					        for (Map.Entry<String, String> passwordPolicyOptionEntry : passwordPolicyOptionMap.entrySet()) {
 | 
				
			||||||
            String code = passwordPolicyOptionEntry.getKey();
 | 
					            String code = passwordPolicyOptionEntry.getKey();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,6 +61,7 @@ import top.continew.admin.common.context.UserContextHolder;
 | 
				
			|||||||
import top.continew.admin.common.enums.DisEnableStatusEnum;
 | 
					import top.continew.admin.common.enums.DisEnableStatusEnum;
 | 
				
			||||||
import top.continew.admin.common.enums.GenderEnum;
 | 
					import top.continew.admin.common.enums.GenderEnum;
 | 
				
			||||||
import top.continew.admin.common.util.SecureUtils;
 | 
					import top.continew.admin.common.util.SecureUtils;
 | 
				
			||||||
 | 
					import top.continew.admin.system.enums.OptionCategoryEnum;
 | 
				
			||||||
import top.continew.admin.system.mapper.UserMapper;
 | 
					import top.continew.admin.system.mapper.UserMapper;
 | 
				
			||||||
import top.continew.admin.system.model.entity.DeptDO;
 | 
					import top.continew.admin.system.model.entity.DeptDO;
 | 
				
			||||||
import top.continew.admin.system.model.entity.RoleDO;
 | 
					import top.continew.admin.system.model.entity.RoleDO;
 | 
				
			||||||
@@ -630,7 +631,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserRes
 | 
				
			|||||||
     * @return 密码允许重复使用次数
 | 
					     * @return 密码允许重复使用次数
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private int checkPassword(String password, UserDO user) {
 | 
					    private int checkPassword(String password, UserDO user) {
 | 
				
			||||||
        Map<String, String> passwordPolicy = optionService.getByCategory(CATEGORY);
 | 
					        Map<String, String> passwordPolicy = optionService.getByCategory(OptionCategoryEnum.PASSWORD);
 | 
				
			||||||
        // 密码最小长度
 | 
					        // 密码最小长度
 | 
				
			||||||
        PASSWORD_MIN_LENGTH.validate(password, MapUtil.getInt(passwordPolicy, PASSWORD_MIN_LENGTH.name()), user);
 | 
					        PASSWORD_MIN_LENGTH.validate(password, MapUtil.getInt(passwordPolicy, PASSWORD_MIN_LENGTH.name()), user);
 | 
				
			||||||
        // 密码是否必须包含特殊字符
 | 
					        // 密码是否必须包含特殊字符
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ import lombok.Data;
 | 
				
			|||||||
import lombok.NoArgsConstructor;
 | 
					import lombok.NoArgsConstructor;
 | 
				
			||||||
import org.hibernate.validator.constraints.Length;
 | 
					import org.hibernate.validator.constraints.Length;
 | 
				
			||||||
import top.continew.admin.common.constant.RegexConstants;
 | 
					import top.continew.admin.common.constant.RegexConstants;
 | 
				
			||||||
import top.continew.starter.core.constant.StringConstants;
 | 
					import top.continew.starter.core.constant.CharConstants;
 | 
				
			||||||
import top.continew.starter.core.util.StrUtils;
 | 
					import top.continew.starter.core.util.StrUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.Serial;
 | 
					import java.io.Serial;
 | 
				
			||||||
@@ -130,7 +130,7 @@ public class GenConfigDO implements Serializable {
 | 
				
			|||||||
    public void setTableName(String tableName) {
 | 
					    public void setTableName(String tableName) {
 | 
				
			||||||
        this.tableName = tableName;
 | 
					        this.tableName = tableName;
 | 
				
			||||||
        // 默认表前缀(sys_user -> sys_)
 | 
					        // 默认表前缀(sys_user -> sys_)
 | 
				
			||||||
        int underLineIndex = StrUtil.indexOf(tableName, StringConstants.C_UNDERLINE);
 | 
					        int underLineIndex = StrUtil.indexOf(tableName, CharConstants.UNDERLINE);
 | 
				
			||||||
        if (-1 != underLineIndex) {
 | 
					        if (-1 != underLineIndex) {
 | 
				
			||||||
            this.tablePrefix = StrUtil.subPre(tableName, underLineIndex + 1);
 | 
					            this.tablePrefix = StrUtil.subPre(tableName, underLineIndex + 1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,5 +22,5 @@ import ${packageName}.service.${classNamePrefix}Service;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Tag(name = "${businessName}管理 API")
 | 
					@Tag(name = "${businessName}管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@CrudRequestMapping(value = "/${apiModuleName}/${apiName}", api = {Api.PAGE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
 | 
					@CrudRequestMapping(value = "/${apiModuleName}/${apiName}", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
 | 
				
			||||||
public class ${className} extends BaseController<${classNamePrefix}Service, ${classNamePrefix}Resp, ${classNamePrefix}DetailResp, ${classNamePrefix}Query, ${classNamePrefix}Req> {}
 | 
					public class ${className} extends BaseController<${classNamePrefix}Service, ${classNamePrefix}Resp, ${classNamePrefix}DetailResp, ${classNamePrefix}Query, ${classNamePrefix}Req> {}
 | 
				
			||||||
@@ -14,6 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { Message } from '@arco-design/web-vue'
 | 
					import { Message } from '@arco-design/web-vue'
 | 
				
			||||||
 | 
					import { useWindowSize } from '@vueuse/core'
 | 
				
			||||||
import { get${classNamePrefix}, add${classNamePrefix}, update${classNamePrefix} } from '@/apis/${apiModuleName}/${apiName}'
 | 
					import { get${classNamePrefix}, add${classNamePrefix}, update${classNamePrefix} } from '@/apis/${apiModuleName}/${apiName}'
 | 
				
			||||||
import { type Columns, GiForm, type Options } from '@/components/GiForm'
 | 
					import { type Columns, GiForm, type Options } from '@/components/GiForm'
 | 
				
			||||||
import { useForm } from '@/hooks'
 | 
					import { useForm } from '@/hooks'
 | 
				
			||||||
@@ -23,6 +24,8 @@ const emit = defineEmits<{
 | 
				
			|||||||
  (e: 'save-success'): void
 | 
					  (e: 'save-success'): void
 | 
				
			||||||
}>()
 | 
					}>()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { width } = useWindowSize()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const dataId = ref('')
 | 
					const dataId = ref('')
 | 
				
			||||||
const visible = ref(false)
 | 
					const visible = ref(false)
 | 
				
			||||||
const isUpdate = computed(() => !!dataId.value)
 | 
					const isUpdate = computed(() => !!dataId.value)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,6 +48,7 @@ import org.springframework.web.bind.annotation.*;
 | 
				
			|||||||
import top.continew.admin.common.config.properties.CaptchaProperties;
 | 
					import top.continew.admin.common.config.properties.CaptchaProperties;
 | 
				
			||||||
import top.continew.admin.common.constant.CacheConstants;
 | 
					import top.continew.admin.common.constant.CacheConstants;
 | 
				
			||||||
import top.continew.admin.auth.model.resp.CaptchaResp;
 | 
					import top.continew.admin.auth.model.resp.CaptchaResp;
 | 
				
			||||||
 | 
					import top.continew.admin.system.enums.OptionCategoryEnum;
 | 
				
			||||||
import top.continew.admin.system.service.OptionService;
 | 
					import top.continew.admin.system.service.OptionService;
 | 
				
			||||||
import top.continew.starter.cache.redisson.util.RedisUtils;
 | 
					import top.continew.starter.cache.redisson.util.RedisUtils;
 | 
				
			||||||
import top.continew.starter.captcha.graphic.core.GraphicCaptchaService;
 | 
					import top.continew.starter.captcha.graphic.core.GraphicCaptchaService;
 | 
				
			||||||
@@ -151,7 +152,7 @@ public class CaptchaController {
 | 
				
			|||||||
        String captcha = RandomUtil.randomNumbers(captchaMail.getLength());
 | 
					        String captcha = RandomUtil.randomNumbers(captchaMail.getLength());
 | 
				
			||||||
        // 发送验证码
 | 
					        // 发送验证码
 | 
				
			||||||
        Long expirationInMinutes = captchaMail.getExpirationInMinutes();
 | 
					        Long expirationInMinutes = captchaMail.getExpirationInMinutes();
 | 
				
			||||||
        Map<String, String> siteConfig = optionService.getByCategory("SITE");
 | 
					        Map<String, String> siteConfig = optionService.getByCategory(OptionCategoryEnum.SITE);
 | 
				
			||||||
        String content = TemplateUtils.render(captchaMail.getTemplatePath(), Dict.create()
 | 
					        String content = TemplateUtils.render(captchaMail.getTemplatePath(), Dict.create()
 | 
				
			||||||
            .set("siteUrl", projectProperties.getUrl())
 | 
					            .set("siteUrl", projectProperties.getUrl())
 | 
				
			||||||
            .set("siteTitle", siteConfig.get("SITE_TITLE"))
 | 
					            .set("siteTitle", siteConfig.get("SITE_TITLE"))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -109,7 +109,7 @@ public class CommonController {
 | 
				
			|||||||
    @Cached(key = "'SITE'", name = CacheConstants.OPTION_KEY_PREFIX)
 | 
					    @Cached(key = "'SITE'", name = CacheConstants.OPTION_KEY_PREFIX)
 | 
				
			||||||
    public List<LabelValueResp<String>> listSiteOptionDict() {
 | 
					    public List<LabelValueResp<String>> listSiteOptionDict() {
 | 
				
			||||||
        OptionQuery optionQuery = new OptionQuery();
 | 
					        OptionQuery optionQuery = new OptionQuery();
 | 
				
			||||||
        optionQuery.setCategory(OptionCategoryEnum.SITE);
 | 
					        optionQuery.setCategory(OptionCategoryEnum.SITE.name());
 | 
				
			||||||
        return optionService.list(optionQuery)
 | 
					        return optionService.list(optionQuery)
 | 
				
			||||||
            .stream()
 | 
					            .stream()
 | 
				
			||||||
            .map(option -> new LabelValueResp<>(option.getCode(), StrUtil.nullToDefault(option.getValue(), option
 | 
					            .map(option -> new LabelValueResp<>(option.getCode(), StrUtil.nullToDefault(option.getValue(), option
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,7 @@ import top.continew.starter.extension.crud.model.resp.BaseIdResp;
 | 
				
			|||||||
@Tag(name = "应用管理 API")
 | 
					@Tag(name = "应用管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@RequiredArgsConstructor
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
@CrudRequestMapping(value = "/open/app", api = {Api.PAGE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
 | 
					@CrudRequestMapping(value = "/open/app", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
 | 
				
			||||||
public class AppController extends BaseController<AppService, AppResp, AppDetailResp, AppQuery, AppReq> {
 | 
					public class AppController extends BaseController<AppService, AppResp, AppDetailResp, AppQuery, AppReq> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final AppService appService;
 | 
					    private final AppService appService;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,6 @@ import top.continew.starter.extension.crud.enums.Api;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Tag(name = "部门管理 API")
 | 
					@Tag(name = "部门管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
 | 
					@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
 | 
				
			||||||
public class DeptController extends BaseController<DeptService, DeptResp, DeptResp, DeptQuery, DeptReq> {
 | 
					public class DeptController extends BaseController<DeptService, DeptResp, DeptResp, DeptQuery, DeptReq> {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,6 @@ import top.continew.starter.extension.crud.enums.Api;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Tag(name = "字典管理 API")
 | 
					@Tag(name = "字典管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@CrudRequestMapping(value = "/system/dict", api = {Api.LIST, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
					@CrudRequestMapping(value = "/system/dict", api = {Api.LIST, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
				
			||||||
public class DictController extends BaseController<DictService, DictResp, DictResp, DictQuery, DictReq> {
 | 
					public class DictController extends BaseController<DictService, DictResp, DictResp, DictQuery, DictReq> {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -36,6 +36,6 @@ import top.continew.starter.log.core.annotation.Log;
 | 
				
			|||||||
@Log(module = "字典管理")
 | 
					@Log(module = "字典管理")
 | 
				
			||||||
@Tag(name = "字典项管理 API")
 | 
					@Tag(name = "字典项管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@CrudRequestMapping(value = "/system/dict/item", api = {Api.PAGE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
					@CrudRequestMapping(value = "/system/dict/item", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
				
			||||||
public class DictItemController extends BaseController<DictItemService, DictItemResp, DictItemResp, DictItemQuery, DictItemReq> {
 | 
					public class DictItemController extends BaseController<DictItemService, DictItemResp, DictItemResp, DictItemQuery, DictItemReq> {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -44,7 +44,7 @@ import top.continew.starter.extension.crud.util.ValidateGroup;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Tag(name = "菜单管理 API")
 | 
					@Tag(name = "菜单管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@CrudRequestMapping(value = "/system/menu", api = {Api.TREE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
					@CrudRequestMapping(value = "/system/menu", api = {Api.TREE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
				
			||||||
public class MenuController extends BaseController<MenuService, MenuResp, MenuResp, MenuQuery, MenuReq> {
 | 
					public class MenuController extends BaseController<MenuService, MenuResp, MenuResp, MenuQuery, MenuReq> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,7 +44,7 @@ import java.time.LocalDateTime;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Tag(name = "公告管理 API")
 | 
					@Tag(name = "公告管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@CrudRequestMapping(value = "/system/notice", api = {Api.PAGE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
					@CrudRequestMapping(value = "/system/notice", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
				
			||||||
public class NoticeController extends BaseController<NoticeService, NoticeResp, NoticeDetailResp, NoticeQuery, NoticeReq> {
 | 
					public class NoticeController extends BaseController<NoticeService, NoticeResp, NoticeDetailResp, NoticeQuery, NoticeReq> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,7 +49,7 @@ import java.util.List;
 | 
				
			|||||||
@Validated
 | 
					@Validated
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@RequiredArgsConstructor
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
@CrudRequestMapping(value = "/system/role", api = {Api.PAGE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
					@CrudRequestMapping(value = "/system/role", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
				
			||||||
public class RoleController extends BaseController<RoleService, RoleResp, RoleDetailResp, RoleQuery, RoleReq> {
 | 
					public class RoleController extends BaseController<RoleService, RoleResp, RoleDetailResp, RoleQuery, RoleReq> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final UserRoleService userRoleService;
 | 
					    private final UserRoleService userRoleService;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,6 @@ import top.continew.starter.extension.crud.enums.Api;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Tag(name = "存储管理 API")
 | 
					@Tag(name = "存储管理 API")
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@CrudRequestMapping(value = "/system/storage", api = {Api.PAGE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
					@CrudRequestMapping(value = "/system/storage", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE})
 | 
				
			||||||
public class StorageController extends BaseController<StorageService, StorageResp, StorageResp, StorageQuery, StorageReq> {
 | 
					public class StorageController extends BaseController<StorageService, StorageResp, StorageResp, StorageQuery, StorageReq> {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -61,7 +61,7 @@ import java.io.IOException;
 | 
				
			|||||||
@Validated
 | 
					@Validated
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@RequiredArgsConstructor
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
@CrudRequestMapping(value = "/system/user", api = {Api.PAGE, Api.LIST, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE,
 | 
					@CrudRequestMapping(value = "/system/user", api = {Api.PAGE, Api.LIST, Api.DETAIL, Api.ADD, Api.UPDATE, Api.DELETE,
 | 
				
			||||||
    Api.EXPORT})
 | 
					    Api.EXPORT})
 | 
				
			||||||
public class UserController extends BaseController<UserService, UserResp, UserDetailResp, UserQuery, UserReq> {
 | 
					public class UserController extends BaseController<UserService, UserResp, UserDetailResp, UserQuery, UserReq> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,5 +5,5 @@
 | 
				
			|||||||
  \____|\___/ |_| |_| \__||_||_| \_| \___|  \_/\_/       /_/   \_\\__,_||_| |_| |_||_||_| |_|
 | 
					  \____|\___/ |_| |_| \__||_||_| \_| \___|  \_/\_/       /_/   \_\\__,_||_| |_| |_||_||_| |_|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 :: ${project.name}   ::                                               v${project.version}
 | 
					 :: ${project.name}   ::                                               v${project.version}
 | 
				
			||||||
 :: ContiNew Starter ::                                               v2.7.2
 | 
					 :: ContiNew Starter ::                                               v2.7.3
 | 
				
			||||||
 :: Spring Boot      ::                                               v${spring-boot.version}
 | 
					 :: Spring Boot      ::                                               v${spring-boot.version}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							@@ -13,7 +13,7 @@
 | 
				
			|||||||
    <parent>
 | 
					    <parent>
 | 
				
			||||||
        <groupId>top.continew</groupId>
 | 
					        <groupId>top.continew</groupId>
 | 
				
			||||||
        <artifactId>continew-starter</artifactId>
 | 
					        <artifactId>continew-starter</artifactId>
 | 
				
			||||||
        <version>2.7.2</version>
 | 
					        <version>2.7.3</version>
 | 
				
			||||||
    </parent>
 | 
					    </parent>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <groupId>top.continew</groupId>
 | 
					    <groupId>top.continew</groupId>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user