使用Vue+elementUI实现CRUD

客官°小女子只卖身不卖艺 2024-03-25 14:14 148阅读 0赞

文章目录

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

前言

最近了解了一下前端框架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 文件,具体如下:

  1. const defaults = {
  2. host: '0.0.0.0',
  3. port: 8080,
  4. https: false
  5. }

6.添加main.js配置

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

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

  1. // 如下两个是网络的请求组件
  2. import VueAxios from "vue-axios";
  3. import axios from 'axios'
  4. // ElmentUI的组件
  5. import ElementUI from 'element-ui'
  6. // ElementUI的样式
  7. import 'element-ui/lib/theme-chalk/index.css'
  8. Vue.use(VueAxios, axios)
  9. Vue.use(ElementUI)
  10. // 设置默认访问后台url基础地址
  11. axios.defaults.baseURL = 'http://localhost:8081'

7.修改App.vue

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

  1. <template>
  2. <el-container>
  3. <el-header>管理系统</el-header>
  4. <el-container>
  5. <el-aside>系统列表</el-aside>
  6. <el-main>
  7. <el-table
  8. :data="musics"
  9. border
  10. style="width: 100%">
  11. <el-table-column
  12. align="center"
  13. prop="musicId"
  14. label="编号"
  15. width="100">
  16. </el-table-column>
  17. <el-table-column
  18. align="center"
  19. prop="musicName"
  20. label="歌曲名称"
  21. width="180">
  22. </el-table-column>
  23. <el-table-column
  24. align="center"
  25. prop="musicAlbumName"
  26. label="专辑名称"
  27. width="180">
  28. </el-table-column>
  29. <el-table-column
  30. align="center"
  31. prop="musicArtistName"
  32. label="歌手名称">
  33. </el-table-column>
  34. </el-table>
  35. </el-main>
  36. </el-container>
  37. </el-container>
  38. </template>
  39. <script>
  40. export default {
  41. name: 'App',
  42. components: {
  43. //HelloWorld
  44. },
  45. data(){
  46. return{
  47. musics:[]
  48. }
  49. },
  50. mounted() {
  51. // 第一种方式
  52. // let that = this;
  53. // this.axios.get('/music/findAll')
  54. // .then(function (response) {
  55. // that.musics = response.data;
  56. // })
  57. // .catch(function (error) {
  58. // console.log(error);
  59. // });
  60. // 第二种方式
  61. // this.axios.get('/music/findAll')
  62. // .then(resp => {
  63. // // resp.data才是实际的数据本身
  64. // this.musics = resp.data;
  65. // alert(this.musics)
  66. // })
  67. // 第三种方式
  68. this.$http.get('/music/findAll').then((response) => {
  69. this.musics = response.data;
  70. })
  71. },
  72. }
  73. </script>
  74. <style>
  75. #app {
  76. font-family: Avenir, Helvetica, Arial, sans-serif;
  77. -webkit-font-smoothing: antialiased;
  78. -moz-osx-font-smoothing: grayscale;
  79. text-align: center;
  80. color: #2c3e50;
  81. margin-top: 60px;
  82. }
  83. </style>
  84. <!-- 设置容器样式 -->
  85. <style>
  86. .el-header {
  87. background-color: #409EFF;
  88. color: #ffffff;
  89. line-height: 60px;
  90. font-size: 28px;
  91. }
  92. .el-aside {
  93. background-color: #e3e3e3;
  94. width: 180px !important;
  95. }
  96. .el-pagination {
  97. text-align: center;
  98. margin-top: 10px;
  99. }
  100. .el-table {
  101. margin-top: 10px;
  102. }
  103. </style>

其中,

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

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

在 main.js 引入 moment.js

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

在当前组件中

  1. let moment = require("moment");

在日期列添加属性

  1. <el-table-column
  2. align="center"
  3. prop="createTime"
  4. label="时间"
  5. :formatter="formatDate"
  6. width="180">
  7. </el-table-column>

在methods中添加对应的的方法

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

9. 加入分页

修改 data

  1. data(){
  2. return{
  3. musics:[],
  4. total:0,
  5. pageSize:0
  6. }
  7. },

添加分页标签

  1. <el-pagination
  2. background
  3. layout="prev, pager, next"
  4. :total="total"
  5. :page-size="pageSize"
  6. @current-change="toPage">
  7. </el-pagination>

修改 methods

  1. methods:{
  2. formatDate(row,column,currVal){
  3. return moment(currVal).format("YYYY-MM-DD")
  4. },
  5. toPage(currPage){
  6. this.axios.get('/music/findByPage?pageNum='+currPage)
  7. .then(resp => {
  8. // resp.data才是实际的数据本身
  9. this.musics = resp.data.list;
  10. //alert(this.musics)
  11. this.total = resp.data.total
  12. this.pageSize = resp.data.pageSize
  13. })
  14. }
  15. },

修改 mounted

  1. mounted() {
  2. this.axios.get('/music/findByPage')
  3. .then(resp => {
  4. // resp.data才是实际的数据本身
  5. this.musics = resp.data.list;
  6. //alert(this.musics)
  7. this.total = resp.data.total
  8. this.pageSize = resp.data.pageSize
  9. })
  10. },

10. 实现删除

添加标签

  1. <el-table-column label="操作">
  2. <template slot-scope="scope">
  3. <el-button
  4. size="mini" type="primary" icon="el-icon-edit"
  5. @click="updateById(scope.row.musicId)">编辑</el-button>
  6. <el-button
  7. size="mini" type="danger" icon="el-icon-delete"
  8. @click="deleteById(scope.row.musicId)">删除</el-button>
  9. </template>
  10. </el-table-column>

修改 data 以及 methods

  1. data(){
  2. return{
  3. musics:[],
  4. total:0,
  5. pageSize:0,
  6. currentPage:1
  7. }
  8. },
  9. methods:{
  10. formatDate(row,column,currVal){
  11. return moment(currVal).format("YYYY-MM-DD")
  12. },
  13. toPage(currPage){
  14. this.axios.get('/music/findByPage?pageNum='+currPage)
  15. .then(resp => {
  16. // resp.data才是实际的数据本身
  17. this.musics = resp.data.list;
  18. //alert(this.musics)
  19. this.total = resp.data.total
  20. this.pageSize = resp.data.pageSize
  21. this.currentPage = resp.data.pageNum
  22. })
  23. },
  24. deleteById(musicId){
  25. this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
  26. confirmButtonText: '确定',
  27. cancelButtonText: '取消',
  28. type: 'warning'
  29. }).then(() => {
  30. this.axios.get('/music/deleteById?musicId='+musicId)
  31. .then(resp => {
  32. if(resp.data == 'success'){
  33. this.toPage(this.currentPage);
  34. }
  35. })
  36. this.$message({
  37. type: 'success',
  38. message: '删除成功!'
  39. });
  40. }).catch(() => {
  41. this.$message({
  42. type: 'info',
  43. message: '已取消删除'
  44. });
  45. });
  46. }
  47. },

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

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

11. 实现添加

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

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

添加 add 的对话框

  1. <el-dialog
  2. title="添加歌曲"
  3. :visible.sync="dialogVisible"
  4. width="30%"
  5. :before-close="handleClose">
  6. <el-form :model="musicModel" :rules="musicRules" ref="musicForm">
  7. <el-form-item label="歌曲名称" prop="musicName">
  8. <el-input v-model="musicModel.musicName"></el-input>
  9. </el-form-item>
  10. <el-form-item label="专辑" prop="musicAlbumName">
  11. <el-input v-model="musicModel.musicAlbumName"></el-input>
  12. </el-form-item>
  13. <el-form-item label="歌手" prop="musicArtistName">
  14. <el-input v-model="musicModel.musicArtistName"></el-input>
  15. </el-form-item>
  16. <el-form-item label="时间" prop="createTime">
  17. <el-date-picker type="date" placeholder="选择日期" v-model="musicModel.createTime" style="width: 100%;"></el-date-picker>
  18. </el-form-item>
  19. <el-form-item>
  20. <el-button type="primary" @click="submitForm('musicForm')">立即创建</el-button>
  21. <el-button @click="resetForm('musicForm')">重置</el-button>
  22. </el-form-item>
  23. </el-form>
  24. </el-dialog>

修改 data

  1. data(){
  2. return{
  3. musics:null,
  4. total:null,
  5. currentPage:null,
  6. //设置添加歌曲的对话框默认不显示
  7. dialogVisible: false,
  8. //添加歌曲的模型
  9. musicModel: {
  10. musicName: '',
  11. musicAlbumName: '',
  12. musicArtistName: '',
  13. createTime: ""
  14. },
  15. //添加歌曲的规则
  16. musicRules: {
  17. musicName: [
  18. {
  19. required: true, message: '请输入歌曲名称', trigger: 'blur'}
  20. ]
  21. }
  22. }
  23. }

在 method 中添加方法

  1. //校验添加表单
  2. submitForm(formName) {
  3. this.$refs[formName].validate((valid) => {
  4. if (valid) {
  5. //alert(this.musicModel);
  6. //添加歌曲,需要注意必须post方式提交,后台使用@RequestBody获取
  7. this.axios.post("/music/addMusic",this.musicModel).then((response) => {
  8. if(response.data == "success"){
  9. //隐藏对话框(添加页面)
  10. this.dialogVisible = false
  11. //重置添加表单
  12. this.$refs[formName].resetFields();
  13. //添加完之后刷新页面
  14. location.reload();
  15. }
  16. })
  17. } else {
  18. console.log('error submit!!');
  19. return false;
  20. }
  21. });
  22. },
  23. //重置添加表单
  24. resetForm(formName) {
  25. this.$refs[formName].resetFields();
  26. },

12. 实现修改

创建修改对话框

  1. <!-- 修改的对话框 -->
  2. <el-dialog
  3. title="修改歌曲"
  4. :visible.sync="updatedialogVisible"
  5. width="30%"
  6. :before-close="handleClose">
  7. <el-form :model="updatemusicModel" :rules="updatemusicRules" ref="updatemusicForm">
  8. <el-form-item label="歌曲ID" prop="musicId">
  9. <el-input v-model="updatemusicModel.musicId" readonly="readonly"></el-input>
  10. </el-form-item>
  11. <el-form-item label="歌曲名称" prop="musicName">
  12. <el-input v-model="updatemusicModel.musicName"></el-input>
  13. </el-form-item>
  14. <el-form-item label="专辑" prop="musicAlbumName">
  15. <el-input v-model="updatemusicModel.musicAlbumName"></el-input>
  16. </el-form-item>
  17. <el-form-item label="歌手" prop="musicArtistName">
  18. <el-input v-model="updatemusicModel.musicArtistName"></el-input>
  19. </el-form-item>
  20. <el-form-item label="时间" prop="createTime">
  21. <el-date-picker type="date" placeholder="选择日期" v-model="updatemusicModel.createTime" style="width: 100%;"></el-date-picker>
  22. </el-form-item>
  23. <el-form-item>
  24. <el-button type="primary" @click="updatesubmitForm('updatemusicForm')">修改</el-button>
  25. <el-button @click="resetForm('updatemusicForm')">重置</el-button>
  26. </el-form-item>
  27. </el-form>
  28. </el-dialog>

在data中添加数据

  1. //设置修改歌曲的对话框默认不显示
  2. updatedialogVisible: false,
  3. //修改歌曲的模型
  4. updatemusicModel: {
  5. musicId:'',
  6. musicName: '',
  7. musicAlbumName: '',
  8. musicArtistName: '',
  9. createTime: ""
  10. },
  11. //修改歌曲的规则
  12. updatemusicRules: {
  13. musicName: [
  14. {
  15. required: true, message: '请输入修改的歌曲名称', trigger: 'blur'},
  16. {
  17. min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur' }
  18. ]
  19. }

修改methods中的方法

  1. //修改之前先查询单个对象
  2. handleEdit(musicId) {
  3. this.$http.get("/music/findByMusicId?musicId="+musicId).then((response) => {
  4. this.updatemusicModel = response.data;
  5. this.updatedialogVisible = true;
  6. })
  7. },
  8. //修改表单提交
  9. //校验添加表单
  10. updatesubmitForm(formName) {
  11. this.$refs[formName].validate((valid) => {
  12. if (valid) {
  13. //alert(this.musicModel);
  14. //修改歌曲,需要注意必须post方式提交,后台使用@RequestBody获取
  15. this.axios.post("/music/updateMusic",this.updatemusicModel).then((response) => {
  16. if(response.data == "success"){
  17. //隐藏对话框(添加页面)
  18. this.updatedialogVisible = false
  19. //重置添加表单
  20. this.$refs[formName].resetFields();
  21. //添加完之后刷新页面
  22. location.reload();
  23. }
  24. })
  25. } else {
  26. console.log('error submit!!');
  27. return false;
  28. }
  29. });
  30. },
  31. updateresetForm(formName) {
  32. this.$refs[formName].resetFields();
  33. }

总结

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

发表评论

表情:
评论列表 (有 0 条评论,148人围观)

还没有评论,来说两句吧...

相关阅读