Vue表单数据修改与删除

news2025/1/2 2:57:58

学习来源:视频p6
书接上文

目录

  • 页面修改
    • 修改对话框
    • 视频教程的做法
  • 后端提供接口
  • 前端调用接口
    • 修改完成后提交
  • 删除功能
    • 后端开设接口
    • 前端调用
  • 最终成果展示

页面修改

将之前的 BookManage 页面的按钮改为想要的功能
在这里插入图片描述
可以注意到修改按钮的标签以及绑定了事件 handleClick
在这里插入图片描述
点击之后其可以在控制台打印出当前行对象的内容
在这里插入图片描述
观看视频时,关于修改数据,弹幕分为了两派
一派认为因该直接从页面中获取现有的数据信息加以修改,再提交给后端并存储到数据库,此流程业务简单,减轻服务器负荷。
还有一派认为因该依据关键信息或唯一标识,从后台请求这一系列数据,在此基础上进行修改,再提交给后端并存储到数据库,此流程数据安全。

我认为确实应该从后端拿数据,毕竟前端显示的数据不一定是完整信息,最全最新的内容肯定是在数据库当中,所有从后端拿数据重新修订再保存到数据库更加安全严谨。

相较于视频中新增一个页面的方式,我选择以弹出框来展示修改页面,这样我认为更切合实际场景
在这里插入图片描述

修改对话框

其核心内容就是 dialogFormVisible 这个属性在点击关键字时改为 true(默认是false)
在这里插入图片描述
所以运用到原来的页面上,当点击“修改”时,把这个属性置为 true 即可
在这里插入图片描述

弹出的表单用原来的新增页面进行代码结合复用
将一下代码拆分放入对应位置即可

<template>
    <div>

        <el-button type="text" @click="dialogFormVisible = true">修改 Dialog</el-button>

        <el-dialog title="修改" :visible.sync="dialogFormVisible">
            <el-form style="width: 80%" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">

                <el-form-item label="书名" prop="name">
                    <el-input v-model="ruleForm.name"></el-input>
                </el-form-item>
                <el-form-item label="作者" prop="author">
                    <el-input v-model="ruleForm.author"></el-input>
                </el-form-item>

                <el-form-item>
                    <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
                    <el-button @click="resetForm('ruleForm')">重置</el-button>
                </el-form-item>
            </el-form>

            <div slot="footer" class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
            </div>
        </el-dialog>
    </div>
</template>


<script>
    export default {
        data() {
            return {
                dialogFormVisible: false,
                formLabelWidth: '120px',
                ruleForm: {
                    name: '',
                    author: ''
                },
                rules: {
                    name: [
                        { required: true, message: '书名不能为空', trigger: 'blur' }
                    ],
                    author: [
                        { required: true, message: '作者不能为空', trigger: 'blur' }
                    ],
                }
            };
        },
        methods: {
            submitForm(formName) {
                const _this = this;
                this.$refs[formName].validate((valid) => {
                    if (valid) {
                        axios.post("http://localhost:8181/book/save",this.ruleForm).then(function (resp) {
                            if (resp.data == "success"){
                                _this.$alert("《"+_this.ruleForm.name+"》添加成功", '成功', {
                                    confirmButtonText: '确定',
                                    callback: action => {
                                        _this.$router.push("/BookMange");
                                    }
                                });
                            }else{
                                _this.$message.error("添加失败");
                            }
                        })
                    } else {
                        console.log('添加失败');
                        return false;
                    }
                });
            },
            resetForm(formName) {
                this.$refs[formName].resetFields();
            },
        }
    }
</script>

最终效果如下

请添加图片描述

视频教程的做法

创建额外的页面,当点击修改按钮时,进行页面跳转,并用 query 传递操作的 id 信息

handleClick(row) {
    this.$router.push({
        path: '/update',
        query:{
            id: row.id
        }
    })
},

在这里插入图片描述
在新的页面初始化地方进行接收参数,请求后端数据
在这里插入图片描述
需要跳转用 $router ,需要接收参数用 $route 拓展阅读route 和 router的区别

后端提供接口

之前 bookRepository 继承的 JPA 接口中,也已经写好了 findById() 函数,对我们来说相当方便,只是这个接口返回的对象是 Optional 的对象,其可以把空的对象也能正常包装并返回,避免出现空指针异常导致程序崩溃,Optional讲解
在这里插入图片描述
再调用 get() 方法以获取到对象,结果也是能正确输出的
则下一步写入handler接口供外部调用

@GetMapping("/findById/{id}")
public Book findById(@PathVariable("id") Integer id){
    return bookRepository.findById(id).get();
}

在这里插入图片描述
经测试也是可以使用的,故在前端调用

前端调用接口

当点击 修改 操作时,对调用函数 handleClick 进行修改

handleClick(row) {
    const _this = this;
    this.dialogFormVisible = true;
    axios.get("http://localhost:8181/book/findById/"+row.id).then(function (resp) {
        _this.ruleForm = resp.data;
    })
},

即可实现点击后出现弹窗+载入修改的目录信息
请添加图片描述

修改完成后提交

将之前的立即创建改成符合业务逻辑的“修改完成”
在这里插入图片描述
然后对函数 submitForm 改装一下即可
其实目前实际使用看来,不改装也能满足业务逻辑需求,JPA 的save函数自动帮我们把对象存进去了
JPA是判定了当前参数是否携带主键,如果没有就存入,如果有就修改内容

但为了业务严谨,并且以后可能遇到更复杂的业务逻辑,针对修改功能还是有必要专门开辟接口的
且根据 REST 规范,更新应该使用 PUT 请求
所以直接在 handler 里面新增接口

@PutMapping("/update")
public String update(@RequestBody Book book){
    Book result = bookRepository.save(book);
    if (result != null){
        return "success";
    }
    else {
        return "fail";
    }
}

将此处的 post 改为 put ,接口网址改成 update
在这里插入图片描述

即可实现修改功能

删除功能

后端开设接口

@DeleteMapping("/deleteById/{id}")
public void delete(@PathVariable("id") Integer id){
    bookRepository.deleteById(id);
}

前端调用

在这里插入图片描述
按钮组件绑定函数

deleteBook(row){
    const _this = this;
    axios.delete("http://localhost:8181/book/deleteById/"+row.id).then(function (resp) {
        if (resp.status == 200){
            _this.$alert("《"+row.name+"》删除成功", '成功', {
                confirmButtonText: '确定并刷新',
                callback: action => {
                    _this.$router.go(0);
                }
            });
        }else{
            _this.$message.error("删除失败");
        }
    })
},

最终成果展示

主页面js代码

<script>
    export default {
        methods: {
            handleClick(row) {
                const _this = this;
                this.dialogFormVisible = true;
                axios.get("http://localhost:8181/book/findById/"+row.id).then(function (resp) {
                    _this.ruleForm = resp.data;
                })
            },
            deleteBook(row){
                const _this = this;
                axios.delete("http://localhost:8181/book/deleteById/"+row.id).then(function (resp) {
                    if (resp.status == 200){
                        _this.$alert("《"+row.name+"》删除成功", '成功', {
                            confirmButtonText: '确定并刷新',
                            callback: action => {
                                _this.$router.go(0);
                            }
                        });
                    }else{
                        _this.$message.error("删除失败");
                    }
                })
            },
            page(currentPage){
                const _this = this;
                axios.get("http://localhost:8181/book/findPart/"+currentPage+"/3").then(function (resp) {
                    _this.tableData = resp.data.content;
                    _this.total = resp.data.totalElements;
                })
            },
            submitForm(formName) {
                const _this = this;
                this.$refs[formName].validate((valid) => {
                    if (valid) {
                        axios.put("http://localhost:8181/book/update",this.ruleForm).then(function (resp) {
                            if (resp.data == "success"){
                                _this.$alert("《"+_this.ruleForm.name+"》修改成功", '成功', {
                                    confirmButtonText: '确定',
                                    callback: action => {
                                        _this.$router.go(0);
                                    }
                                });
                            }else{
                                _this.$message.error("修改失败");
                            }
                        })
                    } else {
                        console.log('添加失败');
                        return false;
                    }
                });
            },
            resetForm(formName) {
                this.$refs[formName].resetFields();
            },
        },
        created(){
            const _this = this;
            axios.get("http://localhost:8181/book/findPart/1/3").then(function (resp) {
                _this.tableData = resp.data.content;
                _this.total = resp.data.totalElements;
            })
        },
        data() {
            return {
                total: null,
                tableData: null,
                dialogFormVisible: false,
                dialogFormVisible: false,
                formLabelWidth: '120px',
                ruleForm: {
                    name: '',
                    author: ''
                },
                rules: {
                    name: [
                        { required: true, message: '书名不能为空', trigger: 'blur' }
                    ],
                    author: [
                        { required: true, message: '作者不能为空', trigger: 'blur' }
                    ],
                }
            }
        }
    }
</script>

请添加图片描述

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

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

相关文章

RK3568核心板以太网大数据测试报告-万象奥科

1. 测试对象HD-RK3568-IOT 底板基于HD-RK3568-CORE工业级核心板设计&#xff08;双网口、双CAN、5路串口&#xff09;&#xff0c;接口丰富&#xff0c;适用于工业现场应用需求&#xff0c;亦方便用户评估核心板及CPU的性能。适用于工业自动化控制、人机界面、中小型医疗分析器…

docker环境下docker-compose一键式搭建fastdfs文件存储服务系统

前言 本节内容我们使用docker-compose一键式搭建一套fastdfs服务&#xff0c;实现docker环境下的文件存储服务&#xff0c;在开始本节内容之前&#xff0c;我们需要提前安装好docker和docker-compose环境。fastdfs是一套分布式的文件存储服务系统&#xff0c;主要有tracker和s…

pipenv的基本使用

一. pipenv 基础 pipenv安装&#xff1a; pip install pipenvpipenv常用命令 pipenv --python 3 # 创建python3虚拟环境 pipenv --venv # 查看创建的虚拟环境 pipenv install 包名 # 安装包 pipenv shell # 切换到虚拟环境中 pip list # 查看当前已经安装的包&#xff0…

地方征信平台第2讲:河北省征信

河北省征信有限公司&#xff0c;注册成立于2022年12月25日&#xff0c;注册资本6330万元人民币。股东及持股比例如下&#xff1a;河北省惠信大数据科技服务有限公司、35.1975%。唐山国控集团有限公司、14.22%。石家庄城控投资集团有限责任公司、 10.8215%。石家庄市国有资本经营…

【017】筛选数据并整理(筛选、返回行号、清除全部数据)_#VBA

自动化办公1. 筛选1.1 在某一基础上筛选1.2 多条件筛选2. 返回行号3. 删除某列重复数据4. 删除当页全部数据5. 求和6. 复制黏贴6.1 第一种6.2 第二种6.2 第三种7. 全部数据1. 筛选 主要使用的命名方式如下 ActiveSheet.Range("$A$1:$L$41500").AutoFilter Field:1,…

打电话哪款蓝牙耳机好?打电话好的蓝牙耳机推荐

耳机除了听歌之外&#xff0c;还经常会用到接听电话。很多真正的无线耳机&#xff0c;在宣传页面上&#xff0c;都会着重介绍自己的耳机在降噪、音质方面的性能&#xff0c;以及他们自己的耳机的性能&#xff0c;下面分享几款打电话好的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝…

人机交互设计概述

人机交互的软件工程实践 1.人机交互设计概述 交互设计视图提高产品或系统的可用性和用户体验。他首先研究、了解某类用户的需求&#xff0c;然后再通过设计来满足用户的需求。随着产品和操作变得越来越复杂&#xff0c;越需要用户掌握新技能&#xff0c;因此设计师对如何能帮…

密码学基础(一)常见密码算法分类

一、密码算法分类&#xff1a; 密码算法主要分为三类&#xff1a;对称密码算法、 非对称密码算法、摘要算法。 二、对称密码算法&#xff08;Symmetric-key Algorithm&#xff09; 1、概念 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算…

8Manage PMO:如何借助系统软件解决多项目管理难点

随着企业不断发展壮大&#xff0c;大多数企业不管性质、规模和行业如何&#xff0c;都会同时进行多个项目&#xff0c;这已然成为一个普遍现象。虽然多项目管理可以提高资源利用率&#xff0c;加速项目交付&#xff0c;但同时也会带来一系列的难点。 如何在多个项目之间有效地…

Python基于词频排序快速挖掘需求大类

Python基于词频排序快速挖掘需求大类 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、所有的代码 这是所有的代码 from collections import defaultdict import jieba.posseg a…

华为机试题:HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

数字信息-数字编码挂钩法

一、前方无路&#xff0c;一切才刚开始0呼啦圈 1蜡烛2鹅 3金元宝4青龙5钩子6哨子 7七仙女8八卦镜9药酒二、少年中国说看到“1”想到“树”&#xff0c;想到“树”&#xff0c;想到“智慧树”&#xff0c;再想到“少年智则国智”看到“2”想到“鸭子”&#xff0c;想到“鸭子”&…

基于 centos7 搭建 laravel+scout+elasticsearch+ik-analyzer 用于中文分词全文检索服务及测试

目录基于 centos7 搭建 laravelscoutelasticsearchik-analyzer 用于中文分词全文检索服务及测试相关软件及版本安装或升级jdk&#xff08;版本&#xff1a;19.0.2&#xff09;安装es&#xff08;版本&#xff1a;8.1.1&#xff09;安装ik-analyzer&#xff08;版本&#xff1a;…

transformer目标检测开山之作detr

1. 将一个batch的图片输入backone获得feature。 &#xff08;2&#xff0c;c&#xff0c;w&#xff0c;h&#xff09;先输入resnet50中&#xff0c;得到&#xff08;2&#xff0c;2048&#xff0c;w&#xff0c;h&#xff09;。虽然这里channel不是256&#xff0c;但是在输入e…

pg mysql oracle 中的schema

1、schema。 pg中的schema表示当前db中数据库对象的命名空间(namespace)&#xff0c;数据库对象包括但不限于表、函数、视图、索引等。 对于熟悉mysql的人来说&#xff0c;在第一次看到pg中的schema的概念时&#xff0c;可能会疑惑&#xff0c;schema不是表示database的吗&…

如何使用码匠连接 Elasticsearch

目录 在码匠中集成 Elasticsearch 在码匠中使用 Elasticsearch 关于码匠 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;常用于处理大规模数据集的搜索、实时数据分析和数据挖掘任务。它支持多种数据源&#xff0c;包括关系型数据库&#xff08;如 MySQL、Pos…

不想重写Dockerfile如何更改docker容器的挂载目录

一、问题 从网络上下载的很多Dockerfile或docker-compose文件进行启动容器的时候&#xff0c;部分重要的目录是依赖volumes挂载到容器内部的&#xff0c;如图 这就会出现一个问题&#xff0c;当我们想将容器打包&#xff0c;便于以后使用的时候&#xff0c;这部分挂载的文件是…

ArcGIS中地形渲染图制作技巧

01 概述 DEM数据作为GIS数据中常见的一种数据&#xff0c;经常都会使用到&#xff0c;除了用来生成等高线、高程点和做各种分析之外&#xff0c;生成地形渲染图也是常见的用途之一&#xff0c;这里给大家介绍一下ArcGIS中地形渲染图制作技巧&#xff0c;希望能够对大家有所帮…

领英开发外贸客户新方式—领英精灵

一、领英精灵是什么&#xff1f; 领英精灵是在LinkedIn领英这个全球最大的职业社交平台基础上研发出的一款工具软件&#xff0c;领英精灵最初研发定位是帮助那些想要在LinkedIn领英上挖掘开发客户需求的人群使用&#xff0c;但他的功能又不仅仅局限于外贸行业。干一行说一行&a…

Java知识复习(十一)RabbitMQ

1、RabbitMQ简介 RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;的消息中间件 2、RabbitMQ核心概念 RabbitMQ 整体上是一个生产者与消费者模型&#xff0c;主要负责接收、存储和转发消息 3、Producer和…