Mock.js
yarn add mockjs -S
yarn add axios -S
// 根据数据模板⽣生成模拟数据
Mock.mock( rurl, rtype, template)
/*
** rurl: 表示需要拦截的 URL,可以是 URL 字符串串或 URL 正则
** eg. /\/domain\/list\.json/、'/domian/list.json'
*/
先在项目中对axios进行实例配置,在src中新建api文件夹,存放config.js,内容如下
import axios from 'axios'
// 创建一个axios实例
const service = axios.create({
// 请求超时时间
timeout: 3000
})
// 添加请求拦截器
service.interceptors.request.use(
config => {
return config
},
err => {
console.log(err)
}
)
service.interceptors.response.use(
response => {
let res = {}
res.status = response.status
res.data = response.data
return res
},
err => console.log(err)
)
export default service
在main.js中引入这个config,并挂载到vue上
...
import http from '@/api/config'
// 挂载在Vue实例上
Vue.use(ElementUI)
Vue.config.productionTip = false
Vue.prototype.$http = http // 这样以后就能通过this.app调用axios实例了
...
新建mock文件夹,存放home.js,设置模拟返回接口的数据
import Mock from 'mockjs'
export default {
getHomeData: () => {
return {
code: 20000,
data: {
videoData: [
{
name: 'SpringBoot',
value: Mock.Random.float(100, 8000, 0, 2),
},
{
name: '小程序',
value: Mock.Random.float(100, 8000, 0, 2),
}
],
},
}
},
}
同路径下新建index.js,对mock进行配置,设置拦截的请求信息以及返回data
import Mock from 'mockjs'
import homeApi from './home.js'
// 设置200-2000毫秒延时请求数据
Mock.setup({
timeout: '200-2000',
})
// 首页相关
// 拦截的是 /home/getData
Mock.mock(/\/home\/getData/, 'get', homeApi.getHomeData)
最后在main.js引入这个mock/index.js进行初始化
...
import http from '@/api/config'
import './mock' // 配置mock/index.js
...
在Home/Home.vue中,加载首页后,调用这个接口,返回模拟数据
...
...
主要是选择组件和调整css样式
首先我们新建一个home对应的scss,在assets/scss新建home.scss
.home {
...先不填
}
基本都是使用卡片布局,然后微调一些css样式
鼠标悬浮时显示
鼠标悬浮时显示
¥ 1234
今日支付订单
微调的home.scss代码如下
.home {
// background-color: #000;
.num {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.el-card {
width: 32%;
margin-bottom: 20px;
}
}
.graph {
margin-top: 20px;
display: flex;
justify-content: space-between;
.el-card {
width: 49%;
}
}
}
登录信息直接写死
Nick
超级管理员
上次登录时间:2020-09-04
上次登录地点:北京
鼠标悬浮时显示
...
...
对这一块的css进行微调,在home.scss中调整
.home {
...
.user {
display: flex;
align-items: center;
padding-bottom: 20px;
margin-bottom: 20px;
border-bottom: 1px solid #ccc;
img {
width: 150px;
height: 150px;
border-radius: 50%;
margin-right: 40px;
}
}
// 等同于.userinfo
&info {
.name {
font-size: 32px;
margin-bottom: 10px;
}
.access {
color: #999999;
}
}
// 用户头像下面的登录时间
.login-info {
p {
line-height: 28px;
font-size: 16px;
color: #999999;
span {
color: #666666;
margin-left: 60px;
}
}
}
...
}
...
data() {
return {
userImg: require('../../assets/images/user.png'),
countData: [
{
name: '今日支付订单',
value: 1234,
icon: 'success',
color: '#2ec7c9',
},
{
name: '今日收藏订单',
value: 210,
icon: 'star-on',
color: '#ffb980',
},
{
name: '今日未支付订单',
value: 1234,
icon: 's-goods',
color: '#5ab1ef',
},
{
name: '本月支付订单',
value: 1234,
icon: 'success',
color: '#2ec7c9',
},
{
name: '本月收藏订单',
value: 210,
icon: 'star-on',
color: '#ffb980',
},
{
name: '本月未支付订单',
value: 1234,
icon: 's-goods',
color: '#5ab1ef',
},
],
}
},
...
通过v-for循环,渲染页面
...
¥ {
{ item.value }}
{
{ item.name }}
对这个home.scss进行微调
.home {
...
// 配置页面右侧的icon样式
.icon {
font-size: 30px;
width: 80px;
height: 80px;
text-align: center;
line-height: 80px;
color: #fff;
}
// 配置页面右侧的detail样式
.detail {
margin-left: 15px;
display: flex;
flex-direction: column;
justify-content: center;
.num {
font-size: 30px;
margin-bottom: 10px;
}
.txt {
font-size: 14px;
text-align: center;
color: #999999;
}
}
}
table部分的数据从home
先给mock下的/home.js加上我们的函数getStatisticalData,替换之前的getData
import Mock from 'mockjs'
// 图表数据
let List = []
export default {
getStatisticalData: () => {
for (let i = 0; i < 7; i++) {
List.push(
Mock.mock({
vue: Mock.Random.float(100, 8000, 0, 2),
wechat: Mock.Random.float(100, 8000, 0, 2),
ES6: Mock.Random.float(100, 8000, 0, 2),
Redis: Mock.Random.float(100, 8000, 0, 2),
React: Mock.Random.float(100, 8000, 0, 2),
springboot: Mock.Random.float(100, 8000, 0, 2),
})
)
}
return {
code: 20000,
data: {
tableData: [
{
name: 'ES6',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: '小程序',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'Vue',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'springboot',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'React',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'Redis',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
],
},
}
},
}
在Home.vue中去调用这个模拟数据
tableData为我们从mock得到的模拟数据,tableLabel是我们打算渲染表格的head,在table中根据tableLabel来循环data中绑定的数据tableData,tableLabel是一个key value,跟后台的数据相对应
在Home.vue的html中只需要绑定tableData、tableLabel这两个变量信息即可显示表格
...
...
// data中声明echart对象
// 通过ref获取dom,初始化echarts实例例
this.echart = echarts.init(this.$refs.ref名字);
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts ⼊入⻔门示例例'
},
tooltip: {},
legend: {
data:['销量量']
},
xAxis: {
data: ["衬衫","⽺羊⽑毛衫","雪纺衫","裤⼦子","⾼高跟鞋","袜⼦子"]
},
yAxis: {},
series: [{
name: '销量量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
// 使⽤用刚指定的配置项和数据显示图表。
this.echart.setOption(option);
安装EChart
yarn add echarts -S
封装一个组件,需要知道哪些属性是动态改变的,哪些是要通过外部传入的,是否需要初始化等
在项目components文件夹中新建一个EChart.vue组件,内容如下
echart
这是一个大体的封装框架,后面再根据情况进行补充
echarts表格的核心就是xAxis、yAxis和series这三个部分,有了这三个部分就可以任意渲染出来一个图表
有坐标轴的图表
+ 数据格式
// 类⽬目轴 xAxis: { data: [], type: 'category', }, // 数据部分 yAxis: { type: 'value' }, series: []
没坐标轴的图表
+ 数据格式
{ series: [] }
下面需要补充mock的模拟数据,在home.js中加上orderData和userData、videoData
import Mock from 'mockjs'
// 图表数据
let List = []
export default {
getStatisticalData: () => {
for (let i = 0; i < 7; i++) {
List.push(
Mock.mock({
vue: Mock.Random.float(100, 8000, 0, 2),
wechat: Mock.Random.float(100, 8000, 0, 2),
ES6: Mock.Random.float(100, 8000, 0, 2),
Redis: Mock.Random.float(100, 8000, 0, 2),
React: Mock.Random.float(100, 8000, 0, 2),
springboot: Mock.Random.float(100, 8000, 0, 2),
})
)
}
return {
code: 20000,
data: {
// 折线图
orderData: {
date: [
'20201001',
'20201002',
'20201003',
'20201004',
'20201005',
'20201006',
'20201007',
],
data: List,
},
// 柱状图
userData: [
{
date: '周一',
new: Mock.Random.integer(1, 100),
active: Mock.Random.integer(100, 1000),
},
{
date: '周二',
new: Mock.Random.integer(1, 100),
active: Mock.Random.integer(100, 1000),
},
{
date: '周三',
new: Mock.Random.integer(1, 100),
active: Mock.Random.integer(100, 1000),
},
{
date: '周四',
new: Mock.Random.integer(1, 100),
active: Mock.Random.integer(100, 1000),
},
{
date: '周五',
new: Mock.Random.integer(1, 100),
active: Mock.Random.integer(100, 1000),
},
{
date: '周六',
new: Mock.Random.integer(1, 100),
active: Mock.Random.integer(100, 1000),
},
{
date: '周日',
new: Mock.Random.integer(1, 100),
active: Mock.Random.integer(100, 1000),
},
],
// 饼图
videoData: [
{
name: 'springboot',
value: Mock.Random.float(1000, 10000, 0, 2),
},
{
name: 'vue',
value: Mock.Random.float(1000, 10000, 0, 2),
},
{
name: '小程序',
value: Mock.Random.float(1000, 10000, 0, 2),
},
{
name: 'ES6',
value: Mock.Random.float(1000, 10000, 0, 2),
},
{
name: 'Redis',
value: Mock.Random.float(1000, 10000, 0, 2),
},
{
name: 'React',
value: Mock.Random.float(1000, 10000, 0, 2),
},
],
tableData: [
{
name: 'ES6',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: '小程序',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'Vue',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'springboot',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'React',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
{
name: 'Redis',
todayBuy: Mock.Random.float(100, 1000, 0, 2),
monthBuy: Mock.Random.float(3000, 5000, 0, 2),
totalBuy: Mock.Random.float(40000, 1000000, 0, 2),
},
],
},
}
},
}
补充EChart.vue组件的内容,让其响应data数据,并且监听data数据的变换
echart
到views下的Home/Home.vue,初始化控件,并将得到的数据绑定到控件,最后渲染到div中
...
现在所有的图都已经做完了,下来只需要对图表做一下样式的调整即可
完善图表选项,主要是让表格配置颜色以及点击效果,修改地方在EChart.vue组件中
...
有些情况,我们需要图表进行自适应伸缩
浏览器器窗口大小发生变化需要对窗口变大事件进行监听,当法神windows事件时,就触发组件的resize
echart
这样就完成浏览器器窗口大小发生变化的效果
折叠菜单的时候,如果想要对图表进行缩放,那么需要监听折叠的变换即isCollapse的值,将这个值在computed中引入,在watch中进行更改
这样折叠菜单后,组件也会进行resize了
在components下的侧边栏组件CommonAside.vue中,引入h3的标题,当折叠的时候显示XX,不折叠的时候显示小滴后台管理系统
XX
XX后台管理系统
...