当前位置:   article > 正文

Element-UI快速入门_element ui

element ui

什么是Element UI

  1. Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库
    1. Element UI是基于Vue 2.0的
    2. Element UI 提供一组组件
    3. Element UI 提供组件的参考实例, 直接复制
  2. 官方网站:

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

搭建环境

创建项目

步骤一: 通过 vue-cli创建项目

vue create eui01

步骤二:运行项目

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_17,color_FFFFFF,t_70,g_se,x_16

整合1:插件

安装好vue项目后,进入到项目目录,执行命令

vue add element

整合步骤1:确定引入方式(全部引入、按需引入)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

整合

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

整合2:安装element-ui插件

npm i element-ui --save

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

整合:element-ui引入

  1. 官方提供了2种引入方式:完整引入、按需引入
    1. 完整引入:引入了eui所有的组件,学习时/开发时常用
    2. 按需引入:引入需要的组件,生产环境下使用。

  1. 完整引入
    1. 1. 导入 element ui 组件库
    2. 2. 导入 element ui css样式
    3. 3. 并将element ui 注册给vue

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_17,color_FFFFFF,t_70,g_se,x_16

  1. /* 导入element-ui样式
  2. */
  3. import 'element-ui/lib/theme-chalk/index.css'
  4. import Vue from 'vue'
  5. import App from './App.vue'
  6. import router from './router'
  7. import store from './store'
  8. /* element-ui所有组件
  9. */
  10. import ElementUI from 'element-ui'
  11. Vue.use(ElementUI)
  12. Vue.config.productionTip = false
  13. new Vue({
  14. router,
  15. store,
  16. render: h => h(App)
  17. }).$mount('#app')

3.布局容器

布局容器

  1. 使用element-ui的布局容器(Container) 进行页面布局。对页面进行划分(上、下、左、中)
  2. 官方文档 : https://element.eleme.cn/#/zh-CN/component/container

用于布局的容器组件,方便快速搭建页面的基本结构:

<el-container>:外层容器。当子元素中包含 <el-header> 或 <el-footer> 时,全部子元素会垂直上下排列,否则会水平左右排列。

<el-header>:顶栏容器。

<el-aside>:侧边栏容器。

<el-main>:主要区域容器。

<el-footer>:底栏容器。

以上组件采用了 flex 布局,使用前请确定目标浏览器是否兼容。此外,<el-container> 的子元素只能是后四者,后四者的父元素也只能是 <el-container>

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

步骤一: 修改src/main.js 导入 element-ui 样式和组件

  1. /* 导入element-ui样式
  2. */
  3. import 'element-ui/lib/theme-chalk/index.css'
  4. import Vue from 'vue'
  5. import App from './App.vue'
  6. import router from './router'
  7. import store from './store'
  8. /* element-ui所有组件
  9. */
  10. import ElementUI from 'element-ui'
  11. Vue.use(ElementUI)
  12. Vue.config.productionTip = false
  13. new Vue({
  14. router,
  15. store,
  16. render: h => h(App)
  17. }).$mount('#app')

步骤二: 删除 src/App.vue所有内容, 拷贝布局模板和样式

  1. <template>
  2. <div id="app">
  3. <el-container>
  4. <el-header>Header</el-header>
  5. <el-main>Main</el-main>
  6. <el-footer>Footer</el-footer>
  7. </el-container>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. }
  13. </script>
  14. <style>
  15. /* 稍后删除 */
  16. .el-header, .el-footer {
  17. background-color: #B3C0D1;
  18. color: #333;
  19. text-align: center;
  20. line-height: 60px;
  21. }
  22. </style>

reset.css

布局页面完成后, 整个body会存在一圈空白, 开发中一般选择重新设置页面样式

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

步骤一: 百度搜索”reset.css” , 并创建 assets/app.css ,拷贝样式 (复制下面样式即可)

 1f8fb641cbde435c860f62c4d3827279.png

  1. body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,th,td {
  2. margin: 0;
  3. padding: 0;
  4. }
  5. table {
  6. border-collapse: collapse;
  7. border-spacing: 0;
  8. }
  9. fieldset,img {
  10. border: 0;
  11. }
  12. address,caption,cite,code,dfn,em,strong,th,var {
  13. font-style: normal;
  14. font-weight: normal;
  15. }
  16. ol,ul {
  17. list-style: none;
  18. }
  19. caption,th {
  20. text-align: left;
  21. }
  22. h1,h2,h3,h4,h5,h6 {
  23. font-size: 100%;
  24. font-weight: normal;
  25. }

满屏填充

在App.vue中,添加样式

  1. html, body, .el-container {
  2. height: 100%;
  3. }

4.导航条

需求

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

导航条

使用导航菜单(NavMenu) 完成导航条效果

官方文档 : https://element.eleme.cn/#/zh-CN/component/menu

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div id="app">
  3. <el-container>
  4. <el-header>
  5. <!-- 导航条 -->
  6. <el-menu
  7. :default-active="$route.path"
  8. class="el-menu-demo"
  9. mode="horizontal"
  10. background-color="#545c64"
  11. text-color="#fff"
  12. active-text-color="#ffd04b"
  13. >
  14. <el-menu-item index="/">首页</el-menu-item>
  15. <el-submenu index="2">
  16. <template slot="title">学生管理</template>
  17. <el-menu-item index="/studentList">学生列表</el-menu-item>
  18. </el-submenu>
  19. <el-submenu index="3">
  20. <template slot="title">个人中心</template>
  21. <el-menu-item index="/login">登录</el-menu-item>
  22. <el-menu-item index="/register">注册</el-menu-item>
  23. </el-submenu>
  24. <el-menu-item index="/cart">
  25. 购物车
  26. </el-menu-item>
  27. </el-menu>
  28. </el-header>
  29. <el-main>
  30. <router-view></router-view>
  31. </el-main>
  32. <el-footer>
  33. 版权所有 2006 - 2022 传智专修学院
  34. </el-footer>
  35. </el-container>
  36. </div>
  37. </template>
  38. <script>
  39. export default {
  40. }
  41. </script>
  42. <style>
  43. .el-header, .el-footer {
  44. background-color: #B3C0D1;
  45. color: #333;
  46. text-align: center;
  47. line-height: 60px;
  48. padding: 0;
  49. }
  50. </style>

路由

点击”首页” 和 “购物车” 可以调整页面

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

步骤一: 修改 src/App.vue 设置路由视图

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_19,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div id="app">
  3. <el-container>
  4. <el-header>
  5. <!-- 导航条 -->
  6. <el-menu
  7. class="el-menu-demo"
  8. mode="horizontal"
  9. background-color="#545c64"
  10. text-color="#fff"
  11. active-text-color="#ffd04b"
  12. :router="true"
  13. >
  14. <el-menu-item index="/">首页</el-menu-item>
  15. <el-submenu index="2">
  16. <template slot="title">学生管理</template>
  17. <el-menu-item index="/studentList">学生列表</el-menu-item>
  18. </el-submenu>
  19. <el-submenu index="3">
  20. <template slot="title">个人中心</template>
  21. <el-menu-item index="/login">登录</el-menu-item>
  22. <el-menu-item index="/register">注册</el-menu-item>
  23. </el-submenu>
  24. <el-menu-item index="/cart">
  25. 购物车
  26. </el-menu-item>
  27. </el-menu>
  28. </el-header>
  29. <el-main>
  30. <router-view></router-view>
  31. </el-main>
  32. <el-footer>
  33. 版权所有 2006 - 2020 传智专修学院
  34. </el-footer>
  35. </el-container>
  36. </div>
  37. </template>
  38. <script>
  39. export default {
  40. }
  41. </script>
  42. <style>
  43. .el-header, .el-footer {
  44. background-color: #B3C0D1;
  45. color: #333;
  46. text-align: center;
  47. line-height: 60px;
  48. padding: 0;
  49. }
  50. </style>

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

步骤二: 编写测试组件(Home.vue和Cart.vue)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_16,color_FFFFFF,t_70,g_se,x_16

页面刷新导航选择问题

默认情况:点击后的默认效果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

刷新页面, 导航条的选中状态消失

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

 修复: 修改 App.vue页面

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_19,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div id="app">
  3. <el-container>
  4. <el-header>
  5. <!-- 导航条 -->
  6. <el-menu
  7. :default-active="$route.path"
  8. class="el-menu-demo"
  9. mode="horizontal"
  10. background-color="#545c64"
  11. text-color="#fff"
  12. active-text-color="#ffd04b"
  13. :router="true"
  14. >

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

页眉

  1. <el-footer>
  2. 版权所有 2006 - 2022 传智专修学院
  3. </el-footer>

5.表格:查询列表

测试页面

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_19,color_FFFFFF,t_70,g_se,x_16

基本表格

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <!-- 列表 -->
  4. <el-table :data="studentList" >
  5. <el-table-column prop="sid" label="编号" width="150"></el-table-column>
  6. <el-table-column prop="sname" label="姓名" width="150"></el-table-column>
  7. <el-table-column prop="gender" label="性别" width="150"></el-table-column>
  8. <el-table-column prop="age" label="年龄" width="150"></el-table-column>
  9. </el-table>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. data () {
  15. return {
  16. studentList: [
  17. {
  18. sid: 's001',
  19. sname: '张三',
  20. gender: '男',
  21. age: 18
  22. },
  23. {
  24. sid: 's002',
  25. sname: '李思',
  26. gender: '女',
  27. age: 21
  28. }
  29. ]
  30. }
  31. }
  32. }
  33. </script>
  34. <style>
  35. </style>

表格修饰

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <!-- 列表 -->
  4. <el-table :data="studentList" stripe border >
  5. <el-table-column prop="sid" label="编号" width="150"></el-table-column>

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16多选

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <!-- 列表 -->
  4. <el-table :data="studentList" stripe border @selection-change="handleSelectionChange">
  5. <el-table-column type="selection" width="55"></el-table-column>
  6. <el-table-column prop="sid" label="编号" width="150"></el-table-column>
  7. <el-table-column prop="sname" label="姓名" width="150"></el-table-column>
  8. <el-table-column prop="gender" label="性别" width="150"></el-table-column>
  9. <el-table-column prop="age" label="年龄" width="150"></el-table-column>
  10. </el-table>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. methods: {
  16. handleSelectionChange(val) {
  17. this.multipleSelection = val; //保存选中的数据
  18. }
  19. },
  20. data () {
  21. return {
  22. multipleSelection: [], //多选,选中的数据
  23. studentList: [
  24. {
  25. sid: 's001',
  26. sname: '张三',
  27. gender: '男',
  28. age: 18
  29. },
  30. {
  31. sid: 's002',
  32. sname: '李思',
  33. gender: '女',
  34. age: 21
  35. }
  36. ]
  37. }
  38. }
  39. }
  40. </script>
  41. <style>
  42. </style>

自定义模板

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <!-- 列表 -->
  4. <el-table :data="studentList" stripe border @selection-change="handleSelectionChange">
  5. <el-table-column type="selection" width="55"></el-table-column>
  6. <el-table-column prop="sid" label="编号" width="150"></el-table-column>
  7. <el-table-column prop="sname" label="姓名" width="150"></el-table-column>
  8. <el-table-column prop="gender" label="性别" width="150"></el-table-column>
  9. <el-table-column prop="age" label="年龄" width="150"></el-table-column>
  10. <el-table-column label="操作">
  11. <template slot-scope="scope">
  12. <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
  13. <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
  14. </template>
  15. </el-table-column>
  16. </el-table>
  17. </div>
  18. </template>
  19. <script>
  20. export default {
  21. methods: {
  22. handleSelectionChange(val) {
  23. this.multipleSelection = val; //保存选中的数据
  24. },
  25. handleEdit(index, row) {
  26. console.log(index, row);
  27. },
  28. handleDelete(index, row) {
  29. console.log(index, row);
  30. }
  31. },
  32. data () {
  33. return {
  34. multipleSelection: [], //多选,选中的数据
  35. studentList: [
  36. {
  37. sid: 's001',
  38. sname: '张三',
  39. gender: '男',
  40. age: 18
  41. },
  42. {
  43. sid: 's002',
  44. sname: '李思',
  45. gender: '女',
  46. age: 21
  47. }
  48. ]
  49. }
  50. }
  51. }
  52. </script>
  53. <style>
  54. </style>
  1. 练习:展示“爱好”信息
  1. studentList: [
  2. {
  3. sid: 's001',
  4. sname: '张三',
  5. gender: '男',
  6. age: 18,
  7. hobbies: ['抽烟','喝酒','烫头']
  8. },
  9. {
  10. sid: 's002',
  11. sname: '李思',
  12. gender: '女',
  13. age: 21,
  14. hobbies: ['抽烟','烫头']
  15. }
  16. ]

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <!-- 列表 -->
  4. <el-table :data="studentList" stripe border @selection-change="handleSelectionChange">
  5. <el-table-column type="selection" width="55"></el-table-column>
  6. <el-table-column prop="sid" label="编号" width="150"></el-table-column>
  7. <el-table-column prop="sname" label="姓名" width="150"></el-table-column>
  8. <el-table-column prop="gender" label="性别" width="150"></el-table-column>
  9. <el-table-column prop="age" label="年龄" width="150"></el-table-column>
  10. <el-table-column label="爱好" >
  11. <template slot-scope="scope">
  12. <el-tag type="warning" v-for="(hobby,index) in scope.row.hobbies" :key="index">{{hobby}}</el-tag>
  13. </template>
  14. </el-table-column>
  15. <el-table-column label="操作">
  16. <template slot-scope="scope">
  17. <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
  18. <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
  19. </template>
  20. </el-table-column>
  21. </el-table>
  22. </div>
  23. </template>
  24. <script>
  25. export default {
  26. methods: {
  27. handleSelectionChange(val) {
  28. this.multipleSelection = val; //保存选中的数据
  29. },
  30. handleEdit(index, row) {
  31. console.log(index, row);
  32. },
  33. handleDelete(index, row) {
  34. console.log(index, row);
  35. }
  36. },
  37. data () {
  38. return {
  39. multipleSelection: [], //多选,选中的数据
  40. studentList: [
  41. {
  42. sid: 's001',
  43. sname: '张三',
  44. gender: '男',
  45. age: 18,
  46. hobbies: ['抽烟','喝酒','烫头']
  47. },
  48. {
  49. sid: 's002',
  50. sname: '李思',
  51. gender: '女',
  52. age: 21,
  53. hobbies: ['抽烟','烫头']
  54. }
  55. ]
  56. }
  57. }
  58. }
  59. </script>
  60. <style>
  61. .el-tag + .el-tag {
  62. margin-left: 10px;
  63. }
  64. </style>

总结

标签

描述

属性

描述

<el-table>

用于绘制表格

data

需要显示的数据

stripe

创建带斑马纹的表格

border

带边框表格

<el-table-column>

用于设置表格的列

label

列名

prop

对应对象中的键名

width

列宽

type

selection 多选框

<template slot-scope="scope">

内容嵌入,scope

条件查询

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <!-- 条件表单 start -->
  2. <el-form :inline="true" :model="studentVo" size="mini" class="demo-form-inline">
  3. <el-form-item label="班级">
  4. <el-select v-model="studentVo.cid" placeholder="请选择班级">
  5. <el-option label="Java12班" value="c001"></el-option>
  6. <el-option label="Java34班" value="c002"></el-option>
  7. </el-select>
  8. </el-form-item>
  9. <el-form-item label="姓名">
  10. <el-input v-model="studentVo.name" placeholder="请输入姓名"></el-input>
  11. </el-form-item>
  12. <el-form-item label="年龄">
  13. <el-col :span="11">
  14. <el-input v-model="studentVo.startAge" placeholder="请输入开始年龄"></el-input>
  15. </el-col>
  16. <el-col class="line" :span="2">-</el-col>
  17. <el-col :span="11">
  18. <el-input v-model="studentVo.endAge" placeholder="请输入结束年龄"></el-input>
  19. </el-col>
  20. </el-form-item>
  21. <el-form-item>
  22. <el-button type="primary" @click="onSubmit">查询</el-button>
  23. </el-form-item>
  24. </el-form>
  25. <!-- 条件表单 end -->

分页条

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <!-- 分页条start -->
  2. <el-pagination
  3. @size-change="handleSizeChange"
  4. @current-change="handleCurrentChange"
  5. :current-page="pageInfo.pageNum"
  6. :page-sizes="[1, 2, 5, 10]"
  7. :page-size="pageInfo.pageSize"
  8. layout="total, sizes, prev, pager, next, jumper"
  9. :total="pageInfo.total">
  10. </el-pagination>
  11. <!-- 分页条end -->

 6.表单

简单表单:登录

显示登录页面:Login.vue

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_18,color_FFFFFF,t_70,g_se,x_16

登录表单效果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_18,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <el-card class="box-card">
  3. <el-form :model="user" label-width="80px" ref="loginFormRef">
  4. <el-form-item label="用户名">
  5. <el-input v-model="user.username" prefix-icon="el-icon-user" placeholder="请输入用户名"></el-input>
  6. </el-form-item>
  7. <el-form-item label="密码">
  8. <el-input v-model="user.password" prefix-icon="el-icon-lock" type="password" placeholder="请输入密码"></el-input>
  9. </el-form-item>
  10. <el-form-item>
  11. <el-button type="primary" @click="login">登录</el-button>
  12. <el-button type="info" @click="$refs.loginFormRef.resetFields()" >重置</el-button>
  13. </el-form-item>
  14. </el-form>
  15. </el-card>
  16. </template>
  17. <script>
  18. export default {
  19. data() {
  20. return {
  21. user: {
  22. username: '',
  23. password: ''
  24. }
  25. }
  26. },
  27. }
  28. </script>
  29. <style>
  30. .box-card {
  31. width: 480px;
  32. }
  33. </style>

复杂表单:注册

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_18,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_13,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <el-card class="box-card">
  3. <el-form :model="user" label-width="80px" ref="loginFormRef">
  4. <el-form-item label="用户名">
  5. <el-input v-model="user.username" prefix-icon="el-icon-user" placeholder="请输入用户名"></el-input>
  6. </el-form-item>
  7. <el-form-item label="密码">
  8. <el-input v-model="user.password" prefix-icon="el-icon-lock" type="password" placeholder="请输入密码"></el-input>
  9. </el-form-item>
  10. <el-form-item label="确认密码">
  11. <el-input v-model="user.repassword" prefix-icon="el-icon-lock" type="password" placeholder="请再次输入密码"></el-input>
  12. </el-form-item>
  13. <el-form-item label="生日">
  14. <el-date-picker v-model="user.birthday" type="date" placeholder="选择日期">
  15. </el-date-picker>
  16. </el-form-item>
  17. <el-form-item label="学历">
  18. <el-select v-model="user.edu" placeholder="请选择你的学历">
  19. <el-option label="小班" value="xb"></el-option>
  20. <el-option label="中班" value="zb"></el-option>
  21. <el-option label="大班" value="db"></el-option>
  22. <el-option label="学前班" value="xqb"></el-option>
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="性别">
  26. <el-radio-group v-model="user.gender">
  27. <el-radio label="男"></el-radio>
  28. <el-radio label="女"></el-radio>
  29. </el-radio-group>
  30. </el-form-item>
  31. <el-form-item label="爱好">
  32. <el-checkbox-group v-model="user.hobbies">
  33. <el-checkbox label="抽烟" name="type"></el-checkbox>
  34. <el-checkbox label="喝酒" name="type"></el-checkbox>
  35. <el-checkbox label="烫头" name="type"></el-checkbox>
  36. <el-checkbox label="蹦迪" name="type"></el-checkbox>
  37. </el-checkbox-group>
  38. </el-form-item>
  39. <el-form-item label="婚否">
  40. <el-switch v-model="user.marry"></el-switch>
  41. </el-form-item>
  42. <el-form-item label="省市县">
  43. <el-cascader
  44. v-model="user.city"
  45. :options="cityList"
  46. ></el-cascader>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button type="primary" @click="login">登录</el-button>
  50. <el-button type="info" @click="$refs.loginFormRef.resetFields()" >重置</el-button>
  51. </el-form-item>
  52. </el-form>
  53. </el-card>
  54. </template>
  55. <script>
  56. export default {
  57. data() {
  58. return {
  59. user: {
  60. username: 'jack',
  61. password: '1234',
  62. repassword: '1234',
  63. birthday: '2020-10-07',
  64. edu: 'db',
  65. gender: '女',
  66. hobbies: ['抽烟','烫头'],
  67. marry: true,
  68. city: ['jiangsu', 'suqian', 'shuyang'],
  69. },
  70. cityList: [
  71. {
  72. value: 'jiangsu',
  73. label: '江苏',
  74. children: [
  75. {
  76. value: 'suqian',
  77. label: '宿迁',
  78. children: [
  79. {
  80. value: 'shuyang',
  81. label: '沭阳',
  82. },
  83. {
  84. value: 'siyang',
  85. label: '泗阳',
  86. }
  87. ]
  88. },
  89. {
  90. value: 'lianyungang',
  91. label: '连云港',
  92. }
  93. ]
  94. }
  95. ]
  96. }
  97. },
  98. methods: {
  99. login() {
  100. alert('登录中...')
  101. }
  102. },
  103. }
  104. </script>
  105. <style>
  106. .box-card {
  107. width: 480px;
  108. }
  109. </style>

表单校验

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_16,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_17,color_FFFFFF,t_70,g_se,x_16

设置校验规则、确定校验属性

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

编写校验规则

  1. rules: {
  2. 校验属性: [ 规则1, 规则2, .... ]
  3. }
  1. { required: true, message: '请输入用户名', trigger: 'blur' },
  2. { min: 3, max: 5, message: `用户名长度必须3-5之间`, trigger: 'blur' }

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

提交表单时,校验

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <el-card class="box-card">
  3. <el-form :model="user" :rules="rules" label-width="80px" ref="loginFormRef">
  4. <el-form-item label="用户名" prop="username">
  5. <el-input v-model="user.username" prefix-icon="el-icon-user" placeholder="请输入用户名"></el-input>
  6. </el-form-item>
  7. <el-form-item label="密码" prop="password">
  8. <el-input v-model="user.password" prefix-icon="el-icon-lock" type="password" placeholder="请输入密码"></el-input>
  9. </el-form-item>
  10. <el-form-item>
  11. <el-button type="primary" @click="login">登录</el-button>
  12. <el-button type="info" @click="$refs.loginFormRef.resetFields()" >重置</el-button>
  13. </el-form-item>
  14. </el-form>
  15. </el-card>
  16. </template>
  17. <script>
  18. export default {
  19. data() {
  20. return {
  21. user: {
  22. username: '',
  23. password: ''
  24. },
  25. rules: {
  26. username: [
  27. { required: true, message: '请输入用户名', trigger: 'blur' },
  28. { min: 3, max: 5, message: `用户名长度必须3-5之间`, trigger: 'blur' }
  29. ],
  30. password: [
  31. { required: true, message: '请输入密码', trigger: 'blur' },
  32. { min: 3, max: 5, message: `密码长度必须3-5之间`, trigger: 'blur' }
  33. ]
  34. }
  35. }
  36. },
  37. methods: {
  38. login() {
  39. this.$refs.loginFormRef.validate(valid => {
  40. if(valid) {
  41. // 校验通过
  42. console.info('通过')
  43. } else {
  44. // 校验未通过
  45. console.info('未通过')
  46. }
  47. })
  48. }
  49. },
  50. }
  51. </script>
  52. <style>
  53. .box-card {
  54. width: 480px;
  55. }
  56. </style>

自定义校验

  1. <template>
  2. <div>
  3. <h3>登录校验</h3>
  4. <el-card class="login-card">
  5. <!-- 登录表单start -->
  6. <el-form ref="loginForm" :model="user" :rules="rules" label-width="80px">
  7. <el-form-item label="用户名" prop="username">
  8. <el-input v-model="user.username" prefix-icon="el-icon-user" placeholder="请输入用户名" clearable></el-input>
  9. </el-form-item>
  10. <el-form-item label="密码" prop="password">
  11. <el-input v-model="user.password" prefix-icon="el-icon-lock" placeholder="请输入密码" show-password clearable></el-input>
  12. </el-form-item>
  13. <el-form-item label="确认密码" prop="repassword">
  14. <el-input v-model="user.repassword" prefix-icon="el-icon-lock" placeholder="请再次输入密码" show-password clearable></el-input>
  15. </el-form-item>
  16. <el-form-item>
  17. <el-button type="primary" @click="login()">登录</el-button>
  18. <el-button type="info">重置</el-button>
  19. </el-form-item>
  20. </el-form>
  21. <!-- 登录表单end -->
  22. </el-card>
  23. </div>
  24. </template>
  25. <script>
  26. export default {
  27. data() {
  28. //校验: 密码和确认密码一致
  29. var validatePass2 = (rule, value, callback) => {
  30. if (value !== this.user.password) {
  31. callback(new Error('两次输入密码不一致!'));
  32. } else {
  33. callback();
  34. }
  35. };
  36. return {
  37. user: {
  38. username: '',
  39. password: '',
  40. repassword: ''
  41. },
  42. rules: {
  43. username: [
  44. { required: true, message: '请输入用户名', trigger: 'blur' },
  45. { min: 3, max: 5, message: '用户名长度在 3 到 5 个字符', trigger: 'blur' }
  46. ],
  47. password: [
  48. { required: true, message: '请输入密码', trigger: 'blur' },
  49. { min: 3, max: 5, message: '密码长度在 3 到 5 个字符', trigger: 'blur' }
  50. ],
  51. repassword: [
  52. { required: true, message: '请再次输入密码', trigger: 'blur' },
  53. { validator: validatePass2, trigger: 'blur' }
  54. ]
  55. }
  56. }
  57. },
  58. methods: {
  59. login() {
  60. // js 对象调用有2种方式:this.user.username 或 this.user['username']
  61. this.$refs.loginForm.validate((valid) => {
  62. if (valid) {
  63. // 校验通过
  64. alert('submit!');
  65. } else {
  66. // 校验失败
  67. console.log('error submit!!');
  68. return false;
  69. }
  70. });
  71. }
  72. },
  73. }
  74. </script>
  75. <style>
  76. .login-card{
  77. width: 480px;
  78. }
  79. </style>

7.常见组件

按钮 Button

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <el-button>默认按钮</el-button>
  4. <el-button type="primary">主要按钮</el-button>
  5. <el-button type="success">成功按钮</el-button>
  6. <el-button type="info">信息按钮</el-button>
  7. <el-button type="warning">警告按钮</el-button>
  8. <el-button type="danger">危险按钮</el-button>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. }
  14. </script>
  15. <style>
  16. </style>

消息提示 Message

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. this.$message.success('这是一条成功消息')
  2. this.$message.error('这是一条错误消息')

  1. <template>
  2. <div>
  3. <el-button type="info" @click="open1">消息</el-button>
  4. <el-button type="success" @click="open2">成功</el-button>
  5. <el-button type="warning" @click="open3">警告</el-button>
  6. <el-button type="danger" @click="open4">错误</el-button>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. methods: {
  12. open1() {
  13. this.$message.info('这是一条提示信息')
  14. },
  15. open2() {
  16. this.$message.success('这是一条成功消息')
  17. },
  18. open3() {
  19. this.$message.warning('这是一条警告消息')
  20. },
  21. open4() {
  22. this.$message.error('这是一条错误消息')
  23. },
  24. },
  25. }
  26. </script>
  27. <style>
  28. </style>

弹出框 MessageBox 确认消息

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. this.$confirm('这是提示信息','这是标题',{confirmButtonText: '确定按钮',cancelButtonText: '取消按钮',type: 'warning'})
  2. .then(()=>{
  3. // 确定按钮回调
  4. this.$message.success('删除了')
  5. // ajax操作
  6. })
  7. .catch(()=>{
  8. // 取消按钮回调
  9. this.$message.error('取消了')
  10. })

弹出框

编写弹出层

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <el-button type="text" @click="dialogVisible = true">点击打开 Dialog</el-button>
  4. <!-- 弹出层 -->
  5. <el-dialog title="这是标题" :visible.sync="dialogVisible" >
  6. 我是一段正文信息
  7. <!-- 操作按钮 -->
  8. <span slot="footer" class="dialog-footer">
  9. <el-button @click="dialogVisible = false">取 消</el-button>
  10. <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
  11. </span>
  12. </el-dialog>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. data() {
  18. return {
  19. dialogVisible: false, //是否显示弹出层
  20. }
  21. },
  22. }
  23. </script>
  24. <style>
  25. </style>

抽屉

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <el-button type="primary" @click="drawerFormVisible = true">修改学生</el-button>
  4. <!-- 抽屉start -->
  5. <el-drawer
  6. title="我是标题"
  7. :visible.sync="drawerFormVisible"
  8. direction="rtl"
  9. :before-close="handleClose">
  10. <el-form :model="student" label-width="80px">
  11. <el-form-item label="姓名" >
  12. <el-input v-model="student.sname" autocomplete="off"></el-input>
  13. </el-form-item>
  14. <el-form-item label="班级" >
  15. <el-select v-model="student.cid" placeholder="请选择班级">
  16. <el-option label="Java12班" value="c001"></el-option>
  17. <el-option label="Java34班" value="c002"></el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item>
  21. <el-button type="primary" @click="drawerFormVisible=false">确定</el-button>
  22. <el-button>取消</el-button>
  23. </el-form-item>
  24. </el-form>
  25. </el-drawer>
  26. <!-- 抽屉end -->
  27. </div>
  28. </template>
  29. <script>
  30. export default {
  31. data() {
  32. return {
  33. drawerFormVisible: false,
  34. student: {
  35. }
  36. }
  37. },
  38. methods: {
  39. handleClose(done) {
  40. this.$confirm('确认关闭?')
  41. .then(_ => {
  42. //确定按钮
  43. done(); //结束回调
  44. })
  45. .catch(_ => {
  46. //取消
  47. });
  48. }
  49. },
  50. }
  51. </script>
  52. <style>
  53. </style>

标签页

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <el-tabs v-model="activeName" >
  4. <el-tab-pane label="用户管理" name="first">
  5. 用户管理
  6. <el-button type="primary" @click="activeName = 'second'">下一步</el-button>
  7. </el-tab-pane>
  8. <el-tab-pane label="配置管理" name="second">
  9. 配置管理
  10. <el-button type="primary" @click="activeName = 'third'">下一步</el-button>
  11. </el-tab-pane>
  12. <el-tab-pane label="角色管理" name="third">
  13. 角色管理
  14. <el-button type="primary" @click="activeName = 'fourth'">下一步</el-button>
  15. </el-tab-pane>
  16. <el-tab-pane label="定时任务补偿" name="fourth">
  17. 定时任务补偿
  18. <el-button type="primary" @click="$message.success('成功了')">完成</el-button>
  19. </el-tab-pane>
  20. </el-tabs>
  21. </div>
  22. </template>
  23. <script>
  24. export default {
  25. data() {
  26. return {
  27. activeName: 'first'
  28. };
  29. }
  30. }
  31. </script>
  32. <style>
  33. </style>

 8.Tree组件

表结构

  1. # 分类表
  2. CREATE TABLE t_category(
  3. tid VARCHAR(32) PRIMARY KEY COMMENT '分类ID',
  4. tname VARCHAR(50) COMMENT '分类名称',
  5. `status` INT DEFAULT '1' COMMENT '分类状态:0 禁用、1 启用',
  6. parent_id VARCHAR(32) COMMENT '父分类ID',
  7. priority INT COMMENT '优先级,越小,同级显示的时候越靠前',
  8. depth INT COMMENT '深度,从1递增'
  9. );
  10. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1000','男装/运动户外', NULL ,1,1);
  11. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2000','手机/数码', NULL ,2,1);
  12. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3000','零食/生鲜', NULL ,3,1);
  13. #'t1000','男装/运动户外'
  14. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1100','上装', 't1000' ,1,2);
  15. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1200','裤子', 't1000' ,2,2);
  16. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1300','流行趋势', 't1000' ,3,2);
  17. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1110','羽绒服', 't1100' ,1,3);
  18. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1120','棉衣', 't1100' ,2,3);
  19. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1130','卫衣', 't1100' ,3,3);
  20. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1210','休闲长裤', 't1200' ,1,3);
  21. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1220','牛仔长裤', 't1200' ,2,3);
  22. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1230','卫裤', 't1200' ,3,3);
  23. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1310','伞兵裤', 't1300' ,1,3);
  24. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1320','夜跑裤', 't1300' ,2,3);
  25. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t1330','冰感T恤', 't1300' ,3,3);
  26. # 't2000','手机/数码'
  27. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2100','手机', 't2000' ,1,2);
  28. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2200','手机配件', 't2000' ,2,2);
  29. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2300','数码配件', 't2000' ,3,2);
  30. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2110','华为手机', 't2100' ,1,3);
  31. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2120','苹果手机', 't2100' ,2,3);
  32. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2130','vivo手机', 't2100' ,3,3);
  33. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2210','手机壳', 't2200' ,1,3);
  34. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2220','手机耳机', 't2200' ,2,3);
  35. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2230','手机支架', 't2200' ,3,3);
  36. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2310','U盘', 't2300' ,1,3);
  37. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2320','硬盘', 't2300' ,2,3);
  38. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t2330','电池', 't2300' ,3,3);
  39. # t2000','零食/生鲜
  40. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3100','方便速食', 't3000' ,1,2);
  41. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3200','零食', 't3000' ,2,2);
  42. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3300','名酒', 't3000' ,3,2);
  43. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3400','乳饮冰', 't3000' ,4,2);
  44. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3110','方便面', 't3100' ,1,3);
  45. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3120','火腿肠', 't3100' ,2,3);
  46. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3130','甜品罐头', 't3100' ,3,3);
  47. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3140','煎饼冷面', 't3100' ,4,3);
  48. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3210','薯片', 't3200' ,1,3);
  49. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3220','饼干', 't3200' ,2,3);
  50. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3230','网红IP', 't3200' ,3,3);
  51. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3240','海味', 't3200' ,4,3);
  52. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3310','清爽啤酒', 't3300' ,1,3);
  53. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3320','微醺红酒', 't3300' ,2,3);
  54. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3330','养生黄酒', 't3300' ,3,3);
  55. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3340','名优白酒', 't3300' ,4,3);
  56. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3410','酸奶', 't3400' ,1,3);
  57. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3420','纯牛奶', 't3400' ,2,3);
  58. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3430','奶粉', 't3400' ,3,3);
  59. INSERT INTO t_category(tid,tname,parent_id,priority,depth) VALUES('t3440','奶酪', 't3400' ,4,3);

后端实现

JavaBean

  1. package com.czxy.entity;
  2. import com.baomidou.mybatisplus.annotation.TableField;
  3. import com.baomidou.mybatisplus.annotation.TableId;
  4. import com.baomidou.mybatisplus.annotation.TableName;
  5. import com.baomidou.mybatisplus.extension.activerecord.Model;
  6. import lombok.Data;
  7. import java.io.Serializable;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. @SuppressWarnings("serial")
  11. @TableName("t_category")
  12. @Data
  13. public class TCategory extends Model<TCategory> {
  14. //分类ID
  15. @TableId
  16. private String tid;
  17. //分类名称
  18. private String tname;
  19. //分类状态:0 禁用、1 启用
  20. private Integer status;
  21. //父分类ID
  22. private String parentId;
  23. //优先级,越小,同级显示的时候越靠前
  24. private Integer priority;
  25. //深度,从1递增
  26. private Integer depth;
  27. @TableField(exist = false)
  28. private List<TCategory> children = new ArrayList<>();
  29. }

Controller

  1. package com.czxy.controller;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.api.ApiController;
  4. import com.baomidou.mybatisplus.extension.api.R;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.czxy.entity.TCategory;
  7. import com.czxy.service.TCategoryService;
  8. import com.czxy.vo.BaseResult;
  9. import org.springframework.web.bind.annotation.*;
  10. import javax.annotation.Resource;
  11. import java.io.Serializable;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16. @RestController
  17. @RequestMapping("tCategory")
  18. public class TCategoryController extends ApiController {
  19. /**
  20. * 服务对象
  21. */
  22. @Resource
  23. private TCategoryService tCategoryService;
  24. @GetMapping
  25. public BaseResult<List<TCategory>> findAll() {
  26. // 1 查询所有,并按照parent_id排序
  27. QueryWrapper<TCategory> queryWrapper = new QueryWrapper<>();
  28. queryWrapper.orderByAsc("parent_id");
  29. List<TCategory> list = tCategoryService.list(queryWrapper);
  30. // 2 处理数据 父子关系
  31. List<TCategory> resultList = new ArrayList<>();
  32. Map<String,TCategory> cacheMap = new HashMap<>();
  33. list.forEach( tCategory -> {
  34. // 3.1 获得父分类
  35. TCategory parentCategory = cacheMap.get(tCategory.getParentId());
  36. // 3.2 如果没有父添加到resultList中,如果有父追加父内部
  37. if(parentCategory == null) {
  38. resultList.add(tCategory);
  39. } else {
  40. parentCategory.getChildren().add(tCategory);
  41. }
  42. // 3.3 缓存自己
  43. cacheMap.put(tCategory.getTid() , tCategory);
  44. });
  45. return BaseResult.ok("查询成功",resultList);
  46. }
  47. }

前端基本实现

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <el-tree
  4. :data="categoryList"
  5. :props="defaultProps"
  6. show-checkbox
  7. @check-change="handleCheckChange">
  8. </el-tree>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. categoryList: [],
  16. defaultProps: {
  17. children: 'children',
  18. label: 'tname',
  19. disabled: (data,node) => {
  20. return data.status == 0
  21. }
  22. }
  23. }
  24. },
  25. methods: {
  26. async findAllCategory() {
  27. let { data } = await this.$http.get('http://localhost:7777/tCategory')
  28. this.categoryList = data.data
  29. },
  30. handleCheckChange( data, checked, indeterminate ) {
  31. console.log(data, checked, indeterminate);
  32. }
  33. },
  34. mounted() {
  35. this.findAllCategory()
  36. },
  37. }
  38. </script>
  39. <style>
  40. </style>

修改状态

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

后端实现

  1. @PutMapping("/change")
  2. public BaseResult changeStatue(@RequestBody TCategory tCategory) {
  3. try {
  4. //1 查询
  5. TCategory findCategory = tCategoryService.getById(tCategory.getTid());
  6. Integer currentStatus = findCategory.getStatus();
  7. //2 需要修改成的状态
  8. Integer status = currentStatus == 1 ? 0 : 1;
  9. //3.1 修改当前
  10. Queue<TCategory> queue = new LinkedList<>();
  11. queue.add(findCategory);
  12. //3.2 遍历队列
  13. while(!queue.isEmpty()) {
  14. // 1) 获得队首
  15. TCategory currentCategory = queue.poll();
  16. // 2) 修改状态
  17. currentCategory.setStatus(status);
  18. tCategoryService.updateById(currentCategory);
  19. // 3) 获得所有的子节点
  20. QueryWrapper<TCategory> queryWrapper = new QueryWrapper<>();
  21. queryWrapper.eq("parent_id", currentCategory.getTid());
  22. List<TCategory> list = tCategoryService.list(queryWrapper);
  23. queue.addAll(list);
  24. }
  25. //4 成功
  26. return BaseResult.ok("修改成功");
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. return BaseResult.error(e.getMessage());
  30. }
  31. }

前端实现

  1. <template>
  2. <div>
  3. <el-tree
  4. :data="categoryList"
  5. :props="defaultProps"
  6. show-checkbox
  7. :expand-on-click-node="false"
  8. node-key="tid"
  9. :default-expanded-keys="expandedArr"
  10. @check-change="handleCheckChange">
  11. <span class="custom-tree-node" slot-scope="{ node, data }">
  12. <span>{{ node.label }}</span>
  13. <span>
  14. <el-button type="info" circle v-if="data.status == 1" size="mini" @click="() => changeCategoryStatus(data)">禁用</el-button>
  15. <el-button type="success" circle v-if="data.status == 0" size="mini" @click="() => changeCategoryStatus(data)">启用</el-button>
  16. </span>
  17. </span>
  18. </el-tree>
  19. </div>
  20. </template>
  21. <script>
  22. export default {
  23. data() {
  24. return {
  25. categoryList: [],
  26. defaultProps: {
  27. id: 'tid',
  28. children: 'children',
  29. label: 'tname',
  30. disabled: (data,node) => {
  31. return data.status == 0
  32. }
  33. },
  34. expandedArr: []
  35. }
  36. },
  37. methods: {
  38. async findAllCategory() {
  39. let { data } = await this.$http.get('http://localhost:7777/tCategory')
  40. this.categoryList = data.data
  41. },
  42. handleCheckChange( data, checked, indeterminate ) {
  43. console.log(data, checked, indeterminate);
  44. },
  45. async changeCategoryStatus( nodeData ) {
  46. let { data } = await this.$http.put(`http://localhost:7777/tCategory/change`, nodeData)
  47. if(data.code == 1){
  48. this.$message.success(data.message)
  49. this.findAllCategory()
  50. //设置展开内容
  51. this.expandedArr = []
  52. this.expandedArr.push(nodeData.tid)
  53. } else {
  54. this.$message.error(data.message)
  55. }
  56. }
  57. },
  58. mounted() {
  59. this.findAllCategory()
  60. },
  61. }
  62. </script>
  63. <style>
  64. .custom-tree-node {
  65. flex: 1;
  66. display: flex;
  67. align-items: center;
  68. justify-content: space-between;
  69. font-size: 14px;
  70. padding-right: 8px;
  71. }
  72. </style>

9.综合案例

弹出层回显学生信息

综合案例:点击学生“修改”按钮,显示弹出层

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

弹出层中编写表单

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

编写修改函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_15,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <!-- 列表 -->
  4. <el-table :data="studentList" stripe border @selection-change="handleSelectionChange">
  5. <el-table-column type="selection" width="55"></el-table-column>
  6. <el-table-column prop="sid" label="编号" width="150"></el-table-column>
  7. <el-table-column prop="sname" label="姓名" width="150"></el-table-column>
  8. <el-table-column prop="gender" label="性别" width="150"></el-table-column>
  9. <el-table-column prop="age" label="年龄" width="150"></el-table-column>
  10. <el-table-column label="爱好" >
  11. <template slot-scope="scope">
  12. <el-tag type="warning" v-for="(hobby,index) in scope.row.hobbies" :key="index">{{hobby}}</el-tag>
  13. </template>
  14. </el-table-column>
  15. <el-table-column label="操作">
  16. <template slot-scope="scope">
  17. <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
  18. <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
  19. </template>
  20. </el-table-column>
  21. </el-table>
  22. <!-- 弹出层 -->
  23. <el-dialog title="修改学生" :visible.sync="dialogFormVisible">
  24. <el-form :model="student">
  25. <el-form-item label="姓名" label-width="80px">
  26. <el-input v-model="student.sname" ></el-input>
  27. </el-form-item>
  28. <el-form-item label="性别" label-width="80px">
  29. <el-radio-group v-model="student.gender">
  30. <el-radio label="男">男生</el-radio>
  31. <el-radio label="女">女生</el-radio>
  32. </el-radio-group>
  33. </el-form-item>
  34. <el-form-item label="年龄" label-width="80px">
  35. <el-input v-model="student.age" ></el-input>
  36. </el-form-item>
  37. <el-form-item label="爱好" label-width="80px">
  38. <el-checkbox-group v-model="student.hobbies">
  39. <el-checkbox label="抽烟" name="type"></el-checkbox>
  40. <el-checkbox label="喝酒" name="type"></el-checkbox>
  41. <el-checkbox label="烫头" name="type"></el-checkbox>
  42. </el-checkbox-group>
  43. </el-form-item>
  44. </el-form>
  45. <div slot="footer" class="dialog-footer">
  46. <el-button @click="dialogFormVisible = false">取 消</el-button>
  47. <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
  48. </div>
  49. </el-dialog>
  50. </div>
  51. </template>
  52. <script>
  53. export default {
  54. methods: {
  55. handleSelectionChange(val) {
  56. this.multipleSelection = val; //保存选中的数据
  57. },
  58. handleEdit(index, row) {
  59. // 回显表单
  60. this.student = row
  61. // 显示弹出层
  62. this.dialogFormVisible = true
  63. },
  64. handleDelete(index, row) {
  65. console.log(index, row);
  66. }
  67. },
  68. data () {
  69. return {
  70. dialogFormVisible: false, // 表单弹出层是否显示
  71. multipleSelection: [], //多选,选中的数据
  72. studentList: [
  73. {
  74. sid: 's001',
  75. sname: '张三',
  76. gender: '男',
  77. age: 18,
  78. hobbies: ['抽烟','喝酒','烫头']
  79. },
  80. {
  81. sid: 's002',
  82. sname: '李思',
  83. gender: '女',
  84. age: 21,
  85. hobbies: ['抽烟','烫头']
  86. }
  87. ],
  88. student: {
  89. }
  90. }
  91. }
  92. }
  93. </script>
  94. <style>
  95. .el-tag + .el-tag {
  96. margin-left: 10px;
  97. }
  98. </style>

 10.轮播图

轮播图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <el-carousel :interval="4000" type="card" height="300px">
  4. <el-carousel-item v-for="item in 6" :key="item">
  5. <img src="@/assets/logo.png" alt="">
  6. </el-carousel-item>
  7. </el-carousel>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. }
  13. </script>
  14. <style>
  15. .el-carousel__item img {
  16. width: 100%;
  17. height: 100%;
  18. }
  19. .el-carousel__item:nth-child(2n) {
  20. background-color: #99a9bf;
  21. }
  22. .el-carousel__item:nth-child(2n+1) {
  23. background-color: #d3dce6;
  24. }
  25. </style>

 切换多张图片

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_7,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div>
  3. <el-carousel :interval="1000" type="card" height="400px">
  4. <el-carousel-item v-for="item in 3" :key="item">
  5. <!-- <img src="@/assets/logo.png" alt="我是提示信息"> -->
  6. <!-- <img src="@/assets/img/1.jpg" alt="我是提示信息"> -->
  7. <img :src="require(`@/assets/img/${item}.jpg`)" alt="我是提示信息">
  8. </el-carousel-item>
  9. </el-carousel>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. }
  15. </script>
  16. <style>
  17. .el-carousel__item img {
  18. width: 100%;
  19. height: 100%;
  20. }
  21. /* 偶数的背景颜色 */
  22. .el-carousel__item:nth-child(2n) {
  23. background-color: #99a9bf;
  24. }
  25. /* 奇数的背景颜色 */
  26. .el-carousel__item:nth-child(2n+1) {
  27. background-color: #d3dce6;
  28. }
  29. </style>

复杂下拉列表

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zm254S25ZCM5a2m44CC,size_20,color_FFFFFF,t_70,g_se,x_16 完整代码

  1. <template>
  2.   <div>
  3.     <el-form ref="form" :model="classes" label-width="80px">
  4.       <el-form-item label="选择老师">
  5.         <el-select v-model="classes.teacherIds" @change="changeTeacher" multiple placeholder="请选择老师">
  6.           <el-option
  7.             v-for="(teacher,index) in teacherList" :key="index"
  8.             :label="teacher.tname"
  9.             :value="teacher.id"
  10.             :disabled="teacher.disabled"
  11.            
  12.             >
  13.             <span style="float: left">{{ teacher.tname }}</span>
  14.             <span style="float: right;">{{ teacher.typeText }}</span>
  15.           </el-option>
  16.         </el-select>
  17.       </el-form-item>
  18.     </el-form>
  19.     {{classes}}
  20.   </div>
  21. </template>
  22. <script>
  23. export default {
  24.   data() {
  25.     return {
  26.       classes: {
  27.         teacherIds: []
  28.       },
  29.       teacherList: [
  30.         {
  31.           id: 't001',
  32.           tname: '梁桐老师',
  33.           type: '1',
  34.           typeText: '授课老师',
  35.           disabled: false
  36.         },
  37.         {
  38.           id: 't002',
  39.           tname: '马坤老师',
  40.           type: '2',
  41.           typeText: '助理老师',
  42.           disabled: false
  43.         },
  44.         {
  45.           id: 't003',
  46.           tname: '仲燕老师',
  47.           type: '3',
  48.           typeText: '辅导员老师',
  49.           disabled: false
  50.         },
  51.         {
  52.           id: 't004',
  53.           tname: '韩小娇老师',
  54.           type: '1',
  55.           typeText: '授课老师',
  56.           disabled: false
  57.         },
  58.         {
  59.           id: 't005',
  60.           tname: '董洪超老师',
  61.           type: '2',
  62.           typeText: '助理老师',
  63.           disabled: false
  64.         },
  65.         {
  66.           id: 't006',
  67.           tname: '韩新园老师',
  68.           type: '3',
  69.           typeText: '辅导员老师',
  70.           disabled: false
  71.         },
  72.        
  73.       ]
  74.     }
  75.   },
  76.   methods: {
  77.     changeTeacher(selectIds) { // 选中的老师id
  78.       // 1 获得选中老师对应的类型
  79.       let selectType = this.teacherList.map(teacher => {
  80.         if(selectIds.includes(teacher.id)) {
  81.           return teacher.type
  82.         }
  83.       });
  84.       // 2 处理数据:相同类型,不是选中老师,的其他老师禁用
  85.       this.teacherList.forEach(teacher => {
  86.         if(selectType.includes(teacher.type) && !selectIds.includes(teacher.id)) {
  87.           // 禁用
  88.           teacher.disabled = true
  89.         } else {
  90.           // 启用
  91.           teacher.disabled = false
  92.         }
  93.       })
  94.     }
  95.   },
  96. }
  97. </script>
  98. <style>
  99. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/54381
推荐阅读
相关标签
  

闽ICP备14008679号