ElementUI结合Vue完成主页的CUD(增删改)表单验证

news2024/11/24 0:00:09

目录

一、CUD

( 1 )  CU讲述

( 2 )  编写

1. CU

2. 删除

二、验证

前端整合代码 :


一、CUD

以下的代码基于我博客中的代码进行续写 : 

使用ElementUI结合Vue导航菜单和后台数据分页查询

( 1 )  CU讲述

在CRUD操作中,CU代表创建(Create)和更新(Update)。

1. 创建(Create):创建操作用于在数据库中创建新的数据记录。它通常涉及向数据库中插入新的数据行或文档。例如,在关系型数据库中,可以使用INSERT语句来创建新的数据行。在文档数据库中,可以直接插入新的文档。

2. 更新(Update):更新操作用于修改数据库中已存在的数据记录。它可以用于更改数据行或文档中的一个或多个属性的值。例如,在关系型数据库中,可以使用UPDATE语句来更新数据行的值。在文档数据库中,可以使用更新操作符来修改文档的属性。

这两个操作通常是CRUD操作中最常用的。创建操作用于添加新的数据记录,而更新操作用于修改已存在的数据记录。它们可以在应用程序中用于实现用户注册、添加新的产品、更新用户信息等功能。

( 2 )  编写

1. CU

在项目中的src文件下api中找到action.js进行配置数据访问的地址:

/**
 * 对后台请求的地址的封装,URL格式如下:
 * 模块名_实体名_操作
 */
export default {
  'SERVER': 'http://localhost:8080/ssm', //服务器地址
  'SYSTEM_USER_DOLOGIN': '/user/userLogin', //登陆请求
  'SYSTEM_USER_DOREG': '/user/userRegister', //注册请求
  'SYSTEM_MENU': '/module/queryRootNode', //左侧菜单导航数据请求
  'SYSTEM_BookList': '/book/queryBookPager', //书籍的后端数据请求
  'SYSTEM_BookAdd': '/book/addBook', //书籍增加的数据请求
  'SYSTEM_BookEdit': '/book/editBook', //书籍修改的数据请求
  'SYSTEM_BookDel': '/book/delBook', //书籍删除的数据请求
  'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    return this.SERVER + this[k];
  }
}

在BookList.vue组件中进行编写增加修改的代

在ElementUI里面找到弹出窗进行编写增加修改的弹窗

 <!-- 弹出的编辑及增加弹窗 -->
    <el-dialog :title="title" :visible.sync="dialogFormVisible" :before-close="close">
      <el-form :model="book" :rules="rules" ref="book">
        <el-form-item label="书籍编号 :" :label-width="formLabelWidth">
          <el-input v-model="book.id" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍名称 :" prop="bookname" :label-width="formLabelWidth">
          <el-input v-model="book.bookname" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍价格 :" prop="price" :label-width="formLabelWidth">
          <el-input v-model="book.price" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍类型 :" prop="booktype" :label-width="formLabelWidth">
          <el-select v-model="book.booktype" placeholder="请选择书籍类型">
            <el-option v-for="t in types" :label="t.tname" :value="t.tname" :key="'key'+t.tid"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="close">取 消</el-button>
        <el-button type="primary" @click="submit">确 定</el-button>
      </div>
    </el-dialog>
  </div>

 在script标签中编写方法进行数据增加修改实现,在data中编写属性:

data() {
      return {
        bookname: '',
        tableData: [],
        rows: 10,
        total: 0,
        page: 1,
        formLabelWidth: '120px', //弹出窗输入框前的文字宽度
        title: '书籍新增', //弹出窗标题
        dialogFormVisible: false, //默认关闭
        book: {
          id: '',
          bookname: '',
          price: '',
          booktype: ''
        },
        types: [],
      }
    },

在script标签中编写方法进行数据增加修改实现,在methods中编写方法:

submit() {
        //获取值
        let params = {
          id: this.book.id,
          bookname: this.book.bookname,
          price: this.book.price,
          booktype: this.book.booktype
        }
        console.log(params);
        //获取配置的方法请求地址
        let url = this.axios.urls.SYSTEM_BookAdd;
        //如果是书籍编辑就将请求地址修改为书籍修改的请求地址
        if (this.title == '书籍编辑') {
          url = this.axios.urls.SYSTEM_BookEdit;
        }
            //请求后端地址进行书籍的新增或修改
            this.axios.post(url, params).then(d => {
              // console.log(url);
              // console.log(d);
              this.close();
              this.query({});
            }).catch(e => {});
   


      },
      //弹出窗取消,值初始化
      close() {
        this.book = {
          id: '',
          bookname: '',
          price: '',
          booktype: ''
        };
        this.dialogFormVisible = false;
      },
      //打开弹出窗,进行书籍的编辑
      open(index, row) {
        this.dialogFormVisible = true;
        if (row) {
          this.title = '书籍编辑';
          this.book.id = row.id;
          this.book.bookname = row.bookname
          this.book.price = row.price;
          this.book.booktype = row.booktype;
        }
      },

在created中初始化数据

created() {
      this.query({});
      //初始书籍类型的书籍
      this.types = [{
        tid: 1,
        tname: '玄幻'
      }, {
        tid: 2,
        tname: '爽文'
      }, {
        tid: 3,
        tname: '爱情'
      }, {
        tid: 4,
        tname: '动作'
      }, {
        tid: 5,
        tname: '都市'
      }];
    }

增加表格操作 :

      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button size="mini" @click="open(scope.$index,scope.row)">编辑</el-button>
          <el-button size="mini" type="danger" @click="Del(scope.row)">删除</el-button>
        </template>
      </el-table-column>

增加效果 :

修改效果 : 

2. 删除

在script标签中编写方法进行数据删除实现,在methods中编写方法:

     //书籍删除的方法
      Del(r) {
        this.$confirm('你确定将编号为' + r.id + '的书籍永久删除, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          //获取配置的书籍删除方法请求地址
          let url = this.axios.urls.SYSTEM_BookDel;
          //请求后端地址进行书籍的新增或修改
          this.axios.post(url, {
            id: r.id
          }).then(d => {
            this.$message({
              type: 'success',
              message: '书籍删除成功!'
            });
            this.query({});
          }).catch(e => {});
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
      }

删除效果 : 

二、验证

在表单中增加以下两个属性 :

:rules="rules" ref="book"

 在script标签中编写方法进行数据增加修改实现,在data中编写属性:

data() {
      return {
        bookname: '',
        tableData: [],
        rows: 10,
        total: 0,
        page: 1,
        formLabelWidth: '120px', //弹出窗输入框前的文字宽度
        title: '书籍新增', //弹出窗标题
        dialogFormVisible: false, //默认关闭
        book: {
          id: '',
          bookname: '',
          price: '',
          booktype: ''
        },
        types: [],
        //增加表单验证
        rules: {
          bookname: [{
              required: true,
              message: '请输入书籍的名称',
              trigger: 'blur'
            },
            {
              min: 2,
              max: 10,
              message: '书籍名称长度在 2 到 10 个字符',
              trigger: 'blur'
            }
          ],
          price: [{
            required: true,
            message: '请填写书籍价格',
            trigger: 'blur'
          }],
          booktype: [{
            required: true,
            message: '请选择书籍类型',
            trigger: 'blur'
          }]
        }
      }
    },

在script标签中编写方法,在methods中编写submit()方法:

 submit() {
        //获取值
        let params = {
          id: this.book.id,
          bookname: this.book.bookname,
          price: this.book.price,
          booktype: this.book.booktype
        }
        console.log(params);
        //获取配置的方法请求地址
        let url = this.axios.urls.SYSTEM_BookAdd;
        //如果是书籍编辑就将请求地址修改为书籍修改的请求地址
        if (this.title == '书籍编辑') {
          url = this.axios.urls.SYSTEM_BookEdit;
        }
        //请求前必须通过表单验证
        this.$refs['book'].validate((valid) => {
           console.log(valid);
          if (valid) {
            //请求后端地址进行书籍的新增或修改
            this.axios.post(url, params).then(d => {
              // console.log(url);
              // console.log(d);
              this.close();
              this.query({});
            }).catch(e => {});
          } else {
            this.$message('有必输入项或者没有按要求输入,请正确填写!!');
            return false;
          }
        });


      }

表单验证的效果  :

前端整合代码 :

BookList.vue 所有代码如下  :

<template>
  <div class="Book" style="padding: 30px;">
    <!-- 输入框搜索 -->
    <el-form :inline="true" class="demo-form-inline">
      <el-form-item label="书籍名称 : ">
        <el-input v-model="bookname" placeholder="书籍名称"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" plain @click="onSubmit">查询</el-button>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" plain @click="open">新增</el-button>
      </el-form-item>
    </el-form>
    <!-- 书籍的书籍表格 -->
    <el-table :data="tableData" style="width: 100%">
      <el-table-column prop="id" label="书籍ID"></el-table-column>
      <el-table-column prop="bookname" label="书籍名称"></el-table-column>
      <el-table-column prop="price" label="书籍价格"></el-table-column>
      <el-table-column prop="booktype" label="书籍类型"></el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button size="mini" @click="open(scope.$index,scope.row)">编辑</el-button>
          <el-button size="mini" type="danger" @click="Del(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页 -->
    <div class="block" style="padding: 20px;">
      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"
        background :page-sizes="[10, 20, 30, 40]" :page-size="rows" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <!-- 弹出的编辑及增加弹窗 -->
    <el-dialog :title="title" :visible.sync="dialogFormVisible" :before-close="close">
      <el-form :model="book" :rules="rules" ref="book">
        <el-form-item label="书籍编号 :" :label-width="formLabelWidth">
          <el-input v-model="book.id" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍名称 :" prop="bookname" :label-width="formLabelWidth">
          <el-input v-model="book.bookname" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍价格 :" prop="price" :label-width="formLabelWidth">
          <el-input v-model="book.price" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍类型 :" prop="booktype" :label-width="formLabelWidth">
          <el-select v-model="book.booktype" placeholder="请选择书籍类型">
            <el-option v-for="t in types" :label="t.tname" :value="t.tname" :key="'key'+t.tid"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="close">取 消</el-button>
        <el-button type="primary" @click="submit">确 定</el-button>
      </div>
    </el-dialog>
  </div>

</template>

<script>
  export default {
    data() {
      return {
        bookname: '',
        tableData: [],
        rows: 10,
        total: 0,
        page: 1,
        formLabelWidth: '120px', //弹出窗输入框前的文字宽度
        title: '书籍新增', //弹出窗标题
        dialogFormVisible: false, //默认关闭
        book: {
          id: '',
          bookname: '',
          price: '',
          booktype: ''
        },
        types: [],
        //增加表单验证
        rules: {
          bookname: [{
              required: true,
              message: '请输入书籍的名称',
              trigger: 'blur'
            },
            {
              min: 2,
              max: 10,
              message: '书籍名称长度在 2 到 10 个字符',
              trigger: 'blur'
            }
          ],
          price: [{
            required: true,
            message: '请填写书籍价格',
            trigger: 'blur'
          }],
          booktype: [{
            required: true,
            message: '请选择书籍类型',
            trigger: 'blur'
          }]
        }
      }
    },
    methods: {
      //书籍删除的方法
      Del(r) {
        this.$confirm('你确定将编号为' + r.id + '的书籍永久删除, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          //获取配置的书籍删除方法请求地址
          let url = this.axios.urls.SYSTEM_BookDel;
          //请求后端地址进行书籍的新增或修改
          this.axios.post(url, {
            id: r.id
          }).then(d => {
            this.$message({
              type: 'success',
              message: '书籍删除成功!'
            });
            this.query({});
          }).catch(e => {});
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
      },
      submit() {
        //获取值
        let params = {
          id: this.book.id,
          bookname: this.book.bookname,
          price: this.book.price,
          booktype: this.book.booktype
        }
        console.log(params);
        //获取配置的方法请求地址
        let url = this.axios.urls.SYSTEM_BookAdd;
        //如果是书籍编辑就将请求地址修改为书籍修改的请求地址
        if (this.title == '书籍编辑') {
          url = this.axios.urls.SYSTEM_BookEdit;
        }
        //请求前必须通过表单验证
        this.$refs['book'].validate((valid) => {
           console.log(valid);
          if (valid) {
            //请求后端地址进行书籍的新增或修改
            this.axios.post(url, params).then(d => {
              // console.log(url);
              // console.log(d);
              this.close();
              this.query({});
            }).catch(e => {});
          } else {
            this.$message('有必输入项或者没有按要求输入,请正确填写!!');
            return false;
          }
        });


      },
      //弹出窗取消,值初始化
      close() {
        this.book = {
          id: '',
          bookname: '',
          price: '',
          booktype: ''
        };
        this.dialogFormVisible = false;
      },
      //打开弹出窗,进行书籍的编辑
      open(index, row) {
        this.dialogFormVisible = true;
        if (row) {
          this.title = '书籍编辑';
          this.book.id = row.id;
          this.book.bookname = row.bookname
          this.book.price = row.price;
          this.book.booktype = row.booktype;
        }
      },
      handleSizeChange(r) {
        //当页大小发生变化
        let params = {
          bookname: this.bookname,
          rows: r,
          page: this.page
        }
        // console.log(params)
        this.query(params);
      },
      handleCurrentChange(p) {
        //当前页码大小发生变化
        let params = {
          bookname: this.bookname,
          rows: this.rows,
          page: p
        }
        // console.log(params)
        this.query(params);
      },
      query(params) {
        //获取后台请求书籍数据的地址
        let url = this.axios.urls.SYSTEM_BookList;
        this.axios.get(url, {
          params: params
        }).then(d => {
          // console.log(url)
          this.tableData = d.data.rows;
          this.total = d.data.total;
        }).catch(e => {});
      },
      onSubmit() {
        let params = {
          bookname: this.bookname
        }
        // console.log(params)
        this.query(params);
        this.bookname = ''
      }
    },
    created() {
      this.query({});
      //初始书籍类型的书籍
      this.types = [{
        tid: 1,
        tname: '玄幻'
      }, {
        tid: 2,
        tname: '爽文'
      }, {
        tid: 3,
        tname: '爱情'
      }, {
        tid: 4,
        tname: '动作'
      }, {
        tid: 5,
        tname: '都市'
      }];
    }
  }
</script>

<style>
</style>

 

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

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

相关文章

通过Nginx配置域名映射到本地项目

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Spring的注解开发-Spring配置其它注解

Spring配置其它注解 Primary 拓展&#xff1a;Primary注解用于标注相同类型的Bean优先被使用权&#xff0c;Primary是Spring3.0引入的&#xff0c;与Componen&#xff08;及其衍生的三个注解&#xff09;t和Bean一起使用&#xff0c;标注该Bean的优先级更高&#xff0c;则在通…

【知识回顾】Java常用类库-Java Runtime

文章目录 一、快速入门1.1 Runtime 介绍1.2 常用方法1.2.1 基本方法1.2.2 行为控制类1.2.3 系统信息类1.2.4 exec1.2.5 其他方法1.2.6 注意事项 二、基本使用2.1 获取当前虚拟机信息2.2 操作系统进程2.3 Process对象 三、业务场景实战3.1 执行外部脚本3.2 动态加载类 四、小结 …

《数据结构、算法与应用C++语言描述》-栈的应用-迷宫老鼠问题

迷宫老鼠 问题描述 迷宫&#xff08;如图 8-9 所示&#xff09;是一个矩形区域&#xff0c;有一个入口和一个出口。迷宫内部包含不能穿越的墙壁或障碍物。这些障碍物沿着行和列放置&#xff0c;与迷宫的边界平行。迷宫的入口在左上角&#xff0c;出口在右下角。 假定用 nxm 的…

【Java每日一题】——第十六题:将数组元素逆序并遍历输出。(2023.09.30)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第十五题。 &#x1f3af;问题&#xff1a; 设有数组如下&#xff1a;int[] arr{11,34,47,19,5,87,63,88}; 测试结果如下&#xff1a; &#x1f3af; 答案&#xff1a; int a[]new int [10];Random …

《三国志》游戏的MySQL数据设计与管理

在任何成功的游戏背后,都有一个精心设计和管理的数据系统。这不仅决定了游戏的运行效率,还直接影响到玩家的游戏体验。 本文将深入探讨著名游戏《三国志》中的数据设计和管理。本文将讲解游戏中核心的数据元素、数据管理方法,以及开发团队在数据方面所做的工作。 文章目录 …

【C语言次列车ing】No.1站---C语言入门

文章目录 前言一、什么是C语言二、第一个C语言程序三、数据类型四、变量、常量五、字符串转义字符注释 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到我的乱七八糟小星球&#x1f31d; &#x1f4cb;专栏&#xff1a;C语言次列车i…

考研王道强化阶段(二轮复习)“算法题”备考打卡表 记录

问题&#xff1a;做408真题_2010_42题&#xff0c;即王道书 2.2.3_大题_10 思路&#xff1a; 回头补 代码&#xff1a; int moveL(SqlList &L,SqlList &S,int p) {// 健壮性表达if( L.len 0 ){return 0;}// 调用另外一个顺序表存储pos前面的元素for( int i0;i<p;…

【模型压缩】模型剪枝模块

模型剪枝模块 最基本的基于阈值策略 基于分布来选择阈值 假定权重是符合一个正太分布正态分布有68% 小于标准差 将标准差作为阈值卷积层的敏感度要比全连接层更大&#xff1a;导致有些层over-pruning 有些层 under-pruning 设置预期的稀疏率 权重值按照绝对值进行排序从最小…

字符串函数与内存函数讲解

文章目录 前言一、字符串函数1.求字符串长度strlen 2.长度不受限制的字符串函数(1)strcpy(2)strcat(3)strcmp 3.长度受限制的字符串函数(1)strncpy(2)strncat(3)strncmp 4.字符串查找(1)strstr(2)strtok 5.错误信息报告(1)strerror(2)perror 二、内存函数1.memcpy2.memmove3.me…

山西电力市场日前价格预测【2023-10-02】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-02&#xff09;山西电力市场全天平均日前电价为355.35元/MWh。其中&#xff0c;最高日前电价为521.18元/MWh&#xff0c;预计出现在18: 45。最低日前电价为309.36元/MWh&#xff0c;预计…

【C语言深入理解指针(2)】

1. 数组名的理解 在上⼀个博客我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#x…

Windows驱动反调试的一种手段

Windows驱动反调试的一种手段 今天要介绍的是eprocess的0xbc位置 0x0bc DebugPort : Ptr32 Void DebugPort是在用windowsapi调试方式时候所使用的数据结构指针&#xff0c;那么如果我们能够循环清空这个值的话&#xff0c;就可以做到大部分windows调试api都无法正确调试进程 …

机器学习算法基础--聚类问题的评价指标

1.聚类问题指标评价的意义 聚类算法是非监督学习最常用的一种方法&#xff0c;性能度量是衡量学习模型优劣的指标&#xff0c;也可作为优化学习模型的目标函数。聚类性能度量根据训练数据是否包含标记数据分为两类&#xff0c;一类是将聚类结果与标记数据进行比较&#xff0c;称…

【Axure】常见元件、常用交互效果

产品结构图 以微信为例&#xff0c;根据页面层级制作 动态面板 动态面板的作用&#xff1a;动态面板是一个可视区域&#xff0c;如果要把控件放进去&#xff0c;要全部放进去&#xff0c;放多少显示多少 文本框 隐藏边框方法&#xff1a;先拉一个矩形&#xff0c;去掉部分…

uniapp项目实践总结(二十五)苹果 ios 平台 APP 打包教程

导语:当你的应用程序开发完成后,在上架 ios 应用商店之前,需要进行打包操作,下面就简单介绍一下打包方法。 目录 准备工作注册账号生成证书打包配置准备工作 在打包之前,请保证你的 uniapp 应用程序编译到 ios 模拟器或者是真机调试基座环境下是可以正常运行的,苹果打包…

记录一次阿里云服务器ECS上启动的portainer无法访问的问题

如下图&#xff0c;在阿里云ECS服务器上安装并启动了portainer&#xff0c;但是在自己电脑上访问不了远程的portainer。 最后发现是要在网络安全组里开放9000端口号&#xff0c;具体操作如下&#xff1a; 在云服务器管理控制台点击左侧菜单中的网络与安全-安全组&#xff0c;然…

国庆day2---select实现服务器并发

select.c&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\ }while(0)#define IP "192.168.1.3" #define PORT 8888int main(int argc, const char *argv[]) {//创建报式套接字socketi…

Java笔记五(数组)

目录 数组 数组声明创建 数组初始化的三种初始化类型&#xff1a; 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 数组的使用 示例一&#xff1a;计算所有的元素和以及查找最大元素 示例二&#xff1a;For-Each循环 示例三&#xff1a;数组作…

[NOIP2011 提高组] 选择客栈

[NOIP2011 提高组] 选择客栈 题目描述 丽江河边有 n n n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从 1 1 1 到 n n n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共 k k k 种&#xff0c;用整数 0 ∼ k − 1 0 \sim k-1 0∼k−1 表示&#xff09;&am…