<template>
<div>
<!-- 头部 -->
<Header></Header>
<!-- 左侧菜单 -->
<Asider></Asider>
<!-- 内容显示区域 -->
<router-view></router-view>
</div>
</template>
<script>
import Asider from '@/components/Asider'
import Header from '@/components/Header'
export default {
components:{
Asider,
Header
}
}
</script>
1、左侧菜单编写
<template>
<div class="sidebar">
<el-menu
class="sidebar-el-menu"
:default-active="onRoutes"
:collapse="collapse"
background-color="#334256"
text-color="#ffffff"
active-text-color="#20a0ff"
router
>
<template v-for="item in items">
<template>
<el-menu-item :index="item.index" :key="item.index">
<i :class="item.icon"></i>
{{item.title}}
</el-menu-item>
</template>
</template>
</el-menu>
</div>
</template>
<script>
import bus from "../assets/js/bus"
export default {
data(){
return{
collapse: false,
items:[
{
icon: 'el-icon-document', //表示选项图标
index: 'Info', //表示跳转到哪个路由
title: '系统首页' //表示选项的标题
},
{
icon: 'el-icon-document',
index: 'Consumer',
title: '用户管理'
},
{
icon: 'el-icon-document',
index: 'Singer',
title: '歌手管理'
},
{
icon: 'el-icon-document',
index: 'SongList',
title: '歌单管理'
},
]
}
},
computed:{
onRoutes(){
return this.$route.path.replace('/',''); //表示默认选中哪个路由,让其处于选中状态
}
},
created(){
//通过Bus进行组件间的通信,来折叠侧边栏
//接收Header头部传过来的信息,判断collapse是否为true,来折叠侧边栏
bus.$on('collapse',msg =>{
this.collapse = msg
})
}
}
</script>
<style scoped>
.sidebar {
display: block;
position: absolute;
left: 0;
top: 70px;
bottom: 0;
background-color: #334256;
overflow-y: scroll;
}
.sidebar::-webkit-scrollbar{
width: 0;
}
.sidebar-el-menu:not(.el-menu--collapse){
width: 150px;
}
.sidebar >ul {
height: 100%;
}
</style>
:default-active=”onRoutes” 表示默认选中哪个路由 :collapse=”collapse” 表示当collapse为true时,打开选项卡,否则,关闭选项卡 router 表示跳到哪个路由,与index一起搭配使用
2、头部菜单编写
<template>
<div class="header">
<!-- 折叠图片 -->
<div class="collapse-btn" @click="collapseChange">
<i class="el-icon-menu"></i>
</div>
<div class="logo">music后台管理</div>
<div class="header-right">
<div class="btn-fullscreen" @click="handleFullScreen">
<el-tooltip :content="fullscreen?`取消全屏`:`全屏`" placement="bottom">
<i class="el-icon-rank"></i>
</el-tooltip>
</div>
<div class="user-avator">
<img src="../assets/img/user.jpg"/>
</div>
<el-dropdown class="user-name" trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
{{userName}}
<i class="el-icon-caret-bottom"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import bus from "../assets/js/bus";
export default {
data(){
return{
collapse: false,
fullscreen:false
}
},
computed:{
//获取用户名
userName(){
return localStorage.getItem('userName');
}
},
methods:{
//侧边栏折叠
collapseChange(){
this.collapse = !this.collapse;
bus.$emit('collapse',this.collapse);
},
//全屏事件
handleFullScreen(){
if(this.fullscreen){
if(document.exitFullscreen){
document.exitFullscreen();
}else if(document.webkitCancelFullScreen){ //safari 、Chrome
document.webkitCancelFullScreen();
}else if (document.mozCancelFullScreen){ //firefox
document.mozCancelFullScreen();
}else if(document.msExitFullScreen){ //ie
document.msExitFullScreen();
}
}else{
let element = document.documentElement;
if(element.requestFullscreen){
element.requestFullscreen();
}else if(element.webkitRequestFullScreen){ //safari 、Chrome
element.webkitRequestFullScreen();
}else if(element.mozRequestFullScreen){ //firefox
element.mozRequestFullScreen();
}else if (element.msRequestFullScreen){ //ie
element.msRequestFullScreen();
}
}
this.fullscreen = !this.fullscreen;
},
//退出登录
handleCommand(command){
if(command == "logout"){
localStorage.removeItem('userName');
this.$router.push("/");
}
}
}
}
</script>
<style scoped>
.header{
position: relative;
background-color: #253041;
box-sizing: border-box;
width: 100%;
height: 70px;
font-size: 22px;
color: #ffffff;
}
.collapse-btn{
float: left;
padding: 0 21px;
cursor: pointer;
line-height: 70px;
}
.header .logo{
float: left;
line-height: 70px;
}
.header-right{
float: right;
padding-right: 50px;
display:flex;
height: 70px;
align-items: center;
}
.btn-fullscreen{
transform: rotate(45deg);
margin-right: 5px;
font-size: 24px;
}
.user-avator{
margin-left: 20px;
}
.user-avator img{
display: block;
width: 40px;
height: 40px;
border-radius: 50%;
}
.user-name{
margin-left: 10px;
}
.el-dropdown-link{
color: #ffffff;
cursor: pointer;
}
</style>
2.1 侧边栏折叠
:collapse=”collapse” 表示当collapse为true时,打开选项卡,否则,关闭选项卡
<!-- 折叠图片 -->
<div class="collapse-btn" @click="collapseChange">
<i class="el-icon-menu"></i>
</div>
//侧边栏折叠
collapseChange(){
this.collapse = !this.collapse;
bus.$emit('collapse',this.collapse);
},
当点击侧边栏折叠图标时,发送一个侧边栏折叠事件总线,给父组件及其他组件调用。
通过this.$emit(‘事件名称’,值); 进行通知其他组件进行侧边栏的折叠
created(){
//通过Bus进行组件间的通信,来折叠侧边栏
bus.$on('collapse',msg =>{
this.collapse = msg
})
}
其他组件,通过this.$on(‘事件名称保持一致’,回调函数就是传过来的值),来接收组件间的通信;
2.2 全屏事件
<div class="btn-fullscreen" @click="handleFullScreen">
<el-tooltip :content="fullscreen?`取消全屏`:`全屏`" placement="bottom">
<i class="el-icon-rank"></i>
</el-tooltip>
</div>
//全屏事件
handleFullScreen(){
if(this.fullscreen){ //表示当前全屏状态,需要退出全屏
if(document.exitFullscreen){
document.exitFullscreen();
}else if(document.webkitCancelFullScreen){ //safari 、Chrome
document.webkitCancelFullScreen();
}else if (document.mozCancelFullScreen){ //firefox
document.mozCancelFullScreen();
}else if(document.msExitFullScreen){ //ie
document.msExitFullScreen();
}
}else{ //表示当前退出全屏状态,需要打开全屏
let element = document.documentElement;
if(element.requestFullscreen){
element.requestFullscreen();
}else if(element.webkitRequestFullScreen){ //safari 、Chrome
element.webkitRequestFullScreen();
}else if(element.mozRequestFullScreen){ //firefox
element.mozRequestFullScreen();
}else if (element.msRequestFullScreen){ //ie
element.msRequestFullScreen();
}
}
this.fullscreen = !this.fullscreen;
},
document.exitFullscreen() 表示退出全屏; element.mozRequestFullScreen() 表示打开全屏;
2.3 获取登录的用户名
computed:{
//获取用户名
userName(){
return localStorage.getItem('userName');
}
},
2.4 退出登录
<div class="user-avator">
<img src="../assets/img/user.jpg"/>
</div>
<el-dropdown class="user-name" trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
<!-- 用户名 -->
{{userName}}
<i class="el-icon-caret-bottom"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
//退出登录
handleCommand(command){
if(command == "logout"){
//移除本地客户端存储的用户名
localStorage.removeItem('userName');
//跳转到登录页面
this.$router.push("/");
}
}
3、Home主页面编写
<template>
<div>
<!-- 头部 -->
<Header></Header>
<!-- 左侧菜单 -->
<Asider></Asider>
<!-- 内容显示区域 -->
<div class="content-box" :class="{'content-collapse':collapse}">
<router-view></router-view>
</div>
</div>
</template>
<script>
import Asider from '@/components/Asider'
import Header from '@/components/Header'
import bus from "../assets/js/bus";
export default {
components:{
Asider,
Header
},
data(){
return {
collapse: false
}
},
created(){
//通过Bus进行组件间的通信,来折叠侧边栏
bus.$on('collapse',msg =>{
this.collapse = msg
})
}
}
</script>
:class=”{‘content-collapse’:collapse}” 表示当点击折叠侧边栏的时候,内容显示区域也随之侧边栏折叠改变而改变
4、编写内容显示Page页面
配置路由
export default new Router({
routes: [
{
path: '/',
component: resolve => require(['../pages/Login.vue'], resolve)
},
{
path: '/Home',
component: resolve => require(['../components/Home.vue'], resolve),
children:[
{
path: '/Info',
name : '后台首页',
component: resolve => require(['../pages/InfoPage.vue'], resolve)
},
{
path: '/Consumer',
name : '用户管理页面',
component: resolve => require(['../pages/ConsumerPage.vue'], resolve)
},
{
path: '/Singer',
name : '歌手页面',
component: resolve => require(['../pages/SingerPage.vue'], resolve)
},
{
path: '/SongList',
name : '歌单页面',
component: resolve => require(['../pages/SongListPage.vue'], resolve)
}
]
},
]
})