refactor(项目结构): 重构项目包结构和异常处理

- 将ResponseMessage和GlobalExceptionHandler移动到exceptopn包
- 重构服务接口包结构,将接口从service.imp移动到service包
- 更新所有控制器中ResponseMessage的引用路径
- 统一服务接口命名规范,去除I前缀
- 调整application.properties配置,统一服务端口
- 优化SecurityConfig权限配置,简化API访问控制
- 清理旧的日志文件
- 更新开发环境配置,添加前端开发端口支持
This commit is contained in:
qingfeng1121
2025-12-12 17:35:53 +08:00
parent 505a7a0944
commit 9b01ee8889
29 changed files with 3561 additions and 5219 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -63,25 +63,21 @@ public class SecurityConfig {
// 允许公开访问的路径 // 允许公开访问的路径
// 登录和认证相关端点应该全部公开 // 登录和认证相关端点应该全部公开
.antMatchers("/api/auth/**").permitAll() .antMatchers("/api/auth/**").permitAll()
// 公开get请求 // 文章浏览量增加接口公开
.antMatchers(HttpMethod.GET,"/api/help/**").permitAll()
.antMatchers(HttpMethod.GET,"/api/category-attributes/**").permitAll()
.antMatchers(HttpMethod.GET,"/api/markdowns/**").permitAll()
.antMatchers(HttpMethod.GET,"/api/articles/**").permitAll()
.antMatchers(HttpMethod.GET,"/api/messages/**").permitAll()
.antMatchers(HttpMethod.GET,"/api/categories/**").permitAll()
.antMatchers(HttpMethod.GET,"/api/category-attributes/**").permitAll()
.antMatchers(HttpMethod.GET,"/api/nonsense/**").permitAll()
// 公开post请求
.antMatchers(HttpMethod.POST,"/api/messages/**").permitAll()
.antMatchers(HttpMethod.POST,"/api/users/**").permitAll()
.antMatchers(HttpMethod.POST,"/api/articles/view/**").permitAll() .antMatchers(HttpMethod.POST,"/api/articles/view/**").permitAll()
// 所有GET请求公开
.antMatchers(HttpMethod.GET,"/api/**").permitAll()
// 新增、删除、修改操作需要管理员权限
.antMatchers(HttpMethod.POST,"/api/**").hasRole("ADMIN")
.antMatchers(HttpMethod.PUT,"/api/**").hasRole("ADMIN")
.antMatchers(HttpMethod.DELETE,"/api/**").hasRole("ADMIN")
// 管理员才能访问的路径 // 管理员才能访问的路径
.antMatchers("/api/admin/**").hasRole("ADMIN") .antMatchers("/api/admin/**").hasRole("ADMIN")
// 其他所有请求都需要认证 // 其他所有请求都需要认证
.anyRequest().authenticated() .anyRequest().authenticated()
.and() .and()
// 配置会话管理,使用无状态会话 // 配置会话管理,使用无状态会话策略
// 这意味着每个请求都需要包含认证信息如JWT
.sessionManagement() .sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and() .and()

View File

@@ -1,10 +1,11 @@
package com.qf.myafterprojecy.controller; package com.qf.myafterprojecy.controller;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Article; import com.qf.myafterprojecy.pojo.Article;
import com.qf.myafterprojecy.pojo.dto.ArticleDto; import com.qf.myafterprojecy.pojo.dto.ArticleDto;
import com.qf.myafterprojecy.pojo.dto.PageDto; import com.qf.myafterprojecy.pojo.dto.PageDto;
import com.qf.myafterprojecy.service.imp.IArticleService; import com.qf.myafterprojecy.service.IArticleService;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,6 +1,6 @@
package com.qf.myafterprojecy.controller; package com.qf.myafterprojecy.controller;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.utils.JwtUtils; import com.qf.myafterprojecy.utils.JwtUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,9 @@
package com.qf.myafterprojecy.controller; package com.qf.myafterprojecy.controller;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Category_attribute; import com.qf.myafterprojecy.pojo.Category_attribute;
import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto; import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto;
import com.qf.myafterprojecy.service.imp.ICategoryAttributeService; import com.qf.myafterprojecy.service.ICategoryAttributeService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,9 @@
package com.qf.myafterprojecy.controller; package com.qf.myafterprojecy.controller;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Category; import com.qf.myafterprojecy.pojo.Category;
import com.qf.myafterprojecy.pojo.dto.CategoryDto; import com.qf.myafterprojecy.pojo.dto.CategoryDto;
import com.qf.myafterprojecy.service.imp.ICategoryService; import com.qf.myafterprojecy.service.ICategoryService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;

View File

@@ -1,9 +1,9 @@
package com.qf.myafterprojecy.controller; package com.qf.myafterprojecy.controller;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Message; import com.qf.myafterprojecy.pojo.Message;
import com.qf.myafterprojecy.pojo.dto.MessageDto; import com.qf.myafterprojecy.pojo.dto.MessageDto;
import com.qf.myafterprojecy.service.imp.IMessageService; import com.qf.myafterprojecy.service.IMessageService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,9 @@
package com.qf.myafterprojecy.controller; package com.qf.myafterprojecy.controller;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Nonsense; import com.qf.myafterprojecy.pojo.Nonsense;
import com.qf.myafterprojecy.pojo.dto.NonsenseDto; import com.qf.myafterprojecy.pojo.dto.NonsenseDto;
import com.qf.myafterprojecy.service.imp.INonsenseService; import com.qf.myafterprojecy.service.INonsenseService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,9 @@
package com.qf.myafterprojecy.controller; package com.qf.myafterprojecy.controller;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Users; import com.qf.myafterprojecy.pojo.Users;
import com.qf.myafterprojecy.pojo.dto.UserDto; import com.qf.myafterprojecy.pojo.dto.UserDto;
import com.qf.myafterprojecy.service.imp.IUserService; import com.qf.myafterprojecy.service.IUserService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,4 +1,4 @@
package com.qf.myafterprojecy; package com.qf.myafterprojecy.exceptopn;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -7,8 +7,6 @@ import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.qf.myafterprojecy.config.ResponseMessage;
@RestControllerAdvice @RestControllerAdvice
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

View File

@@ -1,4 +1,4 @@
package com.qf.myafterprojecy.config; package com.qf.myafterprojecy.exceptopn;
import lombok.Data; import lombok.Data;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;

View File

@@ -1,6 +1,6 @@
package com.qf.myafterprojecy.service.imp; package com.qf.myafterprojecy.service;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Article; import com.qf.myafterprojecy.pojo.Article;
import com.qf.myafterprojecy.pojo.dto.ArticleDto; import com.qf.myafterprojecy.pojo.dto.ArticleDto;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;

View File

@@ -1,6 +1,6 @@
package com.qf.myafterprojecy.service.imp; package com.qf.myafterprojecy.service;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Category_attribute; import com.qf.myafterprojecy.pojo.Category_attribute;
import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto; import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto;

View File

@@ -1,6 +1,6 @@
package com.qf.myafterprojecy.service.imp; package com.qf.myafterprojecy.service;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Category; import com.qf.myafterprojecy.pojo.Category;
import com.qf.myafterprojecy.pojo.dto.CategoryDto; import com.qf.myafterprojecy.pojo.dto.CategoryDto;

View File

@@ -1,6 +1,6 @@
package com.qf.myafterprojecy.service.imp; package com.qf.myafterprojecy.service;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Message; import com.qf.myafterprojecy.pojo.Message;
import com.qf.myafterprojecy.pojo.dto.MessageDto; import com.qf.myafterprojecy.pojo.dto.MessageDto;

View File

@@ -1,6 +1,6 @@
package com.qf.myafterprojecy.service.imp; package com.qf.myafterprojecy.service;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Nonsense; import com.qf.myafterprojecy.pojo.Nonsense;
import com.qf.myafterprojecy.pojo.dto.NonsenseDto; import com.qf.myafterprojecy.pojo.dto.NonsenseDto;

View File

@@ -1,6 +1,6 @@
package com.qf.myafterprojecy.service.imp; package com.qf.myafterprojecy.service;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Users; import com.qf.myafterprojecy.pojo.Users;
import com.qf.myafterprojecy.pojo.dto.UserDto; import com.qf.myafterprojecy.pojo.dto.UserDto;

View File

@@ -1,11 +1,11 @@
package com.qf.myafterprojecy.service; package com.qf.myafterprojecy.service.impl;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Article; import com.qf.myafterprojecy.pojo.Article;
import com.qf.myafterprojecy.pojo.dto.ArticleDto; import com.qf.myafterprojecy.pojo.dto.ArticleDto;
import com.qf.myafterprojecy.repository.ArticleRepository; import com.qf.myafterprojecy.repository.ArticleRepository;
import com.qf.myafterprojecy.repository.CategoryAttributeRepository; import com.qf.myafterprojecy.repository.CategoryAttributeRepository;
import com.qf.myafterprojecy.service.imp.IArticleService; import com.qf.myafterprojecy.service.IArticleService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,10 +1,10 @@
package com.qf.myafterprojecy.service; package com.qf.myafterprojecy.service.impl;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Category_attribute; import com.qf.myafterprojecy.pojo.Category_attribute;
import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto; import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto;
import com.qf.myafterprojecy.repository.CategoryAttributeRepository; import com.qf.myafterprojecy.repository.CategoryAttributeRepository;
import com.qf.myafterprojecy.service.imp.ICategoryAttributeService; import com.qf.myafterprojecy.service.ICategoryAttributeService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,10 +1,10 @@
package com.qf.myafterprojecy.service; package com.qf.myafterprojecy.service.impl;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Category; import com.qf.myafterprojecy.pojo.Category;
import com.qf.myafterprojecy.pojo.dto.CategoryDto; import com.qf.myafterprojecy.pojo.dto.CategoryDto;
import com.qf.myafterprojecy.repository.CategoryRepository; import com.qf.myafterprojecy.repository.CategoryRepository;
import com.qf.myafterprojecy.service.imp.ICategoryService; import com.qf.myafterprojecy.service.ICategoryService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,10 +1,10 @@
package com.qf.myafterprojecy.service; package com.qf.myafterprojecy.service.impl;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Message; import com.qf.myafterprojecy.pojo.Message;
import com.qf.myafterprojecy.pojo.dto.MessageDto; import com.qf.myafterprojecy.pojo.dto.MessageDto;
import com.qf.myafterprojecy.repository.MessageRepository; import com.qf.myafterprojecy.repository.MessageRepository;
import com.qf.myafterprojecy.service.imp.IMessageService; import com.qf.myafterprojecy.service.IMessageService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,10 +1,10 @@
package com.qf.myafterprojecy.service; package com.qf.myafterprojecy.service.impl;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Nonsense; import com.qf.myafterprojecy.pojo.Nonsense;
import com.qf.myafterprojecy.pojo.dto.NonsenseDto; import com.qf.myafterprojecy.pojo.dto.NonsenseDto;
import com.qf.myafterprojecy.repository.NonsenseRepository; import com.qf.myafterprojecy.repository.NonsenseRepository;
import com.qf.myafterprojecy.service.imp.INonsenseService; import com.qf.myafterprojecy.service.INonsenseService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -1,10 +1,10 @@
package com.qf.myafterprojecy.service; package com.qf.myafterprojecy.service.impl;
import com.qf.myafterprojecy.config.ResponseMessage; import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import com.qf.myafterprojecy.pojo.Users; import com.qf.myafterprojecy.pojo.Users;
import com.qf.myafterprojecy.pojo.dto.UserDto; import com.qf.myafterprojecy.pojo.dto.UserDto;
import com.qf.myafterprojecy.repository.UsersRepository; import com.qf.myafterprojecy.repository.UsersRepository;
import com.qf.myafterprojecy.service.imp.IUserService; import com.qf.myafterprojecy.service.IUserService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -5,7 +5,7 @@
# ==================================================================== # ====================================================================
# 应用基本配置 - 开发特定 # 应用基本配置 - 开发特定
server.port=7070 server.port=7071
# ==================================================================== # ====================================================================
# 数据库与JPA配置 - 开发用 # 数据库与JPA配置 - 开发用
@@ -38,7 +38,7 @@ jwt.token-prefix=Bearer
# 安全与CORS配置 - 开发用 # 安全与CORS配置 - 开发用
# ==================================================================== # ====================================================================
# CORS配置开发环境允许所有本地前端访问 # CORS配置开发环境允许所有本地前端访问
cors.allowed-origins=http://localhost:3000,http://localhost:8080 cors.allowed-origins=http://localhost:3000,http://localhost:8080,http://localhost:5173
cors.allowed-methods=GET,POST,PUT,DELETE,OPTIONS cors.allowed-methods=GET,POST,PUT,DELETE,OPTIONS
cors.allowed-headers=* cors.allowed-headers=*
cors.allow-credentials=true cors.allow-credentials=true
@@ -58,6 +58,10 @@ logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
# 热部署配置 # 热部署配置
spring.devtools.restart.enabled=true spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java spring.devtools.restart.additional-paths=src/main/java
# 解决DevTools重启时丢失profile配置的问题
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s
spring.devtools.restart.exclude=static/**,public/**
# Actuator配置开发环境开放更多端点便于调试 # Actuator配置开发环境开放更多端点便于调试
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.include=*

View File

@@ -4,7 +4,7 @@
# ==================================================================== # ====================================================================
# 应用基本配置 - 生产特定 # 应用基本配置 - 生产特定
server.port=8080 server.port=7070
# ==================================================================== # ====================================================================
# 数据库与JPA配置 - 生产用 # 数据库与JPA配置 - 生产用

View File

@@ -4,7 +4,7 @@
# 环境激活配置 # 环境激活配置
# 说明:默认激活开发环境,生产环境部署时应通过命令行参数或环境变量覆盖 # 说明:默认激活开发环境,生产环境部署时应通过命令行参数或环境变量覆盖
spring.profiles.active=dev spring.profiles.active=dev
server.port=7070
# 应用名称(通用配置) # 应用名称(通用配置)
spring.application.name=web_project spring.application.name=web_project