diff --git a/README.md b/README.md index c02ffa7..c513094 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,178 @@ http://localhost ``` +> 说明:以上为原始快速启动说明。当前升级后的 v2.0 分支已迁移到 Spring Boot 3,推荐使用 JDK 17 运行;旧版本中的 JDK 1.8 说明仅适用于早期分支。 + + +## 当前升级版本说明 + +当前代码已完成 Spring Boot 3 兼容升级,主要技术栈如下: + +- Java 17 +- Spring Boot 3.3.5 +- Spring Security 6 +- Spring Data JPA / Hibernate 6 +- FreeMarker +- H2 Database(开发环境默认) +- MySQL 8(生产/外部数据库环境) +- Flyway(数据库版本迁移) +- SpringDoc OpenAPI(替代 Springfox Swagger) +- Ehcache 3 + JCache +- Druid Spring Boot 3 Starter +- MapStruct + + +## 环境要求 + +- JDK:17+ +- Maven:3.8+ +- MySQL:8.x(仅 mysql profile 需要) + +检查本地环境: + +``` +java -version +javac -version +mvn -version +``` + + +## 构建与启动 + +### 使用默认 H2 开发环境 + +项目默认激活 `h2` profile: + +``` +mvn spring-boot:run +``` + +访问: + +``` +http://localhost +``` + +如果本机 Linux 普通用户无法绑定 80 端口,可以临时指定其他端口: + +``` +mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8080" +``` + +然后访问: + +``` +http://localhost:8080 +``` + + +### 使用 MySQL 环境 + +1. 创建数据库: + +``` +CREATE DATABASE jiscuss DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +``` + +2. 修改配置文件: + +``` +src/main/resources/application-mysql.yml +``` + +根据实际环境修改: + +- `spring.datasource.url` +- `spring.datasource.username` +- `spring.datasource.password` + +3. 启动 mysql profile: + +``` +mvn spring-boot:run -Dspring-boot.run.profiles=mysql +``` + + +## 数据库迁移说明 + +项目已使用 Flyway 接管数据库初始化和后续变更,迁移脚本位于: + +``` +src/main/resources/db/migration/ +``` + +当前迁移文件: + +- `V1__init_schema.sql`:初始化表结构和基础数据 +- `V2__security_updates.sql`:安全相关字段/数据升级 + +注意:旧的 `schema.sql` 和 `data.sql` 已不再使用,避免与 Flyway 重复初始化。 + + +## 安全与管理端点 + +- 登录认证已迁移到 Spring Security 6 配置方式。 +- `/admin/**`、`/actuator/**`、`/druid/**` 需要管理员角色访问。 +- H2 Console 默认关闭;如需开发调试,可显式开启: + +``` +mvn spring-boot:run -Dspring-boot.run.arguments="--spring.h2.console.enabled=true" +``` + +- OpenAPI 文档地址: + +``` +http://localhost/swagger-ui.html +http://localhost/v3/api-docs +``` + + +## 网络不佳时的构建建议 + +如果依赖已经下载到本地 Maven 仓库,可以使用离线模式: + +``` +mvn -o -DskipTests compile +``` + +如果首次构建尚未下载 Spring Boot 3.3.5 等依赖,离线模式会失败,需要在网络可用时先执行一次: + +``` +mvn -DskipTests compile +``` + +国内网络环境可配置 Maven 镜像源后再构建。依赖下载完成后,后续即可使用 `mvn -o` 离线构建。 + + +## 常用检查命令 + +编译检查: + +``` +mvn -DskipTests compile +``` + +打包: + +``` +mvn -DskipTests package +``` + +运行 jar: + +``` +java -jar target/jiscuss-0.0.1-SNAPSHOT.jar +``` + + +## 升级注意事项 + +- Spring Boot 3 使用 `jakarta.*` 命名空间,旧的 `javax.servlet`、`javax.persistence`、`javax.validation` 不再使用。 +- Hibernate 6 可自动识别数据库方言,配置中无需手动指定 `database-platform`。 +- MySQL 连接已移除不推荐的 `autoReconnect=true`。 +- JSON 响应优先使用 Spring MVC + Jackson 自动序列化,不再依赖 `org.json`。 +- WebSocket starter 已移除;如后续确实需要实时通信,再按功能重新引入。 + ## [四]、开源协议 diff --git a/pom.xml b/pom.xml index 9324ba5..f3e2286 100644 --- a/pom.xml +++ b/pom.xml @@ -39,10 +39,6 @@ org.springframework.boot spring-boot-starter-web - - org.springframework.boot - spring-boot-starter-websocket - org.springframework.boot @@ -73,13 +69,6 @@ runtime - - - org.json - json - 20240303 - - org.springdoc diff --git a/src/main/java/com/yaoyuan/jiscuss/common/Node.java b/src/main/java/com/yaoyuan/jiscuss/common/Node.java index 6c85f10..7939139 100644 --- a/src/main/java/com/yaoyuan/jiscuss/common/Node.java +++ b/src/main/java/com/yaoyuan/jiscuss/common/Node.java @@ -2,6 +2,8 @@ package com.yaoyuan.jiscuss.common; import com.yaoyuan.jiscuss.entity.custom.PostCustom; import lombok.Data; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Date; @@ -17,6 +19,8 @@ import java.util.List; @Data public class Node { + private static final Logger logger = LoggerFactory.getLogger(Node.class); + /** * Node * 空方法 @@ -85,7 +89,7 @@ public class Node { for (Node node1 : list) { //循环添加 if (node1.getId().equals(node.getParentId())) { //判断留言的上一段是都是这条留言 node1.getNextNodes().add(node); //是,添加,返回true; - System.out.println("添加了一个"); + logger.debug("添加了一个"); return true; } else { //否则递归继续判断 if (node1.getNextNodes().size() != 0) { @@ -127,7 +131,7 @@ public class Node { **/ public static void show(List list) { for (Node node : list) { - System.out.println(node.getUserId() + " 用户回复了你:" + node.getContent()); + logger.debug("{} 用户回复了你:{}", node.getUserId(), node.getContent()); if (node.getNextNodes().size() != 0) { Node.show(node.getNextNodes()); } diff --git a/src/main/java/com/yaoyuan/jiscuss/config/WebSecurityConfig.java b/src/main/java/com/yaoyuan/jiscuss/config/WebSecurityConfig.java index 182e509..e297f6a 100644 --- a/src/main/java/com/yaoyuan/jiscuss/config/WebSecurityConfig.java +++ b/src/main/java/com/yaoyuan/jiscuss/config/WebSecurityConfig.java @@ -16,7 +16,7 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler; +import org.springframework.security.web.access.expression.DefaultHttpSecurityExpressionHandler; import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager; /** @@ -69,7 +69,7 @@ public class WebSecurityConfig { *

Security decisions: *