1、通过路由展示用户列表页

新建user文件夹,里面新建Users.vue文件:

  1. <template>
  2. <div>
  3. <h3>用户列表组件</h3>
  4. </div>
  5. </template>
  6.  
  7. <script>
  8. export default {
  9. }
  10. </script>
  11.  
  12. <style lang="less" scoped>
  13.  
  14. </style>

修改路由文件,添加Users路由:

  1. import Users from '../components/user/Users.vue'
  2.  
  3. const routes = [
  4. { path: '/', redirect: '/login' }, // 重定向
  5. { path: '/login', component: Login },
  6. {
  7. path: '/home',
  8. component: Home,
  9. redirect: '/welcome', // 重定向
  10. children: [ // 子路由
  11. { path: '/welcome', component: Welcome },
  12. { path: '/users', component: Users } // 用户列表
  13. ]
  14. }
  15. ]

这时点击左侧菜单的用户列表,就可以看到跳转到了用户列表页:

2、小bug:刷新后左侧菜单的高亮没有了

Menu Attribute里有个default-active属性: 表示当前激活菜单的 index,就是说如果想让菜单中的某一项高亮被激活,就把这项对应的index的值,赋值为整个menu菜单的default-active属性。

每次点击左侧二级菜单时,把对应的index的值,赋值给default-active属性。

  1. <el-menu background-color="#333744" text-color="#fff" active-text-color="#409eff" :unique-opened="true"
  2. :collapse="isCollapse" :collapse-transition="false" :router="true" :default-active="activePath">
  3.  
  4. <el-menu-item :index="'/' + subItem.path" v-for="subItem in item.children" :key="subItem.id" @click="saveNavState">
  5.  
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. activePath: '' // 激活状态值
  11. }
  12. },
  13. methods: {
  14. // 保存菜单链接的激活状态
  15. saveNavState(item) {
  16. console.log(item.index)
  17. this.activePath = item.index
  18. }
  19. }
  20. }
  21. </script>

这样写完后发现可以实现效果,但是一刷新,激活状态又没有了,,准备存到sessioStorage中实现保存:

  1. <el-menu background-color="#333744" text-color="#fff" active-text-color="#409eff" :unique-opened="true"
  2. :collapse="isCollapse" :collapse-transition="false" :router="true" :default-active="activePath">
  3.  
  4. <el-menu-item :index="'/' + subItem.path" v-for="subItem in item.children" :key="subItem.id" @click="saveNavState">
  5.  
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. activePath: '' // 被激活的链接地址
  11. }
  12. },
  13. // 生命周期函数
  14. created() {
  15. this.getMenuList()
  16. this.activePath = window.sessionStorage.getItem('activePath')
  17. },
  18. methods: {
  19. // 保存菜单链接的激活状态
  20. saveNavState(item) {
  21. console.log(item.index)
  22. this.activePath = item.index
  23. // 将点击之后的index地址保存到客户端的sessionStorage中
  24. window.sessionStorage.setItem('activePath', item.index)
  25. }
  26. }
  27. }
  28. </script>

可以实现效果了,刷新后还是高亮的。

后来发现新版Element支持更简单的写法了:

  1. <el-menu background-color="#333744" text-color="#fff" active-text-color="#409eff" :unique-opened="true"
  2. :collapse="isCollapse" :collapse-transition="false" :router="true" :default-active="$route.path">
  3.  
  4. <!--直接给default-active绑定$route.path的值就可以了-->

3、用户列表基础布局

首先要把使用的面包屑和卡片组件添加到element.js里:

  1. import Vue from 'vue'
  2. import { Button, Form, FormItem, Input, Message, Container, Header, Aside, Main,
  3. Menu, Submenu, MenuItemGroup, MenuItem, Breadcrumb, BreadcrumbItem, Card } from 'element-ui'
  4.  
  5. Vue.use(Button)
  6. Vue.use(Form)
  7. Vue.use(FormItem)
  8. Vue.use(Input)
  9. Vue.use(Container)
  10. Vue.use(Header)
  11. Vue.use(Aside)
  12. Vue.use(Main)
  13. Vue.use(Menu)
  14. Vue.use(Submenu)
  15. Vue.use(MenuItemGroup)
  16. Vue.use(MenuItem)
  17. Vue.use(Breadcrumb)
  18. Vue.use(BreadcrumbItem)
  19. Vue.use(Card)
  20. // 挂载到Vue全局
  21. Vue.prototype.$message = Message

在Users.vue里添加面包屑和卡片代码:

  1. <template>
  2. <div>
  3. <!--面包屑导航区域-->
  4. <el-breadcrumb separator-class="el-icon-arrow-right">
  5. <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
  6. <el-breadcrumb-item>用户管理</el-breadcrumb-item>
  7. <el-breadcrumb-item>用户列表</el-breadcrumb-item>
  8. </el-breadcrumb>
  9. <!--卡片视图区域-->
  10. <el-card>
  11. 111
  12. </el-card>
  13. </div>
  14. </template>

然后在全局样式global里添加重置样式:

  1. /* 全局样式表 */
  2. html, body, #app {height: 100%; margin:; padding:;}
  3. .el-breadcrumb{margin-bottom: 15px;font-size: 12px;}
  4. .el-card{box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) !important;}

然后进行卡片里的布局,上部是一个搜索框和一个添加按钮,这个可以用栅格布局,记得把Row, Col添加导入到element.js,这里就不写了

实现代码:

  1. <template>
  2. <div>
  3. <!--面包屑导航区域-->
  4. <el-breadcrumb separator-class="el-icon-arrow-right">
  5. <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
  6. <el-breadcrumb-item>用户管理</el-breadcrumb-item>
  7. <el-breadcrumb-item>用户列表</el-breadcrumb-item>
  8. </el-breadcrumb>
  9. <!--卡片视图区域-->
  10. <el-card>
  11. <el-row :gutter="20">
  12. <el-col :span="10">
  13. <!--搜索区域-->
  14. <el-input placeholder="请输入内容">
  15. <el-button slot="append" icon="el-icon-search"></el-button>
  16. </el-input>
  17. </el-col>
  18. <el-col :span="4">
  19. <el-button type="primary">添加用户</el-button>
  20. </el-col>
  21. </el-row>
  22. </el-card>
  23. </div>
  24. </template>

实现效果:

4、请求接口获取用户列表数据

查看接口文档,1.3.1用户数据列表:请求路径是users,请求方式是get,请求参数是:query 查询参数 可以为空、pagenum 当前页码 不能为空、pagesize 每页显示条数 不能为空

代码如下:

  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. userList: [], // 用户列表
  6. total: 0, // 用户总数
  7. // 获取用户列表的参数对象
  8. queryInfo: {
  9. query: '', // 查询参数
  10. pagenum: 1, // 当前页码
  11. pagesize: 2 // 每页显示条数
  12. }
  13. }
  14. },
  15. created() { // 生命周期函数
  16. this.getUserList()
  17. },
  18. methods: {
  19. async getUserList() {
  20. const { data: res } = await this.$http.get('users', { params: this.queryInfo })
  21. console.log(res)
  22. if (res.meta.status !== 200) return this.$message.error(res.meta.msg)
  23. this.userList = res.data.users
  24. this.total = res.data.total
  25. }
  26. }
  27. }
  28. </script>

5、使用表格组件渲染用户列表

首先还是在element.js里添加Table和TableColumn导入:

  1. import Vue from 'vue'
  2. import { Button, Form, FormItem, Input, Message, Container, Header, Aside, Main,
  3. Menu, Submenu, MenuItemGroup, MenuItem, Breadcrumb, BreadcrumbItem, Card, Row, Col,
  4. Table, TableColumn } from 'element-ui'
  5.  
  6. Vue.use(Button)
  7. Vue.use(Form)
  8. Vue.use(FormItem)
  9. Vue.use(Input)
  10. Vue.use(Container)
  11. Vue.use(Header)
  12. Vue.use(Aside)
  13. Vue.use(Main)
  14. Vue.use(Menu)
  15. Vue.use(Submenu)
  16. Vue.use(MenuItemGroup)
  17. Vue.use(MenuItem)
  18. Vue.use(Breadcrumb)
  19. Vue.use(BreadcrumbItem)
  20. Vue.use(Card)
  21. Vue.use(Row)
  22. Vue.use(Col)
  23. Vue.use(Table)
  24. Vue.use(TableColumn)
  25. // 挂载到Vue全局
  26. Vue.prototype.$message = Message

然后添加代码:

  1. <!--用户列表区域-->
  2. <el-table :data="userList" style="width: 100%" border stripe>
  3. <el-table-column prop="username" label="姓名"></el-table-column>
  4. <el-table-column prop="email" label="邮箱"></el-table-column>
  5. <el-table-column prop="mobile" label="电话"></el-table-column>
  6. <el-table-column prop="role_name" label="角色"></el-table-column>
  7. <el-table-column prop="mg_state" label="状态"></el-table-column>
  8. <el-table-column label="操作"></el-table-column>
  9. </el-table>

边框:默认情况下,Table 组件是不具有竖直方向的边框的,如果需要,可以使用border属性,它接受一个Boolean,设置为true即可启用。

隔行变色:stripe属性可以创建带斑马纹的表格。它接受一个Boolean,默认为false,设置为true即为启用。

6、表格前面添加索引列

type="index"

  1. <!--用户列表区域-->
  2. <el-table :data="userList" style="width: 100%" border stripe>
  3. <el-table-column type="index" label="#"></el-table-column>
  4. <el-table-column prop="username" label="姓名"></el-table-column>
  5. <el-table-column prop="email" label="邮箱"></el-table-column>
  6. <el-table-column prop="mobile" label="电话"></el-table-column>
  7. <el-table-column prop="role_name" label="角色"></el-table-column>
  8. <el-table-column prop="mg_state" label="状态"></el-table-column>
  9. <el-table-column label="操作"></el-table-column>
  10. </el-table>

效果图:

7、自定义状态列的显示效果

用到Switch 开关组件,添加导入到element.js,这里就不写了。

然后要用到作用域插槽:

  1. <!-- 作用域插槽 -->
  2. <template slot-scope="scope">
  3. {{scope.row}}
  4. </template>

这里定义了一个作用域插槽,通过slot-scope="scope"接收了当前作用域的数据,然后通过scope.row拿到对应这一行的数据,再绑定具体的属性值就行了。

  1. <el-table-column prop="mg_state" label="状态">
  2. <!-- 作用域插槽 -->
  3. <template slot-scope="scope">
  4. <!-- {{scope.row}} -->
  5. <el-switch v-model="scope.row.mg_state"></el-switch>
  6. </template>
  7. </el-table-column>

如果同时指定了prop和作用域插槽,那么作用域插槽会覆盖prop,所以prop就不生效了,可以删掉。

8、通过作用域插槽自定义操作列

要用过id来操作对应数据,还是定义作用域插槽来实现:

  1. <el-table-column label="操作">
  2. <!-- 作用域插槽 -->
  3. <template slot-scope="scope">
  4. {{scope.row.id}}
  5. </template>
  6. </el-table-column>

然后要添加三个按钮组件: size表示尺寸

  1. <!--修改-->
  2. <el-button type="primary" size="mini" icon="el-icon-edit"></el-button>
  3. <!--删除-->
  4. <el-button type="danger" size="mini" icon="el-icon-delete"></el-button>
  5. <!--分配角色-->
  6. <el-button type="warning" size="mini" icon="el-icon-setting"></el-button>

需要给分配角色按钮添加一个鼠标移上去有提示信息,使用Tooltip 文字提示组件,添加导入这里就不写了:

  1. <!--分配角色-->
  2. <el-tooltip class="item" effect="dark" content="分配角色" placement="top" :enterable="false">
  3. <el-button type="warning" size="mini" icon="el-icon-setting"></el-button>
  4. </el-tooltip>

enterable属性:表示鼠标是否可进入到 tooltip 中,默认是true开的,需要把它绑定为false,鼠标移到上面提示就消失了。

效果图:

9、实现分页效果

Pagination 分页组件,添加导入这里就不写了

属性参数         说明                                                       类型          可选值                                                                默认值
current-page   当前页数,支持 .sync 修饰符                number     —                                                                       1
page-sizes      每页显示个数选择器的选项设置            number[]   —                                                                       [10, 20, 30, 40, 50, 100]
page-size       每页显示条目个数,支持 .sync 修饰符   number    —                                                                       10
total                总条目数                                                 number    —                                                                        —
layout             组件布局,子组件名用逗号分隔             String      sizes, prev, pager, next, jumper, ->, total, slot     'prev, pager, next, jumper, ->, total'

事件名称           说明                                                    回调参数
size-change      pageSize改变时会触发                     每页条数
current-change   currentPage改变时会触发              当前页
prev-click  用户点击上一页按钮改变当前页后触发    当前页
next-click  用户点击下一页按钮改变当前页后触发    当前页

  1. <!--分页区域-->
  2. <el-pagination
  3. @size-change="handleSizeChange"
  4. @current-change="handleCurrentChange"
  5. :current-page="queryInfo.pagenum"
  6. :page-sizes="[1, 2, 5, 10]"
  7. :page-size="queryInfo.pagesize"
  8. layout="total, sizes, prev, pager, next, jumper"
  9. :total="total">
  10. </el-pagination>
  11.  
  12. <script>
  13. export default {
  14. methods: {
  15. // 监听 pageSize 改变的事件
  16. handleSizeChange(newSize) {
  17. console.log(newSize)
  18. },
  19. // 监听 当前页码值 改变的事件
  20. handleCurrentChange(newPage) {
  21. console.log(newPage)
  22. }
  23. }
  24. }
  25. </script>

然后把点击改变后的newSize和newPage,再赋值给回pagesize和pagenum,然后重新获取用户列表数据:

  1. // 监听 pageSize 改变的事件
  2. handleSizeChange(newSize) {
  3. // console.log(newSize)
  4. this.queryInfo.pagesize = newSize
  5. // 重新发起请求用户列表
  6. this.getUserList()
  7. },
  8. // 监听 当前页码值 改变的事件
  9. handleCurrentChange(newPage) {
  10. // console.log(newPage)
  11. this.queryInfo.pagenum = newPage
  12. // 重新发起请求用户列表
  13. this.getUserList()
  14. }

在添加一个全局的分页样式:

  1. /* 全局样式表 */
  2. html, body, #app {height: 100%; margin:; padding:;}
  3. .el-breadcrumb{margin-bottom: 15px;font-size: 12px;}
  4. .el-card{box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) !important;}
  5. .el-table{margin-top: 15px;font-size: 12px;}
  6. .el-pagination{margin-top: 15px;}

现在点击分页,用户列表数据就可以随之变化了。

效果图:

10、修改用户状态

查看Switch事件:

事件名称             说明                                         回调参数
change switch    状态发生变化时的回调函数     新状态的值

修改代码,添加事件:

  1. <el-table-column label="状态">
  2. <!-- 作用域插槽 -->
  3. <template slot-scope="scope">
  4. <el-switch v-model="scope.row.mg_state" @change="userStateChanged(scope.row)"></el-switch>
  5. </template>
  6. </el-table-column>
  7.  
  8. <script>
  9. export default {
  10. methods: {
  11. // 监听 当前状态值 改变事件
  12. userStateChanged(userinfo) {
  13. console.log(userinfo)
  14. }
  15. }
  16. }
  17. </script>

现在就要把修改后的用户信息保存到服务器。

查看接口文档,1.3.3. 修改用户状态,请求路径:users/:uId/state/:type,请求方法:put,
请求参数:uId:用户ID:不能为空`携带在url中、type:用户状态:不能为空`携带在url中`:值为 true 或者 false

修改添加代码:

  1. // 监听 当前状态值 改变事件
  2. async userStateChanged(userinfo) {
  3. console.log(userinfo)
  4. const { data: res } = await this.$http.put(
  5. `users/${userinfo.id}/state/${userinfo.mg_state}`
  6. )
  7. if (res.meta.status !== 200) {
  8. userinfo.ms_state = !userinfo.ms_state
  9. return this.$message.error('更新用户状态失败')
  10. }
  11. this.$message.success('更新用户状态成功!')
  12. }
  13. // 注意put这里为了拼接动态参数用的是反引号``

现在点击修改用户状态,再重新刷新后,显示的还是刚才修改后的状态,成功。

11、实现搜索功能

给搜索框实现双向绑定,并添加点击事件:绑定queryInfo.query,点击重新获取用户列表

  1. <!--搜索区域-->
  2. <el-input v-model="queryInfo.query" placeholder="请输入内容">
  3. <el-button slot="append" icon="el-icon-search" @click="getUserList"></el-button>
  4. </el-input>

添加清空按钮,清空输入框同时刷新用户列表:

使用clearable属性即可得到一个可清空的输入框

clear事件 在点击由 clearable 属性生成的清空按钮时触发

  1. <el-input v-model="queryInfo.query" placeholder="请输入内容" clearable @clear="getUserList">

效果图:

Vue + ElementUI的电商管理系统实例03 用户列表的更多相关文章

  1. Vue + ElementUI的电商管理系统实例02 主页

    1.打开Element网站,找到主页需要的布局格式 修改Home.vue: <template> <el-container class="home-container&q ...

  2. Vue + ElementUI的电商管理系统实例01 登录表单

    效果图: 1.首先来根据Element网站实现布局: <template> <div class="login_container"> <div cl ...

  3. Kotlin实战案例:带你实现RecyclerView分页查询功能(仿照主流电商APP,可切换列表和网格效果)

    随着Kotlin的推广,一些国内公司的安卓项目开发,已经从Java完全切成Kotlin了.虽然Kotlin在各类编程语言中的排名比较靠后(据TIOBE发布了 19 年 8 月份的编程语言排行榜,Kot ...

  4. Django REST framework+Vue 打造生鲜电商项目(笔记十)

    (from:https://www.cnblogs.com/derek1184405959/p/8877643.html  有修改) 十三.首页.商品数量.缓存和限速功能开发 首先把pycharm环境 ...

  5. Django REST framework+Vue 打造生鲜电商项目(笔记九)

    (from:http://www.cnblogs.com/derek1184405959/p/8859309.html) 十二.支付宝沙箱环境配置 12.1.创建应用 进入蚂蚁金服开放平台(https ...

  6. Django REST framework+Vue 打造生鲜电商项目(笔记七)

    十.购物车.订单管理和支付功能 1.添加商品到购物车 (1)trade/serializer.py 这里的serializer不继承ModelSerializer,是因为自己写的Serializer更 ...

  7. Django REST framework+Vue 打造生鲜电商项目(笔记五)

    一.viewsets实现商品详情页接口 (1)商品详情页只需要多继承一个类(mixins.RetrieveModelMixin)就可以了,(它的功能就是展示商品详情) class GoodsListV ...

  8. Django REST framework+Vue 打造生鲜电商项目(笔记四)

    (PS:部分代码和图片来自博客:http://www.cnblogs.com/derek1184405959/p/8813641.html.有增删) 一.用户登录和手机注册 1.drf的token功能 ...

  9. Django REST framework+Vue 打造生鲜电商项目(笔记三)

    (PS:转载自http://www.cnblogs.com/derek1184405959/p/8810591.html  有修改) 一.drf的过滤 (1)添加到app里面 INSTALLED_AP ...

随机推荐

  1. YAML_11 when条件判断

    当系统负载超过0.7时,则关掉httpd ansible]# vim when.yml --- - hosts: cache   remote_user: root   tasks:     - sh ...

  2. 38、数据源Parquet之使用编程方式加载数据

    一.概述 Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0. 列式存 ...

  3. 数据结构实验之查找二:平衡二叉树 (SDUT 3374)

    #include <stdio.h> #include <string.h> #include <stdlib.h> struct node { int data; ...

  4. Mybatis 通用Mapper增强

    1.确保是个Maven项目,确保Spring与Mybatis正确配置. 2.新建一个自定义通用Mapper. /** * BaseMapper接口:使mapper包含完整的CRUD方法<br&g ...

  5. 使用IDEA创建一个Maven Web工程:无法创建Java Class文件

    今天用IDEA新建了一个maven web工程,项目目录是这样的: 在新创建一个Java class 文件时,却没有Java class功能,无法创建,如图: 解决方案: 选择 File——>P ...

  6. arts 打卡12周

    一 算法:  字符串转换整数 (atoi)   请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找 ...

  7. C# WinForm中的一些小问题

    前言 记一些C#窗体应用编程中的小问题. DataGridView 设置Selected = true后实际选中行标依旧是第一行. 通常通过this.dataGridView1.Rows[i].Sel ...

  8. centos7使用MariaDB(转)

    转载文章:https://blog.csdn.net/zwkkkk1/article/details/78444581?locationNum=10&fps=1 最近使用centos7,php ...

  9. CESIUM内置shader变量和函数[转]

    cesium中内置了一些常量.变量和函数,在vs和fs中可直接使用. 内置uniform 内置uniform主要置于AutomaticUniforms类里面,该类私有未开放文档. czm_backgr ...

  10. 关于Android8.0 静态注册广播 行为变更的说明。

    Andorid 8.0 对广播的使用做了变更. 当广播接收器使用静态注册方式使用时,除了一些例外,这个接收器接收不到隐式广播. 注意这个“隐式”是重点. 看了网上几篇文章,对这个变更理解有误.错误的理 ...