• JavaWeb笔记——VUE和ElementUI进阶


    vue

    • vue是一个前端框架,是在前后端分离这样的业务场景诞生的。vue是基于node.js来运行的。vue有2.0、3.0版本。vue它的底层是html、css、js,它是一套构建用户界面的渐进式(javascript)框架。并提供了⼀套声明式的、组件化的编程模型,帮助你⾼效地开 发⽤户界⾯。⽆论是简单还是复杂的界⾯,Vue 都可以胜任。
    • 渐进式:没有太多的限制的一个js框架。就是一开始使用这个框架,你不需要完全的掌握它的全部的功能或者特性。
    • 前后端分离介绍: 前后端分离属于开发模式中的⼀种,其核⼼思想是前端项⽬采⽤(node.js实现)和后端项⽬能够 独⽴运⾏,前端采⽤ajax 向服务器发送请求,服务器只需要提供请求的地址(api)即可协作开 发。这样的项⽬ 称做前后端分离项⽬。

    安装node.js

    下载 | Node.js 中文网 官⽹

    1、双击安装包,⼀直点击下⼀步。

    2、点击change按钮,更换到⾃⼰的指定安装位置,点击下⼀步(不修改默认位置也是可以的 )。

    3、⼀直点击下⼀步,最后安装成功即可。

    安装完成后:控制台输入 node -v ---- 查看是否安裝成功

    构建⼀个vue项⽬

    控制台输⼊指令:

    npm init vue@latest

    这⼀指令将会安装并执⾏ create-vue,它是 Vue 官⽅的项⽬脚⼿架⼯具

    如果不确定是否要开启某个功能,你可以直接按下回⻋键选择 No。在项⽬被创建后,通过以下步骤安装依赖并启动开发服务器:

    cd

    命令自动下载这些依赖。

    npm install

    运行vue项目

    npm run dev

    当你准备将应⽤发布到⽣产环境时,请运⾏:

    npm run build

    1、VUE工程结构

    • node_model:项目依赖文件夹,存放的是一些vue功能依赖的模块。
    • public:存放的是一些公共的静态资源文件。
    • *src:程序员自己存放的源代码(自己编写的代码)
    • assets:存放静态资源文件。js.css等
    • components:组件:存放的是一些公共的组件(非路由组件)
    • App.vue:vue的页面文件,默认vue项目启动后访问的页面。
    • *main.js:程序的入口文件。vue项目启动最先执行的文件。
    • package.json:包管理工具,记录项目引用的第三方资源库
    • package-lock.json:记录第三方资源库的来源。

    2、vue页面组成

    主要由三个部分组成

    •  ————编写逻辑代码、js代码
    • ————编写页面代码。html代码
    • ————编写样式代码,css代码块

    3、VUE生命周期

    指的是vue界面从创建到销毁的一个过程。(vue实例创建、初始化、运行、销毁)

    生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法,这些生命周期方法也被称为钩子方法(钩子函数)。

    状态阶段周期
    beforeCreate创建前
    created创建(创建vue实例)
    beforeMount载入前
    mounted挂载完成(将数据渲染到界面上)
    beforeUpdate更新前
    updated更新后(更新页面数据)
    beforeDestroy销毁前
    destroyed销毁后(销毁vue实例)

    4、VUE基础语法

    声明数据、声明函数(方法)

    1. <template>
    2.  <div>
    3.    <h1>这是我的第一个vue页面h1>
    4.    
    5.    <span>姓名:{{name}}span><br>
    6.    <span>年龄:{{age}}span><br>
    7.    <span>备注:{{desc}}span><br>
    8.    
    9.    <span v-html="sex">span><br>
    10.    
    11.    <p v-if="age<18">这是一个未成年的程序员p>
    12.    <p v-else-if="age<30">这是一个成年的程序员p>
    13.    <p v-else>年到中年,小心被裁员p>
    14.    <p v-if="status==0">未支付订单p>
    15.    <p v-else-if="status==1">已发货订单p>
    16.    <p v-else>已完成订单p>
    17.    
    18.    
    19.    
    20.    <p v-for="c in color" :key="c">{{c}}p>
    21.    <p v-for="user in userList" :key="user.id">
    22.      {{user.name}}今年{{user.age}}岁,他/她是一位{{user.sex}}性
    23.    p>
    24.    
    25.    
    26.    <button v-on:click="count++">点击count次数改变button>
    27.    <p>count点击次数:{{count}}p>
    28.    
    29.    <button v-on:click="clickTotal1(5)">点击total1+numberbutton>
    30.    <p>total计数器:{{total}}p>
    31.    <button v-on:click="clickTotal2('哈撒给!!')">点击textbutton>
    32.    <p>text:{{text}}p>
    33.  div>
    34. template>
    35. <script>
    36. //声明数据————这是一个固定格式
    37. export default {
    38.  //data() : 一般设置一些页面上常用的参数
    39.  data(){
    40.    return{
    41.      name:'2Eua',
    42.      age:23,
    43.      desc:'菜狗子Java程序员一枚',
    44.      sex:'

      '
      ,
    45.      status:0,
    46.      color:['白色','蓝色','紫色','黑色','橘色'],
    47.      userList:[
    48.         {'id':1,'name':'Bit','age':22,'sex':'男'},
    49.         {'id':2,'name':'Simple','age':25,'sex':'男'},
    50.         {'id':3,'name':'Niko','age':28,'sex':'男'}
    51.     ],
    52.      count:0,
    53.      total:0,
    54.      text:''
    55.   }
    56. },
    57.  methods:{
    58.    //第一种方法的声明
    59.    //每点击一次按钮,total加五
    60.    //函数传递参数和js写法是一样的。
    61.    //数字参数直接传递,
    62.    clickTotal1:function (number){
    63.      this.total+=number
    64.   },
    65.    //第二种方法的声明
    66.    //字符串类型的参数需要添加单引号''
    67.    clickTotal2(text){
    68.      this.text = text
    69.   }
    70. }
    71. }
    72. script>
    73. <style>
    74. style>

    5、组件

    • 组件其实就是一个vue页面,它与vue普通页面是完全相同的。

    • 唯一区别:组件可以被多个地方进行调用。普通页面只能调用一次。

    • 组件提高import进行导入。import时只需要指明组件的名称和路径即可。

    • 为了区分组件和普通界面,在vue项目里组件一般放在components文件夹下。而普通页面一般放在view或者是pages文件夹下。

    写一个组件vue界面

    1. <template>
    2.  <h1>{{msg}}h1>
    3. template>
    4. <script>
    5. export default {
    6.  //组件名称
    7.  name: "TestComponent",
    8.  //定义组件的参数
    9.  //props组件里的一个属性(字段),期望参数从调用方传递过来
    10.  props:{
    11.    msg:''
    12. },
    13.   data(){
    14.    return{
    15.   }
    16. },
    17.  methods:{
    18. }
    19. }
    20. }
    21. script>
    22. <style scoped>
    23. style>

    导入组件

    1. <template>
    2.  <div>
    3.    <h1>这是我的第一个vue页面h1>
    4.    
    5.    <TestComponent msg="这是一个测试组件">TestComponent>
    6.  div>
    7. template>
    8. <script>
    9.  //导入组件
    10.  // TestComponent:组件名称
    11.  //from "./components/TestComponent.vue":组件的路径
    12.  import TestComponent from "./components/TestComponent.vue";
    13. //声明数据————这是一个固定格式
    14. export default {
    15.  //表示引入组件
    16.  components: {TestComponent},
    17. script>
    18. <style>
    19. style>

    6、路由

    路由指的是在vue项目里具体呈现给用户的是哪一个页面,那么这个时候就是通过路由来进行控制的。注意:在vue项目里,很多时候路由都是嵌套在App.vue页面的,然后只需要更新app.vue里具体显示页面的部分即可。路由也是一种局部刷新,达到页面的跳转效果。

    安装路由

    命令:

    cnpm install --save vue-router(所谓的渐进式)

    save表示把路由的依赖添加到package.json里。

    1. "dependencies": {
    2. "vue": "^3.2.45",
    3. "vue-router": "^4.1.6"
    4. },

    7、npm和cnpm命令的区别和联系

    两者都是用于node插件的,安装、卸载、以及依赖管理nmp这个命令安装插件时都是从国外的服务器进行下载的,经常受网络影响,可能会出现异常,所以很多时候我们也是用cnpm来进行下载。cnpm是由淘宝团队提供的镜像地址进行下载的。国内的淘宝镜像称为cnpm。两者语法类似。在国内使用cnpm下载效率高于npm。

    8、路由的代码书写

    在app.vue中通过显示路由内容。

    简单来说就是通过url显示⻚⾯的功能。

    1、新建pages包,在这个包里新建两个vue界面(Login.vue和Register.vue)路由传参

    1. <template>
    2.  <div>
    3.    <h2>用户登录h2>
    4.   账号:<input type="text"><br>
    5.   密码:<input type="password"><br>
    6.    <span>id:{{id}}名称:{{name}}年龄:{{age}}性别:{{sex}}span>
    7.    <input type="button" value="登录">
    8.  div>
    9. template>
    10. <script>
    11. export default {
    12.  name: "Login",
    13.  //页面创建时调用
    14.  //常常再打开一个新页面时通过该方法来渲染页面,动态改变页面的数据
    15.  created() {
    16.    //通过路由得到请求参数
    17.    this.id = this.$route.query.id;
    18.    this.name = this.$route.query.name;
    19.    this.age = this.$route.query.age;
    20.    this.sex = this.$route.query.sex;
    21. },
    22.  data(){
    23.    return{
    24.      id:0,
    25.      name:'',
    26.      age:0,
    27.      sex:''
    28.   }
    29. }
    30. }
    31. script>
    32. <style scoped>
    33. style>
    34. <template>
    35. <div>
    36.  <h2>用户注册h2>
    37. 邮箱:<input type="email"><br>
    38. 性别:<input type="radio">
    39.      <input type="radio"><br>
    40. 生日:<input type="date"><br>
    41. 密码:<input type="password"><br>
    42. 确认密码:<input type="password"><br>
    43.  <input type="button" value="注册">
    44. div>
    45. template>
    46. <script>
    47. export default {
    48.  name: "Register"
    49. }
    50. script>
    51. <style scoped>
    52. style>

    2、新建一个router路由目录(包),在这个目录下新建index.js和routes.js文件

    配置index.js

    1. //用来配置路由管理器
    2. //导入路由管理器——路由里自带的
    3. import{createRouter,createWebHistory} from "vue-router";
    4. //导入自己写的路由
    5. //import后跟的是文件中的元素,如果是vue页面,那么就是页面的别名
    6. // from跟的是文件的路径
    7. //调用时该文件里的元素需要导出export default '元素'
    8. import routes from "./routes";
    9. //配置路由管理器
    10. const router = createRouter({
    11.    //配置路由不需要带用#号
    12.    history:createWebHistory(),
    13.    routes
    14. });
    15. //导出后其它组件可以调用
    16. export default router;
    17. //用来配置路由信息的
    18. const routes = [
    19.   {
    20.        //给当前路由起别名
    21.        name: "Login",
    22.        //配置访问路径
    23.        path: "/login",
    24.        //配置当前页面的具体路径
    25.        component: () => import('../pages/Login.vue')
    26.   },
    27.   {
    28.        //给当前路由起别名
    29.        name: "Register",
    30.        //配置访问路径
    31.        path: "/register",
    32.        //配置当前页面的具体路径
    33.        component: () => import('../pages/Register.vue')
    34.   }
    35. ]
    36. // const text = [{
    37. //     name:'xxx',age:10
    38. // }]
    39. //导出后其它组件可以调用
    40. export default routes;
    41. //如果需要多个导出,使用括号拼成数组格式
    42. // export default {routes,text};

    3、main.js 前端的配置文件。在main.js配置路由

    1. import { createApp } from 'vue'
    2. import App from './App.vue'
    3. import './assets/main.css'
    4. //启用路由
    5. //导入路由管理器的配置
    6. import router from "./router/index";
    7. //导入axios
    8. import axios from "axios";
    9. //当前主页面里启动/使用路由配置:createApp(App).use(router)
    10. //createApp
    11. //create 表示创建一个实例
    12. //App是application这个单词的缩写,表示应用这个实例
    13. //mount('#app'):表示将一个id为app的节点挂载到vue上
    14. createApp(App).use(router).use(axios).mount('#app')

    4、接下来写主界面App.vue

    1. <template>
    2.  <div>
    3.    <button @click="loginPage()">登录button>
    4.    <button v-on:click="register()">注册button>
    5.  div>
    6.  <div>
    7.    <router-view>router-view>
    8.  div>
    9.  <div>
    10.    <router-link :to="{ name:'Login',query:{id:2,name:'坤坤',age:28,sex:'男'}}">
    11.     修改
    12.    router-link>
    13.    <a href="/login">跳转a>
    14.  div>
    15. template>
    16. <script>
    17.  //导入组件
    18.  // TestComponent:组件名称
    19.  //from "./components/TestComponent.vue":组件的路径
    20.  import TestComponent from "./components/TestComponent.vue";
    21.  import axios from "axios";
    22. //声明数据————这是一个固定格式
    23. export default {
    24.  //表示引入组件
    25.  components: {TestComponent},
    26.  created() {
    27.    axios.post('http://localhost:8080/user/login',null).then(res=>{
    28.   })
    29. },
    30.  //data() : 一般设置一些页面上常用的参数
    31.  data(){
    32.    return{
    33.   }
    34. },
    35.  methods:{
    36.    //跳转到登录页面
    37.    loginPage(){
    38.      //跳转到指定的页面
    39.      //直接跳转到某个页面
    40.      // this.$router.push("/login")
    41.      //跳转页面并且向目标页面传递参数
    42.      this.$router.push({
    43.        //name 表示当前页面的别名
    44.        // 跳转到名字叫做Login的页面
    45.        name:'Login',
    46.        //query是传递的参数。可以是多个
    47.        query:{
    48.          id: 1,
    49.          name: "chw",
    50.          age: 23,
    51.          sex: "男"
    52.       }})
    53.   },
    54.    register(){
    55.      this.$router.push("/register")
    56.   }
    57. }
    58. }
    59. script>
    60. <style>
    61. style>

    9、在vue路由里$router和$route的区别

    $router对象它是全局路由对象的实例。是router构造方法的实例。是它可以控制整个路由的页面跳转。

    $route对象表示当前的路由对象信息,包含了当前 URL 解析得到的信息。包含当前的路径,参数,query对象等。这个对象一般用来获取当前跳转路由的相关参数。

    10、axios

    Vue里,通常使用axios向服务器发出AJAX请求。

    Axios,可以工作于浏览器里,也可以在node.js使用。

    主要功能有:

    1、发送ajax请求到服务器端,服务器端响应数据到浏览器端

    2、自动转换JSON

    在vue中使⽤axios

    vue中使⽤axios需要安装:npm install axios

    11、跨域问题

    当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

    跨域是指客户端浏览器发送http请求时,由于浏览器自身存在的安全机制(同源策略),浏览器会检查请求中的(协议,域名(ip),端口号)。判断当前请求的(协议,域名(ip),端口号)和当前页面的(协议,域名(ip),端口号)是否相同。如果不相同,浏览器会对当前的请求进行限制。这个限制叫做跨域。

    • 只要协议、域名、端口里有一种不一样那么都会存在跨域。

    • 一般跨域问题常出现在前后端分离的系统里。而且服务器之间不存在跨域问题。

    axios解决跨域问题

    1、使用配置代理的方式解决。

    因为浏览器同源策略机制,前后端分离后客户端请求服务端的数据时,会存在跨域问题。而服务器和服务器之间是可以相互请求数据的,是没有跨域的概念的,也就是说我们可以配置一个代理的服务器,由这个代理服务器收到客户端请求,将请求转发给另一个服务器,然后把请求出来的数据返回到代理服务器里,再由代理服务器返回数据给我们的客户端。这样就实现了跨域访问数据。

    Vue3.0解决⽅案:vite.config.js中进⾏配置一个代理服务器:

    1. import { fileURLToPath, URL } from 'node:url'
    2. import { defineConfig } from 'vite'
    3. import vue from '@vitejs/plugin-vue'
    4. // https://vitejs.dev/config/
    5. export default defineConfig({
    6.  plugins: [vue()],
    7.  resolve: {
    8.    alias: {
    9.      '@': fileURLToPath(new URL('./src', import.meta.url))
    10.   }
    11. },
    12.  //配置服务和代理
    13.  server:{
    14.    //配置本地端口
    15.    port:8000,
    16.    //配置代理信息
    17.    proxy:{
    18.      //配置请求映射路径:只要是以/api开头的请求都使用下面得配置信息
    19.      '/api':{
    20.        //配置目标服务器地址
    21.        target:'http://localhost:8088',
    22.        // 允许跨域
    23.        changeOrigin: true,
    24.        //url重写
    25.        rewrite:(path)=>path.replace(/^\/api/,'')
    26.     }
    27.   }
    28. }
    29. })
    30. /*
    31. rewrite 叫做请求url重写:配置代理之后客户端向服务器发送请求
    32. (地址:目标服务器+映射地址)http:localhost:8088/api/user/login
    33. 代理服务器最终请求得地址为:http:localhost:8088/user/login
    34. */

    2、注解@CrossOrigin解决跨域问题

    服务端通过在controller控制器的class类上配置注解@CrossOrigin来解决跨域问题。

    组件和页面的区别:

    1、组件其实就是一个vue的页面,它跟vue普通页面是完全相同的。

    2、唯一区别是,组件可以被多个地方进行调用。而普通页面只能调用一次。

    3、在vue项目里,组件一般放在components文件夹下。而普通页面一般放在pages文件夹下,或者view文件夹下。

    4、页面是直接和URL对应,或者说是和“大”URL对应的,里面不做具体的功能,而是放各种组件,负责组件之间的关联关系。

    5、组件负责实现具体的功能。页面包括组件。

    12、VUE双向绑定

    基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。

    双向绑定是指当数据模型数据发生变化时,页面展示的数据会随之发生变化,而如果页面中的数据发生变化时,绑定的模型数据也随之发生变化。

    Element-UI

    Element-Ul是饿了么前端团队推出的⼀款基于Vue.js 的桌⾯端UI框架。⼿机端有对应框架是Mint UI Vue框架:它是对js的封装,Element-UI 它是基于Vue的框架,它封装了css样式,我们使⽤Vue需要样 式的时候就使⽤它。 丰富的组件,⾃定义主题,国际化。 提供友好的⽂档和 demo,维护成本⼩ ⽀持 npm ⽅式

    安装使用

    官⽹: 一个 Vue 3 UI 框架 | Element Plus

    下载:

    Vue使⽤element-ui 需要使⽤element-plus

    npm install element-plus --save

    cnpm install element-plus --save

    配置: 在main.js里导入,并且use,挂载

    1. //引入elementui-plus
    2. import elementUI from 'element-plus'
    3. //引入elementui-plus得样式
    4. import 'element-plus/dist/index.css' // 样式依赖
    5. //引入elementui-plus里的图标
    6. import * as ElIcons from '@element-plus/icons-vue' // 引⼊图标
    7. const app = createApp(NewApp);
    8. // createApp(App).use(router).use(elementUI).mount('#app')
    9. //遍历添加图标组件
    10. for (const icon in ElIcons){
    11.    app.component(icon,ElIcons[icon])
    12. }
    13. //挂载
    14. app.use(router).use(elementUI).mount('#app')

    elementUI的布局

    1.  <el-row style="background-color: aquamarine">
    2.      <el-col :span="24">
    3.        <h2>这是布局得头部h2>
    4.      el-col>
    5.  el-row>
    6.  <el-row>
    7.    <el-col :span="4" style="background-color: sienna">
    8.      <h2>导航栏h2>
    9.    el-col>
    10.    <el-col :span="20" style="background-color: pink">
    11.      <el-row>
    12.        <el-col :span="12" style="background-color: blueviolet"><h2>嵌套1h2>el-col>
    13.        <el-col :span="12" style="background-color: olivedrab"><h2>嵌套2h2>el-col>
    14.      el-row>
    15.    el-col>
    16.  el-row>
    1.   <el-button type="primary">主要按钮el-button>
    2.   <el-button type="success">成功按钮el-button>
    3.   <el-button type="info">信息按钮el-button>
    4.   <el-button type="warning">警告按钮el-button>
    5.   <el-button type="danger">危险按钮el-button>
    1. <el-button type="primary" icon="Edit" />
    2.   <el-button type="primary" icon="Share" />
    3.   <el-button type="primary" icon="Delete" />
    4.   <el-button type="primary" icon="Search">Searchel-button>
    5.   <el-button type="primary">
    6.     Upload<el-icon class="el-icon--right"><Upload />el-icon>
    7.   el-button>
    1.   <el-radio-group v-model="sex">
    2.     <el-radio label="1">el-radio>
    3.     <el-radio label="0">el-radio>
    4.   el-radio-group>
    1.   <el-checkbox-group v-model="likeArray">
    2.     <el-checkbox label="1">打篮球el-checkbox>
    3.     <el-checkbox label="2">踢足球el-checkbox>
    4.     <el-checkbox label="3">玩游戏el-checkbox>
    5.     <el-checkbox label="4">敲代码el-checkbox>
    6.   el-checkbox-group>
    7. <el-button type="success" icon="Upload">增加按钮el-button>
    8. <el-button type="danger" icon="Delete">删除按钮el-button>
    9. <el-button type="info" icon="Search">查询按钮el-button>
    10. <el-button type="warning" icon="Edit">修改按钮el-button>

    复选框的动态产生

    1.   <el-checkbox-group v-model="studyArray">
    2.     <el-checkbox :label=lesson.id v-for="lesson in lessonArray" :key="lesson.id" >{{lesson.lessonName}}el-checkbox>
    3.   el-checkbox-group>
    4. studyArray: [],
    5. lessonArray: [
    6.         {id:1,lessonName:'JavaWeb'},
    7.         {id:2,lessonName:'SpringBoot'},
    8.         {id:3,lessonName:'Mybatis'}
    9.       ]

     下拉列表

    1. <el-select v-model="edu" placeholder="请选择学历" @change="eduChange()">
    2. <el-option label="高中" value="1">el-option>
    3. <el-option label="大专" value="2">el-option>
    4. <el-option label="本科" value="3">el-option>
    5. <el-option label="研究生" value="4">el-option>
    6. el-select>

    日期选择框

    1. <el-date-picker v-model="startTime" type="date" value-format="YYYY-MM-DD"
    2. placeholder="请选择开始时间" @change="timeChange()">
    3. el-date-picker>
    4. {{this.startTime}}
    5. <el-date-picker v-model="endTime" type="datetime" value-format="YYYY-MM-DD hh:mm:ss"
    6. placeholder="请选择结束时间" @change="endTimeChange()">
    7. el-date-picker>
    8. {{this.endTime}}

    表格

    1. <el-table :data="userList" stripe>
    2. <el-table-column prop="id" label="ID">el-table-column>
    3. <el-table-column prop="name" label="名称">el-table-column>
    4. <el-table-column prop="sex" label="性别">el-table-column>
    5. <el-table-column prop="address" label="家庭地址">el-table-column>
    6. el-table>

    表格数据从后台获取

    1、页面:

    1. <el-table :data="bookList" stripe>
    2. <el-table-column prop="id" label="ID">el-table-column>
    3. <el-table-column prop="name" label="书名">el-table-column>
    4. <el-table-column prop="author" label="作者">el-table-column>
    5. <el-table-column prop="desc" label="描述">el-table-column>
    6. <el-table-column prop="price" label="价格">el-table-column>
    7. <el-table-column label="数量">
    8. <template #default="priceTemp">
    9. <el-input v-model="priceTemp.row.number">el-input>
    10. template>
    11. el-table-column>
    12. <el-table-column label="总价">
    13. <template #default="sumTemp">
    14. {{sumTemp.row.price * sumTemp.row.number}}
    15. template>
    16. el-table-column>
    17. <el-table-column prop="status" label="状态">
    18. <template #default="scope">
    19. {{ scope.row.status==1?'可售':'不可售'}}
    20. template>
    21. el-table-column>
    22. <el-table-column prop="createTime" label="创建时间">el-table-column>
    23. <el-table-column label="操作">
    24. <template #default="scope">
    25. <el-button type="primary" @click="deleteBook(scope.row.id)">删除el-button>
    26. template>
    27. el-table-column>
    28. el-table>

    2、ajax请求

    1. <script>
    2. import axios from "axios";
    3. export default {
    4. name: "NewApp",
    5. created() {
    6. axios.post('/chw/book/bookList',null).then(resp=>{
    7. this.bookList = resp.data;
    8. })
    9. },
    10. data(){
    11. return{
    12. bookList: []
    13. }
    14. },
    15. methods:{
    16. deleteBook(id){
    17. alert(id);
    18. }
    19. }
    20. }
    21. script>

    3、bean

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. public class BookBean {
    5. private int id;
    6. private String name;
    7. private String author;
    8. private String desc;
    9. private String createTime;
    10. private int status;//0:代表禁用,1:代表开放
    11. private double price;
    12. private int number;
    13. }

    4、控制器

    1. @RestController
    2. @RequestMapping("/book")
    3. public class BookController {
    4. @RequestMapping("/bookList")
    5. public List getBookList(){
    6. BookBean bookBean = new BookBean(1,"JavaWeb","张三","javaweb应用","2022-12-09",1,77.5,3);
    7. BookBean bookBean1 = new BookBean(2,"MySQL","李四","MySQL","2022-12-08",0,60.5,10);
    8. BookBean bookBean2 = new BookBean(3,"Oracle","王五","Oracle","2022-12-05",1,89.5,9);
    9. BookBean bookBean3 = new BookBean(4,"SpringBoot","赵六","SpringBoot","2022-12-11",0,48.5,5);
    10. BookBean bookBean4 = new BookBean(5,"SpringMVC","孙七","SpringMVC","2022-12-22",0,66.5,6);
    11. List bookBeanList = new ArrayList<>();
    12. bookBeanList.add(bookBean);
    13. bookBeanList.add(bookBean1);
    14. bookBeanList.add(bookBean2);
    15. bookBeanList.add(bookBean3);
    16. bookBeanList.add(bookBean4);
    17. return bookBeanList;
    18. }
    19. }

    对话框

    1. <el-dialog v-model="dialogVisible" title="添加用户" width="30%">
    2. <span>这是一个添加用户操作span>
    3. <template #footer>
    4. <span class="dialog-footer">
    5. <el-button type="primary" @click="dialogVisible = false">取消el-button>
    6. <el-button type="primary">确定el-button>
    7. span>
    8. template>
    9. el-dialog>
    10. <el-button type="primary" @click="dialogVisible=true">打开对话框el-button>

    导航栏、分页、验证规则、对话框

    1. <template>
    2. <el-row style="background-color: pink">
    3. <el-col :span="24"><h1>这是首页标题h1>el-col>
    4. el-row>
    5. <el-row>
    6. <el-col :span="6" style="background-color: aqua">
    7. <el-menu class="el-menu--vertical-demo"
    8. text-color="#3014ADFF"
    9. default-active="2-1"
    10. background-color="#5EE069FF">
    11. <el-sub-menu index="1">
    12. <template #title>
    13. <el-icon>
    14. <User/>
    15. el-icon>
    16. <span>用户管理span>
    17. template>
    18. <el-menu-item index="1-1">注册用户el-menu-item>
    19. <el-menu-item index="1-2">用户列表el-menu-item>
    20. el-sub-menu>
    21. <el-sub-menu index="2">
    22. <template #title>
    23. <el-icon>
    24. <View/>
    25. el-icon>
    26. <span>角色管理span>
    27. template>
    28. <el-menu-item index="2-1">角色列表el-menu-item>
    29. <el-menu-item index="2-2">角色修改el-menu-item>
    30. el-sub-menu>
    31. el-menu>
    32. el-col>
    33. <el-col :span="18" style="background-color: blueviolet">
    34. <h2>内容h2>
    35. el-col>
    36. el-row>
    37. <el-dialog v-model="dialogVisible" title="添加用户" width="30%">
    38. <el-form :model="userForm" :rules="rules" ref="userForm" class="demo-ruleForm">
    39. <el-form-item label="姓名" prop="userName">
    40. <el-input v-model="userForm.userName">el-input>
    41. el-form-item>
    42. <el-form-item label="密码" prop="passWord">
    43. <el-input type="password" v-model="userForm.passWord">el-input>
    44. el-form-item>
    45. <el-form-item label="性别" prop="sex">
    46. <el-radio-group v-model="userForm.sex">
    47. <el-radio :label="1">el-radio>
    48. <el-radio :label="2">el-radio>
    49. el-radio-group>
    50. el-form-item>
    51. <el-form-item label="电话号码" prop="tel">
    52. <el-input v-model="userForm.tel">el-input>
    53. el-form-item>
    54. <el-form-item label="生日" prop="birthday">
    55. <el-date-picker type="date" value-format="YYYY-MM-DD"
    56. v-model="userForm.birthday" placeholder="请选择生日">
    57. el-date-picker>
    58. el-form-item>
    59. el-form>
    60. <template #footer>
    61. <span class="dialog-footer">
    62. <el-button type="primary" @click="cancel()">取消el-button>
    63. <el-button type="primary" @click="addUser()">确定el-button>
    64. span>
    65. template>
    66. el-dialog>
    67. <el-button type="primary" @click="dialogVisible=true">打开添加用户对话框el-button>
    68. <el-pagination
    69. @size-change="changeSize"
    70. @current-change="changeCurPage"
    71. :current-page="curPage"
    72. :page-size="pageSize"
    73. layout="total, sizes, prev, pager, next, jumper"
    74. :total="total">
    75. el-pagination>
    76. template>
    77. <script>
    78. import axios from "axios";
    79. import {ElMessage} from "element-plus";
    80. export default {
    81. name: "App1206",
    82. data() {
    83. return {
    84. curPage: 1,
    85. pageSize: 10,
    86. total: 100,
    87. userForm: {
    88. userName: '',
    89. passWord: '',
    90. birthday: '',
    91. sex: 0,
    92. tel: ''
    93. },
    94. dialogVisible: false,
    95. //验证规则
    96. //1:给表单加上rules——属性——规则
    97. //2:给表单的每行元素el-form-item加上prop属性,注意prop属性名称和表单标签的v-model里的名称要一致。
    98. //3:声明验证的规则,也就是声明的rules变量
    99. // required:是否必须,message:提示消息,trigger:blur:失去焦点时触发
    100. rules: {
    101. userName: [
    102. {required: true, message: '请输入用户名', trigger: 'blur'},
    103. {min: 2, max: 8, message: '用户名长度为2-8位', trigger: 'blur'}],
    104. tel: [
    105. {required: true, message: '请输入电话号码', trigger: 'blur'},
    106. {pattern: /^1[3578]\d{9}$/, message: '电话必须是13、15、17、18开始的十一位数', trigger: 'blur'}]
    107. }
    108. }
    109. },
    110. methods: {
    111. changeCurPage(curPage) {
    112. alert(curPage);
    113. },
    114. changeSize(pageSize){
    115. alert(pageSize);
    116. },
    117. cancel() {
    118. this.dialogVisible = false;
    119. //重置表单
    120. this.$refs.userForm.resetFields();
    121. },
    122. addUser() {
    123. //最常用方法第二种----传递表单
    124. axios.post('/chw/user/addUser', this.userForm).then(response => {
    125. if ("success" == response.data) {
    126. ElMessage({
    127. message: '用户添加成功。',
    128. type: 'success',
    129. })
    130. //关闭弹窗
    131. this.dialogVisible = false;
    132. //清空表单
    133. //第一种方式(清空表单)
    134. /*this.userForm = {
    135. userName: '',
    136. passWord: '',
    137. birthday: '',
    138. sex: 0
    139. }*/
    140. //第二种方式(重置表单)
    141. //第一步,给当前form表单新增一个ref属性
    142. //第二步,给需要清空的表单标签el-form-item加上prop参数
    143. //第三步,重置表单
    144. //设置一个名叫userForm的表单元素,重置所有的表单,重置不是清空
    145. //重置是重置回声明表单时的值
    146. this.$refs.userForm.resetFields();
    147. } else {
    148. ElMessage({
    149. message: '用户添加失败。',
    150. type: 'failed',
    151. })
    152. }
    153. });
    154. /* //传递对象。formData对象_扩展
    155. let param = new FormData();
    156. param.append("userName",this.userForm.userName)
    157. param.append("sex",this.userForm.sex)
    158. param.append("birthday",this.userForm.birthday)
    159. param.append("passWord",this.userForm.passWord)
    160. axios.post('/chw/user/addUser',param).then(resp=>{
    161. if ("success" == resp.data){
    162. ElMessage({
    163. message: '用户添加成功。',
    164. type: 'success',
    165. })
    166. }
    167. });*/
    168. /*// 第三种
    169. let param = JSON.stringify(this.userForm);
    170. // 设置当前请求数据内容的类型为json字符串
    171. let config = {
    172. headers: {
    173. 'Content-Type': 'application/json'
    174. }
    175. }
    176. axios.post('/chw/user/addUser',param,config).then(resp => {
    177. if ("success" == resp.data) {
    178. ElMessage({
    179. message: '用户添加成功。',
    180. type: 'success',
    181. })
    182. }
    183. });*/
    184. },
    185. }
    186. }
    187. script>
    188. <style scoped>
    189. style>

  • 相关阅读:
    1.1 OpenCV随手简记(一)
    R语言 第一部分
    旋转框目标检测mmrotate v0.3.1入门
    程序员面试金典 - 面试题 17.17. 多次搜索
    JAVA SE 基础总结
    智慧电网解决方案-最新全套文件
    【Java 进阶篇】JDBC 管理事务详解
    Echarts热力/散点/面积地图和高德amap不得不说的故事
    使用API Monitor工具巧妙探测C++程序中监听某端口的模块
    Cocos2dx-lua ScrollView[二]进阶篇
  • 原文地址:https://blog.csdn.net/weixin_62993347/article/details/128168322