本项目是基于vue+element-ui进行开发的一个后台管理系统,适用于刚学习完vue或者是后端开发人员去了解前端知识的一个新手项目,该项目是根据b站Ailen老师的分享进行总结。
vue后台管理系统
使用Yarn包管理工具
- 速度快
- 离线模式
- 安装版本统一
- 更简洁的输出
- 更好的语义化
vue-cli 脚手架的搭建
前提需安装node.js和npm
安装vue-cli
使用yarn命令安装需提前安装yarn,使用
1 | npm i -g yarn |
使用如下命令检查是否安装成功
1 | vue -V |
使用如下命令创建脚手架文件
1 | vue create “自己文件名” // 不可使用驼峰命名 |
选择vue版本
使用yarn包管理工具,创建完成后,使用如下命令启动脚手架
1 | npm run serve |
安装element-ui
参考网站组件 | Element进行安装
在入口文件main.js 写以下代码使用element-ui
1 | import Vue from 'vue'; |
按需引用组件
首先,安装 babel-plugin-component:
1 | npm install babel-plugin-component -D |
在babel.config.js下修改
1 | module.exports = { |
接下来,如果你只希望引入部分组件,比如Button和Row,那么需要在 main.js 中写入以下内容:
1 | import Vue from 'vue' |
这样做可以减少项目打包的体积
vue router
vue的官方路由,用以下代码安装
1 | npm i vue-router@3.6.5 |
在src目录下新建router文件夹,再新建index.js,在index.js配置相关路由。如果在一个模块化工程中使用它,必须要通过 Vue.use()
明确地安装路由功能:
1 | import Vue from 'vue' |
在src文件夹下创建views文件夹,从这个文件夹构造各个组件。
创建Home.vue
1 | <template> |
创建User.vue
1 | <template> |
在index.js 引入组件
1 | import Vue from 'vue' |
在mian.js 入口文件挂载路由
1 | import Vue from 'vue' |
直接启动不会跳转,需要在App.vue挂载路由出口
1 | <!-- 路由出口 --> |
嵌套路由
减少菜单栏及头部或者脚部的重复开发
在view文件夹创建Main.vue 作为主路由
1 | <template> |
在index.js下配置主路由
1 | import Vue from 'vue' |
注意需要在主路由也加上路由出口
整体UI搭建
1 | <template> |
在components下创建菜单组件CommonAside.vue
1 | <template> |
在Main.js中引用
1 | <template> |
修改侧边菜单,代码如下
1 | <template> |
引用less解析器
1 | npm i less@4.1.2 less-loader@6.0.0 |
1 | <style lang="less" scoped > |
清除默认样式,不然会出现贴边现象,在App.vue 下加入如下代码
1 | <script lang="less"> |
为新加的菜单添加路由,创建组件并且在index.js引入创建的组件并加入路由,(mall.vue,pageTow.vue,pageOne.vue)
1 | import Vue from 'vue' |
(这里注意路由重定向)
目前,会出现一个错误,如果重复点击菜单,控制台会报重复跳转的错误,这里需要在点击菜单前判断(route表示为当前页面的路由,router为路由实例),在clickMenu方法修改为
1 | clickMenu(item){ |
头部UI设计,创建CommonHeader.vue文件,代码如下
1 | <template> |
创建完成后注意要在Main.vue中引入该头部组件。结果如下图:
Vuex实现左侧菜单折叠
1 | npm i vuex@3.6.2 |
创建store文件夹,再创建store.js和tab.js(用于菜单管理)代码分别为
1 | import Vue from 'vue' |
1 | //管理菜单相关的数据(es6语法,对象导出) |
再入口文件引入该组件
1 | import store from './store' |
再头部组件的按钮加入click事件,用来出发store里的collapseMenu方法,改变isCollapse的值
1 | handleMenu(){ |
在菜单组件中处理修改的值,需要要在computed下去处理数据,切记要删掉data里的isCollapse属性
1 | isCollapse(){ |
其他问题,在菜单测边框的h3标题下改为3元判断符
1 | {{ isCollapse ? '后台' : "通用后台管理系统" }} |
首页UI搭建
用户信息
使用element-ui的layout布局,保证页面自适应大小,并且使用card模板创建用户信息,头像img使用flex布局
flex 垂直居中
1 | display: flex; |
用户信息代码
1 | <template> |
结果如下:
购买统计部分
使用elment-ui中的表格模板,并于v-for遍历tableData中的数据。
1 | <template> |
结果如下图:
订单统计实现
这里需要左右布局,这里可以想到flex布局,代码如下:
1 | <template> |
结果如下图:
axios的基本使用
axios安装
1 | npm install axios |
axios的封装
axios实例以及拦截器的简单封装,在src文件夹创建utils文件夹,并且再次文件下创建request.js
1 | import axios from "axios" |
封装api,在src文件夹创建api文件夹,并且再次文件下创建index.js
1 | import http from '@/utils/request' |
在home.vue 中使用 封装好的api
1 | import {getData} from '../api' |
结果如下:
mock数据模拟
mock.js的安装
1 | npm i mockj |
在api文件夹下创建mock.js,同时在api文件夹下创建mockServeData文件夹,并创建home.js文件用于返回首页数据,同时在入口文件引入mock.js
mock.js:
1 | import Mock from 'mockjs' |
home.js:
1 | //首页数据 |
入口文件引入
1 | import './api/mock' |
结果展示:
首页可视化图表样式
代码如下:
1 | <template> |
echarts表格使用
安装
1 | npm i echarts@5.1.2 |
引入依赖
1 | import * as echarts from 'echarts' |
折线图设计,代码如下(详情参考Apache ECharts)
1 | <template> |
结果展示:
其余柱状图和饼状图代码如下:
1 | <template> |
首页完成,结果如下:
头部面包屑设计
在Commonheader .vue加入
1 | <!--面包屑--> |
使用vuex管理表头面包屑的数组,在store文件下的tab.js中的state加入tabList,用来获取菜单路由,进行增加,删除。
1 | tabList: [ |
在 mutations加入更新面包屑方法,其主要操作tabList
1 | //更新面包屑数据(val为传进的数据) |
在Commonheader .vue获取tabList
1 | import { mapState } from 'vuex'; |
导航栏tag设计
组件加入CommonTags
1 | <template> |
其更改导航tag仍使用vuex经行管理
1 | //删除指定的tags数据 |
结果展示
用户管理页面功能
新增用户及新增用户表单验证
使用element-ui的表单及dialog对话框去显示新增页面,其对话框嵌套表单实现新增
1 | <div class="manage-header"> |
data内容如下
1 | dialogVisible: false, |
方法如下:
1 | //提交用户表单 |
结果如图:
表格数据展示
使用mock.js模拟后端系统发送请求获取数据,其内容如下
1 | import Mock from 'mockjs' |
其mock定义请求路径:
1 | //用户列表数据 |
在index.js下定义api接口
1 | import http from '@/utils/request' |
在user.vue在created生命周期下定义方法,返回表格数据:
1 | created() { |
新增,删除,修改,分页方法代码如下:
新增:
1 | handleAdd() { |
删除:
1 | handleDel(row) { |
修改:
1 | handleEdit(row) { |
分页:
1 | handlePage(val) { |
查询表格:
1 | //列表的查询 |
此处getList()是对获取列表数据的封装:
1 | getList() { |
其user.vue 最终代码为:
1 | <template> |
结果如图:
登录功能
登陆页面样式设计,代码如下
1 | <template> |
结果如图:
token
安装cookie
1 | npm i js-cookie@3.0.1 |
1 | //登陆方法 |
使用全局前置导航守卫并配置到入口文件下
1 | //添加全局前置导航 |
目前已经可以实现跳转,但是登录数据是写死的,这里通过mock模拟后端接口发送token
1 | import Mock from 'mockjs' |
配置mock数据拦截器
1 | Mock.mock(/api\/premission\/getMenu/,'post',permission.getMenu) |
定义api接口
1 | export const getMenu =(data) =>{ |
重新修改登录方法
1 | //登陆方法 |
在头部组件的下拉框加入退出功能:
1 | handleClick(command) { |
mock模拟后端发送数据进行登录跳转。
菜单权限功能
- 不同登录的账号,会有不同的菜单权限
- 通过输入url地址来显示页面
- 对于菜单的数据在不同页面之间的数据通信
在store中定义菜单数据:
1 | menu:[ |
在login的登录方法下添加该功能:
1 | //获取菜单数据,存入store中 |
在公共菜单组件下的computed方法下获取动态菜单数据
1 | menuData(){ |
删除原来固定的菜单组件,改用获取动态menuData。
通过Cookie保存保存页面数据完成不同页面之间的通信。
修改setMenu方法及获取menuData的计算方法:
1 | //设置menu的数据 |
1 | menuData(){ |
动态注册路由:
1 | //动态注册路由 |
如果刷新发现home页面空白,在vue重新创建的时候加入动态路由注册方法。
1 | new Vue({ |
项目源码:
1 | https://gitee.com/gj2002298/vue-manage |
改代码仅供学习。