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
英文地址,請注明出處:http://en.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;男生、女生、卡通、情侶、動漫&…