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);
+ }
+
+}