基于 Vue 和 SSM 的前后端分離項目實戰:登錄與注冊功能實現

文章目錄

    • 前言
    • 項目概述
    • 前端部分(Vue)
      • 1. 項目初始化
      • 2. 頁面布局
        • Login.vue
        • Register.vue
      • 3. 路由配置
      • 4. 主組件
    • 后端部分(SSM)
      • 1. 項目結構
      • 2. 數據庫設計
      • 3. MyBatis 配置
      • 4. DAO 層
      • 5. Service 層
      • 6. Controller 層
      • 7. 配置文件
      • 8. Spring 配置
      • 9. Servlet 配置
      • 10. 部署到 Tomcat
    • 總結

前言

在現代 Web 開發中,前后端分離架構已經成為主流。前端負責頁面展示和交互,后端提供數據接口,二者通過 API 進行通信。本文將通過一個實戰小項目,詳細介紹如何使用 Vue.js 搭建前端界面,以及使用 SSM 框架(Spring、SpringMVC、MyBatis)構建基于 Tomcat 部署的后端服務,實現登錄和注冊功能。

項目概述

我們將構建一個簡單的用戶管理系統,包含用戶注冊和登錄功能。前端使用 Vue.js 框架,后端使用 SSM 框架進行開發,并通過 Tomcat 部署后端服務。通過這個項目,可以深入理解前后端分離的開發模式以及各個框架的使用方法。

前端部分(Vue)

1. 項目初始化

首先,使用 Vue CLI 創建一個新的 Vue 項目:

vue create user-management

選擇默認的配置或者根據自己的需求進行定制。創建完成后,進入項目目錄:

cd user-management

然后安裝所需的依賴:

npm install axios vue-router element-ui
  • axios 用于發送 HTTP 請求。
  • vue-router 用于實現頁面路由。
  • element-ui 是一個基于 Vue 的 UI 組件庫,用于快速構建頁面。

2. 頁面布局

src/views 目錄下創建兩個視圖文件:Login.vueRegister.vue,分別用于登錄和注冊頁面。

Login.vue
<template><div class="login-container"><el-form :model="loginForm" :rules="rules" ref="loginForm" label-width="80px"><el-form-item label="用戶名" prop="username"><el-input v-model="loginForm.username"></el-input></el-form-item><el-form-item label="密碼" prop="password"><el-input type="password" v-model="loginForm.password"></el-input></el-form-item><el-button type="primary" @click="submitLogin">登錄</el-button></el-form></div>
</template><script>
export default {data() {return {loginForm: {username: '',password: ''},rules: {username: [{ required: true, message: '請輸入用戶名', trigger: 'blur' }],password: [{ required: true, message: '請輸入密碼', trigger: 'blur' }]}};},methods: {submitLogin() {this.$refs.loginForm.validate((valid) => {if (valid) {// 調用后端接口axios.post('/api/login', this.loginForm).then(response => {if (response.data.success) {this.$message.success('登錄成功');// 保存 tokenlocalStorage.setItem('token', response.data.token);this.$router.push('/home');} else {this.$message.error(response.data.message);}});}});}}
};
</script>
Register.vue
<template><div class="register-container"><el-form :model="registerForm" :rules="rules" ref="registerForm" label-width="80px"><el-form-item label="用戶名" prop="username"><el-input v-model="registerForm.username"></el-input></el-form-item><el-form-item label="密碼" prop="password"><el-input type="password" v-model="registerForm.password"></el-input></el-form-item><el-form-item label="確認密碼" prop="confirmPassword"><el-input type="password" v-model="registerForm.confirmPassword"></el-input></el-form-item><el-button type="primary" @click="submitRegister">注冊</el-button></el-form></div>
</template><script>
export default {data() {return {registerForm: {username: '',password: '',confirmPassword: ''},rules: {username: [{ required: true, message: '請輸入用戶名', trigger: 'blur' }],password: [{ required: true, message: '請輸入密碼', trigger: 'blur' }],confirmPassword: [{ required: true, message: '請確認密碼', trigger: 'blur' }]}};},methods: {submitRegister() {this.$refs.registerForm.validate((valid) => {if (valid) {if (this.registerForm.password !== this.registerForm.confirmPassword) {this.$message.error('兩次密碼不一致');return;}// 調用后端接口axios.post('/api/register', this.registerForm).then(response => {if (response.data.success) {this.$message.success('注冊成功');this.$router.push('/login');} else {this.$message.error(response.data.message);}});}});}}
};
</script>

3. 路由配置

src/router/index.js 中配置路由:

import Vue from 'vue';
import VueRouter from 'vue-router';
import Login from '../views/Login.vue';
import Register from '../views/Register.vue';
import Home from '../views/Home.vue';Vue.use(VueRouter);const routes = [{path: '/',redirect: '/login'},{path: '/login',component: Login},{path: '/register',component: Register},{path: '/home',component: Home}
];const router = new VueRouter({mode: 'history',routes
});export default router;

4. 主組件

src/App.vue 中設置主組件:

<template><div id="app"><router-view></router-view></div>
</template>

后端部分(SSM)

1. 項目結構

后端項目采用 Maven 構建,主要模塊包括:

  • src/main/java/com/example/usermanagement/controller:控制器層,處理前端請求。
  • src/main/java/com/example/usermanagement/service:服務層,處理業務邏輯。
  • src/main/java/com/example/usermanagement/dao:數據訪問層,使用 MyBatis 操作數據庫。
  • src/main/resources/mapper:MyBatis 的 XML 映射文件。
  • src/main/resources/application.properties:配置文件。

2. 數據庫設計

創建一個名為 user_management 的數據庫,包含一個 user 表:

CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL
);

3. MyBatis 配置

src/main/resources/mapper/UserMapper.xml 中配置 MyBatis 的 SQL 映射:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.usermanagement.dao.UserDao"><insert id="registerUser" parameterType="com.example.usermanagement.model.User">INSERT INTO user (username, password) VALUES (#{username}, #{password})</insert><select id="getUserByUsername" parameterType="String" resultType="com.example.usermanagement.model.User">SELECT * FROM user WHERE username = #{username}</select></mapper>

4. DAO 層

創建 UserDao 接口:

package com.example.usermanagement.dao;import com.example.usermanagement.model.User;public interface UserDao {int registerUser(User user);User getUserByUsername(String username);
}

5. Service 層

創建 UserService 接口及其實現類 UserServiceImpl

package com.example.usermanagement.service;import com.example.usermanagement.model.User;public interface UserService {boolean register(User user);boolean login(String username, String password);
}
package com.example.usermanagement.service.impl;import com.example.usermanagement.dao.UserDao;
import com.example.usermanagement.model.User;
import com.example.usermanagement.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic boolean register(User user) {return userDao.registerUser(user) > 0;}@Overridepublic boolean login(String username, String password) {User user = userDao.getUserByUsername(username);return user != null && user.getPassword().equals(password);}
}

6. Controller 層

創建 UserController

package com.example.usermanagement.controller;import com.example.usermanagement.model.User;
import com.example.usermanagement.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Result register(@RequestBody User user) {if (userService.register(user)) {return new Result(true, "注冊成功");} else {return new Result(false, "注冊失敗");}}@PostMapping("/login")public Result login(@RequestBody User user) {if (userService.login(user.getUsername(), user.getPassword())) {return new Result(true, "登錄成功", "token");} else {return new Result(false, "用戶名或密碼錯誤");}}class Result {private boolean success;private String message;private Object data;public Result(boolean success, String message) {this.success = success;this.message = message;}public Result(boolean success, String message, Object data) {this.success = success;this.message = message;this.data = data;}// Getter 和 Setter 方法}
}

7. 配置文件

src/main/resources/application.properties 中配置數據庫連接和 MyBatis:

spring.datasource.url=jdbc:mysql://localhost:3306/user_management
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/*.xml

8. Spring 配置

創建 Spring 配置文件 spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.example.usermanagement"/><mvc:annotation-driven/><!-- 數據源配置 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="url" value="${spring.datasource.url}"/><property name="username" value="${spring.datasource.username}"/><property name="password" value="${spring.datasource.password}"/><property name="driverClassName" value="${spring.datasource.driver-class-name}"/></bean><!-- MyBatis SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/></bean><!-- MyBatis Mapper 掃描 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.usermanagement.dao"/></bean>
</beans>

9. Servlet 配置

web.xml 中配置 Servlet 和 Spring 上下文:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1"><display-name>User Management</display-name><!-- Spring 上下文 --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-config.xml</param-value></context-param><!-- Spring 監聽器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Spring MVC DispatcherServlet --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-config.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/api/*</url-pattern></servlet-mapping><!-- 跨域支持 --><filter><filter-name>corsFilter</filter-name><filter-class>org.apache.catalina.filters.CorsFilter</filter-class><init-param><param-name>cors.allowed.origins</param-name><param-value>*</param-value></init-param><init-param><param-name>cors.allowed.methods</param-name><param-value>GET,POST,PUT,DELETE,OPTIONS</param-value></init-param><init-param><param-name>cors.allowed.headers</param-name><param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value></init-param></filter><filter-mapping><filter-name>corsFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

10. 部署到 Tomcat

  1. 將后端項目打包成 WAR 文件。
  2. 將 WAR 文件部署到 Tomcat 的 webapps 目錄。
  3. 啟動 Tomcat,訪問項目。

總結

通過以上步驟,我們實現了一個基于 Vue 和 SSM 框架的前后端分離項目,完成了用戶登錄和注冊功能。前端使用 Vue.js 構建了友好的用戶界面,后端使用 SSM 框架提供了穩定的數據服務,并通過 Tomcat 進行部署。這種架構清晰、易于維護,適合現代 Web 開發的需求。

在實際開發中,還可以進一步優化,例如添加用戶角色管理、密碼加密、驗證碼等功能,以提高系統的安全性和用戶體驗。

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

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

相關文章

Windows安裝nvm【超詳細圖解】

目錄 前言 一、NVM下載 方式一&#xff1a;官網下載 方式二&#xff1a;GitHub 下載 二、NVM安裝 鏡像源配置 三、Node安裝 四、環境變量配置 前言 NVM&#xff08;Node Version Manager&#xff09;是一個命令行工具&#xff0c;用于在一臺計算機上輕松管理和切換多…

KVM虛擬機磁盤創建探究-2

使用 virt-install 命令自動創建磁盤鏡像和使用 qemu-img 手動創建磁盤鏡像&#xff0c;在磁盤鏡像本身格式和基本功能上是一致的&#xff0c;但在一些特性如初始占用磁盤空間、創建時的可配置性等方面存在區別&#xff0c;下面以 QCOW2 格式磁盤鏡像為例進行詳細說明。 初始占…

京準電鐘:NTP校時服務器于安防監控系統應用方案

京準電鐘&#xff1a;NTP校時服務器于安防監控系統應用方案 京準電鐘&#xff1a;NTP校時服務器于安防監控系統應用方案 NTP校時服務器在安防監控系統中的應用方案主要通過高精度時間同步技術&#xff0c;解決設備間時間差異問題&#xff0c;確保日志、錄像等數據的時間一致性…

遞歸遍歷目錄 和 普通文件的復制 [Java EE]

遞歸遍歷目錄 首先 先列出當前目錄所包含的內容 File[] files currentDir.listFiles();if (files null || files.length 0) {// 若是空目錄或非法目錄, 則直接返回return;} 然后 遍歷列出的文件, 分情況兩種討論 for (File f: files) {// 加個日志, 方便查看程序執行情…

NO.19十六屆藍橋杯模擬賽第三期上

1 如果一個數 p 是個質數&#xff0c;同時又是整數 a 的約數&#xff0c;則 p 稱為 a 的一個質因數。 請問&#xff0c; 2024 的最大的質因數是多少&#xff1f; 答&#xff1a;23 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false)…

Linux網絡_應用層自定義協議與序列化_守護進程

一.協議 協議是一種 "約定". socket api 的接口, 在讀寫數據時, 都是按 "字符串" 的方式來發送接 收的. 如果我們要傳輸一些 "結構化的數據" 怎么辦呢? 其實&#xff0c;協議就是雙方約定好的結構化的數據 像下面&#xff0c;兩端都知道數據結構…

SQL命令詳解之多表查詢(連接查詢)

目錄 1 簡介 2 內連接查詢 2.1 內連接語法 2.2 內連接練習 3 外連接查詢 3.1 外連接語法 3.2 外連接練習 4 總結 1 簡介 連接的本質就是把各個表中的記錄都取出來依次匹配的組合加入結果集并返回給用戶。我們把 t1 和 t2 兩個表連接起來的過程如下圖所示&#xff1a; …

001-碼云操作

碼云操作 一、配置公鑰1.官網地址1.進入 git bash2.查看生成的公鑰3.設置到 Gitee4.測試 二、初始化一個項目1.新建倉庫 一、配置公鑰 方便后續提交代碼不用填寫密碼 1.官網地址 官網地址&#xff1a;https://gitee.com/Git碼云教程&#xff1a;https://gitee.com/help/arti…

30.[前端開發-JavaScript基礎]Day07-數組Array-高階函數-日期Date-DOM

JavaScript的DOM操作 &#xff08;一&#xff09; 1 什么是DOM&#xff1f; 認識DOM和BOM 深入理解DOM 2 認識DOM Tree DOM Tree的理解 3 DOM的整體結構 DOM的學習順序 DOM的繼承關系圖 document對象 4 節點、元素導航 節點&#xff08;Node&#xff09;之間的導航&…

【自學筆記】Spring基礎知識點總覽-持續更新

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 Spring 基礎知識點總覽1. Spring 框架簡介2. IoC&#xff08;控制反轉&#xff09;與 DI&#xff08;依賴注入&#xff09;2.1 IoC 容器2.2 依賴注入方式示例代碼&a…

WordPress多語言插件GTranslate

GTranslate是一個免費的WordPress多語言插件&#xff0c;它允許您將網站內容翻譯成多種語言。這個插件提供了一個簡單易用的界面&#xff0c;讓您可以在WordPress后臺直接進行翻譯操作。以下是GTranslate插件的一些主要特點&#xff1a; 免費使用&#xff1a;GTranslate插件完…

數列極限入門習題

數列極限入門習題 lim ? n → ∞ ( 1 1 2 1 3 ? 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim?(121?31??n1?)n1? lim ? n → ∞ ( 1 n 1 1 n 2 ? 1 n n ) \lim\limits_{n\rightarrow\…

嵌入式學習前要了解的基礎知識

一、電壓和電流 在嵌入式開發中&#xff0c;電壓和電流是兩個基本的電氣概念&#xff0c;對于理解和設計電子電路至關重要。它們直接影響到嵌入式系統的性能、功耗、可靠性和安全性。 電壓&#xff08;Voltage&#xff09; 電壓是電場力推動電荷移動的能力&#xff0c;通常以…

機器學習:強化學習的epsilon貪心算法

強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種機器學習方法&#xff0c;旨在通過與環境交互&#xff0c;使智能體&#xff08;Agent&#xff09;學習如何采取最優行動&#xff0c;以最大化某種累積獎勵。它與監督學習和無監督學習不同&#xff0c;強調試錯…

Spring學習筆記03——Spring Boot的文件結構

Spring boot常見的文件結構&#xff1a; src/ ├── main/ │ ├── java/ │ │ └── com.example.demo/ │ │ ├── DemoApplication.java # 主入口 │ │ ├── config/ # 配置類 │ │ ├── controller/ …

談談 HTTPS 的工作原理,SSL / TLS 握手流程是什么?

一、HTTPS 核心機制&#xff1a;非對稱加密 對稱加密 HTTPS HTTP over TLS/SSL&#xff0c;通過 ?混合加密體系? 解決三大問題&#xff1a; ?防竊聽? - 對稱加密傳輸內容&#xff08;如 AES&#xff09;?防篡改? - 數字簽名驗證數據完整性?防冒充? - 數字證書驗證服…

共軛梯度法筆記

一、梯度下降法 x k 1 x k ? α ? f ( x k ) x_{k1} x_k - \alpha \nabla f(x_k) xk1?xk??α?f(xk?) 這是普通的梯度下降公式&#xff0c;有兩個量是關鍵&#xff0c;步長 α \alpha α和方向 ? f ( x k ) \nabla f(x_k) ?f(xk?)。這里的方向直接選擇了梯度方向&…

ubuntu 啟動不起來,光標閃爍 解決方法

ubuntu 啟動不起來&#xff0c;光標閃爍 進不了系統&#xff0c;解決方法 按ctrl alt f2&#xff0c;進入終端&#xff0c;登錄。 jounal -b 查看啟動日志。 發現是找不到顯卡驅動程序。 解決方法&#xff1a; 卸載nvidia程序。 sudo systemctl stop gdm # 適用于GNOME…

CSS - 妙用Sass

官方文檔&#xff1a;https://www.sass.hk/docs/ 1.例1&#xff1a; each $theme in $themeList {$themeKey: map-get($theme, key);media screen and (weex-theme: $themeKey) {.btnText {max-width: 150px;include font(map-get($theme, medFont),map-get($theme, subFontS…

chromadb向量數據庫使用 (2)

目錄 代碼代碼解釋**1. 導入 chatGLM 嵌入函數****2. 創建 ChromaDB 客戶端和集合****3. 查詢集合中的數據數量****4. 添加數據到集合****5. 獲取已存儲的文檔****6. 更新文檔****7. 再次獲取數據&#xff0c;驗證更新結果****8. 刪除某個文檔****9. 獲取已刪除的文檔****總結*…