image.png
image.png

  1. <template>
  2. <div>
  3. <!-- 头部 -->
  4. <Header></Header>
  5. <!-- 左侧菜单 -->
  6. <Asider></Asider>
  7. <!-- 内容显示区域 -->
  8. <router-view></router-view>
  9. </div>
  10. </template>
  11. <script>
  12. import Asider from '@/components/Asider'
  13. import Header from '@/components/Header'
  14. export default {
  15. components:{
  16. Asider,
  17. Header
  18. }
  19. }
  20. </script>

image.png
image.png

1、左侧菜单编写

image.png

  1. <template>
  2. <div class="sidebar">
  3. <el-menu
  4. class="sidebar-el-menu"
  5. :default-active="onRoutes"
  6. :collapse="collapse"
  7. background-color="#334256"
  8. text-color="#ffffff"
  9. active-text-color="#20a0ff"
  10. router
  11. >
  12. <template v-for="item in items">
  13. <template>
  14. <el-menu-item :index="item.index" :key="item.index">
  15. <i :class="item.icon"></i>
  16. {{item.title}}
  17. </el-menu-item>
  18. </template>
  19. </template>
  20. </el-menu>
  21. </div>
  22. </template>
  23. <script>
  24. import bus from "../assets/js/bus"
  25. export default {
  26. data(){
  27. return{
  28. collapse: false,
  29. items:[
  30. {
  31. icon: 'el-icon-document', //表示选项图标
  32. index: 'Info', //表示跳转到哪个路由
  33. title: '系统首页' //表示选项的标题
  34. },
  35. {
  36. icon: 'el-icon-document',
  37. index: 'Consumer',
  38. title: '用户管理'
  39. },
  40. {
  41. icon: 'el-icon-document',
  42. index: 'Singer',
  43. title: '歌手管理'
  44. },
  45. {
  46. icon: 'el-icon-document',
  47. index: 'SongList',
  48. title: '歌单管理'
  49. },
  50. ]
  51. }
  52. },
  53. computed:{
  54. onRoutes(){
  55. return this.$route.path.replace('/',''); //表示默认选中哪个路由,让其处于选中状态
  56. }
  57. },
  58. created(){
  59. //通过Bus进行组件间的通信,来折叠侧边栏
  60. //接收Header头部传过来的信息,判断collapse是否为true,来折叠侧边栏
  61. bus.$on('collapse',msg =>{
  62. this.collapse = msg
  63. })
  64. }
  65. }
  66. </script>
  67. <style scoped>
  68. .sidebar {
  69. display: block;
  70. position: absolute;
  71. left: 0;
  72. top: 70px;
  73. bottom: 0;
  74. background-color: #334256;
  75. overflow-y: scroll;
  76. }
  77. .sidebar::-webkit-scrollbar{
  78. width: 0;
  79. }
  80. .sidebar-el-menu:not(.el-menu--collapse){
  81. width: 150px;
  82. }
  83. .sidebar >ul {
  84. height: 100%;
  85. }
  86. </style>

:default-active=”onRoutes” 表示默认选中哪个路由 :collapse=”collapse” 表示当collapse为true时,打开选项卡,否则,关闭选项卡 router 表示跳到哪个路由,与index一起搭配使用

2、头部菜单编写

image.png

  1. <template>
  2. <div class="header">
  3. <!-- 折叠图片 -->
  4. <div class="collapse-btn" @click="collapseChange">
  5. <i class="el-icon-menu"></i>
  6. </div>
  7. <div class="logo">music后台管理</div>
  8. <div class="header-right">
  9. <div class="btn-fullscreen" @click="handleFullScreen">
  10. <el-tooltip :content="fullscreen?`取消全屏`:`全屏`" placement="bottom">
  11. <i class="el-icon-rank"></i>
  12. </el-tooltip>
  13. </div>
  14. <div class="user-avator">
  15. <img src="../assets/img/user.jpg"/>
  16. </div>
  17. <el-dropdown class="user-name" trigger="click" @command="handleCommand">
  18. <span class="el-dropdown-link">
  19. {{userName}}
  20. <i class="el-icon-caret-bottom"></i>
  21. </span>
  22. <el-dropdown-menu slot="dropdown">
  23. <el-dropdown-item command="logout">退出登录</el-dropdown-item>
  24. </el-dropdown-menu>
  25. </el-dropdown>
  26. </div>
  27. </div>
  28. </template>
  29. <script>
  30. import bus from "../assets/js/bus";
  31. export default {
  32. data(){
  33. return{
  34. collapse: false,
  35. fullscreen:false
  36. }
  37. },
  38. computed:{
  39. //获取用户名
  40. userName(){
  41. return localStorage.getItem('userName');
  42. }
  43. },
  44. methods:{
  45. //侧边栏折叠
  46. collapseChange(){
  47. this.collapse = !this.collapse;
  48. bus.$emit('collapse',this.collapse);
  49. },
  50. //全屏事件
  51. handleFullScreen(){
  52. if(this.fullscreen){
  53. if(document.exitFullscreen){
  54. document.exitFullscreen();
  55. }else if(document.webkitCancelFullScreen){ //safari 、Chrome
  56. document.webkitCancelFullScreen();
  57. }else if (document.mozCancelFullScreen){ //firefox
  58. document.mozCancelFullScreen();
  59. }else if(document.msExitFullScreen){ //ie
  60. document.msExitFullScreen();
  61. }
  62. }else{
  63. let element = document.documentElement;
  64. if(element.requestFullscreen){
  65. element.requestFullscreen();
  66. }else if(element.webkitRequestFullScreen){ //safari 、Chrome
  67. element.webkitRequestFullScreen();
  68. }else if(element.mozRequestFullScreen){ //firefox
  69. element.mozRequestFullScreen();
  70. }else if (element.msRequestFullScreen){ //ie
  71. element.msRequestFullScreen();
  72. }
  73. }
  74. this.fullscreen = !this.fullscreen;
  75. },
  76. //退出登录
  77. handleCommand(command){
  78. if(command == "logout"){
  79. localStorage.removeItem('userName');
  80. this.$router.push("/");
  81. }
  82. }
  83. }
  84. }
  85. </script>
  86. <style scoped>
  87. .header{
  88. position: relative;
  89. background-color: #253041;
  90. box-sizing: border-box;
  91. width: 100%;
  92. height: 70px;
  93. font-size: 22px;
  94. color: #ffffff;
  95. }
  96. .collapse-btn{
  97. float: left;
  98. padding: 0 21px;
  99. cursor: pointer;
  100. line-height: 70px;
  101. }
  102. .header .logo{
  103. float: left;
  104. line-height: 70px;
  105. }
  106. .header-right{
  107. float: right;
  108. padding-right: 50px;
  109. display:flex;
  110. height: 70px;
  111. align-items: center;
  112. }
  113. .btn-fullscreen{
  114. transform: rotate(45deg);
  115. margin-right: 5px;
  116. font-size: 24px;
  117. }
  118. .user-avator{
  119. margin-left: 20px;
  120. }
  121. .user-avator img{
  122. display: block;
  123. width: 40px;
  124. height: 40px;
  125. border-radius: 50%;
  126. }
  127. .user-name{
  128. margin-left: 10px;
  129. }
  130. .el-dropdown-link{
  131. color: #ffffff;
  132. cursor: pointer;
  133. }
  134. </style>

2.1 侧边栏折叠

:collapse=”collapse” 表示当collapse为true时,打开选项卡,否则,关闭选项卡

  1. <!-- 折叠图片 -->
  2. <div class="collapse-btn" @click="collapseChange">
  3. <i class="el-icon-menu"></i>
  4. </div>
  1. //侧边栏折叠
  2. collapseChange(){
  3. this.collapse = !this.collapse;
  4. bus.$emit('collapse',this.collapse);
  5. },

当点击侧边栏折叠图标时,发送一个侧边栏折叠事件总线,给父组件及其他组件调用。
通过this.$emit(‘事件名称’,值); 进行通知其他组件进行侧边栏的折叠

  1. created(){
  2. //通过Bus进行组件间的通信,来折叠侧边栏
  3. bus.$on('collapse',msg =>{
  4. this.collapse = msg
  5. })
  6. }

其他组件,通过this.$on(‘事件名称保持一致’,回调函数就是传过来的值),来接收组件间的通信;

2.2 全屏事件

  1. <div class="btn-fullscreen" @click="handleFullScreen">
  2. <el-tooltip :content="fullscreen?`取消全屏`:`全屏`" placement="bottom">
  3. <i class="el-icon-rank"></i>
  4. </el-tooltip>
  5. </div>
  1. //全屏事件
  2. handleFullScreen(){
  3. if(this.fullscreen){ //表示当前全屏状态,需要退出全屏
  4. if(document.exitFullscreen){
  5. document.exitFullscreen();
  6. }else if(document.webkitCancelFullScreen){ //safari 、Chrome
  7. document.webkitCancelFullScreen();
  8. }else if (document.mozCancelFullScreen){ //firefox
  9. document.mozCancelFullScreen();
  10. }else if(document.msExitFullScreen){ //ie
  11. document.msExitFullScreen();
  12. }
  13. }else{ //表示当前退出全屏状态,需要打开全屏
  14. let element = document.documentElement;
  15. if(element.requestFullscreen){
  16. element.requestFullscreen();
  17. }else if(element.webkitRequestFullScreen){ //safari 、Chrome
  18. element.webkitRequestFullScreen();
  19. }else if(element.mozRequestFullScreen){ //firefox
  20. element.mozRequestFullScreen();
  21. }else if (element.msRequestFullScreen){ //ie
  22. element.msRequestFullScreen();
  23. }
  24. }
  25. this.fullscreen = !this.fullscreen;
  26. },

document.exitFullscreen() 表示退出全屏; element.mozRequestFullScreen() 表示打开全屏;

2.3 获取登录的用户名

  1. computed:{
  2. //获取用户名
  3. userName(){
  4. return localStorage.getItem('userName');
  5. }
  6. },

2.4 退出登录

  1. <div class="user-avator">
  2. <img src="../assets/img/user.jpg"/>
  3. </div>
  4. <el-dropdown class="user-name" trigger="click" @command="handleCommand">
  5. <span class="el-dropdown-link">
  6. <!-- 用户名 -->
  7. {{userName}}
  8. <i class="el-icon-caret-bottom"></i>
  9. </span>
  10. <el-dropdown-menu slot="dropdown">
  11. <el-dropdown-item command="logout">退出登录</el-dropdown-item>
  12. </el-dropdown-menu>
  13. </el-dropdown>
  1. //退出登录
  2. handleCommand(command){
  3. if(command == "logout"){
  4. //移除本地客户端存储的用户名
  5. localStorage.removeItem('userName');
  6. //跳转到登录页面
  7. this.$router.push("/");
  8. }
  9. }

3、Home主页面编写

image.png

  1. <template>
  2. <div>
  3. <!-- 头部 -->
  4. <Header></Header>
  5. <!-- 左侧菜单 -->
  6. <Asider></Asider>
  7. <!-- 内容显示区域 -->
  8. <div class="content-box" :class="{'content-collapse':collapse}">
  9. <router-view></router-view>
  10. </div>
  11. </div>
  12. </template>
  13. <script>
  14. import Asider from '@/components/Asider'
  15. import Header from '@/components/Header'
  16. import bus from "../assets/js/bus";
  17. export default {
  18. components:{
  19. Asider,
  20. Header
  21. },
  22. data(){
  23. return {
  24. collapse: false
  25. }
  26. },
  27. created(){
  28. //通过Bus进行组件间的通信,来折叠侧边栏
  29. bus.$on('collapse',msg =>{
  30. this.collapse = msg
  31. })
  32. }
  33. }
  34. </script>

:class=”{‘content-collapse’:collapse}” 表示当点击折叠侧边栏的时候,内容显示区域也随之侧边栏折叠改变而改变

4、编写内容显示Page页面

image.png

image.png

配置路由

  1. export default new Router({
  2. routes: [
  3. {
  4. path: '/',
  5. component: resolve => require(['../pages/Login.vue'], resolve)
  6. },
  7. {
  8. path: '/Home',
  9. component: resolve => require(['../components/Home.vue'], resolve),
  10. children:[
  11. {
  12. path: '/Info',
  13. name : '后台首页',
  14. component: resolve => require(['../pages/InfoPage.vue'], resolve)
  15. },
  16. {
  17. path: '/Consumer',
  18. name : '用户管理页面',
  19. component: resolve => require(['../pages/ConsumerPage.vue'], resolve)
  20. },
  21. {
  22. path: '/Singer',
  23. name : '歌手页面',
  24. component: resolve => require(['../pages/SingerPage.vue'], resolve)
  25. },
  26. {
  27. path: '/SongList',
  28. name : '歌单页面',
  29. component: resolve => require(['../pages/SongListPage.vue'], resolve)
  30. }
  31. ]
  32. },
  33. ]
  34. })