12.vue整合springboot首页显示数据库表-实现按钮:【添加修改删除查询】

vue整合springboot首页显示数据库表:【添加修改删除查询】

提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每个知识点,都是写出代码和运行结果且前后关联上的去分析和说明(能大量节约您的时间)。

所有文章都*不会*直接把代码放那里,让您自己去看去理解。我希望我的内容对您有用而努力~


文章目录

  • vue整合springboot首页显示数据库表:【添加修改删除查询】
  • 前言
  • 一、后端
  • 二、前端
    • 查询
    • 添加
    • 修改
    • 删除
  • 三、总结
  • 总结


本文章是系列文章,技术栈内容为:【springboot+vue】【前后分离】
【详细图文,实操步骤分享,节约时间版】。最终完成一个商业化项目。内容有:
springboot知识
mybatisPlus知识
vue知识
node.js知识

本小节的内容是
vue篇章 之 : 12.vue3实现与springboot交互【完成登陆及页面跳转】



每一个文章小节都会把 标题 说的很清楚。前后关联看,可以快速实现:前后分离。本质上,额外文章链接和文章自己标题内容关系不大。

=附01=:前面小节文章已经实现springboot的创建,springboot关联前端数据swagger和springboot通过mybatisplus操作数据库
【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本(非常简洁快速)
【上榜文章,一文搞定】现在springboot是3.x以上版本,jdk版本至少要求17.但是很多时候我们电脑是jdk1.8(求稳定性和安全性)。文本分享本机电脑1.8的jdk。idea如何非常简洁快速的创建springboot
文章里面也有 为什么只能是jdk17起和地址指定为阿里云报错的解决办法

=附02=:前面小节已经安装好node.js和分享了一些vue语法,及RESTful风格及安装配置swagger使用,和:
如何启动vue项目和vue语法组件化不同标签应对的作用说明
通过工具生成的vue案例(工具生成vue项目工程结构,里面有一个欢迎界面网页)为切入点,逐步逐步修改分享讲解,完成vue项目如何启动。及自行编写一些标签和样式来替换默认的内容,帮助理解包括里面的标签,js代码,样式如何配合的

=附03=:这个文章是 Axios 详细语法和实现步骤,其实整个 系列 干脆快速,很多上榜的
vue实现与后台springboot传递数据【传值/取值 Axios 】
在这里插入图片描述
实现Axios的案例解决方案(代码实例),代码已经直接解决了跨域,当然也标注了注释。

我为啥放链接。因为本文章的内容 本质上 是把前面很多的内容串起来了


前言

完成 前端 vue.js工程结构准备
前端能启动vue项目(vue项目的工程结构及vue语法分享在前面章节)。当前已经分享完毕的进度:vue项目里面网页写Axios取后台的值和发送数据到后台。已完成实现点击不同链接显示不同页面内容,vue-router路由配置,把Axios和router路由整合起来
登陆验证成功跳转到其他页面(登陆逻辑实现就是序号10)
完成首页数据表显示(序号11)

完成 后台 springboot工程结构准备
包括springboot项目(dao、service、controller、pojo实体类)。controller类里面的方法能拿实现不同提交方式(get post put delete) 去调用service/dao。 dao通过mybatisPlus操作mysql数据库(前面章节有分享)

本小节是 显示完毕数据库表之后,点击不同按钮,实现:添加修改删除查询
上一节
11.vue网页开启自动提交springboot后台查询-首页显示数据库表
已经显示出全部数据表里面的内容,前端后端代码都有

从0到现在,内容拆开了。实现前后分离。
拆开:力求 每一篇文章 单独把主题 分享清楚:本小节是 在表格基础上:增删改查


一、后端

数据库
在这里插入图片描述

controller

@RestController
@CrossOrigin //跨域问题,序号8 ,联系前后端,使用axios的细节步骤,附://(文章最后 分享了 非常详细的跨域 同源策略简单/非简单)
public class UserController {@Resourceprivate UserService userService;@PostMapping("/login")public boolean login(User user){boolean b = userService.login(user); //序号10  实现登录跳转首页用的return b;}@GetMapping("/findAll")public List<User> findAll(){List<User> list = userService.findAllUser();//查询全部,显示 welcome.vue之前就调用加载  //文章序号8  axios分享的vue组件生命周期自带函数return list;}@GetMapping("/getUser")public User getUser(){User user = userDao.selectById(1);return user;}@PostMapping("/addUser") //Post 添加public int addUser(@RequestBody User user){System.out.println(user);int number = userService.insertUser(user);return number;}@PutMapping("/updateUser") //Put 修改public int updateUser(@RequestBody User user){System.out.println(user);int number = userService.updateUser(user);return number;}@DeleteMapping("/deleteUser/{uid}") //Delete 删除public int deleteUser(@PathVariable("uid") int id){int number = userService.deleteUser(id);return number;}
}

service

@Service
public class UserService {@Resourceprivate UserDao userDao;//mybatisPlus的语法   序号4分享的mybatisPlus的详细使用//序号4 文章最后面,分享了QueryWrapper的使用语法(拼接sql语句)private QueryWrapper<User> wrapper = new QueryWrapper<User>();public boolean login(User user){ //登陆用的User u = userDao.selectOne(wrapper.eq("uname",user.getUname()));if(u == null){return false;}else{if(u.getUpwd().equals(user.getUpwd())){return true;}else{return false;}}}public User findById(int id){return userDao.selectOne(wrapper.eq("uid",id));//eq 是 =  的意思//wrapper 有一套自己的语法,能非常方便的拼接sql语句}public User findByName(String name){return userDao.selectOne(wrapper.eq("uname",name));//uname=参数name//序号4 文章最后面(wrapper)    我把内容拆开,是保证文章简洁  //保证  文章仅仅是标题内容}public List<User> findAllUser(){return userDao.selectList(null); }public int insertUser(User user){return userDao.insert(user);}public int updateUser(User user){return userDao.update(user,wrapper.eq("uid",user.getUid()));}public int deleteUser(int id){return userDao.deleteById(id);}
}

dao层

@Mapper
public interface UserDao extends BaseMapper<User> {  //使用的mybatisPlus//BaseMapper这里类里面  自动有很多很多 不同逻辑的增删改查的功能  //子类继承了父类,子类直接拥有父类的一些方法  我们不写基本的//这个案例不用写复杂的 ,如果非要我们自己写,具体内容在序号4里面
}

实体类


//如果表名和实体类不一样用:
//@TableName("数据库表名")
public class User {@TableIdprivate int uid; //自带很多sql语句, 所以:告诉mybatisPlus,这个成员变量是主键private String uname;private String upwd;private int uage;构造函数get settoString略}

二、前端

使用了axios(前后数据交互) 详细的语法分享:序号8
使用了router(路由,指定跳转的页面) 序号9
使用了elementPlus(视图标签ui框架) 序号10

现在整合了几乎前面全部的 。如果看晕,还是建议:看一看前面的

进入这个界面,看到的是:
在这里插入图片描述

全部代码,配合后台能直接运行<template><div><el-button type="primary" @click="userAdd" style="margin-bottom: 20px">新增</el-button><el-table :data="list" border style="width: 100%"><el-table-column type="index" align="center" width="60" label="序号" /> <!-- 自动的序号,不是数据库表的内容 --><el-table-column prop="uid" align="center"  width="100" label="id" /><el-table-column prop="uname" align="center" width="60" label="名称" /><el-table-column prop="uage" align="center" width="60" label="年龄" /><el-table-column label="操作" width="120"><template #default="scope"><el-button size="mini" @click="userToUpdate(scope.$index, scope.row)">编辑/修改</el-button><el-button size="mini" type="danger" @click="userDelete(scope.$index, scope.row)">删除</el-button></template></el-table-column></el-table><!-- 编辑/修改对话框 --><el-dialog v-model="editDialogVisible" title="编辑/修改数据"><el-form :model="editForm"><el-form-item label="ID" label-width="80px"><el-input v-model="editForm.uid" disabled /></el-form-item><el-form-item label="名称" label-width="80px"><el-input v-model="editForm.uname" /></el-form-item><el-form-item label="年龄" label-width="80px"><el-input v-model="editForm.uage" /></el-form-item></el-form><template #footer><el-button @click="editDialogVisible = false">取消</el-button><el-button type="primary" @click="userUpdate">确认</el-button></template></el-dialog><!-- 新增对话框 --><el-dialog v-model="addDialogVisible" title="新增数据"><el-form :model="addForm"><el-form-item label="名称" label-width="80px"><el-input v-model="addForm.uname" /></el-form-item><el-form-item label="年龄" label-width="80px"><el-input v-model="addForm.uage" /></el-form-item></el-form><template #footer><el-button @click="addDialogVisible = false">取消</el-button><el-button type="primary" @click="confirmAdd">确认</el-button></template></el-dialog></div>
</template><script>
import {reactive, toRefs} from "vue";
import {useRouter} from "vue-router";
import axios from "axios";export default {name: 'welcome',data() {return {list: [], // 初始化为空数组,稍后填充数据editDialogVisible: false,  //窗口默认不显示addDialogVisible: false,  //窗口默认不显示editForm: {  //修改方法和网页标签共用的对象uid: '',uname: '',uage: ''},addForm: {  //添加方法和网页标签共用的对象uname: '',uage: ''}};},created() {this.fetchTableData(); // 组件创建时自动调用的方法},methods: {fetchTableData() { //显示表格全部数据axios.get('http://localhost:8081/findAll').then(response => {this.list = response.data; })},userToUpdate(i,row) {  //开启修改网页窗口   及  row整行数据作为参数传给窗口this.editForm = { ...row };this.editDialogVisible = true;},userUpdate() {alert(this.editForm.uname)axios.put('http://localhost:8081/updateUser', this.editForm).then(() => {this.fetchTableData(); //调用表格显示方法this.editDialogVisible = false;  //把窗口关了this.$message.success('修改成功'); })},userDelete(i,row) { //删除this.$confirm('确认删除该记录吗?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {axios.delete(`http://localhost:8081/deleteUser/${row.uid}`).then(() => {this.fetchTableData();this.$message.success('删除成功');})})},userAdd() { //开启添加网页窗口  addForm 是全局对象,清空数据this.addForm = { uname: '', uage: '' };this.addDialogVisible = true;},    confirmAdd() { //添加方法 alert(this.addForm.uname)  //看一下 有值没有axios.post('http://localhost:8081/addUser', this.addForm).then(() => {this.fetchTableData();this.addDialogVisible = false;this.$message.success('新增成功');})}}
}
</script><style>样式我没写 ,各位可以自行编辑css样式
</style>

查询

这里是上面代码的某一个部分:

<el-table :data="list" border style="width: 100%">
标签里面::data="引用一个 全局变量"   list会被表格遍历,序号11详细的表格显示

这个变量list在data()里面声明:

data() {return {list: [] //这里仅仅声明 。没有赋值  声明了 很多地方都能用 ,前面文章:vue语法有很多分享...等等其他全局声明} //created() 组件被创建 自动调用的函数created() {this.fetchTableData(); // 调用我们自己定义的函数fetchTableData//还可以用很多个 其他的函数   在组件被创建的时候自动调用},methods: {fetchTableData() {//提交后台   接收数据   赋值给全局变量list (后台返回的也是一个list)axios.get('http://localhost:8081/findAll').then(response => {this.list = response.data; })} //赋值之后,这个list就在表格里面显示

添加

定义一个按钮,点击调用userAdd方法:

<el-button type="primary" @click="userAdd" style="margin-bottom: 20px">新增</el-button>

执行:

userAdd() { this.addForm = { uname: '', uage: '' };  //全局变量里面的数据清空  里面的成员变量uname和uagethis.addDialogVisible = true;  //让模态窗口显示出来}

点击之后:
在这里插入图片描述
最上面:template标签里面:最后一段,定义了这个窗口。且表单取值
我把代码放到一堆,这个主要看 流程和点击之后,发生了什么,对应的关系:

流程:弹出的窗口里面有一个:
<el-form :model="addForm">  
这个addForm又是一个全局变量  在data里面声明的<el-input v-model="addForm.uage" />
uage对应成员变量   也对应后端实体类的名字因为:controller能直接赋值参数在窗口里面点击提交:
<el-button type="primary" @click="confirmAdd">确认</el-button>执行confirmAdd方法
刚刚userAdd方法,是弹出窗口
confirmAdd方法 是提交后台post提交confirmAdd() {alert(this.addForm.uname)axios.post('http://localhost:8081/addUser', this.addForm) //全局变量给后台.then(() => { //成功之后this.fetchTableData(); //显示首页表格的方法this.addDialogVisible = false; //窗口关掉this.$message.success('新增成功'); //网页上面中间 绿色的字 显示3秒消失})}

修改

表格里面点击修改的按钮<el-button size="mini" @click="userToUpdate(scope.$index, scope.row)">编辑/修改</el-button>
两个参数:
一个是表格的序号(我方法里没有用,这个是分享,可以获取到序号)
一个是row (整行的数据)userToUpdate 是开启窗口的方案  及  给全局变量赋值 row参数数据(窗口数据回显)
userToUpdate(i,row) {  //i可以alert看一眼 和后台内容无关,vue给的tr的序号,也能为参数this.editForm = { ...row };  //整行的数据作为参数this.editDialogVisible = true; //显示窗口}

在这里插入图片描述
改一改之后,点击确认:

执行这个方法
<el-button type="primary" @click="userUpdate">确认</el-button>userUpdate() { //put提交alert(this.editForm.uname)//可以删掉,确认一下。全局变量是否有数据给后台的axios.put('http://localhost:8081/updateUser', this.editForm) //this.editForm传给给后台.then(() => {this.fetchTableData(); //显示表格的方法this.editDialogVisible = false; //关掉窗口this.$message.success('修改成功'); //网页上面中间 绿色的字 显示3秒消失})}

删除

userDelete(i,row) {this.$confirm('确认删除该记录吗?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => { //点击确定之后 发送delete请求 删除axios.delete(`http://localhost:8081/deleteUser/${row.uid}`).then(() => {this.fetchTableData(); //显示表格的方法this.$message.success('删除成功');})})}

三、总结

在data里面定义了很多全局变量
窗口显示 窗口不显示 是false true
表格里面 点击: 新增 修改 删除 按钮的作用是:显示某某窗口(false or true)
因为是全局变量,所以添加按钮方法里面还清空了数据: uname:"" 给了一个空值

在窗口里面操作:
数据传递 和登陆的时候 语法一样。都是在form表单里面赋值
form里面的数据用:model=“全局变量”
这个全局变量 有数据之后 给axios传递到后台。
axios成功就是.then()
.then()里面:调用表格显示的方法,关闭窗口,显示文字


总结

说明一下:整个这个系列实现前后分离的springboot+vue项目。序号文章一共也就10几篇,只有核心图文重点操作步骤来实现这个目标(基本上您边看边写:一个小时或者一上午就能跟着一起手搓一个前后分离项目,然后您可以自行添加功能和内容在您项目里面)

其他扩展细节知识点,本系列省略了(或者有链接)如:
还有一些案例,但是现在案例基本满足大部分情况,毕竟当前我们的目的是:快速手搓一个前后分离的全栈。
很多文章都有链接,除了实现前后分离步骤之外,还可以查看链接详细分享的文章,后面根据需求自行添加内容到项目里面

(会陆续更新非常多的IT技术知识及泛IT的电商知识,可以点个关注,共同交流。ღ( ´・ᴗ・` )比心)
(也欢迎评论,提问。 我会依次回答~)

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

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

相关文章

LLM笔记(九)KV缓存(2)

文章目录 1. 背景与动机2. 不使用 KV Cache 的情形2.1 矩阵形式展开2.2 计算复杂度 3. 使用 KV Cache 的优化3.1 核心思想3.2 矩阵形式展开3.3 计算复杂度对比 4. 总结5. GPT-2 中 KV 缓存的实现分析5.1 缓存的数据结构与类型5.2 在注意力机制 (GPT2Attention) 中使用缓存5.3 缓…

2025年渗透测试面试题总结-各厂商二面试题02(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 各厂商二面试题02 模块六&#xff1a;基础技术扩展 1. HTTP请求方式 2. 域名解析工具与技术 3. Web十…

专业漏洞扫描机构如何助力企业保障安全并提升竞争力?

在这个信息化的当下&#xff0c;专业漏洞扫描机构扮演着至关重要的角色。他们运用专业的技术和手段&#xff0c;对各种软件和系统进行细致的漏洞检测&#xff0c;确保其安全可靠&#xff0c;同时帮助企业提高产品质量和市场竞争力。 服务项目 我们专注于向客户供应周到详尽的…

卷积神经网络中的二维卷积与三维卷积详解

【内容摘要】 本文聚焦卷积神经网络中的二维卷积与三维卷积&#xff0c;详细解析两者的区别、操作原理及应用场景&#xff0c;涵盖二维/三维卷积操作示意图、多通道输入处理方式&#xff0c;以及RGB图像不采用三维卷积的原因&#xff0c;助力理解不同卷积类型的特性与适用场景。…

Oracle 的 ASSM 表空间

Oracle 的 ASSM&#xff08;Automatic Segment Space Management&#xff09;表空间 是一种自动管理段空间的技术&#xff0c;通过位图&#xff08;Bitmap&#xff09;机制跟踪数据块的使用情况&#xff0c;替代传统的手动管理&#xff08;MSSM&#xff0c;即 Freelist 管理&am…

蚂蚁金服大数据面经及参考答案

Java 如何保证跨平台性?请从 JVM 底层适配机制及向上提供的统一接口角度说明 Java 的跨平台性是其核心优势之一,依赖于 JVM(Java Virtual Machine)的底层适配机制和向上层提供的统一接口。从底层来看,JVM 针对不同操作系统和硬件平台进行了定制化实现,负责解析和执行 Ja…

P1009 [NOIP 1998 普及组] 阶乘之和

题目描述 用高精度计算出 S1!2!3!⋯n!&#xff08;n≤50&#xff09;。 其中 ! 表示阶乘&#xff0c;定义为 n!n(n−1)(n−2)⋯1。例如&#xff0c;5!54321120。 输入格式 一个正整数 n。 输出格式 一个正整数 S&#xff0c;表示计算结果。 输入输出样例 输入 3 输出…

Python 的 os 库常见使用方法(操作目录及文件)

前言&#xff1a; os 模块是 Python 标准库中用于与操作系统交互的核心模块&#xff0c;提供了许多操作文件和目录的功能。以下是常见的使用方法&#xff1a; 1. 目录操作 方法功能说明示例os.getcwd()获取当前工作目录print(os.getcwd())os.chdir(path)切换当前工作目录os.ch…

vue3 el-table实现字段可编辑

在Vue 3中&#xff0c;如果你想让el-table&#xff08;Element Plus的表格组件&#xff09;的字段可编辑&#xff0c;你可以通过以下方式来实现&#xff1a; 使用cell-mouse-enter和cell-mouse-leave事件动态显示编辑图标或控件 你可以在鼠标进入单元格时显示一个编辑图标或输…

基于shardingsphere的分库分表方案

一、准备docker容器 启动两个mysql的docker容器 docker run -v /root/mysql_volume/data:/var/lib/mysql -v /root/mysql_volume/conf:/etc/mysql/conf.d -v /root/mysql_volume/my.cnf:/etc/my.cnf -p 3306:3306 --name mysql --restartalways --privilegedtrue -e MYSQL_RO…

SearxNG本地搜索引擎

SearxNG 是一个强大、开源的 元搜索引擎(meta search engine),它不会存储用户信息,注重隐私保护,并支持从多个搜索引擎聚合结果,用户可以自建部署,打造一个无广告、可定制的搜索平台。 🔍 什么是 SearxNG? SearxNG 是 Searx 的一个积极维护的分支(fork),意在改进…

Vue3.5 企业级管理系统实战(十九):菜单管理

篇幅原因&#xff0c;本节先探讨菜单管理页面增删改查相关功能&#xff0c;角色菜单&#xff0c;菜单权限&#xff0c;动态菜单等内容放在后面。 1 菜单 api 在 src/api/menu.ts 中添加菜单 api&#xff0c;代码如下&#xff1a; //src/api/menu.ts import service from &qu…

【android bluetooth 协议分析 01】【HCI 层介绍 8】【ReadLocalVersionInformation命令介绍】

1. HCI_Read_Local_Version_Information 命令介绍 1. 功能&#xff08;Description&#xff09; HCI_Read_Local_Version_Information 命令用于读取本地 Bluetooth Controller 的版本信息&#xff0c;包括 HCI 和 LMP 层的版本&#xff0c;以及厂商 ID 和子版本号。 这类信息用…

React底层架构深度解析:从虚拟DOM到Fiber的演进之路

一、虚拟DOM&#xff1a;性能优化的基石 1.1 核心工作原理 React通过JSX语法将组件转换为轻量级JavaScript对象&#xff08;即虚拟DOM&#xff09;&#xff0c;而非直接操作真实DOM。这一过程由React.createElement()实现&#xff0c;其结构包含元素类型、属性和子节点等信息&a…

从AlphaGo到ChatGPT:AI技术如何一步步改变世界?

从AlphaGo到ChatGPT&#xff1a;AI技术如何一步步改变世界&#xff1f; 这里给大家分享一个人工智能学习网站。点击跳转到网站。 https://www.captainbed.cn/ccc 前言 在科技发展的历史长河中&#xff0c;人工智能&#xff08;AI&#xff09;技术无疑是最为璀璨的明珠之一。从…

关于在Unity项目中使用Post Processing插件打包到web端出现的问题

关于在Unity项目中使用Post Processing插件打包到web端出现的问题 解决方法&#xff1a;是不激活摄像机上的Post Processing有关组件&#xff0c;拉低场景中的Directional Light平行光的强度进行web端打包。 &#xff08;烘焙灯光时是可以激活。&#xff09; web端支持这个Pos…

MySQL - 如何突破单库性能瓶颈

数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的&#xff0c;服务器是数据库的宿主&#xff0c;其性能直接影响了数据库的性能&#xff0c;所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…

用 CodeBuddy 搭建「MiniGoal 小目标打卡器」:一次流畅的 UniApp 开发体验

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在日常生活中&#xff0c;我们总是希望能够坚持一些小习惯&#xff0c;比如每天锻炼十分钟、读一页书、早睡十分…

OpenCV 环境搭建与概述

// //OpenCV-4.11.0 C VS2019 // 一、OpenCV学习路线 1、入门: OpenCV图像读写、视频读写、基本像素处理、基本卷积处理、基本C开发知识。 2、初级: OpenCV自定义卷积操作、图像梯度、边缘提取、二值分析、视频分析、形态学处理、几何变换与透视变换。 3、中级: 角点查找、BL…

如何快速更换电脑浏览器ip:教程与注意事项

无论是为了访问地域限制内容、保护隐私&#xff0c;还是解决网络问题&#xff0c;快速更换浏览器IP地址的需求日益增多。以下是快速更换电脑浏览器IP地址的几种常用方法及注意事项&#xff0c;结合了多种场景下的解决方案&#xff1a; 一、快速更换浏览器IP的方法 1. 代理服务…