chore: Spring Boot 2.7.8 => 3.0.3

1.Spring Boot 2.7.8 => 3.0.3
2.Knife4j 适配 Spring Boot 3.x
3.ServletUtil => JakartaServletUtil
4.javax.* => jakarta.*
This commit is contained in:
dlj 2023-03-16 13:01:13 +08:00 committed by Charles7c
parent 9bbff7f22c
commit dea160a7b2
44 changed files with 146 additions and 105 deletions

View File

@ -130,12 +130,7 @@ limitations under the License.
<!-- Knife4j前身是 swagger-bootstrap-ui集 Swagger2 和 OpenAPI3 为一体的增强解决方案) --> <!-- Knife4j前身是 swagger-bootstrap-ui集 Swagger2 和 OpenAPI3 为一体的增强解决方案) -->
<dependency> <dependency>
<groupId>com.github.xiaoymin</groupId> <groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>
<!-- Spring Doc OpenAPI可以结合 Spring Boot 使用的,基于 OpenAPI3 的 API 文档生成工具) -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
</dependency> </dependency>
<!-- Redisson不仅仅是一个 Redis Java 客户端) --> <!-- Redisson不仅仅是一个 Redis Java 客户端) -->

View File

@ -18,7 +18,7 @@ package top.charles7c.cnadmin.common.base;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -75,7 +75,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "分页查询列表") @Operation(summary = "分页查询列表")
@ResponseBody @ResponseBody
@GetMapping @GetMapping
protected R<PageDataVO<V>> page(@Validated Q query, @Validated PageQuery pageQuery) { public R<PageDataVO<V>> page(@Validated Q query, @Validated PageQuery pageQuery) {
this.checkPermission("list"); this.checkPermission("list");
PageDataVO<V> pageDataVO = baseService.page(query, pageQuery); PageDataVO<V> pageDataVO = baseService.page(query, pageQuery);
return R.ok(pageDataVO); return R.ok(pageDataVO);
@ -93,7 +93,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "查询树列表") @Operation(summary = "查询树列表")
@ResponseBody @ResponseBody
@GetMapping("/tree") @GetMapping("/tree")
protected R<List<Tree<Long>>> tree(@Validated Q query, @Validated SortQuery sortQuery) { public R<List<Tree<Long>>> tree(@Validated Q query, @Validated SortQuery sortQuery) {
this.checkPermission("list"); this.checkPermission("list");
List<Tree<Long>> list = baseService.tree(query, sortQuery, false); List<Tree<Long>> list = baseService.tree(query, sortQuery, false);
return R.ok(list); return R.ok(list);
@ -111,7 +111,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "查询列表") @Operation(summary = "查询列表")
@ResponseBody @ResponseBody
@GetMapping("/list") @GetMapping("/list")
protected R<List<V>> list(@Validated Q query, @Validated SortQuery sortQuery) { public R<List<V>> list(@Validated Q query, @Validated SortQuery sortQuery) {
this.checkPermission("list"); this.checkPermission("list");
List<V> list = baseService.list(query, sortQuery); List<V> list = baseService.list(query, sortQuery);
return R.ok(list); return R.ok(list);
@ -128,7 +128,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Parameter(name = "id", description = "ID", in = ParameterIn.PATH) @Parameter(name = "id", description = "ID", in = ParameterIn.PATH)
@ResponseBody @ResponseBody
@GetMapping("/{id}") @GetMapping("/{id}")
protected R<D> get(@PathVariable Long id) { public R<D> get(@PathVariable Long id) {
this.checkPermission("list"); this.checkPermission("list");
D detail = baseService.get(id); D detail = baseService.get(id);
return R.ok(detail); return R.ok(detail);
@ -144,7 +144,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "新增数据") @Operation(summary = "新增数据")
@ResponseBody @ResponseBody
@PostMapping @PostMapping
protected R<Long> add(@Validated @RequestBody C request) { public R<Long> add(@Validated @RequestBody C request) {
this.checkPermission("add"); this.checkPermission("add");
Long id = baseService.add(request); Long id = baseService.add(request);
return R.ok("新增成功", id); return R.ok("新增成功", id);
@ -162,7 +162,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "修改数据") @Operation(summary = "修改数据")
@ResponseBody @ResponseBody
@PutMapping("/{id}") @PutMapping("/{id}")
protected R update(@Validated @RequestBody C request, @PathVariable Long id) { public R update(@Validated @RequestBody C request, @PathVariable Long id) {
this.checkPermission("update"); this.checkPermission("update");
baseService.update(request, id); baseService.update(request, id);
return R.ok("修改成功"); return R.ok("修改成功");
@ -179,7 +179,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Parameter(name = "ids", description = "ID 列表", in = ParameterIn.PATH) @Parameter(name = "ids", description = "ID 列表", in = ParameterIn.PATH)
@ResponseBody @ResponseBody
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
protected R delete(@PathVariable List<Long> ids) { public R delete(@PathVariable List<Long> ids) {
this.checkPermission("delete"); this.checkPermission("delete");
baseService.delete(ids); baseService.delete(ids);
return R.ok("删除成功"); return R.ok("删除成功");
@ -197,7 +197,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
*/ */
@Operation(summary = "导出数据") @Operation(summary = "导出数据")
@GetMapping("/export") @GetMapping("/export")
protected void export(@Validated Q query, @Validated SortQuery sortQuery, HttpServletResponse response) { public void export(@Validated Q query, @Validated SortQuery sortQuery, HttpServletResponse response) {
this.checkPermission("export"); this.checkPermission("export");
baseService.export(query, sortQuery, response); baseService.export(query, sortQuery, response);
} }

View File

@ -18,7 +18,7 @@ package top.charles7c.cnadmin.common.base;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.groups.Default; import jakarta.validation.groups.Default;
import lombok.Data; import lombok.Data;

View File

@ -18,7 +18,7 @@ package top.charles7c.cnadmin.common.base;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;

View File

@ -20,7 +20,7 @@ import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;

View File

@ -23,6 +23,7 @@ import java.lang.reflect.Method;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.util.pattern.PathPatternParser;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -55,7 +56,14 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi
// 拼接路径前缀合并了 @RequestMapping 的部分能力 // 拼接路径前缀合并了 @RequestMapping 的部分能力
String pathPrefix = crudRequestMapping.value(); String pathPrefix = crudRequestMapping.value();
if (StrUtil.isNotBlank(pathPrefix)) { if (StrUtil.isNotBlank(pathPrefix)) {
requestMappingInfo = RequestMappingInfo.paths(pathPrefix).build().combine(requestMappingInfo); /**
* 问题RequestMappingInfo.paths(pathPrefix)返回的RequestMappingInfo对象里pathPatternsCondition = null
* 导致combine()方法抛出断言异常
* 修复: 创建options对象, 并设置PatternParser
*/
RequestMappingInfo.BuilderConfiguration options = new RequestMappingInfo.BuilderConfiguration();
options.setPatternParser(PathPatternParser.defaultInstance);
requestMappingInfo = RequestMappingInfo.paths(pathPrefix).options(options).build().combine(requestMappingInfo);
} }
// 过滤 API // 过滤 API

View File

@ -18,9 +18,9 @@ package top.charles7c.cnadmin.common.handler;
import java.util.Objects; import java.util.Objects;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation; import jakarta.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException; import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@ -16,7 +16,7 @@
package top.charles7c.cnadmin.common.model.query; package top.charles7c.cnadmin.common.model.query;
import javax.validation.constraints.Min; import jakarta.validation.constraints.Min;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -24,7 +24,7 @@ import lombok.NoArgsConstructor;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.Range;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@ -24,7 +24,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;

View File

@ -18,7 +18,7 @@ package top.charles7c.cnadmin.common.model.request;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;

View File

@ -19,7 +19,7 @@ package top.charles7c.cnadmin.common.util;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;

View File

@ -22,8 +22,8 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import javax.mail.MessagingException; import jakarta.mail.MessagingException;
import javax.mail.internet.MimeMessage; import jakarta.mail.internet.MimeMessage;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Data; import lombok.Data;

View File

@ -18,8 +18,8 @@ package top.charles7c.cnadmin.common.util;
import java.util.*; import java.util.*;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;

View File

@ -18,14 +18,14 @@ package top.charles7c.cnadmin.common.util.helper;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.servlet.JakartaServletUtil;
import top.charles7c.cnadmin.common.constant.CacheConsts; import top.charles7c.cnadmin.common.constant.CacheConsts;
import top.charles7c.cnadmin.common.model.dto.LogContext; import top.charles7c.cnadmin.common.model.dto.LogContext;
@ -57,7 +57,7 @@ public class LoginHelper {
// 记录登录信息 // 记录登录信息
HttpServletRequest request = ServletUtils.getRequest(); HttpServletRequest request = ServletUtils.getRequest();
loginUser.setClientIp(ServletUtil.getClientIP(request)); loginUser.setClientIp(JakartaServletUtil.getClientIP(request));
loginUser.setLocation(IpUtils.getCityInfo(loginUser.getClientIp())); loginUser.setLocation(IpUtils.getCityInfo(loginUser.getClientIp()));
loginUser.setBrowser(ServletUtils.getBrowser(request)); loginUser.setBrowser(ServletUtils.getBrowser(request));
LogContext logContext = LogContextHolder.get(); LogContext logContext = LogContextHolder.get();

View File

@ -82,7 +82,7 @@ public class QueryHelper {
* 查询数据类型 * 查询数据类型
*/ */
private static <Q, R> void buildQuery(Q query, Field field, QueryWrapper<R> queryWrapper) { private static <Q, R> void buildQuery(Q query, Field field, QueryWrapper<R> queryWrapper) {
boolean accessible = field.isAccessible(); boolean accessible = field.canAccess(null);
try { try {
field.setAccessible(true); field.setAccessible(true);
// 没有 @Query直接返回 // 没有 @Query直接返回

View File

@ -19,10 +19,10 @@ package top.charles7c.cnadmin.monitor.filter;
import java.io.IOException; import java.io.IOException;
import java.util.Objects; import java.util.Objects;
import javax.servlet.FilterChain; import jakarta.servlet.FilterChain;
import javax.servlet.ServletException; import jakarta.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;

View File

@ -19,8 +19,8 @@ package top.charles7c.cnadmin.monitor.interceptor;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Map; import java.util.Map;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -41,7 +41,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.servlet.JakartaServletUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.http.HttpStatus; import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -215,13 +215,13 @@ public class LogInterceptor implements HandlerInterceptor {
logDO.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString() logDO.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString()
: request.getRequestURL().append("?").append(request.getQueryString()).toString()); : request.getRequestURL().append("?").append(request.getQueryString()).toString());
logDO.setRequestMethod(request.getMethod()); logDO.setRequestMethod(request.getMethod());
logDO.setRequestHeaders(this.desensitize(ServletUtil.getHeaderMap(request))); logDO.setRequestHeaders(this.desensitize(JakartaServletUtil.getHeaderMap(request)));
String requestBody = this.getRequestBody(request); String requestBody = this.getRequestBody(request);
if (StrUtil.isNotBlank(requestBody)) { if (StrUtil.isNotBlank(requestBody)) {
logDO.setRequestBody(this.desensitize( logDO.setRequestBody(this.desensitize(
JSONUtil.isTypeJSON(requestBody) ? JSONUtil.parseObj(requestBody) : ServletUtil.getParamMap(request))); JSONUtil.isTypeJSON(requestBody) ? JSONUtil.parseObj(requestBody) : JakartaServletUtil.getParamMap(request)));
} }
logDO.setClientIp(ServletUtil.getClientIP(request)); logDO.setClientIp(JakartaServletUtil.getClientIP(request));
logDO.setLocation(IpUtils.getCityInfo(logDO.getClientIp())); logDO.setLocation(IpUtils.getCityInfo(logDO.getClientIp()));
logDO.setBrowser(ServletUtils.getBrowser(request)); logDO.setBrowser(ServletUtils.getBrowser(request));
logDO.setCreateUser(ObjectUtil.defaultIfNull(logDO.getCreateUser(), LoginHelper.getUserId())); logDO.setCreateUser(ObjectUtil.defaultIfNull(logDO.getCreateUser(), LoginHelper.getUserId()));
@ -243,7 +243,7 @@ public class LogInterceptor implements HandlerInterceptor {
private void logResponse(LogDO logDO, HttpServletResponse response) { private void logResponse(LogDO logDO, HttpServletResponse response) {
int status = response.getStatus(); int status = response.getStatus();
logDO.setStatusCode(status); logDO.setStatusCode(status);
logDO.setResponseHeaders(this.desensitize(ServletUtil.getHeadersMap(response))); logDO.setResponseHeaders(this.desensitize(JakartaServletUtil.getHeadersMap(response)));
// 响应体不记录非 JSON 响应数据 // 响应体不记录非 JSON 响应数据
String responseBody = this.getResponseBody(response); String responseBody = this.getResponseBody(response);
if (StrUtil.isNotBlank(responseBody) && JSONUtil.isTypeJSON(responseBody)) { if (StrUtil.isNotBlank(responseBody) && JSONUtil.isTypeJSON(responseBody)) {
@ -328,7 +328,7 @@ public class LogInterceptor implements HandlerInterceptor {
} }
// 2检查是否需要记录内网 IP 操作 // 2检查是否需要记录内网 IP 操作
boolean isInnerIp = IpUtils.isInnerIp(ServletUtil.getClientIP(request)); boolean isInnerIp = IpUtils.isInnerIp(JakartaServletUtil.getClientIP(request));
if (isInnerIp && Boolean.FALSE.equals(operationLogProperties.getIncludeInnerIp())) { if (isInnerIp && Boolean.FALSE.equals(operationLogProperties.getIncludeInnerIp())) {
return false; return false;
} }

View File

@ -24,7 +24,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;

View File

@ -24,7 +24,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
/** /**

View File

@ -24,7 +24,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;

View File

@ -24,7 +24,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;

View File

@ -30,6 +30,7 @@ import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import top.charles7c.cnadmin.auth.config.satoken.properties.SecurityProperties;
/** /**
* Sa-Token 配置 * Sa-Token 配置

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package top.charles7c.cnadmin.auth.config.satoken; package top.charles7c.cnadmin.auth.config.satoken.properties;
import lombok.Data; import lombok.Data;

View File

@ -18,7 +18,7 @@ package top.charles7c.cnadmin.auth.model.request;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;

View File

@ -22,7 +22,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;

View File

@ -22,7 +22,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;

View File

@ -22,7 +22,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;

View File

@ -24,7 +24,7 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject; import org.springdoc.core.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;

View File

@ -16,8 +16,8 @@
package top.charles7c.cnadmin.system.model.request; package top.charles7c.cnadmin.system.model.request;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;

View File

@ -16,8 +16,8 @@
package top.charles7c.cnadmin.system.model.request; package top.charles7c.cnadmin.system.model.request;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;

View File

@ -18,8 +18,8 @@ package top.charles7c.cnadmin.system.model.request;
import java.util.List; import java.util.List;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;

View File

@ -18,8 +18,8 @@ package top.charles7c.cnadmin.system.model.request;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;

View File

@ -18,8 +18,8 @@ package top.charles7c.cnadmin.system.model.request;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import lombok.Data; import lombok.Data;

View File

@ -18,7 +18,7 @@ package top.charles7c.cnadmin.system.model.request;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;

View File

@ -19,7 +19,7 @@ package top.charles7c.cnadmin.system.model.request;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;

View File

@ -18,7 +18,7 @@ package top.charles7c.cnadmin.system.model.request;
import java.util.List; import java.util.List;
import javax.validation.constraints.*; import jakarta.validation.constraints.*;
import lombok.Data; import lombok.Data;

View File

@ -20,7 +20,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import javax.annotation.Resource; import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@ -20,7 +20,7 @@ import java.io.File;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import javax.annotation.Resource; import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@ -18,9 +18,9 @@ package top.charles7c.cnadmin.webapi.controller.common;
import java.time.Duration; import java.time.Duration;
import javax.mail.MessagingException; import jakarta.mail.MessagingException;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@ -16,7 +16,7 @@
package top.charles7c.cnadmin.webapi.controller.system; package top.charles7c.cnadmin.webapi.controller.system;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@ -53,7 +53,7 @@ public class UserController extends BaseController<UserService, UserVO, UserDeta
@Override @Override
@SaCheckPermission("system:user:add") @SaCheckPermission("system:user:add")
protected R<Long> add(@Validated(BaseRequest.Add.class) @RequestBody UserRequest request) { public R<Long> add(@Validated(BaseRequest.Add.class) @RequestBody UserRequest request) {
Long id = baseService.add(request); Long id = baseService.add(request);
return R.ok(String.format("新增成功,请牢记默认密码:%s", SysConsts.DEFAULT_PASSWORD), id); return R.ok(String.format("新增成功,请牢记默认密码:%s", SysConsts.DEFAULT_PASSWORD), id);
} }

View File

@ -20,7 +20,7 @@ spring:
master: master:
url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false
username: ${DB_USER:root} username: ${DB_USER:root}
password: ${DB_PWD:123456} password: ${DB_PWD:root}
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
# 从库配置(可配多个,构成多从) # 从库配置(可配多个,构成多从)
slave_1: slave_1:
@ -53,13 +53,14 @@ spring.liquibase:
--- ### Redis 单机配置 --- ### Redis 单机配置
spring: spring:
data:
redis: redis:
# 地址 # 地址
host: ${REDIS_HOST:127.0.0.1} host: ${REDIS_HOST:127.0.0.1}
# 端口(默认 6379 # 端口(默认 6379
port: ${REDIS_PORT:6379} port: ${REDIS_PORT:6379}
# 密码(未设置密码时可为空或注释掉) # 密码(未设置密码时可为空或注释掉)
password: ${REDIS_PWD:123456} # password: ${REDIS_PWD:123456}
# 数据库索引 # 数据库索引
database: ${REDIS_DB:0} database: ${REDIS_DB:0}
# 连接超时时间 # 连接超时时间

View File

@ -195,3 +195,22 @@ thread-pool:
queueCapacity: 128 queueCapacity: 128
# 活跃时间 # 活跃时间
keepAliveSeconds: 300 keepAliveSeconds: 300
management:
health:
mail:
# 临时关闭邮箱健康检查
# 注: 邮箱参数没有正确配置会出现mail health异常
enabled: false
# redis:
# # redis
# enabled: false
# mongo:
# # 关闭mongodb健康检查
# enabled: false
# solr:
# # 关闭solr健康检查
# enabled: false
# elasticsearch:
# # 关闭es健康检查
# enabled: false

45
pom.xml
View File

@ -14,8 +14,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -38,7 +38,7 @@ limitations under the License.
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version> <version>3.0.3</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
@ -54,17 +54,21 @@ limitations under the License.
<easyexcel.version>3.2.0</easyexcel.version> <easyexcel.version>3.2.0</easyexcel.version>
<ip2region.version>2.7.6</ip2region.version> <ip2region.version>2.7.6</ip2region.version>
<knife4j.version>4.0.0</knife4j.version> <knife4j.version>4.0.0</knife4j.version>
<redisson.version>3.19.0</redisson.version> <redisson.version>3.19.2</redisson.version>
<easy-captcha.version>1.6.2</easy-captcha.version> <easy-captcha.version>1.6.2</easy-captcha.version>
<hutool.version>5.8.11</hutool.version> <hutool.version>5.8.15</hutool.version>
<okhttp.version>4.10.0</okhttp.version>
<!-- ### 基础环境相关 ### --> <!-- ### 基础环境相关 ### -->
<revision>0.0.1-SNAPSHOT</revision> <revision>3.0.0</revision>
<java.version>1.8</java.version>
<spotless.version>2.28.0</spotless.version> <spotless.version>2.28.0</spotless.version>
<maven.compiler.source>8</maven.compiler.source> <!-- <skipTests>true</skipTests>-->
<maven.compiler.target>8</maven.compiler.target> <!-- ### 下面的这些属性spring-boot-starter-parent里<properties>已经有定义, 无需重复定义 ### -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
<!-- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>-->
<!-- <java.version>17</java.version>-->
<!-- <maven.compiler.source>17</maven.compiler.source>-->
<!-- <maven.compiler.target>17</maven.compiler.target>-->
</properties> </properties>
<profiles> <profiles>
@ -146,6 +150,12 @@ limitations under the License.
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version> <version>${easyexcel.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- 第三方封装 Ip2region离线 IP 数据管理框架和定位库支持亿级别的数据段10 微秒级别的查询性能,提供了许多主流编程语言的 xdb 数据管理引擎的实现) --> <!-- 第三方封装 Ip2region离线 IP 数据管理框架和定位库支持亿级别的数据段10 微秒级别的查询性能,提供了许多主流编程语言的 xdb 数据管理引擎的实现) -->
@ -185,6 +195,13 @@ limitations under the License.
<version>${hutool.version}</version> <version>${hutool.version}</version>
</dependency> </dependency>
<!-- OkHttp网络请求库-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
</dependency>
<!-- ################ 本项目子模块相关 ################ --> <!-- ################ 本项目子模块相关 ################ -->
<!-- API 模块(存放 Controller 层代码,打包部署的模块) --> <!-- API 模块(存放 Controller 层代码,打包部署的模块) -->
<dependency> <dependency>
@ -291,8 +308,8 @@ limitations under the License.
<!-- 远程仓库配置:阿里云 Maven 中央仓库公共代理仓库Central 仓和 JCenter 仓的聚合仓,帮助研发人员提高研发生产效率,使用阿里云 Maven 中央仓库作为下载源,速度更快更稳定) --> <!-- 远程仓库配置:阿里云 Maven 中央仓库公共代理仓库Central 仓和 JCenter 仓的聚合仓,帮助研发人员提高研发生产效率,使用阿里云 Maven 中央仓库作为下载源,速度更快更稳定) -->
<repositories> <repositories>
<repository> <repository>
<id>public</id> <id>aliyun-public</id>
<name>aliyun maven</name> <name>aliyun maven public</name>
<url>https://maven.aliyun.com/repository/public/</url> <url>https://maven.aliyun.com/repository/public/</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>
@ -302,8 +319,8 @@ limitations under the License.
<pluginRepositories> <pluginRepositories>
<pluginRepository> <pluginRepository>
<id>public</id> <id>aliyun-public</id>
<name>aliyun maven</name> <name>aliyun maven public</name>
<url>https://maven.aliyun.com/repository/public/</url> <url>https://maven.aliyun.com/repository/public/</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>