node.js 16.16.0
vue-cli 5.0.8
vue-router 3.6.5
下载vue-router,地址安装 | Vue Router
yarn add [email protected]
在src的router目录下创建index.js,引入vue-router
yarn stylus [email protected]
关闭eslint
npm i element-ui -S
npm install babel-plugin-component -D
element-ui网址 Element - The world's most popular Vue UI framework
侧边栏是公共组件,放在components中
调整成我们想要的效果
通用后台管理系统
导航二
导航二
导航一
选项1
选项2
去掉白边
创建menuData数组,判断有无子菜单,遍历侧边栏菜单
通用后台管理系统
{{item.label}}
{{item.label}}
{{subItem.label}}
menuData
里的path,在路由文件里配置路由
通用后台管理系统
{{item.label}}
{{item.label}}
{{subItem.label}}
首页
活动管理
活动列表
活动详情
个人中心
退出
vue2中,要用vuex的3版本
vue3中,要用vuex的4版本
yarn add [email protected] --save
上次登录时间:2021-7-19
上次登录地点:武汉
上次登录时间:2021-7-19
上次登录地点:武汉
countData
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",
},
],
上次登录时间:2021-7-19
上次登录地点:武汉
¥ {{item.value}}
{{item.name}}
yarn add [email protected]
axios中文文档|axios中文网 | axios
定义一个请求首页数据的接口
在页面中可以调用
yarn add [email protected]
// mock数据模拟
import Mock from 'mockjs'
// 图表数据
let List = []
export default {
getStatisticalData: () => {
//Mock.Random.float 产生随机数100到8000之间 保留小数 最小0位 最大0位
for (let i = 0; i < 7; i++) {
List.push(
Mock.mock({
苹果: Mock.Random.float(100, 8000, 0, 0),
vivo: Mock.Random.float(100, 8000, 0, 0),
oppo: Mock.Random.float(100, 8000, 0, 0),
魅族: Mock.Random.float(100, 8000, 0, 0),
三星: Mock.Random.float(100, 8000, 0, 0),
小米: Mock.Random.float(100, 8000, 0, 0)
})
)
}
return {
code: 20000,
data: {
// 饼图
videoData: [
{
name: '小米',
value: 2999
},
{
name: '苹果',
value: 5999
},
{
name: 'vivo',
value: 1500
},
{
name: 'oppo',
value: 1999
},
{
name: '魅族',
value: 2200
},
{
name: '三星',
value: 4500
}
],
// 柱状图
userData: [
{
date: '周一',
new: 5,
active: 200
},
{
date: '周二',
new: 10,
active: 500
},
{
date: '周三',
new: 12,
active: 550
},
{
date: '周四',
new: 60,
active: 800
},
{
date: '周五',
new: 65,
active: 550
},
{
date: '周六',
new: 53,
active: 770
},
{
date: '周日',
new: 33,
active: 170
}
],
// 折线图
orderData: {
date: ['20191001', '20191002', '20191003', '20191004', '20191005', '20191006', '20191007'],
data: List
},
tableData: [
{
name: 'oppo',
todayBuy: 500,
monthBuy: 3500,
totalBuy: 22000
},
{
name: 'vivo',
todayBuy: 300,
monthBuy: 2200,
totalBuy: 24000
},
{
name: '苹果',
todayBuy: 800,
monthBuy: 4500,
totalBuy: 65000
},
{
name: '小米',
todayBuy: 1200,
monthBuy: 6500,
totalBuy: 45000
},
{
name: '三星',
todayBuy: 300,
monthBuy: 2000,
totalBuy: 34000
},
{
name: '魅族',
todayBuy: 350,
monthBuy: 3000,
totalBuy: 22000
}
]
}
}
}
}
yarn add [email protected]
import * as echarts from 'echarts';
上次登录时间:2021-7-19
上次登录地点:武汉
¥ {{item.value}}
{{item.name}}
selectMenu()
用来更新面包屑数据也就是既不影响到别的地方,又能修改子组件在当前的样式
在el-breadcrumb-item 里 定义span标签,添加类名判断,当前路由name等于item的name就添加active类名
改变未高亮标签的颜色
新增一个user.js来存放和用户相关的mock模拟的数据
import Mock from 'mockjs'
// get请求从config.url获取参数,post从config.body中获取参数
function param2Obj (url) {
const search = url.split('?')[1]
if (!search) {
return {}
}
return JSON.parse(
'{"' +
decodeURIComponent(search)
.replace(/"/g, '\\"')
.replace(/&/g, '","')
.replace(/=/g, '":"') +
'"}'
)
}
let List = []
const count = 200
for (let i = 0; i < count; i++) {
List.push(
Mock.mock({
id: Mock.Random.guid(),
name: Mock.Random.cname(),
addr: Mock.mock('@county(true)'),
'age|18-60': 1,
birth: Mock.Random.date(),
sex: Mock.Random.integer(0, 1)
})
)
}
export default {
/**
* 获取列表
* 要带参数 name, page, limt; name可以不填, page,limit有默认值。
* @param name, page, limit
* @return {{code: number, count: number, data: *[]}}
*/
getUserList: config => {
const { name, page = 1, limit = 20 } = param2Obj(config.url)
console.log('name:' + name, 'page:' + page, '分页大小limit:' + limit)
const mockList = List.filter(user => {
if (name && user.name.indexOf(name) === -1 && user.addr.indexOf(name) === -1) return false
return true
})
const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))
return {
code: 20000,
count: mockList.length,
list: pageList
}
},
/**
* 增加用户
* @param name, addr, age, birth, sex
* @return {{code: number, data: {message: string}}}
*/
createUser: config => {
const { name, addr, age, birth, sex } = JSON.parse(config.body)
console.log(JSON.parse(config.body))
List.unshift({
id: Mock.Random.guid(),
name: name,
addr: addr,
age: age,
birth: birth,
sex: sex
})
return {
code: 20000,
data: {
message: '添加成功'
}
}
},
/**
* 删除用户
* @param id
* @return {*}
*/
deleteUser: config => {
const { id } = JSON.parse(config.body)
if (!id) {
return {
code: -999,
message: '参数不正确'
}
} else {
List = List.filter(u => u.id !== id)
return {
code: 20000,
message: '删除成功'
}
}
},
/**
* 批量删除
* @param config
* @return {{code: number, data: {message: string}}}
*/
batchremove: config => {
let { ids } = param2Obj(config.url)
ids = ids.split(',')
List = List.filter(u => !ids.includes(u.id))
return {
code: 20000,
data: {
message: '批量删除成功'
}
}
},
/**
* 修改用户
* @param id, name, addr, age, birth, sex
* @return {{code: number, data: {message: string}}}
*/
updateUser: config => {
const { id, name, addr, age, birth, sex } = JSON.parse(config.body)
const sex_num = parseInt(sex)
List.some(u => {
if (u.id === id) {
u.name = name
u.addr = addr
u.age = age
u.birth = birth
u.sex = sex_num
return true
}
})
return {
code: 20000,
data: {
message: '编辑成功'
}
}
}
}
配置请求的接口
slot-scope="scope"
作用域插槽,作用:可以在父组件中获取到子组件的数据
新增按钮和编辑按钮共用一个弹窗, modalType: 0,控制,0 新增,1 编辑
给新增按钮添加一个方法handAdd
它的modalType = 0
, dialogVisible =true
展开弹窗
给编辑按钮添加一个方法handleEdit
,它的modalType = 1
,dialogVisible =true
展开弹窗
封装getList方法
解决回显性别显示1和0的问题
yarn add [email protected]
引入permission.js
在点击登录按钮的时候,判断这个code来判断账号密码是否正确,正确就跳转至首页,不正确就显示错误信息
重新登陆一下
看到这个输出就是成功了
删除之前写死的路由,并将跟路由改成 /home