10分钟搭建脚手架:Spring Boot 3.2 + Vue3 前后端分离模板

10分钟搭建脚手架:Spring Boot 3.2 + Vue3 前后端分离模板

  • 一、项目结构设计
  • 二、后端搭建(Spring Boot 3.2)
    • 1. 快速初始化(使用 Spring Initializr)
    • 2. 核心配置
      • application.yml
      • 跨域配置 CorsConfig.java
    • 3. 安全配置
      • SecurityConfig.java
    • 4. JWT认证模块
      • JwtUtils.java
  • 三、前端搭建(Vue3 + Vite)
    • 1. 创建Vue项目
    • 2. 安装必要依赖
    • 3. 项目结构优化
    • 4. 核心配置
      • axios 封装 (api/index.ts)
      • 路由配置 (router/index.ts)
  • 四、前后端联调配置
    • 1. 开发环境代理 (Vite)
    • 2. 生产环境整合
  • 五、一键启动脚本
    • start-dev.sh (开发环境)
    • build-prod.sh (生产构建)
  • 六、Docker 容器化
    • Dockerfile (后端)
    • docker-compose.yml
  • 七、模板功能清单
  • 八、性能优化配置
    • 前端优化 (Vite)
    • 后端优化
  • 九、扩展功能集成
    • 1. 代码生成器
    • 2. 监控端点
  • 十、使用说明

一、项目结构设计

my-project/
├── backend/          # Spring Boot 3.2 后端
├── frontend/         # Vue3 前端
└── docker-compose.yml # 容器化部署

二、后端搭建(Spring Boot 3.2)

1. 快速初始化(使用 Spring Initializr)

  • 依赖选择:
    • Spring Web
    • Spring Data JPA
    • Lombok
    • Spring Security
    • MySQL Driver
    • Spring Boot DevTools

2. 核心配置

application.yml

server:port: 8080servlet:context-path: /apispring:datasource:url: jdbc:mysql://localhost:3306/app_db?useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverjpa:hibernate:ddl-auto: updateshow-sql: trueproperties:hibernate.format_sql: truesecurity:oauth2:resourceserver:jwt:issuer-uri: http://localhost:8080

跨域配置 CorsConfig.java

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.addAllowedOriginPattern("*");config.addAllowedHeader("*");config.addAllowedMethod("*");source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}

3. 安全配置

SecurityConfig.java

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.csrf().disable().authorizeHttpRequests(auth -> auth.requestMatchers("/api/auth/**").permitAll().anyRequest().authenticated()).sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));return http.build();}
}

4. JWT认证模块

JwtUtils.java

public class JwtUtils {private static final String SECRET_KEY = "mySecretKey";private static final long EXPIRATION_TIME = 86400000; // 24小时public static String generateToken(UserDetails userDetails) {return Jwts.builder().setSubject(userDetails.getUsername()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}public static String extractUsername(String token) {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();}
}

三、前端搭建(Vue3 + Vite)

1. 创建Vue项目

npm create vite@latest frontend -- --template vue-ts
cd frontend
npm install

2. 安装必要依赖

npm install axios vue-router@4 pinia @element-plus/icons-vue
npm install -D sass

3. 项目结构优化

src/
├── api/           # API请求封装
├── assets/         # 静态资源
├── components/     # 通用组件
├── router/         # 路由配置
├── store/          # 状态管理
├── views/          # 页面组件
├── utils/          # 工具函数
└── App.vue

4. 核心配置

axios 封装 (api/index.ts)

import axios from 'axios';const api = axios.create({baseURL: import.meta.env.DEV ? 'http://localhost:8080/api' : '/api',timeout: 10000,
});// 请求拦截器
api.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;
});// 响应拦截器
api.interceptors.response.use(response => response.data,error => {if (error.response?.status === 401) {localStorage.removeItem('token');window.location.href = '/login';}return Promise.reject(error);}
);export default api;

路由配置 (router/index.ts)

import { createRouter, createWebHistory } from 'vue-router';const routes = [{path: '/',name: 'Home',component: () => import('@/views/HomeView.vue'),meta: { requiresAuth: true }},{path: '/login',name: 'Login',component: () => import('@/views/LoginView.vue')}
];const router = createRouter({history: createWebHistory(),routes
});router.beforeEach((to, from, next) => {const token = localStorage.getItem('token');if (to.meta.requiresAuth && !token) {next('/login');} else {next();}
});export default router;

四、前后端联调配置

1. 开发环境代理 (Vite)

// vite.config.js
export default defineConfig({plugins: [vue()],server: {proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,rewrite: path => path.replace(/^\/api/, '')}}}
})

2. 生产环境整合

// Spring Boot 配置 (WebMvcConfig.java)
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/").resourceChain(true).addResolver(new PathResourceResolver() {@Overrideprotected Resource getResource(String resourcePath, Resource location) throws IOException {Resource requestedResource = location.createRelative(resourcePath);return requestedResource.exists() && requestedResource.isReadable() ? requestedResource : new ClassPathResource("/static/index.html");}});}
}

五、一键启动脚本

start-dev.sh (开发环境)

#!/bin/bash# 启动后端
cd backend && ./mvnw spring-boot:run &# 启动前端
cd frontend && npm run dev

build-prod.sh (生产构建)

#!/bin/bash# 构建前端
cd frontend
npm run build# 复制前端构建文件到后端
rm -rf ../backend/src/main/resources/static/*
cp -r dist/* ../backend/src/main/resources/static/# 构建后端JAR
cd ../backend
./mvnw clean package -DskipTests

六、Docker 容器化

Dockerfile (后端)

FROM openjdk:17-jdk-slim
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

docker-compose.yml

version: '3.8'services:backend:build: ./backendports:- "8080:8080"environment:SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/app_dbSPRING_DATASOURCE_USERNAME: rootSPRING_DATASOURCE_PASSWORD: rootdepends_on:db:condition: service_healthyfrontend:image: nginx:alpineports:- "80:80"volumes:- ./frontend/dist:/usr/share/nginx/htmldepends_on:- backenddb:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: app_dbvolumes:- mysql-data:/var/lib/mysqlhealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 5stimeout: 10sretries: 5volumes:mysql-data:

七、模板功能清单

  1. 后端功能:
    • JWT认证
    • 统一异常处理
    • 数据验证
    • 分页查询
    • 文件上传
    • API文档 (SpringDoc OpenAPI)
  2. 前端功能:
    • 响应式布局
    • 路由守卫
    • 状态管理
    • 主题切换
    • 国际化
    • 权限控制

八、性能优化配置

前端优化 (Vite)

// vite.config.js
export default defineConfig({build: {rollupOptions: {output: {manualChunks(id) {if (id.includes('node_modules')) {return 'vendor';}}}}}
})

后端优化

# application.yml
spring:jpa:properties:hibernate:jdbc:batch_size: 50fetch_size: 100order_inserts: trueorder_updates: true

九、扩展功能集成

1. 代码生成器

# 安装MyBatis Plus代码生成器
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version>
</dependency>

2. 监控端点

management:endpoints:web:exposure:include: health,info,metrics,prometheusendpoint:health:show-details: always

十、使用说明

  1. 开发模式:
./start-dev.sh
  1. 生产构建:
./build-prod.sh
  1. 容器部署:
docker-compose up -d --build

该模板已集成企业级开发所需的核心功能,10分钟内即可启动开发,适合作为微服务架构的基础模板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90649.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【轨物方案】分布式光伏电站运维升级智能化系列:老电站的数智化重生

自2010年分布式光伏在国内兴起以来&#xff0c;十余年间&#xff0c;市场装机容量已实现飞跃式增长。长期以来&#xff0c;传统的人工巡查和抄表模式是它们日常运维的主要手段。然而&#xff0c;随着电站数量的激增和设备的老化&#xff0c;由此导致的事故频发&#xff0c;使得…

RAG 技术深度面试题:架构、优化与实践应用

1. RAG 基础架构设计 问题&#xff1a;对比单阶段检索&#xff08;Single-stage Retrieval&#xff09;与两阶段检索&#xff08;Two-stage Retrieval&#xff09;在 RAG 系统中的架构差异&#xff0c;说明在企业知识库场景下为何优先选择两阶段检索&#xff1f; 答案&#xff…

yolov8通道级剪枝讲解(超详细思考版)

为了提升推理速度并降低部署成本&#xff0c;模型剪枝已成为关键技术。本文将结合实践操作&#xff0c;讲解YOLOv8模型剪枝的方法原理、实施步骤及注意事项。 虽然YOLOv8n版本本身参数量少、推理速度快&#xff0c;能满足大多数工业检测需求&#xff0c;但谷歌研究表明&#x…

JavaSE:随机数生成

随机数在游戏开发、密码学、模拟测试等场景中扮演着关键角色。本文将深入探讨Java中两种主流的随机数生成技术&#xff1a;Random类和Math.random()方法&#xff0c;并解析背后的类与对象概念&#xff0c;助你全面掌握随机数生成的核心机制。一、随机数生成的两大技术 Java提供…

Android 持久化存储原理与使用解析

一、核心存储方案详解1. SharedPreferences (SP)使用方式&#xff1a;// 获取实例 SharedPreferences sp getSharedPreferences("user_prefs", MODE_PRIVATE);// 写入数据 sp.edit().putString("username", "john_doe").putInt("login_cou…

无 sudo 权限的环境下将 nvcc (CUDA Toolkit) 安装到个人目录 linux

要在无 sudo 权限的环境下将 nvcc 安装到 home 个人目录&#xff0c;你可以手动安装 CUDA Toolkit 到你的 $HOME 目录&#xff0c;只需以下几步即可使用 nvcc 编译 CUDA 程序。 ✅ 步骤&#xff1a;本地安装 CUDA Toolkit&#xff08;含 nvcc&#xff09; 下载 CUDA Toolkit Ru…

从指标定义到AI执行流:衡石SENSE 6.0的BI PaaS如何重构ISV分析链路

一、痛点&#xff1a;ISV行业解决方案的“三重断链”传统ISV构建行业分析模块时面临的核心挑战&#xff1a;指标定义碎片化&#xff1a;客户A的“销售额”含税&#xff0c;客户B不含税&#xff0c;衍生指标无法复用&#xff1b;分析-执行割裂&#xff1a;发现库存异常后需人工导…

构建跨平台远程医疗系统中的视频通路技术方案探究

一、远程医疗走向日常化&#xff0c;音视频能力成为关键基础设施 随着医疗数字化与分级诊疗体系的不断演进&#xff0c;远程医疗正从试点探索阶段&#xff0c;逐步迈向常态化、标准化应用。从县域医院远程问诊、基层医疗协作&#xff0c;到大型三甲医院的术中协同、专科教学直…

Blackbox Exporter Docker 安装配置,并与 Prometheus 集成

1. 创建配置文件目录bashmkdir -p ~/docker/blackbox/config cd ~/docker/blackbox2. 创建 Blackbox Exporter 配置文件 config/blackbox.ymlyamlmodules:http_2xx: # HTTP 可用性检测(响应 2xx/3xx 状态码)prober: httphttp:valid_http_versions: ["HTTP/1.1", &qu…

杰理通用MCU串口+AT指令+485通讯工业语音芯片

一、概述 在现代智能设备与自动化系统中&#xff0c;语音交互功能日益普及&#xff0c;通用 MCU 语音芯片作为核心组件&#xff0c;承担着关键的语音处理任务。其强大的功能不仅体现在语音合成、识别等方面&#xff0c;还包括高效的通信能力。串口 AT 指令 485 通讯模式为通用…

Krpano 工具如何调节全景图片切割之后的分辨率

文章目录概要第一步1.1 复制一下这个文件中的key &#xff0c;打开 krpano Tools.exe第二步 修改切片之后的分辨率修改前的效果修改后的效果概要 前端渲染全景图模拟3D场景 Krpano 工具 获取到后的默认图片分辨率是2048*2048的&#xff0c;如果觉得分辨率低了可以自行在工具中…

物联网十大应用领域深度解析

一、智能物流技术基础&#xff1a;RFID、无线传感器网络、互联网与运筹学、供应链管理理论结合 应用场景&#xff1a;仓储管理&#xff1a;RFID标签实现库存实时监控&#xff0c;自动补货系统降低缺货率。配送优化&#xff1a;通过GPS与物联网数据分析规划最优路径&#xff0c;…

ElasticSearch基础数据查询和管理详解

目录 一、 ElasticSearch核心概念 1. 全文搜索&#xff08;Full-Text Search&#xff09; 2. 倒排索引&#xff08;Inverted Index&#xff09; 3. ElasticSearch常用术语 3.1 映射&#xff08;Mapping&#xff09; 3.2 索引&#xff08;Index&#xff09; 3.3 文档&…

SSE与Websocket有什么区别?

SSE&#xff08;Server-Sent Events&#xff09;和WebSocket都能实现服务器与客户端的实时通信&#xff0c;但它们在协议设计、应用场景和技术特性上有明显差异。以下从多个维度对比两者的区别&#xff1a; 1. 协议基础 SSE 基于HTTP协议&#xff0c;是HTTP的扩展。使用单向通…

力扣Hot100疑难杂症汇总

写在前面 这一篇博客主要用来记录力扣Hot100中我反复刷&#xff0c;但又反复错的难题&#xff0c;为了防止秋招手撕的时候尬住&#xff0c;写这篇博客记录一下那些容易遗忘而且对我来说难度较大的题目。后面复习的时候重点对着这个名单来刷题。 二叉树部分 114. 二叉树展开为…

硬核接线图+配置步骤:远程IO模块接入PLC全流程详解

远程IO模块和PLC&#xff08;可编程逻辑控制器&#xff09;的连接涉及多个方面&#xff0c;包括硬件准备、软件配置、接线方法以及注意事项等。PLC品牌大多分为国产、欧系、美系、日系。国产PLC主要有汇川、台达、和利时、信捷等品牌&#xff1b;欧美系PLC以西门子、施耐德、罗…

【数据结构】长幼有序:树、二叉树、堆与TOP-K问题的层次解析(含源码)

为什么我们要学那么多的数据结构&#xff1f;这是因为没有一种数据结构能够去应对所有场景。我们在不同的场景需要选择不同的数据结构&#xff0c;所以数据结构没有好坏之分&#xff0c;而评估数据结构的好坏要针对场景&#xff0c;就如我们已经学习的结构而言&#xff0c;如果…

wps dispimg python 解析实现参考

在 wps excel 中&#xff0c;可以把图片嵌入单元格&#xff0c;此时会图片单元格会显示如下内容 DISPIMG("ID_142D0E21999C4D899C0723FF7FA4A9DD",1)下面是针对这中图片文件的解析实现 参考博客&#xff1a;Python读取wps中的DISPIMG图片格式_wps dispimg-CSDN博客:h…

Java学习---Spring及其衍生(下)

接下来就到了Spring的另外2个知名的衍生框架&#xff0c;SpringBoot和SpringCloud。其中&#xff0c;SpringBoot 是由 Pivotal 团队开发的一个基于 Spring 的框架&#xff0c;它的设计目的是简化 Spring 应用程序的初始搭建和开发过程。SpringBoot 遵循 “约定优于配置” 的原则…

残月头像阁

残月头像阁 使用说明: 直接上传服务器即可## 项目简介残月头像阁是一个简洁美观的头像网站开源程序 支持快速部署与自定义采用拟态(Neumorphism)设计风格&#xff0c;提供多种分类的头像## 功能特性- &#x1f5bc;️ 多分类头像展示&#xff08;男生、女生、卡通、情侣、动漫&…