From 3c35abc454be7f79be534dc6c59b91d21cf8b14d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sat, 26 Apr 2025 14:38:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iflytop/gd/app/common/base/BaseEntity.java | 44 ------------ .../iflytop/gd/app/common/base/BasePageQuery.java | 26 ------- .../com/iflytop/gd/app/common/base/IBaseEnum.java | 84 ---------------------- .../iflytop/gd/app/common/enums/DeletedEnum.java | 24 ------- .../iflytop/gd/app/common/enums/StatusEnum.java | 24 ------- .../iflytop/gd/app/common/result/IResultCode.java | 12 ---- .../iflytop/gd/app/common/result/PageResult.java | 43 ----------- .../com/iflytop/gd/app/common/result/Result.java | 71 ------------------ .../iflytop/gd/app/common/result/ResultCode.java | 75 ------------------- .../iflytop/gd/app/config/MybatisPlusConfig.java | 61 ---------------- .../com/iflytop/gd/app/config/SwaggerConfig.java | 69 ------------------ .../java/com/iflytop/gd/app/config/WebConfig.java | 16 ----- .../com/iflytop/gd/app/config/WebSocketConfig.java | 14 ---- .../com/iflytop/gd/app/config/WebSocketServer.java | 49 ------------- .../gd/app/core/handler/MyMetaObjectHandler.java | 36 ---------- .../iflytop/gd/system/common/base/BaseEntity.java | 44 ++++++++++++ .../gd/system/common/base/BasePageQuery.java | 26 +++++++ .../iflytop/gd/system/common/base/IBaseEnum.java | 84 ++++++++++++++++++++++ .../gd/system/common/enums/DeletedEnum.java | 24 +++++++ .../iflytop/gd/system/common/enums/StatusEnum.java | 24 +++++++ .../gd/system/common/result/IResultCode.java | 12 ++++ .../gd/system/common/result/PageResult.java | 43 +++++++++++ .../iflytop/gd/system/common/result/Result.java | 71 ++++++++++++++++++ .../gd/system/common/result/ResultCode.java | 75 +++++++++++++++++++ .../gd/system/config/MybatisPlusConfig.java | 61 ++++++++++++++++ .../iflytop/gd/system/config/SwaggerConfig.java | 69 ++++++++++++++++++ .../com/iflytop/gd/system/config/WebConfig.java | 16 +++++ .../iflytop/gd/system/config/WebSocketConfig.java | 14 ++++ .../iflytop/gd/system/config/WebSocketServer.java | 49 +++++++++++++ .../gd/system/handler/MyMetaObjectHandler.java | 36 ++++++++++ 30 files changed, 648 insertions(+), 648 deletions(-) delete mode 100644 src/main/java/com/iflytop/gd/app/common/base/BaseEntity.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/base/BasePageQuery.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/base/IBaseEnum.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/enums/DeletedEnum.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/enums/StatusEnum.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/result/IResultCode.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/result/PageResult.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/result/Result.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/result/ResultCode.java delete mode 100644 src/main/java/com/iflytop/gd/app/config/MybatisPlusConfig.java delete mode 100644 src/main/java/com/iflytop/gd/app/config/SwaggerConfig.java delete mode 100644 src/main/java/com/iflytop/gd/app/config/WebConfig.java delete mode 100644 src/main/java/com/iflytop/gd/app/config/WebSocketConfig.java delete mode 100644 src/main/java/com/iflytop/gd/app/config/WebSocketServer.java delete mode 100644 src/main/java/com/iflytop/gd/app/core/handler/MyMetaObjectHandler.java create mode 100644 src/main/java/com/iflytop/gd/system/common/base/BaseEntity.java create mode 100644 src/main/java/com/iflytop/gd/system/common/base/BasePageQuery.java create mode 100644 src/main/java/com/iflytop/gd/system/common/base/IBaseEnum.java create mode 100644 src/main/java/com/iflytop/gd/system/common/enums/DeletedEnum.java create mode 100644 src/main/java/com/iflytop/gd/system/common/enums/StatusEnum.java create mode 100644 src/main/java/com/iflytop/gd/system/common/result/IResultCode.java create mode 100644 src/main/java/com/iflytop/gd/system/common/result/PageResult.java create mode 100644 src/main/java/com/iflytop/gd/system/common/result/Result.java create mode 100644 src/main/java/com/iflytop/gd/system/common/result/ResultCode.java create mode 100644 src/main/java/com/iflytop/gd/system/config/MybatisPlusConfig.java create mode 100644 src/main/java/com/iflytop/gd/system/config/SwaggerConfig.java create mode 100644 src/main/java/com/iflytop/gd/system/config/WebConfig.java create mode 100644 src/main/java/com/iflytop/gd/system/config/WebSocketConfig.java create mode 100644 src/main/java/com/iflytop/gd/system/config/WebSocketServer.java create mode 100644 src/main/java/com/iflytop/gd/system/handler/MyMetaObjectHandler.java diff --git a/src/main/java/com/iflytop/gd/app/common/base/BaseEntity.java b/src/main/java/com/iflytop/gd/app/common/base/BaseEntity.java deleted file mode 100644 index 03d2ff3..0000000 --- a/src/main/java/com/iflytop/gd/app/common/base/BaseEntity.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.iflytop.gd.app.common.base; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 基础实体类 - * 实体类的基类,包含了实体类的公共属性,如创建时间、更新时间、逻辑删除标识等

- */ -@Data -public class BaseEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - @TableId(type = IdType.AUTO) - private Long id; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/iflytop/gd/app/common/base/BasePageQuery.java b/src/main/java/com/iflytop/gd/app/common/base/BasePageQuery.java deleted file mode 100644 index 3bafece..0000000 --- a/src/main/java/com/iflytop/gd/app/common/base/BasePageQuery.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.iflytop.gd.app.common.base; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 基础分页请求对象 - */ -@Data -@Schema -public class BasePageQuery implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @Schema(description = "页码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private int pageNum = 1; - - @Schema(description = "每页记录数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private int pageSize = 10; - - -} diff --git a/src/main/java/com/iflytop/gd/app/common/base/IBaseEnum.java b/src/main/java/com/iflytop/gd/app/common/base/IBaseEnum.java deleted file mode 100644 index 7ff5a4a..0000000 --- a/src/main/java/com/iflytop/gd/app/common/base/IBaseEnum.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.iflytop.gd.app.common.base; - - -import cn.hutool.core.util.ObjectUtil; - -import java.util.EnumSet; -import java.util.Objects; - -/** - * 枚举通用接口 - */ -public interface IBaseEnum { - - /** - * 根据值获取枚举 - * - * @param value - * @param clazz - * @param 枚举 - * @return - */ - static & IBaseEnum> E getEnumByValue(Object value, Class clazz) { - Objects.requireNonNull(value); - EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 - E matchEnum = allEnums.stream() - .filter(e -> ObjectUtil.equal(e.getValue(), value)) - .findFirst() - .orElse(null); - return matchEnum; - } - - /** - * 根据文本标签获取值 - * - * @param value - * @param clazz - * @param - * @return - */ - static & IBaseEnum> String getLabelByValue(Object value, Class clazz) { - Objects.requireNonNull(value); - EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 - E matchEnum = allEnums.stream() - .filter(e -> ObjectUtil.equal(e.getValue(), value)) - .findFirst() - .orElse(null); - - String label = null; - if (matchEnum != null) { - label = matchEnum.getLabel(); - } - return label; - } - - /** - * 根据文本标签获取值 - * - * @param label - * @param clazz - * @param - * @return - */ - static & IBaseEnum> Object getValueByLabel(String label, Class clazz) { - Objects.requireNonNull(label); - EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 - String finalLabel = label; - E matchEnum = allEnums.stream() - .filter(e -> ObjectUtil.equal(e.getLabel(), finalLabel)) - .findFirst() - .orElse(null); - - Object value = null; - if (matchEnum != null) { - value = matchEnum.getValue(); - } - return value; - } - - T getValue(); - - String getLabel(); - - -} diff --git a/src/main/java/com/iflytop/gd/app/common/enums/DeletedEnum.java b/src/main/java/com/iflytop/gd/app/common/enums/DeletedEnum.java deleted file mode 100644 index 1953753..0000000 --- a/src/main/java/com/iflytop/gd/app/common/enums/DeletedEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iflytop.gd.app.common.enums; - -import com.iflytop.gd.app.common.base.IBaseEnum; -import lombok.Getter; - -/** - * 删除状态枚举 - */ -@Getter -public enum DeletedEnum implements IBaseEnum { - - ENABLE(1, "删除"), - DISABLE(0, "未删除"); - - private final Integer value; - - - private final String label; - - DeletedEnum(Integer value, String label) { - this.value = value; - this.label = label; - } -} diff --git a/src/main/java/com/iflytop/gd/app/common/enums/StatusEnum.java b/src/main/java/com/iflytop/gd/app/common/enums/StatusEnum.java deleted file mode 100644 index e97d65b..0000000 --- a/src/main/java/com/iflytop/gd/app/common/enums/StatusEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iflytop.gd.app.common.enums; - -import com.iflytop.gd.app.common.base.IBaseEnum; -import lombok.Getter; - -/** - * 状态枚举 - */ -@Getter -public enum StatusEnum implements IBaseEnum { - - ENABLE(1, "启用"), - DISABLE(0, "禁用"); - - private final Integer value; - - - private final String label; - - StatusEnum(Integer value, String label) { - this.value = value; - this.label = label; - } -} diff --git a/src/main/java/com/iflytop/gd/app/common/result/IResultCode.java b/src/main/java/com/iflytop/gd/app/common/result/IResultCode.java deleted file mode 100644 index b9bf916..0000000 --- a/src/main/java/com/iflytop/gd/app/common/result/IResultCode.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iflytop.gd.app.common.result; - -/** - * 响应码接口 - **/ -public interface IResultCode { - - String getCode(); - - String getMsg(); - -} diff --git a/src/main/java/com/iflytop/gd/app/common/result/PageResult.java b/src/main/java/com/iflytop/gd/app/common/result/PageResult.java deleted file mode 100644 index 4e70674..0000000 --- a/src/main/java/com/iflytop/gd/app/common/result/PageResult.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.iflytop.gd.app.common.result; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * 分页响应结构体 - */ -@Data -public class PageResult implements Serializable { - - private String code; - - private Data data; - - private String msg; - - public static PageResult success(IPage page) { - PageResult result = new PageResult<>(); - result.setCode(ResultCode.SUCCESS.getCode()); - - Data data = new Data<>(); - data.setList(page.getRecords()); - data.setTotal(page.getTotal()); - - result.setData(data); - result.setMsg(ResultCode.SUCCESS.getMsg()); - return result; - } - - @lombok.Data - public static class Data { - - private List list; - - private long total; - - } - -} diff --git a/src/main/java/com/iflytop/gd/app/common/result/Result.java b/src/main/java/com/iflytop/gd/app/common/result/Result.java deleted file mode 100644 index de9f0ca..0000000 --- a/src/main/java/com/iflytop/gd/app/common/result/Result.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.iflytop.gd.app.common.result; - -import cn.hutool.core.util.StrUtil; -import lombok.Data; - -import java.io.Serializable; - -/** - * 统一响应结构体 - **/ -@Data -public class Result implements Serializable { - - private String code; - - private T data; - - private String msg; - - public static Result success() { - return success(null); - } - - public static Result success(T data) { - Result result = new Result<>(); - result.setCode(ResultCode.SUCCESS.getCode()); - result.setMsg(ResultCode.SUCCESS.getMsg()); - result.setData(data); - return result; - } - - public static Result failed() { - return result(ResultCode.SYSTEM_ERROR.getCode(), ResultCode.SYSTEM_ERROR.getMsg(), null); - } - - public static Result failed(String msg) { - return result(ResultCode.SYSTEM_ERROR.getCode(), msg, null); - } - - public static Result judge(boolean status) { - if (status) { - return success(); - } else { - return failed(); - } - } - - public static Result failed(IResultCode resultCode) { - return result(resultCode.getCode(), resultCode.getMsg(), null); - } - - public static Result failed(IResultCode resultCode, String msg) { - return result(resultCode.getCode(), StrUtil.isNotBlank(msg) ? msg : resultCode.getMsg(), null); - } - - private static Result result(IResultCode resultCode, T data) { - return result(resultCode.getCode(), resultCode.getMsg(), data); - } - - private static Result result(String code, String msg, T data) { - Result result = new Result<>(); - result.setCode(code); - result.setData(data); - result.setMsg(msg); - return result; - } - - public static boolean isSuccess(Result result) { - return result != null && ResultCode.SUCCESS.getCode().equals(result.getCode()); - } -} diff --git a/src/main/java/com/iflytop/gd/app/common/result/ResultCode.java b/src/main/java/com/iflytop/gd/app/common/result/ResultCode.java deleted file mode 100644 index 0a32830..0000000 --- a/src/main/java/com/iflytop/gd/app/common/result/ResultCode.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.iflytop.gd.app.common.result; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.io.Serializable; - -/** - * 统一前端响应码定义 - */ -@Getter -@AllArgsConstructor -public enum ResultCode implements IResultCode, Serializable { - // 成功 - SUCCESS("00000", "成功"), - - // 通用失败 - FAILED("99999", "失败"), - - // 参数校验类(4xxxx) - VALIDATION_ERROR("40000", "参数校验失败"), - - // 鉴权/认证类(4xxxx) - UNAUTHORIZED("40100", "未认证或Token失效"), - FORBIDDEN("40300", "无访问权限"), - - // 资源访问类(4xxxx) - NOT_FOUND("40400", "资源不存在"), - METHOD_NOT_ALLOWED("40500", "不支持的请求方法"), - - // 系统错误(5xxxx) - SYSTEM_ERROR("50000", "系统内部错误"), - - // ----------------- 业务错误(1xxxx)示例 ----------------- - USER_NOT_FOUND("10001", "用户不存在"), - USERNAME_ALREADY_EXISTS("10002", "用户名已存在"), - PASSWORD_INCORRECT("10003", "用户名或密码错误"); - - /** - * 状态码 - */ - private final String code; - /** - * 提示信息 - */ - private final String msg; - - @Override - public String getCode() { - return code; - } - - @Override - public String getMsg() { - return msg; - } - - /** - * 根据 code 获取枚举 - */ - public static ResultCode parse(String code) { - for (ResultCode item : values()) { - if (item.code.equals(code)) { - return item; - } - } - // 找不到则返回通用失败或系统错误 - return SYSTEM_ERROR; - } - - @Override - public String toString() { - return "{\"code\":\"" + code + "\", \"msg\":\"" + msg + "\"}"; - } -} diff --git a/src/main/java/com/iflytop/gd/app/config/MybatisPlusConfig.java b/src/main/java/com/iflytop/gd/app/config/MybatisPlusConfig.java deleted file mode 100644 index ff3a4c2..0000000 --- a/src/main/java/com/iflytop/gd/app/config/MybatisPlusConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.iflytop.gd.app.config; - -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.core.config.GlobalConfig; -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.iflytop.gd.app.core.handler.MyMetaObjectHandler; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -/** - * - */ -@EnableTransactionManagement -@Configuration -public class MybatisPlusConfig { - - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - // 乐观锁插件 - interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); - // 分页插件 - interceptor.addInnerInterceptor(paginationInnerInterceptor()); - - return interceptor; - } - - /** - * 分页插件,自动识别数据库类型 - * https://baomidou.com/guide/interceptor-pagination.html - */ - public PaginationInnerInterceptor paginationInnerInterceptor() { - PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); - // 设置数据库类型 - paginationInnerInterceptor.setDbType(DbType.SQLITE); - // 设置最大单页限制数量,默认 500 条,-1 不受限制 - paginationInnerInterceptor.setMaxLimit(-1L); - return paginationInnerInterceptor; - } - - /** - * 乐观锁插件 - * https://baomidou.com/guide/interceptor-optimistic-locker.html - */ - public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { - return new OptimisticLockerInnerInterceptor(); - } - - /** - * 自动填充数据库创建人、创建时间、更新人、更新时间 - */ - @Bean - public GlobalConfig globalConfig() { - GlobalConfig globalConfig = new GlobalConfig(); - globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); - return globalConfig; - } -} diff --git a/src/main/java/com/iflytop/gd/app/config/SwaggerConfig.java b/src/main/java/com/iflytop/gd/app/config/SwaggerConfig.java deleted file mode 100644 index a14d960..0000000 --- a/src/main/java/com/iflytop/gd/app/config/SwaggerConfig.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.iflytop.gd.app.config; - -import cn.hutool.core.util.ArrayUtil; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.springdoc.core.customizers.GlobalOpenApiCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpHeaders; -import org.springframework.util.AntPathMatcher; - -import java.util.stream.Stream; - -/*** - * 创建Swagger配置 - */ -@Configuration -public class SwaggerConfig { - - @Bean - public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() { - return openApi -> { - // 全局添加Authorization - if (openApi.getPaths() != null) { - openApi.getPaths().forEach((path, pathItem) -> { - - // 忽略认证的请求无需携带 Authorization - String[] ignoreUrls = {"/api/auth/login"}; - if (ArrayUtil.isNotEmpty(ignoreUrls)) { - // Ant 匹配忽略的路径,不添加Authorization - AntPathMatcher antPathMatcher = new AntPathMatcher(); - if (Stream.of(ignoreUrls).anyMatch(ignoreUrl -> antPathMatcher.match(ignoreUrl, path))) { - return; - } - } - - // 其他接口统一添加Authorization - pathItem.readOperations() - .forEach(operation -> - operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)) - ); - }); - } - }; - } - - @Bean - public OpenAPI customOpenAPI() { - return new OpenAPI() - .info(new Info() - .title("系统API") - .version("1.0")) // 配置全局鉴权参数-Authorize - .components(new Components() - .addSecuritySchemes(HttpHeaders.AUTHORIZATION, - new SecurityScheme() - .name(HttpHeaders.AUTHORIZATION) - .type(SecurityScheme.Type.APIKEY) - .in(SecurityScheme.In.HEADER) - .scheme("Bearer") - .bearerFormat("JWT") - ) - ); - } - - -} diff --git a/src/main/java/com/iflytop/gd/app/config/WebConfig.java b/src/main/java/com/iflytop/gd/app/config/WebConfig.java deleted file mode 100644 index 52cdc05..0000000 --- a/src/main/java/com/iflytop/gd/app/config/WebConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iflytop.gd.app.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/api/**") - .allowedOrigins("*") - .allowedMethods("GET", "POST", "PUT", "DELETE") - .allowedHeaders("*"); - } -} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/app/config/WebSocketConfig.java b/src/main/java/com/iflytop/gd/app/config/WebSocketConfig.java deleted file mode 100644 index 9b9d910..0000000 --- a/src/main/java/com/iflytop/gd/app/config/WebSocketConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iflytop.gd.app.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -@Configuration -public class WebSocketConfig { - - @Bean - public ServerEndpointExporter serverEndpointExporter() { - return new ServerEndpointExporter(); - } -} diff --git a/src/main/java/com/iflytop/gd/app/config/WebSocketServer.java b/src/main/java/com/iflytop/gd/app/config/WebSocketServer.java deleted file mode 100644 index c62119c..0000000 --- a/src/main/java/com/iflytop/gd/app/config/WebSocketServer.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.iflytop.gd.app.config; - - -import jakarta.websocket.*; -import jakarta.websocket.server.ServerEndpoint; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -@Slf4j -@ServerEndpoint("/ws") -@Component -public class WebSocketServer { - - private static final Set sessions = Collections.synchronizedSet(new HashSet<>()); - - public static void sendMessageToClients(String message) { - synchronized (sessions) { - for (Session session : sessions) { - try { - session.getBasicRemote().sendText(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - @OnOpen - public void onOpen(Session session) { - sessions.add(session); - } - - @OnMessage - public void onMessage(String message, Session session) { - } - - @OnClose - public void onClose(Session session) { - sessions.remove(session); // 移除关闭连接的 Session - } - - @OnError - public void onError(Throwable error) { - } -} diff --git a/src/main/java/com/iflytop/gd/app/core/handler/MyMetaObjectHandler.java b/src/main/java/com/iflytop/gd/app/core/handler/MyMetaObjectHandler.java deleted file mode 100644 index dba1765..0000000 --- a/src/main/java/com/iflytop/gd/app/core/handler/MyMetaObjectHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.iflytop.gd.app.core.handler; - -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import org.apache.ibatis.reflection.MetaObject; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; - -/** - * mybatis-plus 字段自动填充 - */ -@Component -public class MyMetaObjectHandler implements MetaObjectHandler { - - /** - * 新增填充创建时间 - * - * @param metaObject 元数据 - */ - @Override - public void insertFill(MetaObject metaObject) { - this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); - this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); - } - - /** - * 更新填充更新时间 - * - * @param metaObject 元数据 - */ - @Override - public void updateFill(MetaObject metaObject) { - this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); - } - -} diff --git a/src/main/java/com/iflytop/gd/system/common/base/BaseEntity.java b/src/main/java/com/iflytop/gd/system/common/base/BaseEntity.java new file mode 100644 index 0000000..0af2428 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/base/BaseEntity.java @@ -0,0 +1,44 @@ +package com.iflytop.gd.system.common.base; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 基础实体类 + * 实体类的基类,包含了实体类的公共属性,如创建时间、更新时间、逻辑删除标识等

+ */ +@Data +public class BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + +} diff --git a/src/main/java/com/iflytop/gd/system/common/base/BasePageQuery.java b/src/main/java/com/iflytop/gd/system/common/base/BasePageQuery.java new file mode 100644 index 0000000..f53725c --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/base/BasePageQuery.java @@ -0,0 +1,26 @@ +package com.iflytop.gd.system.common.base; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 基础分页请求对象 + */ +@Data +@Schema +public class BasePageQuery implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "页码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private int pageNum = 1; + + @Schema(description = "每页记录数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + private int pageSize = 10; + + +} diff --git a/src/main/java/com/iflytop/gd/system/common/base/IBaseEnum.java b/src/main/java/com/iflytop/gd/system/common/base/IBaseEnum.java new file mode 100644 index 0000000..72ff589 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/base/IBaseEnum.java @@ -0,0 +1,84 @@ +package com.iflytop.gd.system.common.base; + + +import cn.hutool.core.util.ObjectUtil; + +import java.util.EnumSet; +import java.util.Objects; + +/** + * 枚举通用接口 + */ +public interface IBaseEnum { + + /** + * 根据值获取枚举 + * + * @param value + * @param clazz + * @param 枚举 + * @return + */ + static & IBaseEnum> E getEnumByValue(Object value, Class clazz) { + Objects.requireNonNull(value); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + E matchEnum = allEnums.stream() + .filter(e -> ObjectUtil.equal(e.getValue(), value)) + .findFirst() + .orElse(null); + return matchEnum; + } + + /** + * 根据文本标签获取值 + * + * @param value + * @param clazz + * @param + * @return + */ + static & IBaseEnum> String getLabelByValue(Object value, Class clazz) { + Objects.requireNonNull(value); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + E matchEnum = allEnums.stream() + .filter(e -> ObjectUtil.equal(e.getValue(), value)) + .findFirst() + .orElse(null); + + String label = null; + if (matchEnum != null) { + label = matchEnum.getLabel(); + } + return label; + } + + /** + * 根据文本标签获取值 + * + * @param label + * @param clazz + * @param + * @return + */ + static & IBaseEnum> Object getValueByLabel(String label, Class clazz) { + Objects.requireNonNull(label); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + String finalLabel = label; + E matchEnum = allEnums.stream() + .filter(e -> ObjectUtil.equal(e.getLabel(), finalLabel)) + .findFirst() + .orElse(null); + + Object value = null; + if (matchEnum != null) { + value = matchEnum.getValue(); + } + return value; + } + + T getValue(); + + String getLabel(); + + +} diff --git a/src/main/java/com/iflytop/gd/system/common/enums/DeletedEnum.java b/src/main/java/com/iflytop/gd/system/common/enums/DeletedEnum.java new file mode 100644 index 0000000..858d27d --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/enums/DeletedEnum.java @@ -0,0 +1,24 @@ +package com.iflytop.gd.system.common.enums; + +import com.iflytop.gd.system.common.base.IBaseEnum; +import lombok.Getter; + +/** + * 删除状态枚举 + */ +@Getter +public enum DeletedEnum implements IBaseEnum { + + ENABLE(1, "删除"), + DISABLE(0, "未删除"); + + private final Integer value; + + + private final String label; + + DeletedEnum(Integer value, String label) { + this.value = value; + this.label = label; + } +} diff --git a/src/main/java/com/iflytop/gd/system/common/enums/StatusEnum.java b/src/main/java/com/iflytop/gd/system/common/enums/StatusEnum.java new file mode 100644 index 0000000..d5104d5 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/enums/StatusEnum.java @@ -0,0 +1,24 @@ +package com.iflytop.gd.system.common.enums; + +import com.iflytop.gd.system.common.base.IBaseEnum; +import lombok.Getter; + +/** + * 状态枚举 + */ +@Getter +public enum StatusEnum implements IBaseEnum { + + ENABLE(1, "启用"), + DISABLE(0, "禁用"); + + private final Integer value; + + + private final String label; + + StatusEnum(Integer value, String label) { + this.value = value; + this.label = label; + } +} diff --git a/src/main/java/com/iflytop/gd/system/common/result/IResultCode.java b/src/main/java/com/iflytop/gd/system/common/result/IResultCode.java new file mode 100644 index 0000000..a4d80f3 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/result/IResultCode.java @@ -0,0 +1,12 @@ +package com.iflytop.gd.system.common.result; + +/** + * 响应码接口 + **/ +public interface IResultCode { + + String getCode(); + + String getMsg(); + +} diff --git a/src/main/java/com/iflytop/gd/system/common/result/PageResult.java b/src/main/java/com/iflytop/gd/system/common/result/PageResult.java new file mode 100644 index 0000000..8deb6b6 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/result/PageResult.java @@ -0,0 +1,43 @@ +package com.iflytop.gd.system.common.result; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 分页响应结构体 + */ +@Data +public class PageResult implements Serializable { + + private String code; + + private Data data; + + private String msg; + + public static PageResult success(IPage page) { + PageResult result = new PageResult<>(); + result.setCode(ResultCode.SUCCESS.getCode()); + + Data data = new Data<>(); + data.setList(page.getRecords()); + data.setTotal(page.getTotal()); + + result.setData(data); + result.setMsg(ResultCode.SUCCESS.getMsg()); + return result; + } + + @lombok.Data + public static class Data { + + private List list; + + private long total; + + } + +} diff --git a/src/main/java/com/iflytop/gd/system/common/result/Result.java b/src/main/java/com/iflytop/gd/system/common/result/Result.java new file mode 100644 index 0000000..c42ae63 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/result/Result.java @@ -0,0 +1,71 @@ +package com.iflytop.gd.system.common.result; + +import cn.hutool.core.util.StrUtil; +import lombok.Data; + +import java.io.Serializable; + +/** + * 统一响应结构体 + **/ +@Data +public class Result implements Serializable { + + private String code; + + private T data; + + private String msg; + + public static Result success() { + return success(null); + } + + public static Result success(T data) { + Result result = new Result<>(); + result.setCode(ResultCode.SUCCESS.getCode()); + result.setMsg(ResultCode.SUCCESS.getMsg()); + result.setData(data); + return result; + } + + public static Result failed() { + return result(ResultCode.SYSTEM_ERROR.getCode(), ResultCode.SYSTEM_ERROR.getMsg(), null); + } + + public static Result failed(String msg) { + return result(ResultCode.SYSTEM_ERROR.getCode(), msg, null); + } + + public static Result judge(boolean status) { + if (status) { + return success(); + } else { + return failed(); + } + } + + public static Result failed(IResultCode resultCode) { + return result(resultCode.getCode(), resultCode.getMsg(), null); + } + + public static Result failed(IResultCode resultCode, String msg) { + return result(resultCode.getCode(), StrUtil.isNotBlank(msg) ? msg : resultCode.getMsg(), null); + } + + private static Result result(IResultCode resultCode, T data) { + return result(resultCode.getCode(), resultCode.getMsg(), data); + } + + private static Result result(String code, String msg, T data) { + Result result = new Result<>(); + result.setCode(code); + result.setData(data); + result.setMsg(msg); + return result; + } + + public static boolean isSuccess(Result result) { + return result != null && ResultCode.SUCCESS.getCode().equals(result.getCode()); + } +} diff --git a/src/main/java/com/iflytop/gd/system/common/result/ResultCode.java b/src/main/java/com/iflytop/gd/system/common/result/ResultCode.java new file mode 100644 index 0000000..0bc77a5 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/result/ResultCode.java @@ -0,0 +1,75 @@ +package com.iflytop.gd.system.common.result; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.io.Serializable; + +/** + * 统一前端响应码定义 + */ +@Getter +@AllArgsConstructor +public enum ResultCode implements IResultCode, Serializable { + // 成功 + SUCCESS("00000", "成功"), + + // 通用失败 + FAILED("99999", "失败"), + + // 参数校验类(4xxxx) + VALIDATION_ERROR("40000", "参数校验失败"), + + // 鉴权/认证类(4xxxx) + UNAUTHORIZED("40100", "未认证或Token失效"), + FORBIDDEN("40300", "无访问权限"), + + // 资源访问类(4xxxx) + NOT_FOUND("40400", "资源不存在"), + METHOD_NOT_ALLOWED("40500", "不支持的请求方法"), + + // 系统错误(5xxxx) + SYSTEM_ERROR("50000", "系统内部错误"), + + // ----------------- 业务错误(1xxxx)示例 ----------------- + USER_NOT_FOUND("10001", "用户不存在"), + USERNAME_ALREADY_EXISTS("10002", "用户名已存在"), + PASSWORD_INCORRECT("10003", "用户名或密码错误"); + + /** + * 状态码 + */ + private final String code; + /** + * 提示信息 + */ + private final String msg; + + @Override + public String getCode() { + return code; + } + + @Override + public String getMsg() { + return msg; + } + + /** + * 根据 code 获取枚举 + */ + public static ResultCode parse(String code) { + for (ResultCode item : values()) { + if (item.code.equals(code)) { + return item; + } + } + // 找不到则返回通用失败或系统错误 + return SYSTEM_ERROR; + } + + @Override + public String toString() { + return "{\"code\":\"" + code + "\", \"msg\":\"" + msg + "\"}"; + } +} diff --git a/src/main/java/com/iflytop/gd/system/config/MybatisPlusConfig.java b/src/main/java/com/iflytop/gd/system/config/MybatisPlusConfig.java new file mode 100644 index 0000000..0c0a462 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/config/MybatisPlusConfig.java @@ -0,0 +1,61 @@ +package com.iflytop.gd.system.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.iflytop.gd.system.handler.MyMetaObjectHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * + */ +@EnableTransactionManagement +@Configuration +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + + return interceptor; + } + + /** + * 分页插件,自动识别数据库类型 + * ... + */ + public PaginationInnerInterceptor paginationInnerInterceptor() { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 设置数据库类型 + paginationInnerInterceptor.setDbType(DbType.SQLITE); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInnerInterceptor.setMaxLimit(-1L); + return paginationInnerInterceptor; + } + + /** + * 乐观锁插件 + * ... + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { + return new OptimisticLockerInnerInterceptor(); + } + + /** + * 自动填充数据库创建人、创建时间、更新人、更新时间 + */ + @Bean + public GlobalConfig globalConfig() { + GlobalConfig globalConfig = new GlobalConfig(); + globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); + return globalConfig; + } +} diff --git a/src/main/java/com/iflytop/gd/system/config/SwaggerConfig.java b/src/main/java/com/iflytop/gd/system/config/SwaggerConfig.java new file mode 100644 index 0000000..db82617 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/config/SwaggerConfig.java @@ -0,0 +1,69 @@ +package com.iflytop.gd.system.config; + +import cn.hutool.core.util.ArrayUtil; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springdoc.core.customizers.GlobalOpenApiCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.util.AntPathMatcher; + +import java.util.stream.Stream; + +/*** + * 创建Swagger配置 + */ +@Configuration +public class SwaggerConfig { + + @Bean + public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() { + return openApi -> { + // 全局添加Authorization + if (openApi.getPaths() != null) { + openApi.getPaths().forEach((path, pathItem) -> { + + // 忽略认证的请求无需携带 Authorization + String[] ignoreUrls = {"/api/auth/login"}; + if (ArrayUtil.isNotEmpty(ignoreUrls)) { + // Ant 匹配忽略的路径,不添加Authorization + AntPathMatcher antPathMatcher = new AntPathMatcher(); + if (Stream.of(ignoreUrls).anyMatch(ignoreUrl -> antPathMatcher.match(ignoreUrl, path))) { + return; + } + } + + // 其他接口统一添加Authorization + pathItem.readOperations() + .forEach(operation -> + operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)) + ); + }); + } + }; + } + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("系统API") + .version("1.0")) // 配置全局鉴权参数-Authorize + .components(new Components() + .addSecuritySchemes(HttpHeaders.AUTHORIZATION, + new SecurityScheme() + .name(HttpHeaders.AUTHORIZATION) + .type(SecurityScheme.Type.APIKEY) + .in(SecurityScheme.In.HEADER) + .scheme("Bearer") + .bearerFormat("JWT") + ) + ); + } + + +} diff --git a/src/main/java/com/iflytop/gd/system/config/WebConfig.java b/src/main/java/com/iflytop/gd/system/config/WebConfig.java new file mode 100644 index 0000000..633d918 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/config/WebConfig.java @@ -0,0 +1,16 @@ +package com.iflytop.gd.system.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**") + .allowedOrigins("*") + .allowedMethods("GET", "POST", "PUT", "DELETE") + .allowedHeaders("*"); + } +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/system/config/WebSocketConfig.java b/src/main/java/com/iflytop/gd/system/config/WebSocketConfig.java new file mode 100644 index 0000000..24f1bad --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/config/WebSocketConfig.java @@ -0,0 +1,14 @@ +package com.iflytop.gd.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/src/main/java/com/iflytop/gd/system/config/WebSocketServer.java b/src/main/java/com/iflytop/gd/system/config/WebSocketServer.java new file mode 100644 index 0000000..ddf7634 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/config/WebSocketServer.java @@ -0,0 +1,49 @@ +package com.iflytop.gd.system.config; + + +import jakarta.websocket.*; +import jakarta.websocket.server.ServerEndpoint; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +@Slf4j +@ServerEndpoint("/ws") +@Component +public class WebSocketServer { + + private static final Set sessions = Collections.synchronizedSet(new HashSet<>()); + + public static void sendMessageToClients(String message) { + synchronized (sessions) { + for (Session session : sessions) { + try { + session.getBasicRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + @OnOpen + public void onOpen(Session session) { + sessions.add(session); + } + + @OnMessage + public void onMessage(String message, Session session) { + } + + @OnClose + public void onClose(Session session) { + sessions.remove(session); // 移除关闭连接的 Session + } + + @OnError + public void onError(Throwable error) { + } +} diff --git a/src/main/java/com/iflytop/gd/system/handler/MyMetaObjectHandler.java b/src/main/java/com/iflytop/gd/system/handler/MyMetaObjectHandler.java new file mode 100644 index 0000000..a838157 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/handler/MyMetaObjectHandler.java @@ -0,0 +1,36 @@ +package com.iflytop.gd.system.handler; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * mybatis-plus 字段自动填充 + */ +@Component +public class MyMetaObjectHandler implements MetaObjectHandler { + + /** + * 新增填充创建时间 + * + * @param metaObject 元数据 + */ + @Override + public void insertFill(MetaObject metaObject) { + this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); + this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); + } + + /** + * 更新填充更新时间 + * + * @param metaObject 元数据 + */ + @Override + public void updateFill(MetaObject metaObject) { + this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); + } + +}