Spring Boot+Vue前后端分离博客系统开发实践 📅 2026/8/10 5:46:54 1. 项目概述与技术选型这个博客管理系统采用前后端分离架构后端基于Spring Boot框架前端使用Vue.js实现。这种架构选择在当前企业级应用开发中已经成为主流方案它能够充分发挥Java在服务端开发中的稳定性和Vue在前端交互体验上的优势。Spring Boot作为后端框架有几个显著优势自动配置减少了XML配置的繁琐内嵌Tomcat服务器简化了部署流程Starter依赖管理让技术集成变得简单Actuator提供了完善的监控端点Vue.js作为前端框架则具备响应式数据绑定带来的开发效率提升组件化开发模式的可维护性优势渐进式框架的灵活适配能力丰富的生态系统和社区支持2. 系统架构设计2.1 整体架构图[前端层] Vue.js Element UI ↑↓ HTTP/HTTPS [API网关层] Spring Cloud Gateway ↑↓ [业务服务层] Spring Boot ↑↓ [数据访问层] Spring Data JPA/MyBatis ↑↓ [数据存储层] MySQL Redis2.2 技术栈详解后端技术栈核心框架Spring Boot 2.7.x安全框架Spring Security JWT数据库MySQL 8.0缓存Redis 6.x搜索Elasticsearch 7.x可选消息队列RabbitMQ可选文件存储MinIO/阿里云OSS前端技术栈核心框架Vue 3.xUI组件库Element Plus状态管理Vuex/Pinia路由管理Vue RouterHTTP客户端Axios构建工具Vite3. 后端实现细节3.1 项目结构规范标准的Spring Boot项目结构src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── blog/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # 控制器 │ │ ├── dto/ # 数据传输对象 │ │ ├── entity/ # 实体类 │ │ ├── repository/ # 数据访问层 │ │ ├── service/ # 业务逻辑层 │ │ ├── util/ # 工具类 │ │ └── BlogApplication.java # 启动类 │ └── resources/ │ ├── static/ # 静态资源 │ ├── templates/ # 模板文件 │ └── application.yml # 配置文件 └── test/ # 测试代码3.2 核心功能实现3.2.1 用户认证模块采用JWT实现无状态认证// JWT工具类示例 public class JwtUtil { private static final String SECRET_KEY your-secret-key; private static final long EXPIRATION_TIME 864_000_000; // 10天 public static String generateToken(UserDetails userDetails) { return Jwts.builder() .setSubject(userDetails.getUsername()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } public static String extractUsername(String token) { return Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody() .getSubject(); } }3.2.2 博客文章管理文章实体类设计Entity Table(name articles) public class Article { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; Column(nullable false, length 100) private String title; Column(columnDefinition TEXT) private String content; ManyToOne JoinColumn(name author_id) private User author; Column(name create_time) private LocalDateTime createTime; Column(name update_time) private LocalDateTime updateTime; // getters and setters }3.2.3 评论系统实现嵌套评论数据结构设计Entity Table(name comments) public class Comment { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; ManyToOne JoinColumn(name article_id) private Article article; ManyToOne JoinColumn(name user_id) private User user; Column(columnDefinition TEXT) private String content; ManyToOne JoinColumn(name parent_id) private Comment parent; OneToMany(mappedBy parent, cascade CascadeType.ALL) private ListComment replies new ArrayList(); // getters and setters }4. 前端实现细节4.1 Vue项目结构标准Vue项目结构src/ ├── assets/ # 静态资源 ├── components/ # 公共组件 ├── composables/ # 组合式函数 ├── router/ # 路由配置 ├── stores/ # 状态管理 ├── styles/ # 全局样式 ├── utils/ # 工具函数 ├── views/ # 页面组件 ├── App.vue # 根组件 └── main.js # 入口文件4.2 核心页面实现4.2.1 文章列表页使用Vue3 Composition API实现script setup import { ref, onMounted } from vue import { getArticles } from /api/article import ArticleCard from /components/ArticleCard.vue const articles ref([]) const loading ref(false) const pagination ref({ page: 1, size: 10, total: 0 }) const fetchArticles async () { loading.value true try { const res await getArticles({ page: pagination.value.page, size: pagination.value.size }) articles.value res.data.list pagination.value.total res.data.total } finally { loading.value false } } onMounted(() { fetchArticles() }) /script template div classarticle-list el-skeleton :loadingloading animated template #default article-card v-forarticle in articles :keyarticle.id :articlearticle / el-pagination v-model:current-pagepagination.page :page-sizepagination.size :totalpagination.total current-changefetchArticles / /template /el-skeleton /div /template4.2.2 富文本编辑器集成使用TinyMCE实现script setup import { ref } from vue import Editor from tinymce/tinymce-vue const content ref() const init { height: 500, menubar: false, plugins: [ advlist autolink lists link image charmap print preview anchor, searchreplace visualblocks code fullscreen, insertdatetime media table paste code help wordcount ], toolbar: undo redo | formatselect | bold italic backcolor | \ alignleft aligncenter alignright alignjustify | \ bullist numlist outdent indent | removeformat | help } /script template editor v-modelcontent :initinit / /template5. 前后端交互设计5.1 RESTful API规范博客系统主要API设计GET /api/articles # 获取文章列表 POST /api/articles # 创建文章 GET /api/articles/{id} # 获取文章详情 PUT /api/articles/{id} # 更新文章 DELETE /api/articles/{id} # 删除文章 GET /api/articles/{id}/comments # 获取文章评论 POST /api/articles/{id}/comments # 添加评论5.2 Axios封装示例统一的请求拦截和响应处理import axios from axios import { ElMessage } from element-plus import router from /router const service axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, timeout: 10000 }) // 请求拦截器 service.interceptors.request.use( config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] Bearer ${token} } return config }, error { return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response { const res response.data if (res.code ! 200) { ElMessage.error(res.message || Error) if (res.code 401) { router.push(/login) } return Promise.reject(new Error(res.message || Error)) } return res }, error { ElMessage.error(error.message) return Promise.reject(error) } ) export default service6. 系统安全与性能优化6.1 安全防护措施SQL注入防护使用JPA/Hibernate等ORM框架的参数绑定对原生SQL使用预编译语句避免直接拼接SQL字符串XSS防护前端使用vue-sanitize处理富文本后端对用户输入进行过滤设置HTTP头X-XSS-ProtectionCSRF防护使用Spring Security的CSRF保护对敏感操作要求二次验证接口限流Configuration public class RateLimitConfig { Bean public FilterRegistrationBeanRateLimitFilter rateLimitFilter() { FilterRegistrationBeanRateLimitFilter registration new FilterRegistrationBean(); registration.setFilter(new RateLimitFilter()); registration.addUrlPatterns(/api/*); registration.setName(rateLimitFilter); registration.setOrder(1); return registration; } }6.2 性能优化方案缓存策略文章详情使用Redis缓存热门文章列表缓存5分钟使用Spring Cache抽象层数据库优化为常用查询字段添加索引大文本字段单独存储定期进行表优化前端性能使用Vite进行构建优化组件懒加载图片懒加载和CDN加速异步处理Async public void updateArticleViewCount(Long articleId) { articleRepository.incrementViewCount(articleId); }7. 部署与运维7.1 生产环境部署推荐使用Docker Compose部署version: 3.8 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: blog volumes: - mysql_data:/var/lib/mysql ports: - 3306:3306 redis: image: redis:6.2 ports: - 6379:6379 volumes: - redis_data:/data backend: build: ./backend ports: - 8080:8080 depends_on: - mysql - redis environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/blog SPRING_REDIS_HOST: redis frontend: build: ./frontend ports: - 80:80 depends_on: - backend volumes: mysql_data: redis_data:7.2 监控与日志Spring Boot Actuator配置management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: alwaysELK日志收集方案使用Logstash收集日志Elasticsearch存储日志Kibana进行可视化分析Prometheus监控Configuration EnablePrometheusEndpoint EnableSpringBootMetricsCollector public class PrometheusConfig { }8. 项目扩展方向多语言支持后端使用Spring的MessageSource前端使用vue-i18n第三方登录集成微信/QQ/GitHub OAuth2.0使用Spring Security OAuth2 Client内容审核接入阿里云内容安全API敏感词过滤系统数据分析用户行为分析文章阅读量统计热门标签分析微服务改造使用Spring Cloud拆分服务文章服务、用户服务、评论服务独立部署使用Nacos作为注册中心在实际开发过程中我发现有几个关键点需要特别注意前后端分离项目要确保API文档的及时更新可以使用Swagger或YAPI进行管理富文本内容存储要考虑XSS防护同时保留必要的格式信息分页查询一定要做好性能优化特别是当数据量大的时候用户权限设计要细致RBAC模型是个不错的选择生产环境一定要做好备份策略包括数据库和文件存储