使用Vue+elementUI实现CRUD

news2024/11/26 16:49:50

文章目录

  • 前言
  • 一、简介
  • 二、使用Vue-Cli搭建Vue项目
    • 1. vue-cli 介绍
    • 2.axios.js 介绍
    • 3.Element-Ul 介绍
    • 4.moment.js 介绍
    • 5.搭建项目
    • 6.添加main.js配置
    • 7.修改App.vue
    • 8. 将moment.js 格式 Date 类型引入
    • 9. 加入分页
    • 10. 实现删除
    • 11. 实现添加
    • 12. 实现修改
  • 总结


前言

最近了解了一下前端框架VUE,来记录一下


一、简介

Vue官网https://cn.vuejs.org/

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

来自官网的简介…不说了直接上手吧

二、使用Vue-Cli搭建Vue项目

1. vue-cli 介绍

官网地址:https://cli.vuejs.org/zh/

cli: Command Line 命令行工具,vue-cli就是vue的命令行工具,也称之为脚手架,使用vue-cli提供的各种命令可以拉取、创建、运行我们需要使用到的框架,比如webpack、Element UI、Element Admin等等。那么要想使用vue-cli命令,需要先安装node.js。

node.js提供了前端程序的运行环境,可以把node.js理解成是运行前端程序的服务器。
下载地址:http://nodejs.cn/download/

2.axios.js 介绍

Axios 是一个开源的可以用在浏览器端和 NodeJS 的异步通信框架,她的主要作用就是实现 AJAX 异步通信,其功能特点如下:

  • 从浏览器中创建 XMLHttpRequest
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF(跨站请求伪造)

由于 Vue.js 是一个 视图层框架 并且作者(尤雨溪)严格准守 SoC (关注度分离原则),所以 Vue.js 并不包含 AJAX 的通信功能,为了解决通信问题,作者单独开发了一个名为 vue-resource 的插件,不过在进入 2.0 版本以后停止了对该插件的维护并推荐了 Axios 框架

官网地址:http://www.axios-js.com/

3.Element-Ul 介绍

Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是Mint UI

官网地址:https://element.eleme.cn/#/zh-CN/component/installation

4.moment.js 介绍

moment.js是一个JavaScript的日期和时间处理工具类,提供了非常全面且强悍的日期处理功能

官网地址:http://momentjs.cn/

5.搭建项目

在 Terminal 下使用npm构建项目
1.首先安装Node.js(傻瓜式安装,安装之后可能需要重启)

2.npm install -g @vue/cli #安装vue-cli,该步骤需要等一段时间,若无法安装可使用:npm install -g @vue/cli --force

3.vue -V #查看vue-cli的版本

4.vue create my-app #创建名为my-app的项目(选择vue-cli2.0)

5.my-app>npm install axios vue-axios element-ui --save #安装axios,vue-axios和element-ui

6.my-app>npm install moment --save #安装格式化时间日期的moment.js

7.my-app>npm run serve #启动项目 如果无法启动可以使用:npm run dev

然后访问http://localhost:8080/ 会显示 HelloWorld.vue 该组件的页面
在这里插入图片描述

vue-cli 项目启动时,默认端口为8080,可以在 node_modules@vue\cli-service\lib\commands 目录下,修改serve.js 文件,具体如下:

const defaults = {
  host: '0.0.0.0',
  port: 8080,
  https: false
}

6.添加main.js配置

我们需要在main.js中添加如下配置

main.js是程序的入口,需要引入以下内容(注意不要放在最后一行

// 如下两个是网络的请求组件
import VueAxios from "vue-axios";
import axios from 'axios'

// ElmentUI的组件
import ElementUI from 'element-ui'
// ElementUI的样式
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(VueAxios, axios)
Vue.use(ElementUI)

// 设置默认访问后台url基础地址
axios.defaults.baseURL = 'http://localhost:8081'

7.修改App.vue

注意:el-table-column 标签中的 prop属性 对应的是实体类的属性名

<template>
  <el-container>
    <el-header>管理系统</el-header>
    <el-container>
      <el-aside>系统列表</el-aside>
      <el-main>
        <el-table
                :data="musics"
                border
                style="width: 100%">
          <el-table-column
                  align="center"
                  prop="musicId"
                  label="编号"
                  width="100">
          </el-table-column>
          <el-table-column
                  align="center"
                  prop="musicName"
                  label="歌曲名称"
                  width="180">
          </el-table-column>
          <el-table-column
                  align="center"
                  prop="musicAlbumName"
                  label="专辑名称"
                  width="180">
          </el-table-column>
          <el-table-column
                  align="center"
                  prop="musicArtistName"
                  label="歌手名称">
          </el-table-column>
        </el-table>
      </el-main>
    </el-container>

  </el-container>
</template>

<script>

export default {
  name: 'App',
  components: {
    //HelloWorld
  },

  data(){
    return{
      musics:[]
    }
  },

  mounted() {

    // 第一种方式
    // let that = this;
    // this.axios.get('/music/findAll')
    //         .then(function (response) {
    //           that.musics = response.data;
    //         })
    //         .catch(function (error) {
    //           console.log(error);
    //         });

    // 第二种方式
    // this.axios.get('/music/findAll')
    //         .then(resp => {
    //           // resp.data才是实际的数据本身
    //           this.musics = resp.data;
    //           alert(this.musics)
    //         })

    // 第三种方式
    this.$http.get('/music/findAll').then((response) => {
      this.musics = response.data;
    })
  },
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

<!-- 设置容器样式 -->
<style>
  .el-header {
    background-color: #409EFF;
    color: #ffffff;
    line-height: 60px;
    font-size: 28px;
  }

  .el-aside {
    background-color: #e3e3e3;
    width: 180px !important;
  }

  .el-pagination {
    text-align: center;
    margin-top: 10px;
  }

  .el-table {
    margin-top: 10px;
  }
</style>

其中,

  • templet标签是我们的也买你元素的位置,这里就是页面上直接展示的效果,可以去elementUI的官方网站,找到表格的组件,copy过来,修改成自己的东西,
  • script标签则是我们写页面操作动态逻辑的地方,包括数据获取,页面操作这些,其中data是数据存放的地方,可以直接由后端接口获取然后赋值。
  • style是整个页面的样式。
  • mount则是挂载我们的方法,发送ajax请求的地方,所有的接口请求都需要写在这里
    还有另外一种写法,可以将请求接口的方法,放在一个单独的js文件中,然后将其方法引入当前vue文件例如:
    在这里插入图片描述
    然后在js文件中编写对应的方法,这种方式,调用方法需要在methods中引用
    在这里插入图片描述
    注意:上述截图和本次演示代码无关

8. 将moment.js 格式 Date 类型引入

在 main.js 引入 moment.js

import moment from 'moment'
Vue.use(moment)

在当前组件中

let moment = require("moment");

在日期列添加属性

<el-table-column
    align="center"
    prop="createTime"
    label="时间"
    :formatter="formatDate"
    width="180">
</el-table-column>

在methods中添加对应的的方法

methods:{
    formatDate(row, column, currValue) {
      moment.locale("zh-cn"); 
      return moment(currValue).format('YYYY-MM-DD');
    }
}

9. 加入分页

修改 data

data(){
    return{
      musics:[],
      total:0,
      pageSize:0
    }
  },

添加分页标签

<el-pagination
    background
    layout="prev, pager, next"
    :total="total"
    :page-size="pageSize"
    @current-change="toPage">
</el-pagination>

修改 methods

methods:{
    formatDate(row,column,currVal){
      return moment(currVal).format("YYYY-MM-DD")
    },
    toPage(currPage){
      this.axios.get('/music/findByPage?pageNum='+currPage)
              .then(resp => {
                // resp.data才是实际的数据本身
                this.musics = resp.data.list;
                //alert(this.musics)
                this.total = resp.data.total
                this.pageSize = resp.data.pageSize
              })
    }
  },

修改 mounted

mounted() {

    this.axios.get('/music/findByPage')
            .then(resp => {
              // resp.data才是实际的数据本身
              this.musics = resp.data.list;
              //alert(this.musics)
              this.total = resp.data.total
              this.pageSize = resp.data.pageSize
            })
  },

10. 实现删除

添加标签

<el-table-column label="操作">
  <template slot-scope="scope">
   <el-button
    size="mini" type="primary" icon="el-icon-edit"
    @click="updateById(scope.row.musicId)">编辑</el-button>
   <el-button
    size="mini" type="danger" icon="el-icon-delete"
    @click="deleteById(scope.row.musicId)">删除</el-button>
 </template>
</el-table-column>

修改 data 以及 methods

 data(){
    return{
      musics:[],
      total:0,
      pageSize:0,
      currentPage:1
    }
  },

  methods:{
    formatDate(row,column,currVal){
      return moment(currVal).format("YYYY-MM-DD")
    },
    toPage(currPage){
      this.axios.get('/music/findByPage?pageNum='+currPage)
              .then(resp => {
                // resp.data才是实际的数据本身
                this.musics = resp.data.list;
                //alert(this.musics)
                this.total = resp.data.total
                this.pageSize = resp.data.pageSize
                this.currentPage = resp.data.pageNum
              })
    },
    deleteById(musicId){

      this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {

        this.axios.get('/music/deleteById?musicId='+musicId)
                .then(resp => {
                  if(resp.data == 'success'){
                    this.toPage(this.currentPage);
                  }
                })

        this.$message({
          type: 'success',
          message: '删除成功!'
        });
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    }
  },

如果删除成功,页面没有跳转,需要去后端配置 pagehelper

pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true

11. 实现添加

在 el-main 标签中增加添加按钮

<!-- 添加歌曲按钮 -->
<el-button type="success" @click="dialogVisible = true" >添加歌曲</el-button>

添加 add 的对话框

<el-dialog
                title="添加歌曲"
                :visible.sync="dialogVisible"
                width="30%"
                :before-close="handleClose">

          <el-form :model="musicModel" :rules="musicRules" ref="musicForm">
            <el-form-item label="歌曲名称" prop="musicName">
              <el-input v-model="musicModel.musicName"></el-input>
            </el-form-item>
            <el-form-item label="专辑" prop="musicAlbumName">
              <el-input v-model="musicModel.musicAlbumName"></el-input>
            </el-form-item>
            <el-form-item label="歌手" prop="musicArtistName">
              <el-input v-model="musicModel.musicArtistName"></el-input>
            </el-form-item>
            <el-form-item label="时间" prop="createTime">
              <el-date-picker type="date" placeholder="选择日期" v-model="musicModel.createTime" style="width: 100%;"></el-date-picker>
            </el-form-item>

            <el-form-item>
              <el-button type="primary" @click="submitForm('musicForm')">立即创建</el-button>
              <el-button @click="resetForm('musicForm')">重置</el-button>
            </el-form-item>
          </el-form>

        </el-dialog>

修改 data

data(){
    return{
      musics:null,
      total:null,
      currentPage:null,

      //设置添加歌曲的对话框默认不显示
      dialogVisible: false,

      //添加歌曲的模型
      musicModel: {
        musicName: '',
        musicAlbumName: '',
        musicArtistName: '',
        createTime: ""
      },
      //添加歌曲的规则
      musicRules: {
        musicName: [
          {required: true, message: '请输入歌曲名称', trigger: 'blur'}
        ]
      }

    }
 }

在 method 中添加方法

//校验添加表单
submitForm(formName) {
    this.$refs[formName].validate((valid) => {
        if (valid) {
            //alert(this.musicModel);
            //添加歌曲,需要注意必须post方式提交,后台使用@RequestBody获取
            this.axios.post("/music/addMusic",this.musicModel).then((response) => {
                if(response.data == "success"){
                    //隐藏对话框(添加页面)
                    this.dialogVisible = false
                        //重置添加表单
                        this.$refs[formName].resetFields();
                    //添加完之后刷新页面
                    location.reload();
                }
            })

        } else {
            console.log('error submit!!');
            return false;
        }
    });
},
//重置添加表单
resetForm(formName) {
    this.$refs[formName].resetFields();
},

12. 实现修改

创建修改对话框

  <!-- 修改的对话框 -->
        <el-dialog
                title="修改歌曲"
                :visible.sync="updatedialogVisible"
                width="30%"
                :before-close="handleClose">

          <el-form :model="updatemusicModel" :rules="updatemusicRules" ref="updatemusicForm">
            <el-form-item label="歌曲ID" prop="musicId">
              <el-input v-model="updatemusicModel.musicId" readonly="readonly"></el-input>
            </el-form-item>
            <el-form-item label="歌曲名称" prop="musicName">
              <el-input v-model="updatemusicModel.musicName"></el-input>
            </el-form-item>
            <el-form-item label="专辑" prop="musicAlbumName">
              <el-input v-model="updatemusicModel.musicAlbumName"></el-input>
            </el-form-item>
            <el-form-item label="歌手" prop="musicArtistName">
              <el-input v-model="updatemusicModel.musicArtistName"></el-input>
            </el-form-item>
            <el-form-item label="时间" prop="createTime">
              <el-date-picker type="date" placeholder="选择日期" v-model="updatemusicModel.createTime" style="width: 100%;"></el-date-picker>
            </el-form-item>

            <el-form-item>
              <el-button type="primary" @click="updatesubmitForm('updatemusicForm')">修改</el-button>
              <el-button @click="resetForm('updatemusicForm')">重置</el-button>
            </el-form-item>
          </el-form>

        </el-dialog>

在data中添加数据

//设置修改歌曲的对话框默认不显示
updatedialogVisible: false,

//修改歌曲的模型
updatemusicModel: {
    musicId:'',
    musicName: '',
    musicAlbumName: '',
    musicArtistName: '',
    createTime: ""
},

//修改歌曲的规则
updatemusicRules: {
    musicName: [
        {required: true, message: '请输入修改的歌曲名称', trigger: 'blur'},
        { min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur' }
    ]
}

修改methods中的方法

//修改之前先查询单个对象
handleEdit(musicId) {
    this.$http.get("/music/findByMusicId?musicId="+musicId).then((response) => {
        this.updatemusicModel = response.data;
        this.updatedialogVisible = true;
    })
},

//修改表单提交
//校验添加表单
updatesubmitForm(formName) {
    this.$refs[formName].validate((valid) => {
        if (valid) {
            //alert(this.musicModel);
            //修改歌曲,需要注意必须post方式提交,后台使用@RequestBody获取
            this.axios.post("/music/updateMusic",this.updatemusicModel).then((response) => {
                if(response.data == "success"){
                    //隐藏对话框(添加页面)
                    this.updatedialogVisible = false
                        //重置添加表单
                        this.$refs[formName].resetFields();
                    //添加完之后刷新页面
                    location.reload();
                }
            })

        } else {
            console.log('error submit!!');
            return false;
        }
    });
},

updateresetForm(formName) {
    this.$refs[formName].resetFields();
}

总结

以上即是使用elementUI实现的增删改查,当然不包括后端的接口,算是作为后端开发者,对于前端开发的第一个demo吧

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

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

相关文章

Qt 模态 非模态对话框 半模态 不阻塞对话框

Part1&#xff1a; 什么是模态和非模态对话框 对话框分为模态对话框和非模态对话框。 所谓模态对话框 所谓模态对话框&#xff0c;会阻塞同一应用程序中其它窗口的输入。同时会阻塞当前线程&#xff1b;程序不再下执行&#xff1b; 关闭 窗口&#xff0c;执行下面的代码&a…

从Nginx学习如何获取时间

最近因为工作接触到Nginx的学习&#xff0c;我就把Nginx的源代码下载下来&#xff0c;然后对其进行了分析。发现Nginx的性能强大离不开作者编码的苦心&#xff0c;作者将C的性能发挥到了极致&#xff0c;每个变量都用得非常出神入化。有如此强大的功能&#xff0c;才支撑了全球…

React:从 npx开始

使用 npm 来创建第一个 recat 文件&#xff08; react-demo 是文件名&#xff0c;可以自定义&#xff09; npx create-react-app react-demo npx是 npm v5.2 版本新添加的命令&#xff0c;用来简化 npm 中工具包的使用 原始&#xff1a; 全局安装npm i -g create-react-app 2 …

格式工厂5.10.0版本安装

目前格式工厂有很多&#xff0c;大多都可以进行视频转换 之前遇到一个用ffmpeg拉流保存的MP4在vlc和迅雷都无法正常播放的问题&#xff0c;发现视频长度不对&#xff0c;声音也不对&#xff0c;最后换到了格式工厂的格式播放器是可以正常播放的 格式工厂下载之家的地址 http…

【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 7 月 20 日&#xff0c;在 2005 年的今天&#xff0c;时任微软全球副总裁的李开复加盟谷歌担任谷歌全球副总裁及中国区总裁。谷歌公司在发布聘请李开复消息的同…

ffplay播放器剖析(5)----视频输出剖析

文章目录 1.视频输出模块1.1 视频输出初始化1.1.1 视频输出初始化主要流程1.1.2 calculate_display_rect初始化显示窗口大小 1.2 视频输出逻辑1.2.1 event_loop开始处理SDL事件1.2.2 video_refresh1.2.2.1 计算上一帧显示时长,判断是否还要继续上一帧1.2.2.2 估算当前帧显示时长…

数据结构——(一)绪论

&#x1f449;数据元素整体思维导图 欢迎补充 一、基本概念❤️ 1.1基本术语⭐️ &#xff08;1&#xff09;数据 客观事务属性的数字、字符。 &#xff08;2&#xff09;数据元素 数据元素是数据的基本单位&#xff0c;一个数据元素可由若干数据项组成&#xff0c;数据项是…

【测试开发】Python+Django实现接口测试工具

PythonDjango接口自动化 引言&#xff1a; 最近被几个公司实习生整自闭了&#xff0c;没有基础&#xff0c;想学自动化又不知道怎么去学&#xff0c;没有方向没有头绪&#xff0c;说白了其实就是学习过程中没有成就感&#xff0c;所以学不下去。出于各种花里胡哨的原因&#xf…

C语言第七课----------函数的定义及使用--------C语言重要一笔

作者前言 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________ 目录 1.函数是什么 2. 库函数 3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声…

《向量数据库指南》:使用公共的Pinecone数据集

目录 数据集包含向量和元数据 列出公共数据集 加载数据集 迭代数据集 分批迭代文档并插入到索引中。 将数据集插入为数据帧。 接下来怎么做 本文档介绍如何使用现有的Pinecone数据集。 要了解创建和列出数据集的方法,请参阅创建数据集。 数据集包含向量和元数据 P…

C++的对象优化经验

先看一个例子&#xff1a; class Test{ private:int ma;public:Test(int a 0) : ma(a) { cout << "Test(int a)" << endl; }~Test() { cout << "~Test" << endl; }Test(const Test &t){ma t.ma;cout << "Test(c…

【软件工程中的各种图】

1、用例图&#xff08;use case diagrams&#xff09; 【概念】描述用户需求&#xff0c;从用户的角度描述系统的功能 【描述方式】椭圆表示某个用例&#xff1b;人形符号表示角色 【目的】帮组开发团队以一种可视化的方式理解系统的功能需求 【用例图】 2、静态图(Static …

CXL Bias Mode (1) - Bias Mode 背景与分类

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

波奇学C++:实现一个简单的vector以及避开雷

vector的文档&#xff1a;vector - C Reference (cplusplus.com)​​​​​ 什么是vector&#xff1f; vector是数组。vector空间连续&#xff0c;可变大小&#xff0c;可存放自定义类型。 vector简单的使用 vector<int> v; //int型实例化 v.push_back(1);//插入数据 …

selenium定位rect元素

rect元素属性 rect元素的属性如下&#xff1a; x&#xff1a;此属性确定矩形的x坐标。 值类型&#xff1a;| ; 默认值&#xff1a;0 动画&#xff1a;是y&#xff1a;此属性确定矩形的y坐标。 值类型&#xff1a;| ; 默认值&#xff1a;0 动画&#xff1a;是width&#xff1a…

Web后端开发总结

后端web开发大致流程 和对应的核心技术 对应技术的来源 springMVC可以理解为spring框架中的web开发框架 springMVCSpringMybatis就是我们熟知的ssm框架了

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 21 日论文合集)

文章目录 一、检测相关(15篇)1.1 Representation Learning in Anomaly Detection: Successes, Limits and a Grand Challenge1.2 AlignDet: Aligning Pre-training and Fine-tuning in Object Detection1.3 Cascade-DETR: Delving into High-Quality Universal Object Detectio…

K8S初级入门系列之十一-安全

一、前言 安全是K8S重要的特性&#xff0c;在K8S初级入门系列之四-Namespace/ConfigMap/Secret章节&#xff0c;我们已经已经了解了Namespace&#xff0c;Secret与安全相关的知识。本篇将梳理K8S在安全方面的策略。主要包括两个方面&#xff0c;API安全访问策略以及Pod安全策略…

C++ 之命名空间namespace【详解】

文章目录 一&#xff0c;命名空间出现的意义二&#xff0c;命名空间的定义命名空间里面可以包含变量&#xff0c;函数&#xff0c;类型&#xff1a;命名空间不可以定义在局部作用域&#xff1a;命名空间可以嵌套&#xff1a; 三&#xff0c;同一个工程中允许存在多个相同名称的…

vue-cli项目中,使用webpack-bundle-analyzer进行模块分析,查看各个模块的体积,方便后期代码优化

一、安装 npm install --save-dev webpack-bundle-analyzer 二、在vue.config.js中配置 const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin plugins: [new BundleAnalyzerPlugin({analyzerMode: server,analyzerHost: 127.0.0.1,analyze…