从0到1完成一个Vue后台管理项目(十四、对话框封装、接口联通、api优化 很重点(封装思想))

news2024/11/25 20:53:14

往期

从0到1完成一个Vue后台管理项目(一、创建项目)

从0到1完成一个Vue后台管理项目(二、使用element-ui)

从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库)

从0到1完成一个Vue后台管理项目(四、引入axios、配置路由)

从0到1完成一个Vue后台管理项目(五、登录页(表单校验的使用和封装))

从0到1完成一个Vue后台管理项目(五、登录页,mock,token,axios封装)

从0到1完成一个Vue后台管理项目(六、404页)

从0到1完成一个Vue后台管理项目(七、Header、Footer、页面布局)

从0到1完成一个Vue后台管理项目(八、Menu改造完善、子组件创建、配置路由)

从0到1完成一个Vue后台管理项目(九、引入Breadcrumb面包屑,更改bug)

从0到1完成一个Vue后台管理项目(十、列表API封装、Table列表渲染、表格数据转换)

从0到1完成一个Vue后台管理项目(十一、前端分页实现)

从0到1完成一个Vue后台管理项目(十二、学生table列表删除、查询、重置)

从0到1完成一个Vue后台管理项目(十三、信息列表页面实现:对话框新增、DateTimePicker 日期时间选择器)

加上校验规则在这里插入图片描述

新增接口

在这里插入图片描述

在这里插入图片描述

封装新增api

这里我们安装一下qs模块

这里是因为后端的数据问题需要处理,如果不需要处理的话是不需要下的

cnpm i qs -D

在这里插入图片描述

引入qs

在这里插入图片描述

封装接口

在这里插入图片描述
使用
在这里插入图片描述

封装查询api

在这里插入图片描述
使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改

在这里插入图片描述

我们怎么确定是新增还是修改
给一个状态:state

在这里插入图片描述
然后我们判断一下

在这里插入图片描述
在这里插入图片描述

修改接口

在这里插入图片描述
使用
在这里插入图片描述

bug修复

在这里插入图片描述

此页代码

<template>
  <div class="infoList">
    <el-form :inline="true" class="demo-form-inline" size="small">
      <el-form-item>
        <el-button type="primary" @click="addStudent">新增</el-button>
      </el-form-item>
    </el-form>
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column prop="name" label="姓名" align="center">
      </el-table-column>
      <el-table-column prop="sex" label="性别" align="center">
      </el-table-column>
      <el-table-column prop="age" label="年龄" align="center">
      </el-table-column>
      <el-table-column prop="father" label="父亲" align="center">
      </el-table-column>
      <el-table-column prop="mather" label="母亲" align="center">
      </el-table-column>
      <el-table-column prop="address" label="家庭住址" align="center">
      </el-table-column>
      <el-table-column prop="time" label="入校时间" align="center">
      </el-table-column>
      <el-table-column prop="phone" label="联系方式" align="center">
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button type="danger" size="mini" icon="el-icon-edit" @click="edit(scope.row)"></el-button>
          <el-button type="danger" size="mini" icon="el-icon-delete" @click="del(scope.row)"></el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog :title="state?'添加学生信息':'修改学生信息'" :visible.sync="dialogFormVisible" width="500px">
      <el-form :model="form" :rules="rules" ref="form">
        <el-form-item label="姓名" :label-width="formLabelWidth" prop="name">
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="性别" :label-width="formLabelWidth" prop="sex">
          <el-radio v-model="form.sex" label="1"></el-radio>
          <el-radio v-model="form.sex" label="2"></el-radio>
        </el-form-item>
        <el-form-item label="年龄" :label-width="formLabelWidth" prop="age">
          <el-input v-model="form.age" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="父亲姓名" :label-width="formLabelWidth" prop="father">
          <el-input v-model="form.father" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="母亲姓名" :label-width="formLabelWidth" prop="mather">
          <el-input v-model="form.mather" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="家庭住址" :label-width="formLabelWidth" prop="address">
          <el-input v-model="form.address" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="入校时间" :label-width="formLabelWidth" prop="time">
          <el-date-picker v-model="form.time" type="datetime" placeholder="选择日期时间" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="联系方式" :label-width="formLabelWidth" prop="phone">
          <el-input v-model="form.phone" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="closeInfo('form')">取 消</el-button>
        <el-button type="primary" @click="sure('form') ">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>


<script>
import { info, getInfo, updateInfo } from '@/api/api.js'
export default {
  data() {
    return {
      tableData: [],
      dialogFormVisible: false,
      form: {
        name: '',
        sex: '1',
        age: '',
        father: '',
        mather: '',
        address: '',
        time: '',
        phone: ''
      },
      rules: {
        name: [{ required: true, message: '请输入姓名' }],
        sex: [{ required: true }],
        age: [{ required: true, message: '请输入年龄' }],
        address: [{ required: true, message: '请输入地址' }],
        time: [{ required: true, message: '请输入入学时间' }],
        phone: [{ required: true, message: '请输入联系方式' }]
      },
      formLabelWidth: '80px',
      state: true,
      total: 0
    }
  },
  created() {
    this.getData()
  },
  methods: {
    edit(row) {
      this.form = { ...row }
      this.state = false
      this.dialogFormVisible = true
    },
    closeInfo(form) {
      this.$refs[form].resetFields()
      this.dialogFormVisible = false
    },
    del() {},
    addStudent() {
      this.form = {
        name: '',
        sex: '1',
        age: '',
        father: '',
        mather: '',
        address: '',
        time: '',
        phone: ''
      }
      // this.$$nextTick(() => {
      //   this.$refs['form'].resetFields()
      // })
      this.state = true
      this.dialogFormVisible = true
    },
    getData() {
      getInfo().then(res => {
        if (res.data.status === 200) {
          this.tableData = res.data.data
          this.total = res.data.total
        }
      })
    },
    sure(form) {
      console.log(form, this.form)
      this.$refs[form].validate(valid => {
        if (valid) {
          if (this.state) {
            info(this.form).then(res => {
              if (res.data.status === 200) {
                this.getData()
                this.dialogFormVisible = false
                this.$message({ type: 'success', message: res.data.message })
              }
            })
          } else {
            updateInfo(this.form).then(res => {
              if (res.data.status === 200) {
                this.getData()
                this.dialogFormVisible = false
                this.$message({ type: 'success', message: res.data.message })
              }
            })
          }
        }
      })
    }
  }
}
</script>


<style lang="scss" scoped>
.infoList {
  .demo-form-inline,
  .el-form-item {
    text-align: left;
  }
  .el-pagination {
    text-align: left;
    margin-top: 20px;
  }
}
</style>

删除

接口

在这里插入图片描述使用
在这里插入图片描述

api优化

我们发现新增和修改接口差不多,那么我们是不是可以优化一下

在这里插入图片描述
在这里插入图片描述

增删改查封装复用

utils下建立table.js
table.js下封装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

简化

在这里插入图片描述

table.js代码

// 获取表格数据
export function getData(root, url, params) {
  root.service.get(url, { params: params || {} }).then(res => {
    if (res.data.status) {
      root.tableData = res.data.data
      root.total = res.data.total
    }
  })
    .catch(err => {
      throw err
    })
}


// 新增和修改方法的封装
import qs from 'qs'
export function changeInfo(root, method, url, form, callback) {
  let data = qs.stringify(form)
  root.service[method](url, data)
    .then(res => {
      if (res.data.status === 200) {
        callback(root, url)
        root.dialogFormVisible = false
        root.$refs['form'].resetFields()
        root.$message({ type: 'success', message: res.data.message })
      }
    })
    .catch(err => {
      throw err
    })
}


// 删除方法
export function delData(root, url, id, callFun) {
  root.$alert('你确定要删除吗?', '提示', {
    confirmButtonText: '确定',
    callback: () => {
      root.service.delete(`${url}/${id}`).then(res => {
        if (res.data.status === 200) {
          callFun(root, url)
          root.$message({ message: res.data.message, type: 'success' })
        }
      })
        .catch(err => {
          throw err
        })
    }
  })
}

infoLists.vue

我们把优化后的代码用在infoLists.vue里

<template>
  <div class="infoMent">
    <el-form :inline="true" class="demo-form-inline" size="small">
      <el-form-item>
        <el-button type="primary" @click="addStudent">新增</el-button>
      </el-form-item>
    </el-form>
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column prop="name" label="姓名" align="center">
      </el-table-column>
      <el-table-column prop="sex" label="性别" align="center">
      </el-table-column>
      <el-table-column prop="age" label="年龄" align="center">
      </el-table-column>
      <el-table-column prop="father" label="父亲" align="center">
      </el-table-column>
      <el-table-column prop="mather" label="母亲" align="center">
      </el-table-column>
      <el-table-column prop="address" label="家庭住址" align="center">
      </el-table-column>
      <el-table-column prop="time" label="入校时间" align="center">
      </el-table-column>
      <el-table-column prop="phone" label="联系方式" align="center">
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button type="danger" size="mini" icon="el-icon-edit" @click="edit(scope.row)"></el-button>
          <el-button type="danger" size="mini" icon="el-icon-delete" @click="del(scope.row)"></el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog :title="state?'添加学生信息':'修改学生信息'" :visible.sync="dialogFormVisible" width="500px">
      <el-form :model="form" :rules="rules" ref="form">
        <el-form-item label="姓名" :label-width="formLabelWidth" prop="name">
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="性别" :label-width="formLabelWidth" prop="sex">
          <el-radio v-model="form.sex" label="1"></el-radio>
          <el-radio v-model="form.sex" label="2"></el-radio>
        </el-form-item>
        <el-form-item label="年龄" :label-width="formLabelWidth" prop="age">
          <el-input v-model="form.age" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="父亲姓名" :label-width="formLabelWidth" prop="father">
          <el-input v-model="form.father" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="母亲姓名" :label-width="formLabelWidth" prop="mather">
          <el-input v-model="form.mather" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="家庭住址" :label-width="formLabelWidth" prop="address">
          <el-input v-model="form.address" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="入校时间" :label-width="formLabelWidth" prop="time">
          <el-date-picker v-model="form.time" type="datetime" placeholder="选择日期时间" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="联系方式" :label-width="formLabelWidth" prop="phone">
          <el-input v-model="form.phone" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="closeInfo('form')">取 消</el-button>
        <el-button type="primary" @click="sure('form') ">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>


<script>
import { getData, changeInfo, delData } from '@/utils/table.js'
export default {
  data() {
    return {
      tableData: [],
      dialogFormVisible: false,
      form: {
        name: '',
        sex: '1',
        age: '',
        father: '',
        mather: '',
        address: '',
        time: '',
        phone: ''
      },
      rules: {
        name: [{ required: true, message: '请输入姓名' }],
        sex: [{ required: true }],
        age: [{ required: true, message: '请输入年龄' }],
        address: [{ required: true, message: '请输入地址' }],
        time: [{ required: true, message: '请输入入学时间' }],
        phone: [{ required: true, message: '请输入联系方式' }]
      },
      formLabelWidth: '80px',
      state: true,
      total: 0
    }
  },
  created() {
    getData(this, '/info')
  },
  methods: {
    edit(row) {
      this.form = { ...row }
      this.state = false
      this.dialogFormVisible = true
    },
    closeInfo(form) {
      this.$refs[form].resetFields()
      this.dialogFormVisible = false
    },
    del(row) {
      // console.log(row)
      // 弹窗提示
      delData(this, '/info', row.id, getData)
    },
    addStudent() {
      this.form = {
        name: '',
        sex: '1',
        age: '',
        father: '',
        mather: '',
        address: '',
        time: '',
        phone: ''
      }
      // this.$$nextTick(() => {
      //   this.$refs['form'].resetFields()
      // })
      this.state = true
      this.dialogFormVisible = true
    },
    sure(form) {
      console.log(form, this.form)
      this.$refs[form].validate(valid => {
        if (valid) {
          // if (this.state) {
          //   changeInfo(this, 'post', '/info', this.form, getData)
          // } else {
          //   changeInfo(this, 'put', '/info', this.form, getData)
          // }
          let methods = ''
          this.state ? (methods = 'post') : (methods = 'put')
          changeInfo(this, methods, '/info', this.form, getData)
        }
      })
    }
  }
}
</script>


<style lang="scss" scoped>
.infoMent {
  .demo-form-inline,
  .el-form-item {
    text-align: left;
  }
}
</style>

封装完毕,很重要,建议反复观看

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

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

相关文章

React Fiber 树思想,解决业务实际场景

熟悉 Fiber 树结构 我们知道&#xff0c;React 从 V16 版本开始采用 Fiber 树架构来实现渲染和更新机制。 Fiber 在 React 源码中可以看作是一个任务执行单元&#xff0c;每个 React Element 都会有一个与之对应的 Fiber 节点。 Fiber 节点的核心数据结构如下&#xff1a; …

基于javaweb+springboot+HTML汽车配件管理系统设计和实现以及文档报告

基于javaweb(springboot)汽车配件管理系统设计和实现以及文档报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

Java面试题,这是一篇会一直更新的博客!欢迎大家留言~

Java面试题1、面向对象与面向过程2、Spring源码分析&#xff08;可能比较复杂&#xff0c;但是看下去可能会找到让你顿悟的字眼&#xff09;2.1、Spring创建Bean对象2.2 实例化&#xff08;推断构造方法&#xff09;1、面向对象与面向过程 封装&#xff1a;封装在于明确标识出允…

快递驿站取件管理系统|基于SpringBoot的快递栈系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

商场楼层地图怎么制作,高效、便捷的商场二三维地图绘制平台

当顾客走进庞大的商场购物中心&#xff0c;如何让顾客在商场购物消费时有更轻松方便的体验&#xff1f;如何能快速将品牌和商品传递给潜在顾客&#xff0c;并一键引导顾客到店&#xff1f;电子地图作为大家最喜闻乐见的高效应用形式&#xff0c;在商业应用中&#xff0c;不论针…

arduinoIDE下载keypad和password库文件

任务需求&#xff1a;需要使用4*4矩阵键盘来完成一个按键密码锁 需要使用keypad和password这两个开源库 开源库的查找 1.在IDE中直接查找 同时在更多中能够看到api文档 2.在官网中进行找寻 至于导入的方式比较简单就不做叙述 keypad库文件文档api分析 api可以在官网中有…

用Python找出了删除自己微信的所有人并将他们自动化删除了

用Python找出了删除自己微信的所有人并将他们自动化删除了 你是否有微信被删了好友不自知&#xff0c;还傻傻的给对方发消息&#xff0c;结果出现了下图中那尴尬的一幕的经历呢&#xff1f;其实我们可以用Python提前把他们找出来并自动化删除避免尴尬的。 为了避免再次出现上…

Tools for better thinking

内容来自untools官网&#xff0c;感兴趣的可以去翻译一下&#xff0c;我只做下总结 理解系统 Concept mapConnection circlesIceberg ModelBalancing feedback loopReinforcing feedback loop 做出决策 Cynefin frameworkSix Thinking HatsSecond-order thinkingEisenhower Mat…

【LeetCode】753. 破解保险箱

753. 破解保险箱 题目描述 有一个需要密码才能打开的保险箱。密码是 n 位数, 密码的每一位是 k 位序列 0, 1, ..., k-1 中的一个 。 你可以随意输入密码&#xff0c;保险箱会自动记住最后 n 位输入&#xff0c;如果匹配&#xff0c;则能够打开保险箱。 举个例子&#xff0c…

怎么看电脑配置?Windows和Mac系统配置的查看方法

电脑的配置一般指电脑硬件配件的高档程度和性价比&#xff0c;计算机的性能主要取决于主要的硬件配置。很多朋友在购买电脑之前应该注意查看电脑的配置&#xff0c;怎么看电脑配置&#xff1f;下面有关于Windows系统和Mac系统电脑配置的不同查看方式&#xff0c;一起来看看吧&a…

光遗传学应用中所涉及到的光纤产品盘点!

如上图所示&#xff0c;在光遗传学的应用中&#xff0c;会使用到如光遗传跳线、光遗传插芯针、光纤旋转器、光纤耦合器/分束器&#xff08;12或22&#xff09;等产品。对于这些产品&#xff0c;根据不同的应用&#xff0c;又涉及到光纤芯径、数值孔径NA、出纤长度、插芯直径等众…

如何拖拽图片放到指定的格子里

本文首发于微信公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。今天来分享一个如何在游戏中拖拽一个图片&#xff0c;然后把它放到指定的格子里&#xff0c…

网络编程(十)——基于UDP协议的套接字

TCP和UDP协议传输对比 TCP协议传输数据可靠&#xff0c;TCP传输数据后&#xff0c;如果收到接收方回应消息&#xff0c;则会在本机缓存中删除已发送消息&#xff1b;如果没有收到接收方回应消息&#xff0c;则会利用缓存继续发送消息。UDP协议传输数据相对来说不可靠&#xff…

学生看书用白炽灯和led灯哪个好?学生led护眼灯排行榜

我们都知道学生的晶状体是比较敏感的&#xff0c;不得不承认一个实际问题&#xff0c;LED灯已经普遍到日常生活中&#xff0c;不管是教室、企业、书房&#xff0c;使用LED灯居多&#xff0c;主要是因为它的电流稳定、光线柔和、光效效率高&#xff0c;所以LED灯的灯光没有紫外线…

Qt OpenGL(07)递归细分四面体法绘制球体

文章目录Qt OpenGL通过递归细分逼近球面思路下面就是绘制的代码&#xff1a;Widget.cpp顶点着色器片段着色器Qt OpenGL通过递归细分逼近球面 在OpenGL中绘制球面&#xff0c;不是太简单的事情。因为球面和圆都不是OpenGL所支持的图元&#xff0c;因此我们将通过一种称为递归细分…

飞宇科技在创业板IPO终止:长江证券撤回保荐,吴玉飞为实控人

2023年1月10日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;江苏飞宇医药科技股份有限公司&#xff08;下称“飞宇科技”&#xff09;的保荐机构&#xff08;长江证券&#xff09;提交了撤回飞宇科技首次公开发行股票并在创业板上市申请的申请因此&#xff0c;深圳证券…

BOM(二): 元素偏移量offset 、元素可视区client 、元素滚动 scroll、动画

PC端网页特效元素偏移量offset元素可视区client元素滚动 scroll 系列动画元素偏移量offset 1.offset概述 offset 系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等。 获得元素距离带有定位父元素的位置获得元素自身的大小&#xff08;宽度高度&…

Python 字典(Dictionary)操作详解

这篇文章主要介绍了Python 字典(Dictionary)的详细操作方法&#xff0c;需要的朋友可以参考下。 Python字典是另一种可变容器模型&#xff0c;且可存储任意类型对象&#xff0c;如字符串、数字、元组等其他容器模型。 一、创建字典 字典由键和对应值成对组成。字典也被称作关…

微信小程序云开发之新闻博客社区项目debug后的项目代码

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a;lqj_本人的博客_CSDN博客-微信小程序,html特效,vue2基础领域博主 本次文章主要时为我最近在哔哩哔哩上的新发布的视频做一个映射&#xff01; 哔哩哔哩欢迎关注&#xff1a;小淼前端 哔…

【Python从入门到进阶】3、运行python代码

接上篇《2、Python环境的安装》 上一篇我们学习了如何下载安装Python编程环境&#xff0c;以及如何使用pip管理Python包。本篇我们来学习如何使用终端和执行文件运行python代码。 一、终端运行 我们可以在命令行终端进入python解释程序&#xff0c;直接输入python代码&#x…