【Vue2+Element ui通用后台】用户列表

news2024/11/13 14:52:26

文章目录

  • 新增用户
  • 用户列表

新增用户

首先增加一个 ‘新增’ 按钮,点击弹出对话框来新增用户。弹出框可以使用 Element UI 的 Dialog对话框,其中 visible 表示是否显示 Dialog,支持 .sync 修饰符。我们点击新增按钮把这个标识置为 true,Dialog 即可显示

在这里插入图片描述

其中 Dialog 是一个表单,可以使用 Element UI 的 Form表单,其中 :model = 'form' 是表单数据对象,所以我们在下面的 data 中需要定义这个数据

export default {
  name: "Home",
  data(){
    return{
      dialogVisible: false,
      form:{
        name:'',
        age:'',
        sex:'',
        birth:'',
        addr:'',
      }
    }
  }
}

然后 form 中的内容,每条都需要使用 <el-form-item>。当垂直方向空间受限且表单较简单时,可以在一行内放置表单,可以使用:inline="true"

需要输入的用el-input,性别用 el-select 选择框,form 表单中有示例代码可以直接拿过来。日期可以使用 日期选择器

当点击确定的时候需要进行验证,我们可以参考 表单验证。Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可

用户列表

Element UI table

首先 api 下的 mockServeData 新增 user.js

import Mock from 'mockjs'

// get请求从config.url获取参数,post从config.body中获取参数
function param2Obj (url) {
    const search = url.split('?')[1]
    if (!search) {
        return {}
    }
    return JSON.parse(
        '{"' +
        decodeURIComponent(search)
            .replace(/"/g, '\\"')
            .replace(/&/g, '","')
            .replace(/=/g, '":"') +
        '"}'
    )
}

let List = []
const count = 200

for (let i = 0; i < count; i++) {
    List.push(
        Mock.mock({
            id: Mock.Random.guid(),
            name: Mock.Random.cname(),
            addr: Mock.mock('@county(true)'),
            'age|18-60': 1,
            birth: Mock.Random.date(),
            sex: Mock.Random.integer(0, 1)
        })
    )
}

export default {
    /**
     * 获取列表
     * 要带参数 name, page, limt; name可以不填, page,limit有默认值。
     * @param name, page, limit
     * @return {{code: number, count: number, data: *[]}}
     */
    getUserList: config => {
        const { name, page = 1, limit = 20 } = param2Obj(config.url)
        // console.log('name:' + name, 'page:' + page, '分页大小limit:' + limit)
        const mockList = List.filter(user => {
            if (name && user.name.indexOf(name) === -1 && user.addr.indexOf(name) === -1) return false
            return true
        })
        const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))
        return {
            code: 20000,
            count: mockList.length,
            list: pageList
        }
    },
    /**
     * 增加用户
     * @param name, addr, age, birth, sex
     * @return {{code: number, data: {message: string}}}
     */
    createUser: config => {
        const { name, addr, age, birth, sex } = JSON.parse(config.body)
        console.log(JSON.parse(config.body))
        List.unshift({
            id: Mock.Random.guid(),
            name: name,
            addr: addr,
            age: age,
            birth: birth,
            sex: sex
        })
        return {
            code: 20000,
            data: {
                message: '添加成功'
            }
        }
    },
    /**
     * 删除用户
     * @param id
     * @return {*}
     */
    deleteUser: config => {
        const { id } = JSON.parse(config.body)
        if (!id) {
            return {
                code: -999,
                message: '参数不正确'
            }
        } else {
            List = List.filter(u => u.id !== id)
            return {
                code: 20000,
                message: '删除成功'
            }
        }
    },
    /**
     * 批量删除
     * @param config
     * @return {{code: number, data: {message: string}}}
     */
    batchremove: config => {
        let { ids } = param2Obj(config.url)
        ids = ids.split(',')
        List = List.filter(u => !ids.includes(u.id))
        return {
            code: 20000,
            data: {
                message: '批量删除成功'
            }
        }
    },
    /**
     * 修改用户
     * @param id, name, addr, age, birth, sex
     * @return {{code: number, data: {message: string}}}
     */
    updateUser: config => {
        const { id, name, addr, age, birth, sex } = JSON.parse(config.body)
        const sex_num = parseInt(sex)
        List.some(u => {
            if (u.id === id) {
                u.name = name
                u.addr = addr
                u.age = age
                u.birth = birth
                u.sex = sex_num
                return true
            }
        })
        return {
            code: 20000,
            data: {
                message: '编辑成功'
            }
        }
    }
}

然后修改 mock.js

......
import user from './mockServeData/user'

// 定义mock请求拦截
......

// 用户列表的数据
Mock.mock('/api/user/add','post',user.createUser);
Mock.mock('/api/user/edit','post',user.updateUser);
Mock.mock('/api/user/del','post',user.deleteUser);
Mock.mock('/api/user/getUser',user.getUserList);

然后修改 index.js

......


// 请求首页数据
......

export const getUser = (params)=>{
    // 返回用户列表
    return http.get('/user/getUser',params)
}

// post 和 get 不同,参数是data对象,可以参考:
// https://www.axios-http.cn/docs/api_intro
export const addUser = (data)=>{
    return http.post('/user/add',data)
}

export const editUser = (data)=>{
    return http.post('/user/edit',data)
}

export const delUser = (data)=>{
    return http.post('/user/del',data)
}

在这里插入图片描述

列表最后有两个按钮,分别是编辑和删除,这里用到了自定义列模板

然后 调用接口,展示数据,修改 User.vue。修改和新增公用的一个弹框,所以使用一个变量来进行区分,所以在 data 中新增一个变量:

modalType: 0,// 0表示新增的弹框,1表示编辑的弹框

然后在提交的时候进行判断是新增还是编辑,新增和编辑后都需要重新加载列表来刷新页面,也就是重新调用 getUser 方法,所以可以把这个方法封装下

然后在新建时把 modalType 赋值为 0,同时显示弹框;在编辑时把 modalType 赋值为1,显示弹框的同时,把要修改的数据也显示在弹框中,需要对传过来的 row 进行深拷贝,否则页面的数据也会进行修改了

新增效果如下:
在这里插入图片描述
编辑效果如下:
在这里插入图片描述

进行删除时我们可以使用MessageBox来先进行确认,效果如下:
在这里插入图片描述

完整 User.vue 代码:

<template>
  <div class="manage">
    <el-dialog
        title="提示"
        :visible.sync="dialogVisible"
        :before-close="handleClose"
        width="50%">
      <!--表单数据-->
      <el-form ref="form" :inline="true" :rules="rules" :model="form" label-width="80px">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="form.name" placeholder="请输入姓名"></el-input>
        </el-form-item>
        <el-form-item label="年龄" prop="age">
          <el-input v-model="form.age" placeholder="请输入年龄"></el-input>
        </el-form-item>
        <el-form-item label="性别" prop="sex">
          <el-select v-model="form.sex" placeholder="请选择活动性别">
            <el-option label="男" :value="1"></el-option>
            <el-option label="女" :value="0"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="出生日期" prop="birth">
          <el-date-picker
              v-model="form.birth"
              type="date"
              placeholder="请选择日期"
              value-format="yyyy-MM-DD">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="地址" prop="addr">
          <el-input v-model="form.addr" placeholder="请输入地址"></el-input>
        </el-form-item>
      </el-form>

      <span slot="footer" class="dialog-footer">
        <el-button @click="cancel">取 消</el-button>
        <el-button type="primary" @click="submit">确 定</el-button>
      </span>
    </el-dialog>
    <div class="manage-header">
      <el-button type="primary" @click="handleAdd">+ 新增</el-button>
      <el-table
          :data="tableData"
          style="width: 100%">
        <el-table-column
            prop="name"
            label="姓名"
            width="180">
        </el-table-column>
        <el-table-column
            prop="age"
            label="年龄">
        </el-table-column>
        <el-table-column
            prop="sex"
            label="性别">
          <template slot-scope="scope">
            <span style="margin-left: 10px">{{ scope.row.sex === 1?'男':'女' }}</span>
          </template>
        </el-table-column>
        <el-table-column
            prop="birth"
            label="出生日期">
        </el-table-column>
        <el-table-column
            prop="addr"
            label="地址">
        </el-table-column>
        <el-table-column
            label="操作">
          <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>
    </div>
  </div>
</template>
<script>
import {addUser, delUser, editUser, getUser} from '../api'

export default {
  name: "Home",
  data(){
    return{
      dialogVisible: false,
      form:{
        name:'',
        age:'',
        sex:'',
        birth:'',
        addr:'',
      },
      rules: {
        name: [
          {required: true, message: '请输入姓名', trigger: 'blur'},
        ],
        age: [
          {required: true, message: '请输入年龄', trigger: 'blur'},
        ],
        sex: [
          {required: true, message: '请选择性别', trigger: 'blur'},
        ],
        birth: [
          {required: true, message: '请选择出生日期', trigger: 'blur'},
        ],
        addr: [
          {required: true, message: '请输入地址', trigger: 'blur'},
        ],
      },
      tableData: [],
      modalType: 0,// 0表示新增的弹框,1表示编辑的弹框
    }
  },
  methods: {
    // 用户提交表单
    submit(){
      this.$refs.form.validate((valid)=>{
        if(valid){
          // 后续操作
          if(this.modalType === 0){
            addUser(this.form).then(()=>{
              // 重新获取列表接口
              this.getList();
            })
          }else{
            editUser(this.form).then(()=>{
              this.getList();
            });
          }
          console.log(this.form);
          // 关闭弹窗
          this.dialogVisible = false;
          // 表单内容清空
          this.$refs.form.resetFields();
        }
      })
    },
    handleClose(){
      // 弹框关闭前情况数据
      this.$refs.form.resetFields();
      this.dialogVisible = false;
    },
    cancel(){
      this.handleClose();
    },
    handleEdit(row){
      this.modalType = 1;
      this.dialogVisible = true;
      // 注意,需要对数据进行深拷贝
      this.form = JSON.parse(JSON.stringify(row));
    },
    handleDelete(row){
      this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        console.log('TTT row.id',row.id);
        delUser({id:row.id}).then(()=>{
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
          // 重新获取列表
          this.getList();
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // 获取列表
    getList(){
      getUser().then(({data})=>{
        // console.log('TTT',data);
        this.tableData = data.list;
      })
    },
    handleAdd(){
      this.modalType = 0;
      this.dialogVisible = true;
    }
  },
  mounted() {
    this.getList();
  }
}
</script>

<style scoped>

</style>

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

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

相关文章

金山系不惧微软,前有WPS力扛Office,后有eversheet接力再战

金山软件作为国产互联网元老企业&#xff0c;这里出来的IT大佬不计其数&#xff0c;小米的雷军、逸趣网络的吴裔敏、甜瓜在线的朱勇......金山软件不屈不挠的企业文化&#xff0c;沉淀已久&#xff0c;造就一大批人才&#xff0c;甚至追溯到40年前。 1981年&#xff0c;张旋龙在…

IntelliJ IDEA 闪退的解决办法

场景 最近这idea闪退频率又多了不少 以前 几天一闪退 现在 一天N多次闪退 如下图 看这崩溃日志 这怎么顶 解决办法 查看崩溃日志 日志 1 日志2 日志3 可以看出现在生效的参数 Command Line: -Xms128m -Xmx750m -XX:ReservedCodeCacheSize512m -XX:IgnoreUnrecognized…

SCA技术进阶系列(一):SBOM应用实践初探

现代软件都是组装的而非纯自研。随着开源组件在数字化应用中的使用比例越来越高&#xff0c;混源开发已成为当前业内主流开发方式。开源组件的引入虽然加快了软件开发效率&#xff0c;但同时将开源安全问题引入了整个软件供应链。软件组成成分的透明性成为软件供应链安全保障的…

Flink检查点详解

说白了就是等你要处理的这个或这波数据被所有任务&#xff08;执行完所有算子&#xff09;处理完了 再做检查点保存&#xff08;下图就是三个数据都被map、sum处理完 就做检查点保存 source是读取数据的&#xff09; 下图只是一个检查点的保存过程&#xff08;拆解&#xff09…

Express框架中JWT基础 - 对称|非对称加密

在上一篇内容当中已经使用过了JWT(JSONWebToken)做验证登录&#xff0c;采用的是对称加密的方式&#xff0c;那么在本篇当中来进一步的讲解关于JWT的基础使用对称以及非对称加密&#xff1b;先来简单的回顾上一篇内容当中使用到的对称加密&#xff1a; 对称加密 首先是通过expr…

Kafka架构组成及相关内容

0. 主要参考&#xff1a;1. Kafka基础架构组成&#xff1a;2. Kafka的一些操作命令&#xff1a;3. Kafka 生产者消息发送流程&#xff1a;4. Kafka 的ack机制&#xff1a;5. Kafka 生产者消息发送模式&#xff08;同步/异步&#xff09;&#xff1a;6. Kafka发送消息的分区策略…

元宇宙之声:nspace

nspace 行政总裁为我们介绍他在元宇宙中的最新创作以及对 2023 年的愿景。 本期节目我们邀请了 nspace 行政总裁 Ethan Liu 分享他的 The Sandbox 之旅以及他们的最新创作。 可以告诉我们更多关于 nspace 的信息吗&#xff1f; nspace 是一家专注于开发新的元宇宙商业模式的初创…

html 拖拽事件详解

为了使元素可拖拽&#xff0c;需要在标签上设置draggabletrue属性。 文本、图片和链接是默认可以拖放的&#xff0c;它们的draggable属性自动被设置成了true。 图片和链接按住鼠标左键选中&#xff0c;就可以拖放。 文本只有在被选中的情况下才能拖放。如果显示设置文本的dr…

LinkedIn工具-领英精灵参数怎么设置?

前言&#xff1a; 领英精灵是高端技术人员针对领英平台研发的工具。具有好友分组、备注&#xff0c;一键批量加-好友&#xff0c;批量撤-回邀请&#xff0c;批量群-发消息&#xff0c;批量导出好友资料&#xff0c;批量点-赞、Groups管理七大功能。通过领英精灵可提高领英开发…

Java集合进阶 | Collection接口

本专栏主要是记录学习完本专栏主要是记录学习Java中的知识点&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 JavaWeb&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&#xff08;持续更新中&#xff0…

Three.js入门以及案例(全方位解析)

下载three.js 压缩包 github链接查看所有版本 threejs&#xff1a;https://github.com/mrdoob/three.js/releases 下载即可 常用的文件目录 three.js-文件包 └───build——three.js相关库&#xff0c;可以引入你的.html文件中。│ └───docs——Three.js API文档文件│…

【机器学习算法】模型评估 “神经网络,聚类,向量机,关联规则”算法模型的评估。

模型评估* 数据集的切割 训练-测试数据的方式、交叉验证的方式 我们通常会把数据集切割为训练数据集或者测试数据集&#xff0c;训练数据集用来训练模型用&#xff0c;测试数据集我们一般用来测试模式的实际效能怎么样。 我们在将数据分为训练和测试数据集的时候我们会使用…

go-zero使用consul作为注册中心

目录 在rpc服务中添加配置 导入包&#xff1a; 在rpc服务中添加配置&#xff1a; 引入 Consul config 配置项 user.yml 文件 修改 user.go,将 rpc注册到consul rpc的发现 在api服务中添加配置&#xff1a; 修改api/etc/user.yam 文件 修改 user.yml 修改api/user.go …

@Import的用法

官方定义: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core Using the ImportAnnotation Much as the <import/> element is used within Spring XML files to aid in modularizing configurations, the Import annotat…

一文详解ARP报文格式及工作原理

ARP&#xff08;地址解析协议&#xff09;作用&#xff1a;将目的IP解析为目的MAC&#xff0c;用于二层帧结构的目标MAC封装&#xff0c;数据必须封装为帧才能够被网卡发送出去&#xff0c;帧中必须包含MAC。报文格式&#xff1a;ARP报文不能穿越路由器&#xff0c;不能被转发到…

基于飞桨实现钢铁企业废钢判级迈入智能化道路

目前&#xff0c;国家“双碳”战略与“数据智能”环境正驱动着钢铁企业废钢判级迈入智能化道路。针对生产过程中带来高能耗和高污染问题&#xff0c;企业通过使用飞桨用友废钢智能判级系统&#xff0c;助力提升自身经济效益和安全生产水平。 建设背景 目前&#xff0c;国家“双…

如何在IDEA中创建Web项目

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

QT入门Buttons之QToolButton

目录 一、界面布局介绍 1、布局器中的位置及使用 2、控件的界面属性 2.1对象名称和大小设置 2.2对象文本设置和鼠标箭头更改 2.3、扁平化样式 二、属性功能介绍 1、显示箭头属性 2、按钮风格 3、添加默认action属性 三、Demo展示 此文为作者原创&#xff0c;转载请标…

Web前端:提高React Native应用程序性能的技巧

不可否认&#xff0c;React Native是开发混合应用的未来。它提供了可扩展性、灵活性、速度、敏捷性、成本效益和卓越的性能。难怪这么多成功的公司依赖React Native来构建他们的应用程序。毕竟&#xff0c;在互联网时代&#xff0c;每个企业都需要一个高性能的应用程序来满足客…

PCB如何进行阻抗设计经验总结

&#x1f3e1;《总目录》 目录1&#xff0c; 什么是阻抗匹配2&#xff0c;为何要阻抗匹配3&#xff0c;阻抗设计经验1&#xff0c; 什么是阻抗匹配 阻抗是指电路中两点间电阻&#xff0c;电感和电容的总称。而阻抗匹配是指&#xff0c;传输线及传输线两端的电子元器件的输入或输…