SpringBoot3結(jié)合Vue3實(shí)現(xiàn)用戶(hù)登錄功能
一、實(shí)戰(zhàn)概述
該實(shí)戰(zhàn)教程旨在指導(dǎo)開(kāi)發(fā)者通過(guò)前后端分離的方式,搭建一個(gè)結(jié)合Vue.js前端框架和Spring Boot后端框架的登錄系統(tǒng)。首先,從創(chuàng)建前端項(xiàng)目開(kāi)始,利用Vue CLI快速生成項(xiàng)目結(jié)構(gòu),安裝axios以實(shí)現(xiàn)HTTP請(qǐng)求功能,vue-router處理路由導(dǎo)航,less與less-loader用于樣式預(yù)處理增強(qiáng)前端開(kāi)發(fā)體驗(yàn)。完成基礎(chǔ)設(shè)置后,開(kāi)發(fā)者在IDEA中打開(kāi)并繼續(xù)構(gòu)建前端頁(yè)面,分別創(chuàng)建登錄組件、首頁(yè)組件以及配置路由視圖。編寫(xiě)應(yīng)用根組件,并設(shè)置主入口腳本,同時(shí)為解決跨域問(wèn)題設(shè)置了反向代理。
接著進(jìn)行后端項(xiàng)目的搭建,創(chuàng)建Spring Boot應(yīng)用,配置服務(wù)器運(yùn)行端口號(hào),并啟動(dòng)服務(wù)確保能訪問(wèn)到后端首頁(yè)。然后,為后端設(shè)計(jì)數(shù)據(jù)模型,創(chuàng)建用戶(hù)實(shí)體類(lèi)和結(jié)果實(shí)體類(lèi),以便于業(yè)務(wù)邏輯處理。最后,開(kāi)發(fā)登錄控制器以對(duì)接前端發(fā)送的登錄請(qǐng)求。
整合測(cè)試階段,分別啟動(dòng)前端login-vue項(xiàng)目和后端LoginDemo項(xiàng)目,前端調(diào)用后端接口進(jìn)行登錄驗(yàn)證,確保用戶(hù)登錄功能正常運(yùn)作。此實(shí)戰(zhàn)涵蓋了項(xiàng)目初始化、模塊安裝、組件開(kāi)發(fā)、路由配置、實(shí)體類(lèi)設(shè)計(jì)、控制器編寫(xiě)及跨域解決方案等關(guān)鍵環(huán)節(jié),有助于開(kāi)發(fā)者理解和實(shí)踐前后端交互開(kāi)發(fā)流程。
二、實(shí)戰(zhàn)步驟?
(一)創(chuàng)建前端項(xiàng)目 - login-vue
查看Node和npm版本
安裝vue腳手架,執(zhí)行命令:nmp install -g @vue/cli
1、創(chuàng)建Vue項(xiàng)目
在命令行窗口里執(zhí)行命令:vue create login-vue
,選擇Default ([Vue 3] babel, eslint)
2、安裝axios模塊
Axios 是一款基于Promise的JavaScript庫(kù),主要用于瀏覽器和Node.js環(huán)境,提供了一種簡(jiǎn)單、高效的方式來(lái)處理前端與后端API之間的HTTP通信。它支持創(chuàng)建和發(fā)送GET、POST等多種HTTP請(qǐng)求,可處理JSON數(shù)據(jù)自動(dòng)轉(zhuǎn)換,并具有攔截請(qǐng)求/響應(yīng)、取消請(qǐng)求、設(shè)置超時(shí)等功能。 Axios遵循Promise API設(shè)計(jì),易于理解和使用,廣泛應(yīng)用于現(xiàn)代Web項(xiàng)目中進(jìn)行異步數(shù)據(jù)交互。
進(jìn)入login-vue
目錄,執(zhí)行命令:npm install axios --save
3、安裝vue-router模塊
Vue Router是Vue.js官方的路由管理器,它通過(guò)將SPA(單頁(yè)應(yīng)用)的頁(yè)面切分成多個(gè)組件,并實(shí)現(xiàn)了URL與組件間的映射關(guān)系。在Vue項(xiàng)目中,通過(guò)定義路由規(guī)則和嵌套路由,Vue Router能夠?qū)崿F(xiàn)視圖與URL的同步切換,提供前端路由功能,支持動(dòng)態(tài)路由、導(dǎo)航守衛(wèi)等功能,為構(gòu)建復(fù)雜單頁(yè)應(yīng)用提供了便捷的支持。
執(zhí)行命令:npm install vue-router@4 --save
4、安裝less和less-loader模塊
Less是一種CSS預(yù)處理器,通過(guò)擴(kuò)展CSS語(yǔ)法提供變量、嵌套規(guī)則、混合、函數(shù)等高級(jí)特性,使得樣式編寫(xiě)更高效、模塊化和易于維護(hù)。less-loader則是Webpack的一個(gè)加載器,用于將Less文件編譯成瀏覽器可識(shí)別的CSS代碼。在Vue項(xiàng)目中安裝并配置less和less-loader后,即可在.vue文件或獨(dú)立.less文件中編寫(xiě)Less代碼,并在構(gòu)建過(guò)程中自動(dòng)轉(zhuǎn)化為CSS樣式。
執(zhí)行命令:npm install --save-dev less less-loader
5、運(yùn)行Vue項(xiàng)目
執(zhí)行命令:npm run serve
給出訪問(wèn)應(yīng)用的網(wǎng)址
6、在瀏覽器里訪問(wèn)首頁(yè)
訪問(wèn)http://local:8080
7、在IDEA里打開(kāi)Vue項(xiàng)目
打開(kāi)Vue項(xiàng)目 - login-vue
8、創(chuàng)建登錄Vue組件
在src/components
目錄里,刪除HelloWorld.vue
組件,創(chuàng)建LoginView.vue
組件
<template> <table class="login-table" border="0" cellpadding="10"> <tr> <td align="center">用戶(hù)名</td> <td><input id='username' type="text" v-model="username" placeholder="請(qǐng)輸入用戶(hù)名"/></td> </tr> <tr> <td align="center">密 碼</td> <td><input id='password' type="password" v-model="password" placeholder="請(qǐng)輸入密碼"/></td> </tr> <tr align="center"> <td colspan="2"> <button @click="handleLogin">登錄</button> </td> </tr> </table> </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(''); async function handleLogin() { try { const response = await axios.post('/api/login', {username: username.value, password: password.value}); console.log(response.data.code) if (response.data.code === 200) { router.replace('/index'); // 使用后端返回的路徑 } else if (response.data.code === 400) { alert('用戶(hù)名或密碼錯(cuò)誤!請(qǐng)重新登錄!'); username.value = ''; password.value = ''; document.getElementById('username').focus(); } } catch (error) { console.error("Error during login:", error.message); // 添加錯(cuò)誤處理,打印錯(cuò)誤信息 } } </script> <style lang="less" scoped> /* 重置table樣式 */ .login-table { width: 100%; max-width: 300px; margin: 50px auto; border-collapse: collapse; border-spacing: 0; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .login-table td { padding-bottom: 16px; padding-top: 16px; padding-right: 0px; padding-right: 8px; vertical-align: middle; text-align: left; border-bottom: 1px solid #ddd; } .login-table input[type="text"], .login-table input[type="password"] { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; outline: none; box-sizing: border-box; } .login-table button { display: block; width: 100%; padding: 12px; background-color: #007bff; color: white; font-size: 16px; border: none; border-radius: 4px; cursor: pointer; text-align: center; transition: all 0.3s ease; &:hover, &:focus { background-color: #0056b3; } } </style>
代碼創(chuàng)建了一個(gè)登錄表單,使用Vue響應(yīng)式數(shù)據(jù)綁定用戶(hù)輸入,并在點(diǎn)擊登錄按鈕時(shí)通過(guò)axios發(fā)送POST請(qǐng)求。根據(jù)后端返回的code進(jìn)行判斷:200則跳轉(zhuǎn)至/index頁(yè)面,400則提示錯(cuò)誤并清空密碼重置焦點(diǎn)。同時(shí)定義了簡(jiǎn)潔的登錄界面樣式。
9、創(chuàng)建首頁(yè)Vue組件
在src/components
里創(chuàng)建IndexView.vue
組件
<template> <div class="welcome-container"> Welcome to Vue 3 World~ </div> </template> <script> export default { name: "IndexView" } </script> <style scoped> .welcome-container { padding: 20px; border: 1px solid #ccc; border-radius: 5px; background-color: #f5f5f5; text-align: center; max-width: 400px; margin: 0 auto; color: red; font-weight: bold; font-size: 30px; } </style>
該代碼定義了一個(gè)Vue組件IndexView
,渲染一個(gè)居中顯示的歡迎信息框,樣式包括內(nèi)邊距、邊框、背景色等,并通過(guò)CSS設(shè)置了自動(dòng)水平居中布局及字體樣式。
10、創(chuàng)建路由視圖
在src
里創(chuàng)建router
目錄,在router
目錄里創(chuàng)建index.js
腳本
// 引入Vue3以及新的vue-router import { createRouter, createWebHistory } from 'vue-router'; import Login from '@/components/LoginView.vue'; import Index from "@/components/IndexView.vue"; // 定義路由 const routes = [ { path: '/login', name: 'LoginView', component: Login }, { path: '/index', name: 'IndexView', component: Index } ]; // 創(chuàng)建路由器實(shí)例 const router = createRouter({ history: createWebHistory(), routes, }); // 導(dǎo)出全局注冊(cè) export default router;
該代碼引入Vue Router并定義了登錄和首頁(yè)兩個(gè)路由,使用createRouter創(chuàng)建路由器實(shí)例,配置history模式,并導(dǎo)出用于全局注冊(cè)。
11、編寫(xiě)應(yīng)用根組件
應(yīng)用Vue組件 - App.vue
是 Vue.js 應(yīng)用程序的根組件,負(fù)責(zé)整個(gè)應(yīng)用的布局與整體結(jié)構(gòu),所有其他組件在其內(nèi)部組織和渲染。
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <router-view /> </div> </template> <script> </script> <style lang="less"> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; } </style>
此代碼為Vue應(yīng)用的根組件(App.vue),包含一個(gè)logo圖片和動(dòng)態(tài)路由視圖(<router-view/>
)。樣式設(shè)置字體、抗鋸齒及居中對(duì)齊。
12、編寫(xiě)主入口腳本
main.js
是Vue應(yīng)用的主入口腳本,負(fù)責(zé)初始化Vue應(yīng)用實(shí)例、注冊(cè)全局組件與插件(如路由、狀態(tài)管理等),并掛載到DOM指定元素。
// 導(dǎo)入Vue3的核心API,用于創(chuàng)建Vue應(yīng)用實(shí)例 import {createApp} from 'vue'; // 導(dǎo)入根組件App.vue,它是整個(gè)應(yīng)用程序的主視圖模板 import App from './App.vue'; // 導(dǎo)入已配置好的路由模塊(index.js或router.ts等),它管理著應(yīng)用內(nèi)的頁(yè)面跳轉(zhuǎn)邏輯 import router from "@/router"; // 使用createApp方法創(chuàng)建一個(gè)Vue應(yīng)用實(shí)例,并注冊(cè)全局路由配置 const app = createApp(App).use(router); // 將Vue應(yīng)用掛載到HTML文檔中id為'app'的元素上 // 這將把整個(gè)應(yīng)用程序渲染到這個(gè)DOM元素內(nèi)部 app.mount('#app');
該代碼導(dǎo)入Vue3核心API創(chuàng)建應(yīng)用實(shí)例,引入根組件與路由配置,通過(guò)createApp
初始化應(yīng)用并注冊(cè)路由,最后將整個(gè)應(yīng)用掛載到DOM中id為’app’的元素上。
13、設(shè)置反向代理和跨域支持
修改vue.config.js
代碼,設(shè)置反向代理和跨域支持
module.exports = { // 設(shè)置在保存文件時(shí)禁用ESLint自動(dòng)檢查 lintOnSave: false, // 配置Vue開(kāi)發(fā)服務(wù)器相關(guān)選項(xiàng) devServer: { // 配置HTTP代理,以便在開(kāi)發(fā)過(guò)程中將特定請(qǐng)求轉(zhuǎn)發(fā)到其他服務(wù)器 proxy: { // 當(dāng)請(qǐng)求以 '/api' 開(kāi)頭時(shí)進(jìn)行代理 '/api': { // 指定目標(biāo)服務(wù)器地址(例如后臺(tái)API接口) target: 'http://localhost:8888', // 設(shè)置為true,允許跨域請(qǐng)求時(shí)重寫(xiě)源信息(Origin header) changeOrigin: true, // 路徑重寫(xiě)規(guī)則,將前端應(yīng)用中'/api'前綴去掉,映射到后端服務(wù)器的實(shí)際路徑上 pathRewrite: { '^/api': '' }, } } } }
這段代碼配置了Vue項(xiàng)目在開(kāi)發(fā)環(huán)境下的行為:禁用了文件保存時(shí)的ESLint檢查,并設(shè)置了一個(gè)開(kāi)發(fā)服務(wù)器的代理服務(wù)。當(dāng)開(kāi)發(fā)環(huán)境中前端應(yīng)用發(fā)起對(duì)/api
開(kāi)頭的請(qǐng)求時(shí),該請(qǐng)求會(huì)被代理至http://localhost:8888
服務(wù)器,并通過(guò)pathRewrite
規(guī)則進(jìn)行路徑重寫(xiě),解決前后端分離開(kāi)發(fā)中的跨域問(wèn)題。
14、訪問(wèn)登錄頁(yè)面
啟動(dòng)Vue項(xiàng)目,訪問(wèn)http://localhost:8080/login
(二)創(chuàng)建后端項(xiàng)目 - LoginDemo
1、創(chuàng)建Spring Boot項(xiàng)目
設(shè)置項(xiàng)目名稱(chēng) LoginDemo
、保存位置、語(yǔ)言、類(lèi)型、組標(biāo)識(shí)、構(gòu)件名、包名、JDK版本、Java語(yǔ)言級(jí)、打包類(lèi)型
單擊【Next】按鈕,在彈出的對(duì)話(huà)框里選擇Spring Boot版本,添加項(xiàng)目相關(guān)依賴(lài)
單擊【Create】按鈕,得到初始化項(xiàng)目
2、配置服務(wù)器端口號(hào)
在前端項(xiàng)目里配置了目標(biāo)服務(wù)器地址,端口是8888
在應(yīng)用屬性文件application.properties
里配置服務(wù)器端口號(hào)
3、啟動(dòng)應(yīng)用,訪問(wèn)首頁(yè) 在resources
目錄里創(chuàng)建首頁(yè)index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首頁(yè)</title> </head> <body> <h3 style="text-align: center; color: red">Welcome to Spring Boot World~</h3> </body> </html>
修改入口程序LoginDemoApplication
代碼
啟動(dòng)應(yīng)用程序,在瀏覽器里訪問(wèn)http://localhost:8888
,查看結(jié)果
4、創(chuàng)建用戶(hù)實(shí)體類(lèi) 創(chuàng)建bean
子包,在子包里創(chuàng)建User
類(lèi)
package net.huawei.login.bean; /** * 功能:用戶(hù)實(shí)體類(lèi) * 作者:華衛(wèi) * 日期:2024年01月14日 */ public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
5、創(chuàng)建結(jié)果實(shí)體類(lèi) 創(chuàng)建result
子包,在子包里創(chuàng)建Result
類(lèi),封裝響應(yīng)碼
package net.huawei.login.result; /** * 功能:結(jié)果實(shí)體類(lèi) * 作者:華衛(wèi) * 日期:2024年01月14日 */ public class Result { private int code; public Result(int code) { this.code = code; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } }
該Java類(lèi)為結(jié)果實(shí)體,包含一個(gè)表示狀態(tài)碼的整型變量code,通過(guò)構(gòu)造函數(shù)初始化,并提供getter/setter方法,用于處理服務(wù)端響應(yīng)的狀態(tài)信息。
6、創(chuàng)建登錄控制器
創(chuàng)建controller
子包,在子包里創(chuàng)建LoginController
類(lèi)
package net.huawei.login.controller; import net.huawei.login.bean.User; import net.huawei.login.result.Result; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.util.HtmlUtils; /** * 功能:登錄控制器 * 作者:華衛(wèi) * 日期:2024年01月14日 */ @Controller public class LoginController { @CrossOrigin @PostMapping(value = "api/login") @ResponseBody public Result login(@RequestBody User requestUser) { // 獲取用戶(hù)名和密碼 String username = requestUser.getUsername(); String password = requestUser.getPassword(); // 對(duì)html標(biāo)簽進(jìn)行轉(zhuǎn)義,防止XSS攻擊 username = HtmlUtils.htmlEscape(username); // 判斷登錄是否成功 if (username.equals("無(wú)心劍") && password.equals("903213")) { return new Result(200); } else { System.out.println("用戶(hù)名或密碼有誤!"); return new Result(400); } } }
該Java控制器處理登錄請(qǐng)求,接收并校驗(yàn)用戶(hù)提交的用戶(hù)名密碼,進(jìn)行XSS防護(hù),并根據(jù)預(yù)設(shè)數(shù)據(jù)判斷登錄是否成功,返回包含狀態(tài)碼的結(jié)果實(shí)體。
(三)前后端整合測(cè)試
1、啟動(dòng)前端項(xiàng)目 - login-vue 在前端項(xiàng)目的目錄里執(zhí)行命令:npm run serve
2、啟動(dòng)后端項(xiàng)目 - LoginDemo
啟動(dòng)入口類(lèi)LoginDemoApplication
3、測(cè)試用戶(hù)登錄功能
訪問(wèn)http://localhost:8080/login
登錄頁(yè)面
如果輸入的用戶(hù)名或密碼有誤,彈出消息框提示用戶(hù)
輸入正確的用戶(hù)名或密碼(無(wú)心劍 :903213)
單擊【登錄】按鈕,跳轉(zhuǎn)到首頁(yè)
操作錄屏演示
三、實(shí)戰(zhàn)總結(jié)
該實(shí)戰(zhàn)通過(guò)前后端分離方式,構(gòu)建基于Vue.js與Spring Boot的登錄系統(tǒng)。前端完成項(xiàng)目創(chuàng)建、頁(yè)面組件開(kāi)發(fā)和路由配置;后端搭建Spring Boot服務(wù),設(shè)計(jì)實(shí)體類(lèi)并實(shí)現(xiàn)登錄控制器。整合階段測(cè)試用戶(hù)登錄功能,確保前后端交互正常。
到此這篇關(guān)于SpringBoot3結(jié)合Vue 3實(shí)現(xiàn)用戶(hù)登錄功能的文章就介紹到這了,更多相關(guān)SpringBoot3 Vue3 用戶(hù)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解springboot?springsecuroty中的注銷(xiāo)和權(quán)限控制問(wèn)題
- SpringBoot使用Spring Security實(shí)現(xiàn)登錄注銷(xiāo)功能
- SpringBoot--- SpringSecurity進(jìn)行注銷(xiāo)權(quán)限控制的配置方法
- Vue+springboot批量刪除功能實(shí)現(xiàn)代碼
- springboot和vue前后端交互的實(shí)現(xiàn)示例
- 基于SpringBoot和Vue3的博客平臺(tái)的用戶(hù)注冊(cè)與登錄功能實(shí)現(xiàn)
- SpringBoot和Vue.js實(shí)現(xiàn)的前后端分離的用戶(hù)權(quán)限管理系統(tǒng)
- 詳解SpringBoot項(xiàng)目整合Vue做一個(gè)完整的用戶(hù)注冊(cè)功能
- Vue結(jié)合Springboot實(shí)現(xiàn)用戶(hù)列表單頁(yè)面(前后端分離)
- vue+springboot用戶(hù)注銷(xiāo)功能實(shí)現(xiàn)代碼
相關(guān)文章
完美解決gson將Integer默認(rèn)轉(zhuǎn)換成Double的問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決gson將Integer默認(rèn)轉(zhuǎn)換成Double的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Java數(shù)據(jù)結(jié)構(gòu)與算法之選擇排序(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之選擇排序的相關(guān)資料,本文通過(guò)代碼講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2017-04-04劍指Offer之Java算法習(xí)題精講鏈表與字符串及數(shù)組
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03SpringBoot配置多數(shù)據(jù)源的四種方式分享
在日常開(kāi)發(fā)中我們都是以單個(gè)數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā),在小型項(xiàng)目中是完全能夠滿(mǎn)足需求的,但是,當(dāng)我們牽扯到大型項(xiàng)目的時(shí)候,單個(gè)數(shù)據(jù)庫(kù)就難以承受用戶(hù)的CRUD操作,那么此時(shí),我們就需要使用多個(gè)數(shù)據(jù)源進(jìn)行讀寫(xiě)分離的操作,本文就給大家介紹SpringBoot配置多數(shù)據(jù)源的方式2023-07-07詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問(wèn)題解決方法
本文給大家介紹了eclipse中將項(xiàng)目打包成jar文件的兩種方法及其遇到問(wèn)題解決方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12Java?常量池詳解之字符串常量池實(shí)現(xiàn)代碼
這篇文章主要介紹了Java?常量池詳解之字符串常量池,本文結(jié)合示例代碼對(duì)java字符串常量池相關(guān)知識(shí)講解的非常詳細(xì),需要的朋友可以參考下2022-12-12java 線(xiàn)程公平鎖與非公平鎖詳解及實(shí)例代碼
這篇文章主要介紹了java 線(xiàn)程公平鎖與非公平鎖詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02