完整 Spring Boot + Vue 登錄系統

項目名稱:springboot-vue-login-template


? 功能一覽

模塊功能
后端Spring Boot + MyBatis Plus + JWT + Shiro
數據庫MySQL 用戶表
前端Vue3 + Element Plus + Axios
登錄流程用戶名/密碼驗證 → 返回 Token → 存儲 LocalStorage
權限控制攔截器校驗 Token + Shiro 角色權限
跨域配置后端支持跨域請求
接口安全所有接口需攜帶 Token 訪問

📁 項目結構概覽

springboot-vue-login-template/
├── backend/             # Spring Boot 后端模塊
│   ├── src/main/java      # Java源碼
│   ├── src/main/resources # 配置文件
│   └── pom.xml            # Maven依賴管理
├── frontend/            # Vue3 前端模塊
│   ├── public/
│   ├── src/
│   │   ├── views/         # 頁面組件
│   │   ├── utils/         # 工具類
│   │   └── main.js        # 入口文件
│   └── package.json       # 依賴管理
└── README.md              # 項目說明文檔

🧱 數據庫腳本(MySQL)

CREATE DATABASE springboot_login;USE springboot_login;CREATE TABLE sys_user (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,nickname VARCHAR(50),create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);-- 示例用戶(密碼為123456)
INSERT INTO sys_user (username, password, nickname)
VALUES ('admin', '$2a$10$eACCYoNOHEzWZhE8Cwe6gOXEpTLExV6l', '管理員');

🚀 后端代碼(Spring Boot)

1. application.yml

server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/springboot_login?useSSL=false&serverTimezone=UTCusername: rootpassword: yourpassworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath:/mapper/*.xml

2. JWT 工具類 JwtUtils.java

import io.jsonwebtoken.*;
import java.util.Date;public class JwtUtils {private static final String SECRET = "your-secret-key";private static final long EXPIRATION = 86400000; // 24小時public static String generateToken(String username) {return Jwts.builder().setSubject(username).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)).signWith(SignatureAlgorithm.HS512, SECRET).compact();}public static String parseToken(String token) {return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getSubject();}
}

3. 登錄接口 AuthController.java

@RestController
@RequestMapping("/api/auth")
public class AuthController {@Autowiredprivate UserService userService;@PostMapping("/login")public ResponseEntity<?> login(@RequestBody LoginRequest request) {SysUser user = userService.findByUsername(request.getUsername());if (user == null || !user.getPassword().equals(request.getPassword())) {throw new RuntimeException("用戶名或密碼錯誤");}String token = JwtUtils.generateToken(user.getUsername());return ResponseEntity.ok().header("Authorization", "Bearer " + token).build();}
}

4. 自定義攔截器 JwtInterceptor.java

@Component
public class JwtInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("Authorization");if (token != null && token.startsWith("Bearer ")) {token = token.substring(7);String username = JwtUtils.parseToken(token);UsernamePasswordToken shiroToken = new UsernamePasswordToken(username, "");SecurityUtils.getSubject().login(shiroToken);}return true;}
}

5. 注冊攔截器 WebConfig.java

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate JwtInterceptor jwtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/**").excludePathPatterns("/api/auth/login");}
}

🖥? 前端代碼(Vue3 + Element Plus)

1. 安裝依賴

npm install axios element-plus

2. 登錄頁面組件 Login.vue

<template><div style="max-width: 400px; margin: 100px auto;"><h2>登錄</h2><el-input v-model="username" placeholder="用戶名"></el-input><el-input v-model="password" type="password" placeholder="密碼" @keyup.enter.native="login"></el-input><el-button @click="login" type="primary">登錄</el-button></div>
</template><script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import axios from 'axios';const router = useRouter();
const username = ref('');
const password = ref('');const login = async () => {try {const res = await axios.post('http://localhost:8080/api/auth/login', {username: username.value,password: password.value});const token = res.headers.authorization;localStorage.setItem('token', token);router.push('/home');} catch (error) {alert('登錄失敗');}
};
</script>

3. Axios 請求封裝 utils/request.js

import axios from 'axios';const service = axios.create({baseURL: 'http://localhost:8080',timeout: 5000
});service.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers.Authorization = token;}return config;
});export default service;

📝 項目啟動說明(README.md)

# Spring Boot + Vue 登錄系統模板## 后端啟動1. 創建數據庫并導入數據
2. 修改 `application.yml` 中的數據庫配置
3. 使用 IDEA 或命令行運行 Spring Boot 項目:```bash
cd backend
mvn spring-boot:run

前端啟動

cd frontend
npm install
npm run serve

訪問 http://localhost:8081

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914273.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis 基礎詳細介紹(Redis簡單介紹,命令行客戶端,Redis 命令,Java客戶端)

1. Redis 簡介Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的內存數據庫&#xff0c;遵守 BSD 協議&#xff0c;它提供了一個高性能的鍵值&#xff08;key-value&#xff09;存儲系統&#xff0c;常用于緩存、消息隊列、會話存儲等應用場景。1.1 特征豐富…

C/C++數據結構之多維數組

概述多維數組&#xff0c;實際上就是“數組的數組”。最常見的是二維數組&#xff0c;就像一個表格&#xff0c;擁有行和列。而三維數組則可以想象為多個這樣的表格堆疊起來形成的一個立方體。依此類推&#xff0c;我們可以構建四維、五維甚至更高維度的數組。多維數組主要用于…

[Rust 基礎課程]選一個合適的 Rust 編輯器

市面上現在有很多編輯器都可以開發 Rust&#xff0c;很多都是以安裝 Rust 插件的形式來對 Rust 做支持&#xff0c;本課程使用 RustRover&#xff0c;如果你喜歡其他的編輯器&#xff0c;可以自己搗鼓下。 RustRover https://www.jetbrains.com/rust/ jetbrains 專門對于 Ru…

【零基礎學AI】第37講:提示詞工程(Prompt Engineering)

本節課你將學到 理解提示詞工程的核心原理 掌握5種實用的Prompt設計模式 學會優化提示詞的評估方法 實現一個智能問答系統優化案例 開始之前 環境要求 Python 3.8安裝包&#xff1a;pip install openai tiktokenOpenAI API密鑰&#xff08;免費注冊&#xff1a;https://plat…

莫蘭迪色系工作總結匯報PPT模版分享

莫蘭迪色工作總結PPT模版&#xff0c;莫蘭迪調色板PPT模版&#xff0c;莫蘭迪色系高級簡約PPT模版&#xff0c;莫蘭迪色系工作匯報&#xff0c;莫蘭迪總結匯報模版 莫蘭迪色系工作總結匯報PPT模版分享&#xff1a;https://pan.quark.cn/s/35bcaa03c837

uniapp的app項目,某個頁面長時間無操作,返回首頁

最開始想做成一個公共的&#xff0c;完全提取出來的一個組件&#xff0c;組件設置背景透明&#xff0c;到時候哪個頁面需要&#xff0c;直接引入組件就可以了&#xff0c;所以最開始做的是一個vue的組件&#xff0c;在組件中&#xff0c;監聽頁面的touchstart&#xff0c;但是這…

【實證分析】上市公司綠色戰略數據集(2000-2023年)

數據簡介&#xff1a;綠色戰略是指企業根據其所處的外部環境&#xff08;包括“綠色浪潮”等環保趨勢&#xff09;和企業自身的經營條件&#xff0c;為實現企業生存與發展質量的持續提升&#xff0c;而對企業生產經營活動進行綠色化改造的總體規劃。這包括制定企業綠色可持續發…

【SpringAI】7. 基于 milvus 的向量檢索

SpringAI 基于 milvus 的向量檢索 向量數據庫可以使用 milvus&#xff0c;redis,Elasticsearch 等&#xff0c;本文以 milvus 為例&#xff1a; 1. 啟動milvus 為了盡可能快速上手springai的vectordb功能&#xff0c;我們推薦使用云上的milvus&#xff0c;注冊就能創建免費的…

如何使用數字化動態水印對教育視頻進行加密?

文章目錄前言一、什么是數字化動態水印二、使用數字化動態水印對教育視頻加密的好處&#xff1f;三、數字化動態水印的實現原理四、如何實現數字化動態水印對教育視頻加密總結前言 教育資源數字化蓬勃發展的今天&#xff0c;優質視頻課程已成為機構的核心知識資產。然而&#…

解決bash終端的路徑名稱亂碼問題

解決bash終端的路徑名稱亂碼 默認打開了zsh&#xff0c;當我輸入bash后&#xff0c;就出現了亂碼 (context_rag) [23fanyaohead1]~/mycode-thesis% bash (context_rag) [%n%m]%~%#亂碼原因排查 我遇到了終端亂碼問題&#xff0c;需要檢查當前的終端環境和編碼設置&#xff0c;下…

【深度學習】【入門】Sequential的使用和簡單神經網絡搭建

1.Sequential的概念它是一種按順序封裝神經網絡層的容器&#xff0c;能讓層按照添加順序依次執行計算&#xff0c;簡化網絡搭建流程2.Sequential的作用1.代碼簡潔化對比不用 Sequential 時手動搭建層的繁瑣代碼&#xff08;如每層需手動定義并連接&#xff09;&#xff0c;展示…

前端開發中的資源緩存詳解

資源緩存用于緩存靜態資源,良好的緩存策略可以減少資源重復加載進而提高網頁的整體加載速度。 通常瀏覽器緩存策略分為兩種:強緩存和協商緩存,當然還包括 service worker。 瀏覽器在資源加載時,根據請求頭中的 expires 和 cache-control 值來判斷是否命中強緩存,命中則直…

零基礎入門指南:華為數通認證體系詳解

一、華為數通認證的定位與行業價值華為數通認證&#xff08;Datacom&#xff09;是ICT領域核心方向&#xff0c;覆蓋路由器、交換機等網絡基礎設備技術&#xff0c;被譽為“網絡行業的骨骼”。2020年升級為Datacom認證體系&#xff0c;新增SDN、VXLAN、網絡自動化等前沿技術&am…

超低功耗CC2340R SimpleLink? 系列 2.4GHz 無線 MCU支持BLE5.3/Zigbee/Thread/專有協議

CC2340R SimpleLink? 系列 2.4GHz 無線 MCU支持BLE5.3/Zigbee/Thread/專有協議優勢簡介性能介紹應用場景優勢簡介 CC2340R SimpleLink? 系列器件為 2.4GHz 無線微控制器 (MCU)&#xff0c;面向低功耗 Bluetooth5.3、Zigbee、Thread 和專有 2.4GHz 應用。這些器件針對低功耗無…

若依前后端分離Vue3版本接入阿里云OSS

一、引入依賴首先在commom 模塊的pom 下面引入 阿里云OSS 的 依賴<!-- 阿里云oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></depende…

2025年微軟mos備考攻略-窮鬼版

說實話&#xff0c;微軟MOS認證是微軟官芳推出的辦公軟件方面的認證&#xff0c;考試難度真的不大&#xff0c;完全沒必要報班&#xff0c;自學完全OK&#xff01;一、25 年報考MOS認證詳情報名時間&#xff1a;隨時可以在官網或ji構報名&#xff08;ji構報名會送備考資料&…

數據庫版本自動管理

FlywayDB 是一款 開源數據庫版本管理工具&#xff0c;開發中將表結構的變更或數據初始化腳本維護好&#xff0c;更新到測試環境或線上發版啟動服務的時候&#xff0c;會檢測版本號自動執行數據庫變更&#xff0c;可以減少每次發版到其他環境的人工執行操作。 工作流程初始化階段…

解決Linux綁定失敗地址已使用(端口被占用)的問題

文章目錄解決 bind failed: Address already in use 問題一、問題原因1. **端口已經被其他程序占用**2. **端口處于 TIME_WAIT 狀態**3. **未正確關閉套接字**二、如何排查和解決問題1. **確認端口是否被占用**2. **查找并殺掉占用端口的進程**3. **等待端口釋放&#xff08;TI…

Ragas的Prompt Object

Prompt在Ragas中被用在各種指標、合成數據生成任務中。同時也為提供了替換各種自動以提示詞的方式。Ragas提供了如下幾種Prompt Objects。 instruction:prompt的基礎組成,通過自然語言清晰的描述LLM需要完成的任務。在prompt object中用instruction變量定義。few-shot exampl…

PHP語法高級篇(一):日期時間處理和包含文件

從本篇文章開始&#xff0c;將學習PHP的高級特性內容。本篇文章將記錄在PHP中如何進行日期時間處理和包含文件的學習過程。 一、日期和時間 在PHP中&#xff0c;date() 函數用于格式化日期或時間。 說明 date(string $format, ?int $timestamp null): string 使用指定整數…