• ELementUI之CURD及表单验证


    一.CURD

    1.后端CURD实现

    1. @RequestMapping("/addBook")
    2. @ResponseBody
    3. public JsonResponseBody addBook(Book book){
    4. try {
    5. bookService.insert(book);
    6. return new JsonResponseBody<>("新增书本成功",true,0,null);
    7. } catch (Exception e) {
    8. e.printStackTrace();
    9. return new JsonResponseBody<>("新增书本失败",false,0,null);
    10. }
    11. }
    12. @RequestMapping("/editBook")
    13. @ResponseBody
    14. public JsonResponseBody editBook(Book book){
    15. try {
    16. bookService.updateByPrimaryKey(book);
    17. return new JsonResponseBody<>("编辑书本成功",true,0,null);
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. return new JsonResponseBody<>("编辑书本失败",false,0,null);
    21. }
    22. }
    23. @RequestMapping("/delBook")
    24. @ResponseBody
    25. public JsonResponseBody delBook(Book book){
    26. try {
    27. bookService.deleteByPrimaryKey(book.getId());
    28. return new JsonResponseBody<>("删除书本成功",true,0,null);
    29. } catch (Exception e) {
    30. e.printStackTrace();
    31. return new JsonResponseBody<>("删除书本失败",false,0,null);
    32. }
    33. }
    34. @RequestMapping("/queryBookPager")
    35. @ResponseBody
    36. public JsonResponseBody> queryBookPager(Book book, HttpServletRequest req){
    37. try {
    38. PageBean pageBean=new PageBean();
    39. pageBean.setRequest(req);
    40. List books = bookService.queryBookPager(book, pageBean);
    41. return new JsonResponseBody<>("OK",true,pageBean.getTotal(),books);
    42. } catch (Exception e) {
    43. e.printStackTrace();
    44. return new JsonResponseBody<>("分页查询书本失败",false,0,null);
    45. }
    46. }

    2.前端实现

    2.1前端HTML

    1. <template>
    2. <div class="Book" style="padding: 30px;">
    3. <el-form :inline="true" class="demo-form-inline">
    4. <el-form-item label="书籍名称 : ">
    5. <el-input v-model="bookname" placeholder="书籍名称">el-input>
    6. el-form-item>
    7. <el-form-item>
    8. <el-button type="primary" plain @click="onSubmit">查询el-button>
    9. <el-button type="primary" plain @click="open">新增el-button>
    10. el-form-item>
    11. el-form>
    12. <el-table :data="tableData" style="width: 100%">
    13. <el-table-column prop="id" label="书籍ID">el-table-column>
    14. <el-table-column prop="bookname" label="书籍名称">el-table-column>
    15. <el-table-column prop="price" label="书籍价格">el-table-column>
    16. <el-table-column prop="booktype" label="书籍类型">el-table-column>
    17. <el-table-column label="操作">
    18. <template slot-scope="scope">
    19. <el-button
    20. size="mini"
    21. @click="open(scope.$index, scope.row)">编辑el-button>
    22. <el-button
    23. size="mini"
    24. type="danger"
    25. @click="del(scope.$index, scope.row)">删除el-button>
    26. template>
    27. el-table-column>
    28. el-table>
    29. <div class="block" style="padding: 20px;">
    30. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"
    31. background :page-sizes="[10, 20, 30, 40]" :page-size="rows" layout="total, sizes, prev, pager, next, jumper"
    32. :total="total">
    33. el-pagination>
    34. div>
    35. <el-dialog :title="title" :visible.sync="dialogFormVisible" @close="clear()">
    36. <el-form :model="book">
    37. <el-form-item label="书籍编号" :label-width="formLabelWidth">
    38. <el-input v-model="book.id" autocomplete="off">el-input>
    39. el-form-item>
    40. <el-form-item label="书籍名称" :label-width="formLabelWidth">
    41. <el-input v-model="book.bookname" autocomplete="off">el-input>
    42. el-form-item>
    43. <el-form-item label="书籍价格" :label-width="formLabelWidth">
    44. <el-input v-model="book.price" autocomplete="off">el-input>
    45. el-form-item>
    46. <el-form-item label="书籍类别" :label-width="formLabelWidth">
    47. <el-select v-model="book.booktype" placeholder="请选择活动区域">
    48. <el-option v-for="t in types" :label="t.name" :value="t.name" :key="'key_'+t.id">el-option>
    49. el-select>
    50. el-form-item>
    51. el-form>
    52. <div slot="footer" class="dialog-footer">
    53. <el-button @click="dialogFormVisible = false">取 消el-button>
    54. <el-button type="primary" @click="dosub">确 定el-button>
    55. div>
    56. el-dialog>
    57. div>
    58. template>

    我们通过在ELementUI官网中获取表格样式,弹出框样式及各种界面布局

    2.2 路径配置

    1. 'BOOK_ADD':'book/addBook',
    2. 'BOOK_UPD':'book/editBook',
    3. 'BOOK_DEL':'book/delBook',
    4. 'SYSTEM_BookList': 'book/queryBookPager', //书籍的后端数据请求

    2.3 JS业务方法实现

    1. export default {
    2. data() {
    3. return {
    4. bookname: '',
    5. tableData: [],
    6. rows: 10,
    7. total: 0,
    8. page: 1,
    9. title:'新增窗体',
    10. dialogFormVisible:false,
    11. formLabelWidth:'100px',
    12. types:[],
    13. book:{
    14. id:'',
    15. bookname:'',
    16. price:'',
    17. booktype:'',
    18. }
    19. }
    20. },
    21. methods: {
    22. del(idx,row){
    23. this.$confirm('是否进行删除id为'+row.id+'的数据', '提示', {
    24. confirmButtonText: '确定',
    25. cancelButtonText: '取消',
    26. type: 'warning'
    27. }).then(() => {
    28. let url = this.axios.urls.BOOK_DEL
    29. this.axios.post(url, {id:row.id}).then(d => {
    30. console.log(url);
    31. this.$message({
    32. type: 'success',
    33. message: '删除成功!'
    34. });
    35. this.query({});
    36. }).catch(e => {});
    37. }).catch(() => {
    38. this.$message({
    39. type: 'info',
    40. message: '已取消删除'
    41. });
    42. });
    43. },
    44. dosub(){
    45. //获取后台请求书籍数据的地址
    46. let url = this.axios.urls.BOOK_ADD;
    47. console.log(this.title)
    48. if(this.title=='编辑窗体'){
    49. url = this.axios.urls.BOOK_UPD
    50. }
    51. let params = {
    52. id:this.book.id,
    53. bookname:this.book.bookname,
    54. price:this.book.price,
    55. booktype:this.book.booktype,
    56. };
    57. this.axios.post(url, params).then(d => {
    58. console.log(url);
    59. this.clear();
    60. this.query({});
    61. }).catch(e => {});
    62. },
    63. clear(){
    64. this.dialogFormVisible= false;
    65. this.title = '新增窗体';
    66. this.book={
    67. id:'',
    68. bookname:'',
    69. price:'',
    70. booktype:'',
    71. }
    72. },
    73. open(idx,row){
    74. this.dialogFormVisible= true;
    75. if(row){
    76. this.title = '编辑窗体';
    77. this.book.id = row.id;
    78. this.book.bookname = row.bookname;
    79. this.book.price = row.price;
    80. this.book.booktype = row.booktype;
    81. }
    82. },
    83. handleSizeChange(r) {
    84. //当页大小发生变化
    85. let params = {
    86. bookname: this.bookname,
    87. rows: r,
    88. page: this.page
    89. }
    90. // console.log(params)
    91. this.query(params);
    92. },
    93. handleCurrentChange(p) {
    94. //当前页码大小发生变化
    95. let params = {
    96. bookname: this.bookname,
    97. rows: this.rows,
    98. page: p
    99. }
    100. // console.log(params)
    101. this.query(params);
    102. },
    103. query(params) {
    104. //获取后台请求书籍数据的地址
    105. let url = this.axios.urls.SYSTEM_BookList;
    106. this.axios.get(url, {
    107. params: params
    108. }).then(d => {
    109. console.log(url)
    110. this.tableData = d.data.rows;
    111. this.total = d.data.total;
    112. }).catch(e => {});
    113. },
    114. onSubmit() {
    115. let params = {
    116. bookname: this.bookname
    117. }
    118. console.log(params)
    119. this.query(params);
    120. this.bookname = ''
    121. }
    122. },
    123. created() {
    124. this.query({});
    125. this.types = [{
    126. 'id':1,
    127. 'name':'爽文'
    128. },
    129. {
    130. 'id':2,
    131. 'name':'动作'
    132. },
    133. {
    134. 'id':3,
    135. 'name':'爱情'
    136. },
    137. ]
    138. }
    139. }

    方法详解:

    (1).我们Vue.js中的钩子函数中定义初始化值和状态

    1. bookname: '':这是一个字符串属性,表示书籍的名称,初始值为空字符串。

    2. tableData: []:这是一个数组属性,用于存储表格数据,初始值为空数组。

    3. rows: 10:这是一个数字属性,表示每页显示的行数,默认为 10。

    4. total: 0:这是一个数字属性,表示数据总数,初始值为 0。

    5. page: 1:这是一个数字属性,表示当前页数,初始值为 1。

    6. title: '新增窗体':这是一个字符串属性,表示窗体的标题,初始值为 '新增窗体'。

    7. dialogFormVisible: false:这是一个布尔属性,表示一个对话框是否可见,初始值为 false,意味着对话框默认是隐藏的。

    8. formLabelWidth: '100px':这是一个字符串属性,表示表单标签的宽度,初始值为 '100px'。

    9. types: []:这是一个数组属性,用于存储书籍的类型数据,初始值为空数组。

    10. book 对象:这是一个包含多个属性的对象,表示一个书籍的信息,包括 idbooknamepricebooktype。这些属性初始值都为空字符串或空值。

    (2)del(idx,row)   :

    这个方法接受两个参数 idx 和 row,其中 idx 可能是一个索引或标识,而 row 是包含书籍信息的对象。

    首先,它弹出一个确认对话框,询问用户是否要删除一个具体 ID(row.id)的数据。

    如果用户点击了 "确定",则会发起一个 HTTP POST 请求,将 row.id 发送到指定的删除书籍的接口。

    如果请求成功,会在控制台上打印请求的 URL,然后显示一个成功的消息,并调用 query({}) 方法来刷新数据。

    如果请求失败,将会捕获错误,但似乎没有特定的处理代码。

    (2)dosub()方法:

    这个方法执行与书籍数据相关的提交操作。

    首先,它根据 title 属性的值来确定是要执行添加书籍还是更新书籍的操作,然后设置 url 变量为相应的请求地址。

    接着,它构造一个包含书籍信息的 params 对象。

    然后,它发起一个 HTTP POST 请求,将 params 发送到指定的地址(可能是添加或更新书籍的接口)。

    如果请求成功,会在控制台上打印请求的 URL,然后调用 clear() 方法清空表单数据,并调用 query({}) 方法刷新数据。

    如果请求失败,将会捕获错误,但似乎没有特定的处理代码。

    (3)clear()方法:

    这个方法用于清除表单数据和重置一些状态。

    它将 dialogFormVisible 属性设置为 false,隐藏对话框。

    将 title 属性设置为 '新增窗体',表示这个对话框是用于新增数据的。

    清空 book 对象中的属性,使其恢复到初始状态。

    (4)open()方法:

    这个方法用于打开对话框,以便编辑或添加书籍信息。

    它将 dialogFormVisible 属性设置为 true,以显示对话框。

    如果传递了 row 参数,表示要编辑数据,因此将 title 属性设置为 '编辑窗体'。

    然后,将 book 对象的属性设置为 row 对象中的属性,以便在对话框中显示原有数据,以便编辑。

    这些方法一起构成了一个用于管理书籍信息的 Vue.js 组件的一部分,包括删除、提交、清除和编辑功能。它们依赖于一些状态和属性,如 titlebookdialogFormVisible,以实现不同的交互行为。\

    (5)create()方法是生命周期钩子是 Vue.js 组件中的一个生命周期函数

    1. this.query({});:在组件被创建后立即调用 query 方法,传递一个空对象 {} 作为参数。这可能是用来初始化组件中的数据,例如加载初始的书籍数据。

    2. this.types:这是一个数组属性,包含了书籍类型的数据。在这个代码段中,它被初始化为一个包含三个对象的数组。每个对象都有两个属性:id 表示类型的唯一标识符,name 表示类型的名称。这个数组似乎是用于提供书籍类型的选项,以供用户在界面上选择。

    所以,在组件被创建后,它会立即执行一个查询操作,可能是获取初始的书籍数据,同时初始化了书籍类型的选项。这样,在组件渲染完成后,它就有了初始的数据和选项,可以供用户交互和显示在界面上。

    注: 

    1:隐藏显示设置,通过Vue实例对象中的dialogFormVisible="true|false"来控制dialog显示隐藏
           :visible.sync="dialogFormVisible"
    2:通过close或closed事件,在关闭dialog弹出框时清空form表单数据和验证信息;
           @close="dialogClose" 

    效果演示:

     二.表单验证

    1.什么是表单验证

    表单验证是一种用于检查用户输入数据的过程,以确保输入的数据符合预期的格式、要求和规则。表单验证通常用于 web 应用程序中的用户界面,以确保用户提交的数据有效、合法且安全

    2.定义规则

    2.1绑定表单规则属性

    <el-form :model="book" :rules="rules" ref="book">

    2.2在指定的字段中定义prop属性

    1. <el-table-column prop="id" label="书籍ID">el-table-column>
    2. <el-table-column prop="bookname" label="书籍名称">el-table-column>
    3. <el-table-column prop="price" label="书籍价格">el-table-column>
    4. <el-table-column prop="booktype" label="书籍类型">el-table-column>

    2.3在data中定义规则

    1. rules:{
    2. bookname: [
    3. { required: true, message: '请输入书籍名称', trigger: 'blur' },
    4. { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
    5. ],
    6. price:[
    7. { required: true, message: '请输入书籍价格', trigger: 'blur' },
    8. ],
    9. booktype:[
    10. { required: true, message: '请填写书籍类别', trigger: 'blur' },
    11. ]
    12. }

    3.提交验证规则

    在我们进行提交验证时进行表单验证

    1. dosub(){
    2. this.$refs['book'].validate((valid) => {
    3. if (valid) {
    4. //获取后台请求书籍数据的地址
    5. let url = this.axios.urls.BOOK_ADD;
    6. console.log(this.title)
    7. if(this.title=='编辑窗体'){
    8. url = this.axios.urls.BOOK_UPD
    9. }
    10. let params = {
    11. id:this.book.id,
    12. bookname:this.book.bookname,
    13. price:this.book.price,
    14. booktype:this.book.booktype,
    15. };
    16. this.axios.post(url, params).then(d => {
    17. console.log(url);
    18. this.clear();
    19. this.query({});
    20. }).catch(e => {});
    21. } else {
    22. console.log('error submit!!');
    23. return false;
    24. }
    25. });
    26. },

    4.效果演示

    当我们进行验证提交时必须通过验证我们写的规则才能进行提交

    今天的分享到这里就结束了,感谢各位大大的观看,各位大大的三连是博主更新的动力,感谢谢谢谢谢谢谢谢谢各位的支持!!!!! 

  • 相关阅读:
    教育小程序的性能优化:从前端到后端的综合提升策略
    php伪协议 [ACTF2020 新生赛]Include1
    怎么防止重要文件夹丢失?文件夹安全如何保护?
    内网渗透之Socks代理简介
    Pulsar 也会重复消费?
    Flutter正在被悄悄放弃?浅析Flutter的未来
    ESP-Hosted:降低物联网设备的部署成本与复杂性
    ARM 的 的 AMBA 总线
    SQL Server 解析JSON复杂的多层级示例
    浅谈单例模式
  • 原文地址:https://blog.csdn.net/weixin_73320743/article/details/133707641