Vue3+SpringBoot全栈开发:从零实现增删改查与分页功能

news2025/7/21 17:58:27

 

前言

在现代化Web应用开发中,前后端分离架构已成为主流。本文将详细介绍如何使用Vue3作为前端框架,SpringBoot作为后端框架,实现一套完整的增删改查(CRUD)功能,包含分页查询、条件筛选等企业级特性。

技术栈介绍

  • 前端:Vue3 + Element Plus + Axios

  • 后端:SpringBoot + MyBatis-Plus

  • 构建工具:Vite (前端) + Maven (后端)

一、环境准备与项目搭建

1.1 前端项目初始化

bash

复制

下载

npm init vue@latest vue3-springboot-crud
cd vue3-springboot-crud
npm install axios element-plus --save

1.2 后端项目搭建

使用Spring Initializr创建项目,添加以下依赖:

  • Spring Web

  • MyBatis Framework

  • Lombok

  • MySQL Driver

二、核心功能实现

2.1 跨域解决方案

前后端分离开发首要解决跨域问题,SpringBoot后端配置如下:

java

复制

下载

@Configuration
public class CrossConfig {
    private static final long MAX_AGE = 24 * 60 * 60;

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setMaxAge(MAX_AGE);
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

2.2 前端Axios封装

javascript

复制

下载

import axios from "axios";
import { ElMessage } from 'element-plus'

const http = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL,
    timeout: 50000
})

// 请求拦截器
http.interceptors.request.use(config => {
    config.headers['Content-Type'] = "application/json;charset=utf-8"
    const user = JSON.parse(localStorage.getItem("user") || '{}')
    if (user.token) {
        config.headers['Authorization'] = `Bearer ${user.token}`
    }
    return config
})

// 响应拦截器
http.interceptors.response.use(response => {
    if (response.data.code !== 200) {
        ElMessage.error(response.data.message)
    }
    return response.data
}, error => {
    ElMessage.error(error.message)
    return Promise.reject(error)
})

export default http

三、分页查询实现

3.1 后端分页逻辑

java

复制

下载

@PostMapping("/list_page")
public Result<PageResult<User>> listPage(@RequestBody PageQuery<User> query) {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    if (StringUtils.isNotBlank(query.getEntity().getName())) {
        wrapper.like("name", query.getEntity().getName());
    }
    
    int total = userMapper.selectCount(wrapper);
    PageHelper.startPage(query.getCurrentPage(), query.getPageSize());
    List<User> list = userMapper.selectList(wrapper);
    
    return Result.success(new PageResult<>(total, list));
}

3.2 前端分页组件

vue

复制

下载

<template>
  <div class="pagination-container">
    <el-pagination
      v-model:current-page="queryParams.currentPage"
      v-model:page-size="queryParams.pageSize"
      :page-sizes="[10, 20, 50, 100]"
      layout="total, sizes, prev, pager, next"
      :total="total"
      @size-change="handleQuery"
      @current-change="handleQuery"
    />
  </div>
</template>

<script setup>
import { reactive, ref } from 'vue'
import http from '@/utils/request'

const queryParams = reactive({
  currentPage: 1,
  pageSize: 10,
  name: ''
})

const total = ref(0)
const tableData = ref([])

const handleQuery = async () => {
  const res = await http.post('/user/list_page', queryParams)
  tableData.value = res.data.list
  total.value = res.data.total
}
</script>

四、完整CRUD实现

4.1 新增数据

java

复制

下载

@PostMapping("/add")
public Result<String> addUser(@RequestBody User user) {
    user.setCreateTime(LocalDateTime.now());
    userMapper.insert(user);
    return Result.success("添加成功");
}

4.2 更新数据

java

复制

下载

@PostMapping("/update")
public Result<String> updateUser(@RequestBody User user) {
    user.setUpdateTime(LocalDateTime.now());
    userMapper.updateById(user);
    return Result.success("更新成功");
}

4.3 删除数据

java

复制

下载

@PostMapping("/delete")
public Result<String> deleteUser(@RequestBody List<Long> ids) {
    if (ids != null && !ids.isEmpty()) {
        userMapper.deleteBatchIds(ids);
    }
    return Result.success("删除成功");
}

五、前端界面优化

5.1 表格与表单组件

vue

复制

下载

<template>
  <div class="app-container">
    <!-- 查询表单 -->
    <el-form :inline="true" class="search-form">
      <el-form-item label="用户名">
        <el-input v-model="queryParams.name" clearable @clear="handleQuery" />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="handleQuery">查询</el-button>
        <el-button @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    
    <!-- 操作按钮 -->
    <div class="operation-buttons">
      <el-button type="primary" @click="handleAdd">新增</el-button>
      <el-button type="danger" @click="handleBatchDelete">批量删除</el-button>
    </div>
    
    <!-- 数据表格 -->
    <el-table
      v-loading="loading"
      :data="tableData"
      @selection-change="handleSelectionChange"
    >
      <el-table-column type="selection" width="55" />
      <el-table-column prop="name" label="姓名" />
      <el-table-column prop="age" label="年龄" />
      <el-table-column label="操作" width="200">
        <template #default="scope">
          <el-button size="small" @click="handleEdit(scope.row)">编辑</el-button>
          <el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    
    <!-- 分页组件 -->
    <pagination
      v-show="total > 0"
      :total="total"
      v-model:page="queryParams.currentPage"
      v-model:limit="queryParams.pageSize"
      @pagination="handleQuery"
    />
    
    <!-- 新增/编辑对话框 -->
    <el-dialog v-model="dialogVisible" :title="dialogTitle">
      <el-form :model="form" :rules="rules" ref="formRef">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="form.name" />
        </el-form-item>
        <el-form-item label="年龄" prop="age">
          <el-input-number v-model="form.age" :min="0" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="submitForm">确定</el-button>
      </template>
    </el-dialog>
  </div>
</template>

六、性能优化建议

  1. 后端优化

    • 使用MyBatis-Plus的分页插件替代手动分页

    • 添加Redis缓存高频访问数据

    • 对大数据量查询添加索引

  2. 前端优化

    • 使用防抖处理频繁查询

    • 添加表格加载状态

    • 实现数据懒加载

javascript

复制

下载

// 防抖处理示例
import { debounce } from 'lodash-es'

const debouncedQuery = debounce(handleQuery, 500)

七、常见问题解决

  1. 跨域问题:确保后端正确配置CORS,前端请求地址正确

  2. 分页失效:检查分页参数是否正确传递,后端SQL是否正确拼接

  3. 数据更新不及时:在增删改操作后重新查询数据

  4. 批量操作失败:检查后端是否支持批量操作,参数格式是否正确

结语

本文详细介绍了基于Vue3和SpringBoot的全栈CRUD开发流程,涵盖了从基础查询到复杂分页的实现,以及前后端交互的最佳实践。读者可以根据实际需求扩展更多功能,如表单验证、文件上传、权限控制等。欢迎交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)

导入工具包 rom langchain_core.tools import BaseTool from typing import Sequence, Optional, List from langchain_core.prompts import BasePromptTemplate import re from langchain_core.tools import tool from langchain_core.prompts.chat import (ChatPromptTempla…

极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

leetcode hot100刷题日记——35.子集

解答&#xff1a; 方法一&#xff1a;选or不选的dfs&#xff08;输入视角&#xff09; 思路&#xff1a;[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。 eg.空集就是一个数字都不选&#xff0c;[1,2]就是1&#xff0c;2选&#xff0c;3不选。 class Solution { pub…

MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

手眼标定:九点标定、十二点标定、OpenCV 手眼标定

因为一直使用6轴协作机器人&#xff0c;且主要应用是三维视觉&#xff0c;平常的手眼标定基本都是基于OpenCV来计算的&#xff0c;听说有九点标定和十二点标定&#xff0c;顺便了解下。 目录 1.九点标定1.1 基本原理1.2 关于最小二乘法1.3 具体示例 2.十二点标定3.OpenCV 手眼标…

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析

前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量…

React-native的新架构

本文总结: 文章主要介绍了 React Native 的新架构&#xff0c;包括以下几个方面的内容&#xff1a;&#x1f4f1;✨ 如何抹平 iOS 和 Android 样式差异&#xff0c;提升跨平台一致性&#xff1b; 分析了旧架构中存在的问题&#xff0c;如通信瓶颈、启动慢、维护复杂等&#x…

Git 全平台安装指南:从 Linux 到 Windows 的详细教程

目录 一、Git 简介 二、Linux 系统安装指南 1、CentOS/RHEL 系统安装 2、Ubuntu/Debian 系统安装 3、Windows 系统安装 四、安装后配置&#xff08;后面会详细讲解&#xff0c;现在了解即可&#xff09; 五、视频教程参考 一、Git 简介 Git 是一个开源的分布式版本控制系…

Tree 树形组件封装

整体思路 数据结构设计 使用递归的数据结构&#xff08;TreeNode&#xff09;表示树形数据每个节点包含id、name、可选的children数组和selected状态 状态管理 使用useState在组件内部维护树状态的副本通过deepCopyTreeData函数进行深拷贝&#xff0c;避免直接修改原始数据 核…

AI书签管理工具开发全记录(五):后端服务搭建与API实现

文章目录 AI书签管理工具开发全记录&#xff08;四&#xff09;&#xff1a;后端服务搭建与API实现前言 &#x1f4dd;1. 后端框架选型 &#x1f6e0;️2. 项目结构优化 &#x1f4c1;3. API路由设计 &#x1f9ed;分类管理书签管理 4. 数据模型定义 &#x1f4be;分类模型&…

netTAP 100:在机器人技术中将 POWERLINK 转换为 EtherNet/IP

工业机器人服务专家 年轻的 More Robots 公司成立仅一年多&#xff0c;但其在许多应用领域的专业技术已受到广泛欢迎。这是因为More Robots提供 360 度全方位服务&#xff0c;包括从高品质工业机器人和协作机器人到咨询和培训。这包括推荐适合特定任务或应用的机器人&#xff0…

多模态大语言模型arxiv论文略读(九十八)

Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文标题&#xff1a;Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文作者&#xff1a;Ziyuan Huang, Kaixiang Ji, Biao Gong, Zhiwu Qing, Qinglong Zhang, Kecheng Zhe…

EXCEL--累加,获取大于某个值的第一个数

一、函数 LET(data,A1:A5,cumSum,SCAN(0,data,LAMBDA(a,b,ab)),idx,MATCH(TRUE,cumSum>C1,0),INDEX(data,idx)) 二、函数拆解 1、LET函数&#xff1a;LET(name1, value1, [name2, value2, ...], calculation) name1, name2...&#xff1a;自定义的变量名&#xff08;需以字…

本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】

文章目录 一、安装 Ollama1.1 下载1.2 安装 二、下载 DeepSeek 模型三、使用 DeepSeek3.1 在命令行环境中使用3.2 在第三方软件中使用 一、安装 Ollama 1.1 下载 官方网址&#xff1a;Ollama 官网下载很慢&#xff0c;甚至出现了下载完显示 无法下载&#xff0c;需要授权 目…

win主机如何结束正在执行的任务进程并重启

最近遇到一个问题&#xff0c;一个java入库程序经常在运行了几个小时之后消息无法入库&#xff0c;由于已经没有研发人员来维护这个程序了&#xff0c;故此只能每隔一段时间来重启这个程序以保证一直有消息入库。 但是谁也不能保证一直有人去看这个程序&#xff0c;并且晚上也不…

maven中的maven-resources-plugin插件详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 一、插件定位与核心功能 maven-resources-plugin是Maven构建工具的核心插件之一&#xff0c;主要用于处理项目中的资源文件&#xff08;如…

ROS云课基础篇-01-Linux-250529

ROS云课基础篇收到了很多反馈&#xff0c;正面评价比例高&#xff0c;还有很多朋友反馈需要写更具体一点。 ROS云课基础篇极简复习-C、工具、导航、巡逻一次走完-CSDN博客 于是&#xff0c;有了这篇以及之后的案例&#xff0c;案例均已经测试过8年&#xff0c;但没有在博客公…

深入了解 C# 异步编程库 AsyncEx

在现代应用程序开发中&#xff0c;异步编程已经成为提升性能和响应能力的关键&#xff0c;尤其在处理网络请求、I/O 操作和其他耗时任务时&#xff0c;异步编程可以有效避免阻塞主线程&#xff0c;提升程序的响应速度和并发处理能力。C# 提供了内建的异步编程支持&#xff08;通…

Vulhub靶场搭建(Ubuntu)

前言&#xff1a;Vulhub 是一个开源的漏洞靶场平台&#xff0c;全称是 Vulhub: Vulnerable Web Application Environments&#xff0c;主要用于学习和复现各类 Web 安全漏洞。它的核心特征是通过 Docker 环境快速搭建出带有特定漏洞的靶场系统&#xff0c;适合渗透测试学习者、…

C++:参数传递方法(Parameter Passing Methods)

目录 1. 值传递&#xff08;Pass by Value&#xff09; 2. 地址传递&#xff08;Pass by Address&#xff09; 3. 引用传递&#xff08;Pass by Reference&#xff09; 数组作为函数参数&#xff08;Array as Parameter&#xff09; 数组作为函数返回值 什么是函数&#xff…