Vue Web开发(十)

1. 用户管理新增,搜索,编辑,删除

  本节课完成用户列表表单设计,使用table组件,同样模块化组件,CommonTable.vue组件,并且在User页面中引入,mock实现数据模拟,最终完成用户列表多项功能,实现新增,搜索,编辑,删除功能。
在这里插入图片描述

在这里插入图片描述
  首先是基本信息页面el-table的data属性用于接收table的外部数据tableData,因此添加props,类型是Array,高度90%,stripe属性表示斑马条纹样式。el-table-column表示表头和第一行的内容,后面数据可以循环使用。show-overflow-tooltip表示过长数据用tooltip样式显示。props添加tableLabel,类型为Array,v-for遍历tableLabel(姓名、年龄、性别、出生日期、地址),label就主键名,设置宽度width,如果数据自带宽度就使用item.width,没有则设置125。,这是一个固定写法。slot是插槽,有两个重要性质,显示或不显示、怎样显示都是由父组件决定。{{ scope.row[item.prop] }}拿到列的数据并进行渲染。
  接下来操作页,表头显示“操作”,表内显示“编辑、删除”。el-table-column下存在两个button。两个button都要设置点击事件,用函数方式。
  分页组件使用Pagination组件,在el-table下方添加el-pagination,layout属性,total表示总的数据的数量。在props添加config,total是config下的一个属性,类型是Object。current-page.sync表示当前的页面数,添加点击事件changePage。page-size表示一页里有多少条数据,这里设置20。
  更改样式,表格相对定位,页数绝对定位。

1.1. 新建CommonTable.vue

  在src/components下建CommonTable.vue文件

//src/components/CommonTable.vue
<template><div class="common-table"><el-table :data="tableData" height="90%" stripe><el-table-columnshow-overflow-tooltipv-for="item in tableLabel":key="item.prop":label="item.label":width="item.width ? item.width : 125"><!--获取插槽数据(固定样式)--><template slot-scope="scope"><span style="margin-left: 10px">{{ scope.row[item.prop] }}</span></template></el-table-column><el-table-column label="操作" min-width="180"><template slot-scope="scope"><el-button size="mini"@click="handleEdit(scope.row)">编辑</el-button><el-button size="mini" type="danger"@click="handleDelete(scope.row)">删除</el-button></template></el-table-column></el-table><!--分页组件--><el-paginationclass="pager"layout="prev,pager,next":total="config.total":current-page.sync="config.page"@current-change="changePage":page-size="20"></el-pagination></div>
</template>
<script>export default {name: "CommonTable",props: {tableData: Array,tableLabel: Array,config: Object,},data() {return {};},methods: {handleEdit(row) {this.$emit('edit', row)},handleDelete(row) {this.$emit('del', row)},changePage(page) {this.$emit('changePage', page)}},};
</script>
<style lang="less" scoped>.common-table {height: calc(100% - 62px);background-color: #fff;// position: relative;.pager {position: absolute;bottom: 0;right: 20px;}}
</style>

  在src/components/CommonTable.vue编写数据上传函数,row、page表示数据提交的数据,$emit可以将数据提交到父组件,edit、del、changePage为自定义名称。

//src/components/CommonTable.vuemethods: {handleEdit(row) {this.$emit('edit',row)},handleDelete(row) {this.$emit('del',row)},changePage(page) {this.$emit('changePage',page)}},

1.2. 引入CommonTable组件

1.2.2. src/views/user/index.vue内容编写

  (1)在User页面引入CommonTable组件

//src/views/user/index.vue
import CommonTable from '../../components/CommonTable.vue'
components:{CommonTable
},

  (2)正式使用组件,tableData暂时为空数组,tableLabel为表头的主键。地址和出生日期较长,我们加上宽度。config为分页数据,page为1,表示默认为第一页,total为总页数设置为30(不清楚)。common-form还需要添加三个事件,changePage、edit、del事件。三个事件均为函数。

//src/views/user/index.vue  组件<common-table:tableData="tableData":tableLabel="tableLabel":config="config"@changePage="getList()"@edit="editUser"@del="delUser"></common-table>
//src/views/user/index.vue  datatableData:[],tableLabel:[{prop:"name",label:"姓名"},{prop:"age",label:"年龄"},{prop:"sexLabel",label:"性别"},{prop:"birth",label:"出生日期",width:200},{prop:"addr",label:"地址",width:320},],config:{page:1,total:30,},}},
//src/views/user/index.vue   methodseditUser(){},delUser(){},getList(){}

  (3)src/views/user/index.vue完整代码

//src/views/user/index.vue  组件
<template><div class="manage"><!-- dialog为弹窗内容 --><el-dialog:title="operateType === 'add' ? '新增用户' : '更新用户'":visible.sync="isShow"><!-- 这里冒号是将数据传送给CommonForm组件。 --><common-form:formLabel="operateFormLabel":form="operateForm":inline="true"ref="form"></common-form><div slot="footer" class="dialog-footer"><el-button @click="isShow = false">取消</el-button><el-button type="primary" @click="confirm">确认</el-button></div></el-dialog><div class="manage-header"><el-button type="primary" @click="addUser">新增</el-button><common-form ref="form":formLabel="formLabel":form="searchFrom":inline="true"><el-button type="primary" @click='getList'>搜索</el-button></common-form></div><common-table:tableData="tableData":tableLabel="tableLabel":config="config"@changePage="getList()"@edit="editUser"@del="delUser"></common-table></div>
</template>
<script>import CommonForm from '../../components/CommonForm.vue'import CommonTable from '../../components/CommonTable.vue'export default {name: 'User',components: {CommonForm, CommonTable},data() {return {operateType: 'add',isShow: false,operateFormLabel: [{model: 'name',label: '姓名',type: 'input'},{model: 'age',label: '年龄',type: 'input'},{model: 'sex',label: '性别',type: 'select',opts: [{label: '男',value: 1},{label: '女',value: 0}]},{model: 'birth',label: '出生日期',type: 'date'},{model: 'addr',label: '地址',type: 'input'}],operateForm: {name: '',addr: '',age: '',birth: '',sex: ''},formLabel: [{model: "keyword",label: '',type: 'input'},],searchFrom: {keyword: '',},tableData:[],tableLabel:[{prop:"name",label:"姓名"},{prop:"age",label:"年龄"},{prop:"sexLabel",label:"性别"},{prop:"birth",label:"出生日期",width:200},{prop:"addr",label:"地址",width:320},],config:{page:1,total:30,},}},methods: {confirm() {if (this.operateType === 'edit') {this.$http.post('/user/edit', this.operateForm).then(res => {console.log(res)this.isShow = falsethis.getList()})} else {this.$http.post('/user/add', this.operateForm).then(res => {console.log(res)this.isShow = falsethis.getList()})}},addUser() {this.isShow = true,this.operateType = 'add',this.operateForm = {name: '',addr: '',age: '',birth: '',sex: ''}},getList() {}}}
</script>
<style lang="less" scoped>.manage-header {display: flex;flex-direction: row;justify-content: space-between;align-items: center;}</style>

1.3. mock数据

  (1)mockServeData文件夹中提前放入user.js文件,在tableData需要用mock引入,用mock生成数据。在mock.js中进行拦截ajax,getUserList是User.js的函数,这里写的是拦截器。

//src/api/mock.js
import userApi from './mockServeData/user.js'
Mock.mock(/user\/getUser/,'get',userApi.getUserList)

  (2)在src/api/data.js调用mock拦截器,拦截器和接口调用要一致。

//src/api/data.js
export const getUser = (params) => {return axios.request({url:'/user/getUser',method:'get',params})
}

  (3)回到src/views/user/index.vue页面对接口就进行引入调用。

//src/views/user/index.vue
import { getUser } from '../../api/data'

  在getList()调用,传入参数name,name默认为空。判断name存不存在,如果name存在,那么将当前页码置为1。如果不存在,页码置空。

            getList(name=''){this.config.loading = truename ? (this.config.pag = 1) : ''getUser({page:this.config.page,name}).then(({ data:res })=>{console.log(res,'res')this.tableData = res.list.map(item=>{item.sexLabel = item.sex === 0 ? "女" : "男"return item})this.config.total = res.countthis.config.loading = false})}

  添加生命周期对getList()方法进行调用

        created(){this.getList()},

  在confirm()发最后调用getList()函数。

            confirm(){if(this.operateType === 'edit'){this.$http.post('/user/edit',this.operateForm).then(res => {console.log(res)this.isShow = falsethis.getList()})}else{this.$http.post('/user/add',this.operateForm).then(res => {console.log(res)this.isShow = falsethis.getList()})}},

  定义editUser()

            editUser(row){this.operateType = 'edit'this.isShow = truethis.operateForm = row},

  定义delUser(),接收参数$confirm,第一个参数是提示内容,第二个参数是提示标题,第三个是参数是按钮文本,弹窗类型为warning。箭头函数,拿到当前数据,拿到id,调用api进行删除,删除api为"/user/del",并且需要传入数据的id,给出提示信息,并且调用getList。

            delUser(row){this.$confirm("此操作将永久删除该文件,是否继续?","提示",{confirmButtonText:"确认",canceIButtonText:"取消",type:"warning"}).then(()=>{const id = row.idthis.$http.post("/user/del",{params:{ id }}).then(()=>{this.$message({type:'success',message:'删除成功'})this.getList()})})},

  定义mock删除,deleteUser为mock里user.js的函数

//src/api/mock.js
Mock.mock(/user\/del/,'post',userApi.deleteUser)

  (4)src/views/user/index.vue完整代码

//src/views/user/index.vue  
<template><div class="manage"><!-- dialog为弹窗内容 --><el-dialog:title="operateType === 'add' ? '新增用户' : '更新用户'":visible.sync="isShow"><!-- 这里冒号是将数据传送给CommonForm组件。 --><common-form:formLabel="operateFormLabel":form="operateForm":inline="true"ref="form"></common-form><div slot="footer" class="dialog-footer"><el-button @click="isShow = false">取消</el-button><el-button type="primary" @click="confirm">确认</el-button></div></el-dialog><div class="manage-header"><el-button type="primary" @click="addUser">新增</el-button><common-form ref="form":formLabel="formLabel":form="searchFrom":inline="true"><el-button type="primary" @click='getList'>搜索</el-button></common-form></div><common-table:tableData="tableData":tableLabel="tableLabel":config="config"@changePage="getList()"@edit="editUser"@del="delUser"></common-table></div>
</template>
<script>import CommonForm from '../../components/CommonForm.vue'import CommonTable from '../../components/CommonTable.vue'import { getUser } from '@/api/data'export default {name: 'User',components: {CommonForm, CommonTable},data() {return {operateType: 'add',isShow: false,operateFormLabel: [{model: 'name',label: '姓名',type: 'input'},{model: 'age',label: '年龄',type: 'input'},{model: 'sex',label: '性别',type: 'select',opts: [{label: '男',value: 1},{label: '女',value: 0}]},{model: 'birth',label: '出生日期',type: 'date'},{model: 'addr',label: '地址',type: 'input'}],operateForm: {name: '',addr: '',age: '',birth: '',sex: ''},formLabel: [{model: "keyword",label: '',type: 'input'},],searchFrom: {keyword: '',},tableData:[],tableLabel:[{prop:"name",label:"姓名"},{prop:"age",label:"年龄"},{prop:"sexLabel",label:"性别"},{prop:"birth",label:"出生日期",width:200},{prop:"addr",label:"地址",width:320},],config:{page:1,total:30,},}},created(){//添加生命周期对getList()方法进行调用this.getList()},methods: {confirm() {if (this.operateType === 'edit') {this.$http.post('/user/edit',this.operateForm).then(res => {console.log(res)this.isShow = falsethis.getList()})} else {this.$http.post('/user/add',this.operateForm).then(res => {console.log(res)this.isShow = falsethis.getList()})}},addUser() {this.isShow = true,this.operateType = 'add',this.operateForm = {name: '',addr: '',age: '',birth: '',sex: ''}},getList(name=''){this.config.loading = truename ? (this.config.page = 1) : ''getUser({page:this.config.page,name}).then(({ data:res })=>{console.log("rf=====",res.data)this.tableData = res.data.list.map(item=>{item.sexLabel = item.sex === 0 ? "女" : "男"return item})this.config.total = res.data.countthis.config.loading = false})},editUser(row){this.operateType = 'edit'this.isShow = truethis.operateForm = row},delUser(row){this.$confirm("此操作将永久删除该文件,是否继续?","提示",{confirmButtonText:"确认",canceIButtonText:"取消",type:"warning"}).then(()=>{const id = row.idthis.$http.post("/user/del",{params:{ id }}).then(()=>{this.$message({type:'success',message:'删除成功'})this.getList()})})},}}
</script>
<style lang="less" scoped>.manage-header {display: flex;flex-direction: row;justify-content: space-between;align-items: center;}
</style>

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

1.3. 继续完善

1.3.1. 搜索功能

  添加searchFrom.keyword即可,sharchFrom之前有定义过,里面的keyword字段默认为空。

//src/views/user/index.vue  
<el-button type="primary" @click='getList(searchFrom.keyword)'>搜索</el-button>

   效果
在这里插入图片描述

1.3.2. 编辑

  在点击编辑时调用handledit,这里需要用拿到数据,然后将原有的两个button放在template里面。

//src/components/CommonTable.vue
<el-table-column label="操作" min-width="180"><template slot-scope="scope"><el-button size="mini"@click="handleEdit(scope.row)">编辑</el-button><el-button size="mini" type="danger"@click="handleDelete(scope.row)">删除</el-button></template>
</el-table-column>

在这里插入图片描述

1.3.1. 删除

  此时点击删除功能是没有反应的,需要引入element-ui MessageBox ,添加MessageBox、Message组件,!!!请注意,就是之前是全局引入,这里也必须单独引入MessageBox、Message(原因未知)。并且绑定到prototype属性上。
在这里插入图片描述

//src/mian.js
import { Message,MessageBox } from 'element-ui';
Vue.prototype.$confirm = MessageBox.confirm
Vue.prototype.$message = Message

在这里插入图片描述
  用户管理新增,搜索,编辑,删除示例下载

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

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

相关文章

人工智能在VR展览中扮演什么角色?

人工智能&#xff08;AI&#xff09;在VR展览中扮演着多重关键角色&#xff0c;这些角色不仅增强了用户体验&#xff0c;还为展览的组织者提供了强大的工具。 接下来&#xff0c;由专业从事VR展览制作的圆桌3D云展厅平台为大家介绍AI在VR展览中的一些主要作用&#xff1a; 个性…

学工管理系统-职校信息化管理平台

学工管理系统是一种致力于提升职校管理效率和信息化水平的重要工具。它综合运用了现代信息技术和学工管理理念&#xff0c;为学校提供了全面、科学、高效的管理平台。 学工管理系统在学校管理中发挥着重要的作用。它能够实现学生信息的完整管理&#xff0c;包括学籍、课程、成绩…

如何测量分辨率

一、什么是分辨率&#xff1f; 分辨率指的是分清物体细节的能力。分辨率是一个成像系统还原空间频率的能力。一些人只是简单的用分辨率去描述极限分辨率&#xff0c;但是相机在在不同的对比度的情况下还原低&#xff0c;中和高频率的能力&#xff0c;也可以显示全面综合的信息。…

MySQL数据库下载及安装教程

链接&#xff1a;MySQL数据库下载及安装教程&#xff08;最最新版&#xff09;_mysql下载安装-CSDN博客 亲测安装成功了&#x1f495; 把这个路径放到系统环境变量里头 MD!我这安到C盘去了&#xff0c;就很烦&#x1f92c;&#x1f621; 在CMD登录试一下 mysql -h localhos…

RadiAnt DICOM - 基本主题 :从 PACS 服务器打开研究

正版序列号获取&#xff1a;https://r-g.io/42ZopE RadiAnt DICOM Viewer PACS 客户端功能允许您从 PACS 主机&#xff08;图片存档和通信系统&#xff09;搜索和下载研究。 在开始之前&#xff0c;您需要确保您的 PACS 服务器和 RadiAnt 已正确配置。有关配置说明&#xff0c…

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

智能座舱进阶-应用框架层-Handler分析

首先明确&#xff0c; handler是为了解决单进程内的线程之间的通信问题的。我也需要理解Android系统中进程和线程的概念&#xff0c; APP启动后&#xff0c;会有三四个线程启动起来&#xff0c;其中&#xff0c;有一条mainUITread的线程&#xff0c;专门用来处理UI事件&#xf…

构建高性能异步任务引擎:FastAPI + Celery + Redis

在现代应用开发中&#xff0c;异步任务处理是一个常见的需求。无论是数据处理、图像生成&#xff0c;还是复杂的计算任务&#xff0c;异步执行都能显著提升系统的响应速度和吞吐量。今天&#xff0c;我们将通过一个实际项目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …

go面试问题

1 Go的内存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http状态码 300 请求的资源可包括多个位置&#xff0c;相应可返回一个资源特征与地址的列表用于用户终端&#xff08;例如&#xff1a;浏览器&#xff09;选择 301 永久移动。请求的资源已被永久的移动到新U…

JVM性能优化一:初识内存泄露-内存溢出-垃圾回收

本文主要是让你充分的认识到什么叫做内存泄露&#xff0c;什么叫做内存溢出&#xff0c;别再傻傻分不清了&#xff0c;别再动不动的升级服务器的内存了。 文章目录 1.基本概念1.1.内存泄露1.2.内存溢出1.3.垃圾回收1.4.内存泄露-垃圾回收-内存溢出三者的关系关系 2.代码示例2.…

安装milvus以及向量库增删改操作

首先电脑已经安装了docker windows电脑可下载yml文件 https://github.com/milvus-io/milvus/releases/download/v2.4.6/milvus-standalone-docker-compose.yml 创建milvus文件夹&#xff0c;并在这个目录下创建五个文件夹&#xff1a;conf、db、logs、pic、volumes、wal 然后…

ARP..

ARP 0 前言 真正接触到现网才发现ARP十分重要&#xff0c;无论是排错还是S-MLAG都需要用到ARP这个协议&#xff0c;以前对于ARP的理解比较混乱&#xff1b;所以这次对其中的主要内容做个梳理&#xff1b;一定要学好ARP&#xff01;&#xff01;&#xff01; 1 ARP的概念 Ar…

单片机上电后程序不运行怎么排查问题?

1.电源检查。使用电压表测量单片机的电源电压是否正常&#xff0c;确保电压在规定的范围内&#xff0c;如常见的5V。 2.复位检查。检查复位引脚的电压是否正常&#xff0c;在单片机接通电源时&#xff0c;复位引脚通常会有一个高电平&#xff0c;按下复位按钮时&#xff0c;复位…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

Linux应用开发————mysql数据库表

mysql数据库表操作 查看表的结构 mysql> desc / describe 表名; 或者&#xff1a; mysql> show create table 表名; 常见数据库引擎&#xff1a; innodb, myISAM... 删除表 mysql> drop tabl…

【C#】实现Json转Lua (Json2Lua)

关键词: C#、JsonToLua、Json2Lua、对象序列化Lua 前提需引入NewtonsofJson&#xff0c;引入方法可先在Visual Studio 2019 将Newtonsoft.Json.dll文件导入Unity的Plugins下。 Json格式字符串转Lua格式字符串&#xff0c;效果如下&#xff1a; json字符串 {"1": &q…

2.4 网络概念(分层、TCP)

网络层与传输层概述 网络层&#xff1a; 抽象概念&#xff1a;网络层是基于 IP 的抽象概念&#xff0c;与数据链路层用 MAC 地址标记设备不同。MAC 地址是一种具体化的概念&#xff0c;绑定于所在的物理网络&#xff0c;而 IP 地址可以是固定的&#xff0c;也可以通过路由动态…

LabVIEW伸缩臂参数监控系统

LabVIEW开发伸缩臂越野叉车参数监控系统主要应用于工程机械中的越野叉车&#xff0c;以提高车辆的作业效率和故障诊断能力。系统通过PEAK CAN硬件接口和LabVIEW软件平台实现对叉车作业参数的实时监控和故障分析&#xff0c;具有良好的实用性和推广价值。 系统组成 系统主要由P…

多目标优化常用方法:pareto最优解

生产实际中的许多优化问题大都是多目标问题&#xff0c;举个例子&#xff1a;我们想换一份工资高、压力小、离家近的新工作&#xff0c;这里工资高、压力小、离家近就是我们的目标&#xff0c;显然这是一个多目标问题&#xff0c;那我们肯定想找到这三个目标同时最优的工作&…

跨站脚本攻击的多种方式——以XSS-Labs为例二十关详解解题思路

一、XSS-Labs靶场环境搭建 1.1、XSS介绍 跨站脚本攻击&#xff08;XSS&#xff09;_跨站脚本测试-CSDN博客https://coffeemilk.blog.csdn.net/article/details/142266454 1.2、XSS-Labs XSS-Labs是一个学习XSS攻击手法的靶场&#xff0c;方便我们系统性的学习掌握跨站脚本攻击…