欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

程序员文章站 2022-03-07 18:55:55
1.Vue框架JavaScript升级版,JS它脚本语言,Vue框架语言它my生命,api工具类文章中心思想,有生命力Vue框架思想,MVVM框架思想,数据驱动思想,组件化思想2.j2ee框架分层思想淋漓尽致体现,MVC(model view controller)MVVM(model view viewmodel)model:代表数据view:代表页面展现viewmodel:代表如何在页面中展示数据数据和页面代码分离JSP,页面html代码和数据的代码交织大型项目:<%=...

1.Vue框架

JavaScript升级版,JS它脚本语言,Vue框架
语言它my生命,api工具类
文章中心思想,有生命力
Vue框架思想,MVVM框架思想,数据驱动思想,组件化思想

2.j2ee框架分层思想淋漓尽致体现,MVC(model view controller)

MVVM(model view viewmodel)

model:代表数据
view:代表页面展现
viewmodel:代表如何在页面中展示数据

数据和页面代码分离
JSP,页面html代码和数据的代码交织
大型项目:

<%=msg%>
如果上百行div你还能分清楚哪个是哪个吗?

分层体系对小系统而言,复杂,但是对大系统而言结构清晰,各司其职。
分层体系可以针对每个层进行优化

3.渐进式框架

一般的框架的特点,全盘接收,要么全部使用,要么你就别用!
Vue天生可以按需配置,你需要什么部分的功能,我就提供什么部分的功能,你需要全部功能,那我就给你全部功能。

a.核心core Vue.js
可以只使用vue.js
可以只使用vue.js + components组件
可以只使用vue.js + components组件 + router路由
可以只使用vue.js + components组件 + router路由 + vuex状态管理
构建大型vue项目:npm(包依赖) + webpack(打包、压缩、合并等)

4.为什么Vue要提供额外命令v-* ?

html、css
html表现力太弱,html弱语言,脚本语言
html它能if语句?for语句?
动态网站,根据当前用户可能展现内容不同?
实现登录用户名展现:欢迎…
jsp+jstl(html,java判断最终生成html,动态网站)
性能慢(服务器),代码交织(JAVA、html代码、css代码)

Vue在页面上进行动态判断!if,利用v-if实现
性能高(浏览器)ajax请求,返回只要数据json,然后进行vue渲染
网络资源少,ajax从页面出发,性能高,不占资源

这就是为什么我们vue框架能流行,这么多好处
大前端是必有之路!

新技术远超企业多年工作经验人员,企业招聘不是让你精通,而是对你一个初学者要求,主流技术了解,有培养价值!

JS升级到Vue

css升级bootstrap升级element-ui

学习知识:
1.组件化,componts 自定义组件
2.如果引入第三方组件 element-ui
3.按钮、表格、弹出框
Vue+element-ui如何编程

Vue-cli脚手架,生成jt项目(级别)
要求:固定事情固定地方存储或者编写,

启动web服务:nodejs/后端会用tomcat
npm run dev
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统
不要使用运行启动!

前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统


接下来让我们分析jt文件内容

前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统


main.js 全局组件和css样式导入,所有子组件都受用
App.vue 根组件,所有定义都是子组件,它来调用子组件进行展示
*.vue 文件内容3部分

template html代码+vue代码(编译)
script,js/vue代码,
export default唯一导出组件,vue就可以调用这个组件
name: ‘App’ 给组件起一个名称:App
import App from ‘./App’
import App from ‘./App.vue’
style 组件自身的私有样式修饰

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
加上scoped属性,就限制css只对当前组件生效

	操作系统规范:
	你创建一个目录,已经有两个隐藏目录
	. 代表当前路径
	.. 代表上级路径

	style

基础知识

安装依赖包:
链接:https://pan.baidu.com/s/1BoG2oWv6vuILlOKfCkh0Mg
提取码:hl47

启动服务,连续按2次Ctrl+C退出,输入命令npm i element-ui -D 执行下载

安装依赖包
npm i element-ui -D

在-D开发环境中安装组件 element-ui
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

下载完成后打开HB,找到jt(自己定义的名字)目录,找到src,把element-ui包导入

导入element-ui
全局main.js(导包,css)
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统调用elementui,修改main.js

//导入element-ui包,nmp安装包
//npm i element-ui -D
import ElementUI from 'element-ui'
//导入element的css支持
import 'element-ui/lib/theme-chalk/index.css'

//引用这个element-ui
Vue.use(ElementUI)

1.找到src下components文件夹,自定义组件 Book.vue

必须放在src/components目录下
自己加一个按钮
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统怎么使用自定义组件?(注册)
a. 给组件起一个名字

<script>
export default {
  name: "Book"
}
</script>

b. 在App.vue根组件中声明调用这个组件
在template中引用这个组件<Book></Book>

<template>
  <div>
    <el-button type="primary">
      点我有惊喜2
    </el-button>
  </div>
</template>

<script>
  export default{
    name:"Book"
  }
</script>

<style>

</style>

修改一下 HelloWorld.vue的内容

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <h2>Essential Links</h2>
    <button>点我有惊喜</button>
    </div>
    </template>
<script>
 
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
  font-weight: normal;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

进入App.vue,配置Book页面

前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
    <Book> </Book>
  </div>
</template>

<script>
  /*
export default {
  name: 'App'
}*/
/*
import 导入子组件
components 代表我的声明子组件的集合
'./components/Book.vue' 必须写,不写报错
*/
import Book from './components/Book.vue' /*导入子组件*/
export default{
  components:{
    Book
  }
}
</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>

导入成功的页面效果:

前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

安装element-ui组件,出错

1)重新安装一遍,可能网络异常,启动时,报错
2)npm i element-ui -D #i代表安装,D代表开发环境
npm install element-ui -S #生产环境
3)cnpm,安装这个命令,来执行上面语句

相关字体、js、css文件总目录element-ui必须放在src目录下

布局容器 container

用于布局的容器组件,方便快速搭建页面的基本结构:
:外层容器,当子元素
:顶栏容器
:侧边栏容器
:主要区域容器
:底栏容器
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

图标 icon

https://element.eleme.cn/#/zh-CN/component/icon
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

按钮 button

https://element.eleme.cn/#/zh-CN/component/button
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

表格 Table

https://element.eleme.cn/#/zh-CN/component/table

我们先大概了解一下

表格:
样式

 <template>
    <el-table
      :data="tableData"   //v-bind
      style="width: 100%">
      <el-table-column   //表格列:单元格
        prop="date"      //去获取数据key
        label="日期"     //列名
        width="180">     //列的宽度
      </el-table-column>

数据

 <el-table
  export default {
      data() {
        return {
          tableData: [{
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄'
          }, 

我们用book.vue进行测试:

<template>
  <div>
    <el-row>
    <el-button type="primary">点我有惊喜</el-button>
    </el-row>
    <el-row>
      <el-table>
      <el-table-column label="书名">
      </el-table-column>
      <el-table-column label="作者">
      </el-table-column>
      <el-table-column label="价格">
      </el-table-column>
      <el-table-column label="介绍">
      </el-table-column>
      </el-table>
    </el-row>
  </div>
</template>

<script>
  export default{
    name:"Book"
  }
</script>
<style>
</style>

网页效果:
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

当前行 scope

<template slot-scope="scope"> vue提供的slot-scope槽,scope变量名
scope.row 代表当前行数据
scope.$index 代表当前行的索引值
@click="del(index)" 传递当前行索引值
@click="toupdate(scope.$index,scope.row)" 传递当前行的数据

对话框 dialog

https://element.eleme.cn/#/zh-CN/component/dialog

输入框 input

https://element.eleme.cn/#/zh-CN/component/input

表单 form

https://element.eleme.cn/#/zh-CN/component/form

全局变量支撑

  data(){
    return {
      m : {		//pojo对象,临时存储数据
        id: '',
        name: '',
        address: ''
      },
      isupdate: false,  		//新增和修改标识
      index: null,				//当前行索引值
      dialogVisible: false,	//是否展示对话框标识
      students					//页面数据对象
    }
  },

拓展:图书管理系统

修改调用的组件的网页名称

第一步:在main.js里面添加一个全局指令

Vue.directive('title', {
  inserted: function (el, binding) {
    document.title = el.dataset.title
  }
})

第二步:在要调用的组件里面,随便找一个div加入如下代码

<template>
  <div v-title data-title="xxx">

前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

增加小图标功能:


这些图标都是element-ui定义好的,
这些名称到官网查询

增加删除功能:

1)增加删除按钮
2)增加删除事件
slot-scope vue带的,它实现动态编程
它会提供当前行的索引值 scope.$index
3)从list中删除数据 api,splice函数

删除某行,是有一个索引值?
vue给slot-scope对象,封装数据scope对象
scope.$index
this.list.splice(index, 1) 从list数据中删除对应行,删除一行数据

splice( 1 , 1 )
第一个参数,索引位置
第二个参数,如果是1 是删除
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

splice(1 , 0 , “chen” )
第一个参数,索引位置
第二个参数,0 删除的个数,没删除
第三个参数,后面可以多个值,查询到索引位置
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统
(修改)
Is.splice( 1 , 1 , “chen” )
第—个参数,索引位置
第二个参数,1 删除—个
第三个参数,后面写的值插入
前端技术:Vue+elementUI 饿了吗UI+CRUD,创建图书管理系统

新增、修改、弹出对话框(复用这个对话框)

设置一个全局变量:centerDialogVisible
true展示,false不展示

<el-dialog title="提示" :visible.sync="centerDialogVisible" width="30%" center> //居中
  <span>需要注意的是内容是默认不居中的</span> 
  <span slot="footer" class="dialog-footer"> 
    <el-button @click="centerDialogVisible = false">取 消</el-button>  //centerDialogVisible 变量=false,关闭
    <el-button type="primary" @click="centerDialogVisible = false">确 定</el-button>
  </span>
</el-dialog>

添加表单 Form

表单
全局数据:模型:model,

<el-form :model=“m” 双向绑定数据来源
<el-input v-model=“m.name” 双向绑定
在data中声明,临时存储数据

m: {
        name:null,
        author:null,
        price:null,
        intro:null
      }

一条数据textarea html标签文本域

<el-form :model="m" label-width="100px">
<el-form-item label="活动名称" prop="name">
<el-input v-model="m.name"></el-input>
</el-form-item>

<el-form-item label="活动形式" prop="desc">
<el-input type="textarea" v-model="ruleForm.desc"> </el-input>
</el-form-item>

把m模型中的数据添加到页面
list数据,splice

修改:

1)弹出对话框
2)对话框中要修改的那条对应信息
vue组件它会直接把这个数据封装row中
3)保存(复用)修改这条值

this.list.splice(this.index, 1, this.m) //修改

(修改)s.splice(1,1,"chen")
如何实现新增或者修改的判断呢?
定义一个全局变量 isUpdate
新增对话框:isUpdate=false
修改对话框:isUpdate=true

index代表当前行的索引值

当修改数据时,因为双向绑定,数据变化
页面数据也随之变化,这是不对!!!
this.m = row row代表是页面,m数据
是同一个引用,修改其中一个,都改了
把它们关系断开,创建新对象
数据copy,拷贝row数据,新对象
把新对象赋值this.m

整体代码:

App.vue

<template>
  <div id="app">
    <router-view/>
    <Book>

    </Book>
  </div>
</template>

<script>
  /*
export default {
  name: 'App'
}*/
/*
import 导入子组件
components 代表我的声明子组件的集合
'./components/Book.vue' 必须写,不写报错
*/
import Book from './components/Book.vue' /*导入子组件*/
export default{
  components:{
    Book
  }
}
</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>

main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

//导入element-ui包,nmp安装包
//npm i element-ui -D
import ElementUI from 'element-ui'
//导入element的css支持
import 'element-ui/lib/theme-chalk/index.css'

//引用这个element-ui
Vue.use(ElementUI)

Vue.config.productionTip = false

//添加一个全局指令,修改网页名称
Vue.directive('title', {
  inserted: function (el, binding) {
    document.title = el.dataset.title
  }
})

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

Book.vue

<template>
  <!--自定义网页名称-->
  <div v-title data-title="清风图书管理系统" >
    <!--自定义标题-->
    <h1><i class="el-icon-collection"></i>&nbsp;{{sysname}}</h1>

    <!--创建一个新增按钮-->
    <el-row>
      <el-button type="primary" @click="toadd()" icon="el-icon-document-add">新增</el-button>
    </el-row>

    <!--创建Table 表格-->
    <el-row>
      <el-table :data="list">
        <el-table-column  prop="name" label="书名" width="200" ></el-table-column>
        <el-table-column prop="author" label="作者" width="150"></el-table-column>
        <el-table-column prop="price" label="价格" width="100"></el-table-column>
        <el-table-column prop="intro" label="介绍" width="1020"></el-table-column>
        <el-table-column label="功能" width="240">

          <!--增加修改、删除按钮-->
          <template slot-scope="s">
            <el-button type="warning" @click="toupdate(s.$index,s.row)" round icon="el-icon-edit">修改</el-button>
            <el-button type="danger" icon="el-icon-delete" @click="del(s.$index)" round>删除</el-button>

          </template>
        </el-table-column>
      </el-table>

      <!--增加弹出对话框-->
      <el-dialog title="提示信息" :visible.sync="dialogVisible" width="30%" center  >
        <!--对话框内容-->
        <div>
          <el-form :model="m" label-width="40px"> <!--model表单控件双向绑定-->

            <el-form-item label="书名">
              <el-input v-model="m.name" placeholder="请输入书名..."></el-input>
            </el-form-item>

            <el-form-item label="作者">
              <el-input v-model="m.author" placeholder="请输入作者..."></el-input>
            </el-form-item>

            <el-form-item label="价格">
              <el-input v-model="m.price" placeholder="请输入价格..."></el-input>
            </el-form-item>

            <el-form-item label="介绍">
              <el-input v-model="m.intro" placeholder="请输入介绍..." type="textarea"></el-input>
            </el-form-item>
          </el-form>
        </div>
        <!--对话框按钮-->
        <div slot="footer" class="dialog-footer">
          <el-button type="warning" plain @click="dialogVisible = false">取 消</el-button>
          <el-button type="success" plain @click="save">确 定</el-button>
        </div>
      </el-dialog>
    </el-row>


  </div>
</template>

<script>
  export default {
    name: "Book",

    data() {
      return {
        sysname: "清风图书管理系统",/*自定义的标签*/
         /*弹出窗口按钮变量*/
        dialogVisible: false,
        isUpdate:false,
        index:null,

        /*弹出窗口的绑定*/
        m: {
          name: null,
          author: null,
          price: null,
          intro: null
        },

        /*给表单添加内容*/
        list: [{
            name: "java核心技术卷",
            author: "凯·S.霍斯特曼",
            price: "¥109.30",
            intro: "伴随着Java的成长,《Java核心技术》从第1版到第10版一路走来,得到了广大Java程序设计人员的青睐,成为一本畅销不衰的Java经典图书。",
          },
          /*第二条记录*/
          {
            name: "Java编程思想(第4版)",
            author: "[美] Bruce Eckel",
            price: "¥79.20",
            intro: "设计模式贯穿于众多示例中:适配器、桥接器、职责链、命令、装饰器、外观、工厂方法、享元、点名、数据传输对象、空对象、代理、单例、状态、策略、模板方法以及访问者。"
          },
          /*第三条记录*/
          {
            name: "Java从入门到精通(第5版)",
            author: "明日科技",
            price: "¥52.70",
            intro: "丛书说明:“软件开发视频大讲堂”丛书(第1版)于2008年8月出版,因其编写细腻,易学实用,配备海量学习资源和全程视频等,在软件开发类图书市场上产生了很大反响,绝大部分品种在全国软件开发零售图书排行榜中名列前茅,2009年多个品种被评为“全国优秀畅销书”。 "
          },
          /*第四条记录*/
          {
            name: "零基础学Java(全彩版)",
            author: "明日科技",
            price: "¥60.70",
            intro: "《零基础学Java》从零基础学习者的角度出发,通过通俗易懂的语言、流行有趣的实例,详细地介绍了使用Java语言进行程序开发需要掌握的知识和技术。"
          },
          /*第五条记录*/
          {
            name: "O'Reilly:Head First Java ",
            author: "塞若(Sierra K.),[美] 贝茨(Bates B.)",
            price: "¥54.30",
            intro: "阅读《Head First Java》这本书,你将从中体会到学习的乐趣。对于希望学习一门新的编程语言,又不是计算机科学系或者没有编程经验的人来说,本书简直就是极好的。"
          },
          /*第六条记录*/
          {
            name: "Python编程 从入门到实践 第2版(图灵出品)",
            author: "[美] 埃里克·马瑟斯(Eric Matthes)",
            price: "¥59.60",
            intro: "本书内容分为“基础知识”和“项目”两部分。读完本书,读者不仅能快速掌握编程基础知识,还能编写出解决实际问题的代码并开发复杂的项目。第2版沿袭第1版讲解清晰透彻、循序渐进的特点,并全面升级。"
          },
          /*第七条记录*/
          {
            name: "超简单:用Python让Excel飞起来 ",
            author: "王秀文,郭明鑫,王宇韬",
            price: "¥34.90",
            intro: "《超简单:用Python让Excel飞起来》是一本讲解如何用Python和Excel“强强联手”打造办公利器的案例型教程。"
          },

        ]
      }
    },

    methods: {
      toadd: function(){
        this.isUpdate = false
        this.dialogVisible = true
      },

      toupdate:function(index,row){
        this.isUpdate = true
        this.dialogVisible = true
        //this.m = row 旧对象
        this.m = this.copy(row)

        //this.index代表,data中数据,index代表函数的参数
        this.index = index
      },

      save:function(){
        if(this.isUpdate){
          console.log("全局:index:"+this.index)
          this.list.splice(this.index,1,this.m) //修改
        }else{
        //参数1:0 新增的元素放在第一行,参数2:0代表不删除
        //在最后面加this.list.splice(this.list.length,0,this.m)
        this.list.splice(0,0,this.m)
       }
       this.dialogVisible = false //对话框关闭
       this.m = {} //把模型m的属性值置空
      },
      del: function(index) {
        //删除这个当前行元素,参数1:删除位置,参数2:删除个数
        this.list.splice(index, 1)
      },
      copy:function(oldObj){//复制这个对象
        var newObj ={}
        for(var o in oldObj){ //for循环遍历,o 代表每次属性值
          newObj[o] = oldObj[o]
        }
        return newObj;
      }
    }
  }
</script>

<style>
    textarea{
      font-family: 微软雅黑;
    }
</style>

小结:

1、自定义组件

1)src/componets/Book.vue
2)注册,它都是根组件的孩子,子组件 App.vue

	import Book from './components/Book.vue'
export default {
  components:{
    Book
  }
}

3)App.vue模板地方

2、引入第三方element-ui,业界no1

main.js全局引入
1)安装element-ui组件

npm i element-ui -D
npm install element-ui -S

3)修改main.js,写下面的3句话

import ElementUI from ‘element-ui’

拷贝css等文件到src下

import ‘element-ui/lib/theme-chalk/index.css’
Vue.use(ElementUI)

注册后子组件就可以使用

3、展现数据

:data="list"在data数据区域定义数组对象
表格列prop=“name”,每条数据中key

4、弹出对话框 dialog

dialogVisible 变量,是否展现

5、新增

this.list.splice(0, 0, this.m)
this.m = {} //把模型m的属性值置空 否则下一次进入,内容就不为空

6、副作用,修改页面m和row同引用,一改全都改

断掉它们关系,引用。
this.m = this.copy(row)

copy: function(oldObj){ //复制对象
var newObj = {}
for(var o in oldObj){ //for循环遍历,o代表下标
newObj[o] = oldObj[o]
}
return newObj;
}
两个对象内容一致,是两个对象

demo 前端vue,
ajax,java(访问数据库,SSM大框架),json,解析json,存储到list

本文地址:https://blog.csdn.net/QQ1043051018/article/details/112506002