VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-用戶管理

在現代Web應用開發中,前后端分離架構已經成為主流模式。本文將通過一個完整的用戶管理系統案例,詳細介紹如何使用Vue.js + Element UI構建前端界面,結合Spring Boot實現后端服務,實現前后端分離開發。該系統包含用戶信息的增刪改查、批量操作、導入導出等常見功能,是一個典型的企業級管理系統模塊。

一、技術棧介紹

1.1 前端技術棧

  • Vue.js:漸進式JavaScript框架,用于構建用戶界面

  • Element UI:基于Vue.js的桌面端組件庫,提供豐富的UI組件

  • Axios:基于Promise的HTTP客戶端,用于前后端通信

  • Vue Router:Vue.js官方的路由管理器

1.2 后端技術棧

  • Spring Boot:簡化Spring應用初始搭建和開發過程的框架

  • MyBatis-Plus:MyBatis的增強工具,簡化CRUD操作

  • Hutool:Java工具類庫,提供Excel導入導出等功能

  • JWT:用于身份驗證的JSON Web Token

二、前端實現詳解

2.1 項目結構與配置

前端項目采用Vue CLI搭建,主要目錄結構如下:

src/
├── views/
│   └── User.vue       # 用戶管理主頁面
├── router/            # 路由配置
├── api/               # API請求封裝
└── public/config.js   # 全局配置

public/config.js中配置后端服務地址:

window.WHITE_IP = "your-server-ip:port";

2.2 用戶管理頁面布局

用戶管理頁面主要分為以下幾個部分:

  1. 搜索區域:提供用戶名搜索和重置功能

  2. 操作按鈕區域:新增、批量刪除、導入導出等功能按鈕

  3. 表格展示區域:用戶數據列表展示

  4. 分頁組件:數據分頁控制

  5. 彈窗表單:新增/編輯用戶信息

<div class="User-container"><!-- 搜索區域 --><div style="margin: 10px 0"><el-input v-model="send.name" placeholder="請輸入用戶名"></el-input><el-button @click="selectListPage">搜索</el-button><el-button @click="reset">重置</el-button><!-- 操作按鈕 --><el-button @click="insertWindow">新增</el-button><el-popconfirm @confirm="confirmRemoveIdList"><el-button slot="reference">批量刪除</el-button></el-popconfirm><el-button @click="list_export">導出</el-button></div><!-- 表格區域 --><el-table :data="list" @selection-change="onSelectChange"><!-- 表格列定義 --></el-table><!-- 分頁組件 --><el-pagination@size-change="onSizeChange"@current-change="onCurrentChange":current-page="send.currentPage":page-size="send.pageSize":total="send.total"></el-pagination><!-- 彈窗表單 --><el-dialog :visible.sync="sendFormFlag"><el-form><!-- 表單字段 --></el-form></el-dialog>
</div>

2.3 核心功能實現

2.3.1 分頁查詢

分頁查詢是管理系統的核心功能,前端需要維護當前頁碼、每頁條數等參數:

data() {return {send: {currentPage: 1,pageSize: 10,total: 0,name: ''},list: []}
},
methods: {// 分頁查詢selectListPage() {this.$http.post("/user/list_page", this.send).then(res => {if (res.data.code === "200") {this.send.total = res.data.object.totalthis.list = res.data.object.data}})},// 分頁大小變化onSizeChange(pageSize) {this.send.pageSize = pageSizethis.selectListPage()},// 當前頁變化onCurrentChange(currentPage) {this.send.currentPage = currentPagethis.selectListPage()}
}
2.3.2 新增與編輯用戶

通過同一個彈窗表單實現新增和編輯功能:

methods: {// 打開新增窗口insertWindow() {this.sendFormFlag = truethis.sendForm = {}},// 打開編輯窗口updateWindow(row) {this.sendFormFlag = truethis.sendForm = JSON.parse(JSON.stringify(row))},// 確認保存confirmInsertOrUpdate() {this.$http.post("/user/insertOrUpdate", this.sendForm).then(res => {if (res.data.code === "200") {this.$message.success('保存成功')this.selectListPage()}})}
}
2.3.3 批量操作

批量操作需要處理表格的多選功能:

methods: {// 多選變化onSelectChange(val) {this.sendForm.removeIdList = val},// 確認批量刪除confirmRemoveIdList() {this.sendForm.removeIdList = this.sendForm.removeIdList.map(v => v.id)this.$http.post("user/list_delete", this.sendForm).then(res => {this.selectListPage()})}
}
2.3.4 導入導出功能

導入導出是管理系統常見功能,使用Element UI的Upload組件實現:

methods: {// 導出list_export() {window.open(`https://${WHITE_IP}/user/list_export`)},// 導入成功回調onImportSuccess() {this.$message.success("文件導入成功")this.selectListPage()}
}

三、后端實現詳解

3.1 項目結構

后端采用標準的Spring Boot項目結構:

src/main/java/
└── com.black├── controller    # 控制器層├── mapper        # 數據訪問層├── pojo          # 實體類└── util         # 工具類

3.2 核心控制器實現

用戶控制器處理所有用戶相關的請求:

@RestController
@RequestMapping("/user")
public class UserController {@ResourceUserMapper userMapper;// 新增或更新用戶@PostMapping("/insertOrUpdate")public Res insertOrUpdate(@RequestBody User user) {if (user.getId() != null) {userMapper.updateById(user);} else {user.setPassword(MyUtils.getSHA256StrJava("123456"));userMapper.insert(user);}return Res.success(null);}// 分頁查詢@PostMapping("/list_page")public Res list_page(@RequestBody User user) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();if (StringUtils.isNotBlank(user.getName())) {queryWrapper.like("name", user.getName());}int total = userMapper.selectCount(queryWrapper);queryWrapper.last("limit " + user.getStart() + "," + user.getEnd());List<User> dataList = userMapper.selectList(queryWrapper);Map<String, Object> result = new HashMap<>();result.put("total", total);result.put("data", dataList);return Res.success(result);}// 導出Excel@GetMapping("/list_export")public void list_export(HttpServletResponse response) throws Exception {List<User> list = userMapper.selectList(null);ExcelWriter writer = ExcelUtil.getWriter(true);// 設置標題別名writer.addHeaderAlias("id", "ID");writer.addHeaderAlias("name", "用戶名");// ...其他字段writer.write(list, true);response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");String fileName = URLEncoder.encode("用戶信息", "UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");ServletOutputStream out = response.getOutputStream();writer.flush(out, true);out.close();writer.close();}
}

3.3 分頁查詢實現

后端分頁查詢使用MyBatis-Plus實現:

@PostMapping("/list_page")
public Res list_page(@RequestBody User user) {// 1. 構建查詢條件QueryWrapper<User> queryWrapper = new QueryWrapper<>();if (StringUtils.isNotBlank(user.getName())) {queryWrapper.like("name", user.getName());}// 2. 獲取總數int total = userMapper.selectCount(queryWrapper);// 3. 計算分頁參數int start = (user.getCurrentPage() - 1) * user.getPageSize();int end = user.getPageSize();// 4. 執行分頁查詢queryWrapper.last("limit " + start + "," + end);List<User> dataList = userMapper.selectList(queryWrapper);// 5. 返回結果Map<String, Object> result = new HashMap<>();result.put("total", total);result.put("data", dataList);return Res.success(result);
}

3.4 Excel導出實現

使用Hutool工具庫實現Excel導出:

@GetMapping("/list_export")
public void list_export(HttpServletResponse response) throws Exception {// 1. 查詢數據List<User> list = userMapper.selectList(null);// 2. 創建Excel寫入器ExcelWriter writer = ExcelUtil.getWriter(true);// 3. 設置標題別名writer.addHeaderAlias("id", "ID");writer.addHeaderAlias("name", "用戶名");writer.addHeaderAlias("nick", "昵稱");// ...其他字段// 4. 寫入數據writer.write(list, true);// 5. 設置響應頭response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");String fileName = URLEncoder.encode("用戶信息", "UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");// 6. 輸出流ServletOutputStream out = response.getOutputStream();writer.flush(out, true);out.close();writer.close();
}

四、前后端交互設計

4.1 API接口規范

系統采用RESTful風格設計API,主要接口如下:

請求方法路徑描述
POST/user/list_page分頁查詢用戶列表
POST/user/insertOrUpdate新增或更新用戶
POST/user/delete刪除用戶
POST/user/list_delete批量刪除用戶
GET/user/list_export導出用戶數據到Excel

4.2 數據格式約定

前后端統一使用JSON格式交互,響應數據格式如下:

成功響應:

{"code": "200","message": "成功","object": {"total": 100,"data": [...]}
}

錯誤響應:

{"code": "500","message": "服務器錯誤"
}

4.3 Axios封裝

對Axios進行統一封裝,處理請求和響應:

import axios from 'axios'
import router from '../router'// 創建axios實例
const service = axios.create({baseURL: process.env.BASE_API,timeout: 5000
})// 請求攔截器
service.interceptors.request.use(config => {// 在請求頭中添加tokenif (localStorage.token) {config.headers['Authorization'] = localStorage.token}return config},error => {return Promise.reject(error)}
)// 響應攔截器
service.interceptors.response.use(response => {const res = response.dataif (res.code !== '200') {// token過期處理if (res.code === '401') {router.push('/login')}return Promise.reject(res)} else {return res.object}},error => {return Promise.reject(error)}
)export default service

五、系統安全考慮

5.1 密碼安全

用戶密碼使用SHA256加密存儲:

public class MyUtils {public static String getSHA256StrJava(String str) {try {MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(str.getBytes(StandardCharsets.UTF_8));StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}
}

5.2 接口權限控制

使用JWT進行接口權限驗證:

public class JwtInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("Authorization");if (token == null) {throw new RuntimeException("無token,請重新登錄");}// 驗證tokenClaims claims = JwtUtil.parseToken(token);if (claims == null) {throw new RuntimeException("token不合法");}// 將用戶信息存入requestrequest.setAttribute("userInfo", claims.get("userInfo"));return true;}
}

5.3 XSS防護

對用戶輸入進行過濾,防止XSS攻擊:

public class XssFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(httpRequest);chain.doFilter(xssRequest, response);}
}public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {String value = super.getParameter(name);return cleanXSS(value);}private String cleanXSS(String value) {if (value == null) return null;return HtmlUtils.htmlEscape(value);}
}

六、性能優化實踐

6.1 前端性能優化

  1. 組件懶加載:路由組件按需加載

  2. 表格虛擬滾動:大數據量表格使用虛擬滾動

  3. 請求防抖:搜索框輸入使用防抖處理

// 防抖處理
debounceSelectListPage: _.debounce(function() {this.selectListPage()
}, 500)

6.2 后端性能優化

  1. MyBatis二級緩存:啟用MyBatis二級緩存減少數據庫查詢

  2. 分頁優化:使用更高效的分頁查詢方式

  3. 批量操作:使用批量插入代替循環單條插入

// 批量插入示例
public void batchInsert(List<User> userList) {SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);UserMapper mapper = session.getMapper(UserMapper.class);for (User user : userList) {mapper.insert(user);}session.commit();session.clearCache();session.close();
}

七、總結與擴展

本文詳細介紹了基于Vue.js和Spring Boot的前后端分離用戶管理系統的實現。系統實現了用戶管理的常見功能,包括:

  1. 用戶信息的增刪改查

  2. 批量操作

  3. 數據導入導出

  4. 分頁查詢與條件過濾

  5. 系統安全防護

擴展方向

  1. 角色權限管理:實現更細粒度的權限控制

  2. 操作日志:記錄用戶操作日志

  3. 數據可視化:增加用戶數據統計圖表

  4. 消息通知:系統消息通知功能

  5. 移動端適配:開發響應式布局或單獨移動端應用

通過這個項目,開發者可以掌握前后端分離開發的核心技術棧,了解企業級應用開發的常見模式和最佳實踐。希望本文能為您的開發工作提供有價值的參考。

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

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

相關文章

基于uni-app+vue3實現的微信小程序地圖范圍限制與單點標記功能實現指南

一、功能概述本文將分步驟講解如何使用uni-app框架在微信小程序中實現以下功能&#xff1a;顯示基礎地圖繪制特定區域范圍&#xff08;以鄭州市為例&#xff09;實現點擊地圖添加標記點限制標記點只能在指定區域內添加顯示選中位置的坐標信息二、分步驟實現步驟1&#xff1a;搭…

C# 反射和特性(關于應用特性的更多內容)

關于應用特性的更多內容 至此&#xff0c;我們演示了特性的簡單使用&#xff0c;都是為方法應用單個特性。本節將講述特性的其他使 用方式。 多個特性 可以為單個結構應用多個特性。 多個特性可以使用下面任何一種格式列出。 獨立的特性片段一個接一個。通常&#xff0c;它們彼…

【iOS】KVC原理及自定義

目錄 前言 KVC定義及API KVC的使用 基本類型 集合類型 訪問非對象類型——結構體 集合操作符 層層嵌套 KVC底層原理 設值過程 取值過程 自定義KVC setter方法 getter方法 KVC異常小技巧 自動轉換類型 設置空值 未定義的key 前言 在平時的開發中我們經常用到K…

完整設計 之 智能合約系統:主題約定、代理協議和智能合約 (臨時命名)----PromptPilot (助手)答問之2

摘要&#xff08;CSDN的AI助手生成的&#xff09;智能合約系統架構設計摘要本設計構建了一個多層次智能合約系統&#xff0c;包含150字以內的核心架構&#xff1a;三級架構體系&#xff1a;元級&#xff08;序分&#xff09;&#xff1a;MetaModel合約定義系統核心原則模型級&a…

Java基礎 8.16

1.final關鍵字基本介紹final中文意思&#xff1a;最后的&#xff0c;最終的final可以修飾類、屬性、方法和局部變量在某些情況下&#xff0c;程序員可能有以下需求&#xff0c;就會使用到final當不希望類被繼承時,可以用final修飾當不希望父類的某個方法被子類覆蓋/重寫(overri…

YOLOv8目標檢測網絡結構理論

目錄 YOLOv8的網絡結構圖&#xff1a; Backbone 卷積塊&#xff08;Conv Block&#xff09; Conv2d層 BatchNorm2d層 SiLU激活函數 瓶頸塊(Bottleneck Block) C2f 模塊結構 Neck SPPF(空間金字塔池化快速) PAN - FPN Head 結構1.卷積層和激活函數: 2.預測層(Predi…

docker部署hadoop集群

Docker部署hadoop集群下載資源構建鏡像啟動容器搭建集群配置ssh免密節點職責安排修改配置文件啟動集群測試上傳下載執行wordcount程序補充配置歷史服務器日志聚集單節點啟動Java客戶端使用HDFSMapReduce下載資源 java華為鏡像下載地址&#xff1a;Index of java-local/jdk (hu…

常用的T-SQL命令

文章目錄1. 數據庫操作2. 表操作3. 數據插入、更新、刪除4. 數據查詢5. 存儲過程6. 事務處理7、如何使用T-SQL在表中設置主鍵和外鍵&#xff1f;1. 設置主鍵&#xff08;PRIMARY KEY&#xff09;方法1&#xff1a;創建表時定義主鍵方法2&#xff1a;通過ALTER TABLE添加主鍵2. …

C++面試題及詳細答案100道( 31-40 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

給純小白的 Python 操作 Excel 筆記

&#x1f9f0; 1. 先裝工具電腦鍵盤按 Win R&#xff0c;輸入 cmd&#xff0c;回車&#xff0c;把下面一行粘進去回車&#xff0c;等它跑完。 bashpip install openpyxl——————————————————&#x1f6e0;? 2. 打開一個空白的 Excel 打開 Jupyter Notebook…

HTML 常用屬性介紹

目錄 HTML 屬性 HTML 屬性速查表 一、通用屬性&#xff08;所有元素適用&#xff09; 二、鏈接與引用相關屬性 三、表單與輸入控件屬性 四、媒體與多媒體屬性 五、事件屬性&#xff08;常用 JavaScript 事件&#xff09; 六、其他常用屬性 核心通用屬性 id 屬性 cla…

HTML5練習代碼集:學習與實踐核心特性

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;HTML5作為新一代網頁標準&#xff0c;對Web開發提供了更豐富的功能和工具。本練習代碼集專門針對HTML5的核心特性&#xff0c;包括語義化標簽、離線存儲、多媒體支持、圖形繪制等&#xff0c;以及CSS3的3D效果和…

【RH134知識點問答題】第 10 章:控制啟動過程

目錄 1. 請簡要說明 RHEL9 的啟動過程。 2. 系統重啟和關機的命令分別是什么? 3. Systemd target 是什么&#xff1f; 4. 重置丟失的 root 密碼需要哪些步驟&#xff1f; 5. 如何讓系統日志在重啟后持久保留 1. 請簡要說明 RHEL9 的啟動過程。 答&#xff1a;①開機自檢…

Apollo10.0學習之固態雷達與IMU的外參標定

固態雷達&#xff08;如Livox、禾賽等非旋轉式激光雷達&#xff09;與IMU&#xff08;慣性測量單元&#xff09;的外參標定&#xff08;Extrinsic Calibration&#xff09;是自動駕駛、機器人定位&#xff08;如LIO-SAM、FAST-LIO&#xff09;的關鍵步驟。1. 標定原理 外參標定…

HTML5實現古典音樂網站源碼模板1

文章目錄 1.設計來源1.1 網站首頁1.2 古典音樂界面1.3 著名人物界面1.4 古典樂器界面1.5 歷史起源界面 2.效果和源碼2.1 動態效果2.2 源代碼 源碼下載萬套模板&#xff0c;程序開發&#xff0c;在線開發&#xff0c;在線溝通 作者&#xff1a;xcLeigh 文章地址&#xff1a;http…

40 C++ STL模板庫9-容器2-vector

C STL模板庫9-容器2-vector 文章目錄C STL模板庫9-容器2-vector一、基礎概念1. 類型成員&#xff08;Type Members&#xff09;2. 模板參數二、構造函數1. 語法2. 示例三、元素訪問1. 函數說明2. 示例代碼四、容量操作1. 函數說明2. 關鍵點說明3. 關鍵操作解析4. 操作示例五、修…

GPT-5系列文章2——新功能、測試與性能基準全解析

引言 2025年8月&#xff0c;OpenAI正式發布了其新一代旗艦模型GPT-5。與業界此前期待的AGI(人工通用智能)突破不同&#xff0c;GPT-5更像是OpenAI對現有技術的一次深度整合與用戶體驗優化。本文將全面解析GPT-5的新特性、實際測試表現以及官方發布的基準數據&#xff0c;幫助開…

利用cursor+MCP實現瀏覽器自動化釋放雙手

小伙伴們&#xff0c;我們今天利用cursorMCP實現瀏覽器自動化&#xff0c;釋放雙手&#xff0c;工作效率嘎嘎提升&#xff01;前期準備&#xff1a;安裝node.js網址&#xff1a;https://nodejs.org/zh-cn下載下來安裝即可。 下載browser-tools-mcp擴展程序&#xff1a;下載擴展…

指針/邊界索引混淆梳理

在處理數組/鏈表等數據結構時&#xff0c;時常混淆長度和指針序號。處理技巧&#xff1a;使用0-base索引。則區間長度 rightIndex - LeftIndex 1總長度 lastIndex - firstIndex 1鏈表創建一個dummy節點&#xff0c;添加到head前&#xff0c;則可認為從索引0開始。末尾指針判…

LeetCode 刷題【43. 字符串相乘】

43. 字符串相乘 自己做 解1&#xff1a;矩陣計數 class Solution { public:string multiply(string num1, string num2) {int len1 num1.size();int len2 num2.size();if (num1[0] 0 || num2[0] 0) //結果為0的情況return "0";//存儲計算過程的矩陣vector…