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

View File

@@ -63,25 +63,21 @@ public class SecurityConfig {
// 允许公开访问的路径
// 登录和认证相关端点应该全部公开
.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()
// 所有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")
// 其他所有请求都需要认证
.anyRequest().authenticated()
.and()
// 配置会话管理,使用无状态会话
// 配置会话管理,使用无状态会话策略
// 这意味着每个请求都需要包含认证信息如JWT
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()

View File

@@ -1,10 +1,11 @@
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.dto.ArticleDto;
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.beans.factory.annotation.Autowired;

View File

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

View File

@@ -1,9 +1,9 @@
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.dto.CategoryAttributeDto;
import com.qf.myafterprojecy.service.imp.ICategoryAttributeService;
import com.qf.myafterprojecy.service.ICategoryAttributeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,9 @@
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.dto.CategoryDto;
import com.qf.myafterprojecy.service.imp.ICategoryService;
import com.qf.myafterprojecy.service.ICategoryService;
import org.slf4j.Logger;
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.RestController;
import com.qf.myafterprojecy.config.ResponseMessage;
import com.qf.myafterprojecy.exceptopn.ResponseMessage;
import java.io.File;
import java.io.FileInputStream;

View File

@@ -1,9 +1,9 @@
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.dto.MessageDto;
import com.qf.myafterprojecy.service.imp.IMessageService;
import com.qf.myafterprojecy.service.IMessageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,9 @@
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.dto.NonsenseDto;
import com.qf.myafterprojecy.service.imp.INonsenseService;
import com.qf.myafterprojecy.service.INonsenseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,9 @@
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.dto.UserDto;
import com.qf.myafterprojecy.service.imp.IUserService;
import com.qf.myafterprojecy.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,4 +1,4 @@
package com.qf.myafterprojecy;
package com.qf.myafterprojecy.exceptopn;
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.RestControllerAdvice;
import com.qf.myafterprojecy.config.ResponseMessage;
@RestControllerAdvice
public class GlobalExceptionHandler {
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 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.dto.ArticleDto;
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.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.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.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.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.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.dto.ArticleDto;
import com.qf.myafterprojecy.repository.ArticleRepository;
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.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.dto.CategoryAttributeDto;
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.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.dto.CategoryDto;
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.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.dto.MessageDto;
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.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.dto.NonsenseDto;
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.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.dto.UserDto;
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.LoggerFactory;

View File

@@ -5,7 +5,7 @@
# ====================================================================
# 应用基本配置 - 开发特定
server.port=7070
server.port=7071
# ====================================================================
# 数据库与JPA配置 - 开发用
@@ -38,7 +38,7 @@ jwt.token-prefix=Bearer
# 安全与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-headers=*
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.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配置开发环境开放更多端点便于调试
management.endpoints.web.exposure.include=*

View File

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

View File

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