mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 22:57:17 +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