当前位置:   article > 正文

Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):定义主页面_el-menu--horizontal

el-menu--horizontal

一、定义主页面

 

主页面 可以拆分成多个组件,每个组件负责一部分页面的显示。
  拆分成 Header、Aside、Footer、Content 四个页面。
其中:
  Header          用于定义导航栏信息
  Aside             用于定义菜单栏信息

       Footer             用于定义底部信息
  Content         用于显示各个菜单选项的页面

1》config配置路径


(1)简介

(2)安装

npm install path -S

(3)配置

  1. const path = require('path')
  2. function resolve(dir) {
  3. return path.join(__dirname, dir)
  4. }
  5. module.exports = {
  6. devServer: {
  7. port: 4000
  8. },
  9. configureWebpack: {
  10. resolve: {
  11. alias: {
  12. '~': resolve('./'),
  13. '@': resolve('src'),
  14. "assets": "@/assets",
  15. }
  16. }
  17. }
  18. }

(4)重启服务

2》home.vue


 (1)简介

结构页

(2)页面

  1. <template>
  2. <el-container class="container" v-loading="false" element-loading-text="拼命加载中" element-loading-background="rgba(0, 0, 0, 0.8)" element-loading-spinner="el-icon-loading">
  3. <!-- 侧边栏 -->
  4. <Aside :foldAside="foldAside" />
  5. <!--
  6. direction="vertical" 用于垂直布局
  7. -->
  8. <el-container direction="vertical">
  9. <!-- 头部导航栏 -->
  10. <el-header height="50"> <Header /></el-header>
  11. <!-- 内容 -->
  12. <el-container class="wrapper">
  13. <Content />
  14. </el-container>
  15. <!-- 底部 -->
  16. <div class="footer">
  17. <Footer />
  18. </div>
  19. </el-container>
  20. </el-container>
  21. </template>
  22. <script>
  23. import Header from '@/components/common/header.vue';
  24. import Aside from '@/components/common/aside.vue';
  25. import Footer from '@/components/common/footer.vue';
  26. import Content from '@/components/common/content.vue';
  27. export default {
  28. name: 'Home',
  29. components: {
  30. Header,
  31. Aside,
  32. Footer,
  33. Content,
  34. },
  35. data() {
  36. return {
  37. foldAside: true,
  38. };
  39. },
  40. methods: {
  41. foldOrOpen(data) {
  42. this.foldAside = data;
  43. },
  44. },
  45. };
  46. </script>
  47. <style>
  48. .container {
  49. height: 100%;
  50. }
  51. .wrapper {
  52. height: calc(100vh - 100px);
  53. }
  54. .wrapper_con {
  55. padding-bottom: 0;
  56. }
  57. </style>

3》header.vue 


(1)简介
  通过导航栏,可以进行一些操作。比如:折叠侧边栏、修改密码、退出登录等。

(2)页面代码(路径地址:/src/components/common/header.vue)

  1. <template>
  2. <div class="header">
  3. <!-- 是否展开侧边栏 -->
  4. <div class="header-title" @click="foldOrOpen">
  5. <a class="el-icon-s-fold" v-if="foldAside" title="折叠侧边栏" />
  6. <a class="el-icon-s-unfold" v-else title="展开侧边栏" />
  7. </div>
  8. <!-- 设置、文档、用户设置等 -->
  9. <div class="header-menu">
  10. <el-menu mode="horizontal" class="header-menu-submenu">
  11. <el-menu-item title="设置" index="1" to="/">网站首页 </el-menu-item>
  12. <el-menu-item title="清除缓存" index="2" @click="onClear">清除缓存 </el-menu-item>
  13. <el-menu-item title="系统更新" index="3" @click="onUpdate"> 系统更新 </el-menu-item>
  14. <el-menu-item title="帮助" index="5">帮助</el-menu-item>
  15. <el-menu-item title="设置" index="4"> <i class="el-icon-setting"></i>设置 </el-menu-item>
  16. <!-- 用户设置 -->
  17. <el-submenu title="用户设置" index="6">
  18. <template slot="title">
  19. <span class="header-span"> <img src="@/assets/images/avatar.png" :alt="userName" /> {{ userName }} </span>
  20. </template>
  21. <el-menu-item index="6-1" @click="showPasswordBox"> <i class="el-icon-edit"></i>修改密码 </el-menu-item>
  22. <el-menu-item index="6-2" @click="logout"> <i class="el-icon-close"></i>退出 </el-menu-item>
  23. </el-submenu>
  24. </el-menu>
  25. </div>
  26. </div>
  27. </template>
  28. <script>
  29. export default {
  30. name: 'Header',
  31. data() {
  32. return {
  33. // 是否展开侧边栏
  34. foldAside: true,
  35. // 默认用户名
  36. userName: 'admin',
  37. // 是否展开密码框
  38. UpdatePasswordVisible: false,
  39. };
  40. },
  41. components: {
  42. },
  43. methods: {
  44. // 展开密码修改框
  45. showPasswordBox() {
  46. this.UpdatePasswordVisible = true;
  47. // this.$nextTick 表示数据渲染后,执行密码框初始化
  48. this.$nextTick(() => {
  49. this.$refs.updatePassowrd.init();
  50. });
  51. },
  52. // 展开、折叠侧边栏
  53. foldOrOpen() {
  54. alert('侧边栏逻辑未完成');
  55. console.log('foldOrOpen');
  56. },
  57. // 退出登录,回到登录界面
  58. logout() {
  59. // TODO:退出逻辑待完成
  60. alert('退出逻辑未完成');
  61. this.$router.push({
  62. name: 'Login',
  63. });
  64. },
  65. // 清除缓冲
  66. onClear() {
  67. console.log('onClear');
  68. },
  69. // 系统更新
  70. onUpdate() {
  71. console.log('onUpdate');
  72. },
  73. },
  74. };
  75. </script>
  76. <style>
  77. .header {
  78. padding: 0 10px;
  79. display: flex;
  80. height: 50px;
  81. line-height: 50px;
  82. border-bottom: solid 1px #e6e6e6;
  83. }
  84. .header-title {
  85. height: 50px;
  86. width: 50px;
  87. float: left;
  88. font-size: 30px;
  89. cursor: pointer;
  90. }
  91. .header-menu {
  92. height: 50px;
  93. width: 100%;
  94. flex: 1;
  95. line-height: 50px;
  96. font-size: 30px;
  97. }
  98. .header-menu-submenu {
  99. float: right;
  100. }
  101. .header-submenu-a {
  102. text-decoration: none;
  103. color: #4cc4b8;
  104. font-weight: bold;
  105. font-size: 14px;
  106. }
  107. .header-submenu-a:hover {
  108. background-color: #2c3e50;
  109. }
  110. .el-menu--horizontal > .el-menu-item,
  111. .el-menu--horizontal > .el-submenu .el-submenu__title {
  112. height: 50px !important;
  113. line-height: 50px !important;
  114. padding: 0 10px !important;
  115. }
  116. .el-menu--collapse .el-menu .el-submenu,
  117. .el-menu--popup {
  118. min-width: auto !important;
  119. }
  120. .header-span img {
  121. width: 40px;
  122. height: 40px;
  123. line-height: 40px;
  124. margin: 5px 5px 10px 10px;
  125. border-radius: 50%;
  126. }
  127. .header-span {
  128. font-size: 20px;
  129. border-radius: 50%;
  130. }
  131. </style>

4》aside.vue


(1)简介
  用于定义侧边栏,显示菜单。

(2)页面(路径地址:/src/components/common/aside.vue)

  1. <template>
  2. <div>
  3. <!-- 系统 Logo -->
  4. <el-aside class="header-logo" :width="asideWidth">
  5. <div @click="$router.push({ name: 'Home' })">
  6. <a v-if="foldAside">CMS管理系统</a>
  7. <a v-else>CMS</a>
  8. </div>
  9. </el-aside>
  10. <el-aside class="aside" :width="asideWidth" :class="'icon-size-' + iconSize">
  11. <el-scrollbar style="height: 100%; width: 100%;">
  12. <!--
  13. default-active 表示当前选中的菜单,默认为 home。
  14. collapse 表示是否折叠菜单,仅 mode 为 vertical(默认)可用。
  15. collapseTransition 表示是否开启折叠动画,默认为 true
  16. background-color 表示背景颜色。
  17. text-color 表示字体颜色。
  18. -->
  19. <el-menu :default-active="menuActiveName || 'home'" :collapse="!foldAside" :collapseTransition="false" background-color="#263238" text-color="#8a979e">
  20. <el-menu-item index="home" @click="$router.push({ name: 'Home' })" style="width:200px">
  21. <i class="el-icon-s-home"></i>
  22. <span slot="title">栏目管理</span>
  23. </el-menu-item>
  24. <el-submenu index="demo" style="width:200px">
  25. <template slot="title">
  26. <i class="el-icon-star-off"></i>
  27. <span>demo</span>
  28. </template>
  29. <el-menu-item index="demo-echarts" @click="$router.push({ name: 'Echarts' })">
  30. <i class="el-icon-s-data"></i>
  31. <span slot="title">echarts</span>
  32. </el-menu-item>
  33. <el-menu-item index="demo-ueditor" @click="$router.push({ name: 'Ueditor' })">
  34. <i class="el-icon-document"></i>
  35. <span slot="title">ueditor</span>
  36. </el-menu-item>
  37. </el-submenu>
  38. </el-menu>
  39. </el-scrollbar>
  40. </el-aside>
  41. </div>
  42. </template>
  43. <script>
  44. export default {
  45. name: 'Aside',
  46. data() {
  47. return {
  48. foldAside: true,
  49. // 保存当前选中的菜单
  50. menuActiveName: 'home',
  51. // 保存当前侧边栏的宽度
  52. asideWidth: '200px',
  53. // 用于拼接当前图标的 class 样式
  54. iconSize: 'true',
  55. };
  56. },
  57. };
  58. </script>
  59. <style>
  60. .aside {
  61. margin-bottom: 0;
  62. height: 100%;
  63. max-height: calc(100% - 50px);
  64. width: 100%;
  65. max-width: 200px;
  66. background-color: #263238;
  67. text-align: left;
  68. right: 0;
  69. }
  70. .header-logo {
  71. background-color: #17b3a3;
  72. text-align: center;
  73. height: 50px;
  74. line-height: 50px;
  75. width: 200px;
  76. font-size: 24px;
  77. color: #fff;
  78. font-weight: bold;
  79. margin-bottom: 0;
  80. cursor: pointer;
  81. }
  82. .el-submenu .el-menu-item {
  83. max-width: 200px !important;
  84. }
  85. .el-scrollbar__wrap {
  86. overflow-x: hidden !important;
  87. }
  88. .icon-size-false i {
  89. font-size: 30px !important;
  90. }
  91. .icon-size-true i {
  92. font-size: 18px !important;
  93. }
  94. </style>

5》footer.vue


(1)简介
  底部版权信息

(2)页面(路径地址:/src/components/common/footer.vue)

  1. <template>
  2. <div class="my_footer">Copyright © {{ startYear }}-{{ endYear }} GoldSunny 版权所有</div>
  3. </template>
  4. <script>
  5. export default {
  6. name: 'Footer',
  7. data() {
  8. return {
  9. startYear: new Date().getFullYear(),
  10. endYear: new Date().getFullYear() + 1,
  11. };
  12. },
  13. };
  14. </script>
  15. <style scoped>
  16. .my_footer {
  17. background: #eee;
  18. color: #666;
  19. font-size: 14px;
  20. line-height: 36px;
  21. }
  22. </style>

6》content.vue


(1)简介
  内容区域

(2)页面(路径地址:/src/components/common/content.vue)

  1. <template>
  2. <el-main class="content">
  3. <keep-alive>
  4. <router-view />
  5. </keep-alive>
  6. </el-main>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'Content',
  11. };
  12. </script>
  13. <style>
  14. .el-main {
  15. padding: 15px !important;
  16. }
  17. .content {
  18. background-color: #fff;
  19. }
  20. </style>

7》修改路由

  1. routes: [{
  2. path: "/",
  3. name: "Home",
  4. component: Home,
  5. children: [{
  6. path: "/about",
  7. name: "about",
  8. // route level code-splitting
  9. // this generates a separate chunk (about.[hash].js) for this route
  10. // which is lazy-loaded when the route is visited.
  11. component: () =>
  12. import( /* webpackChunkName: "about" */ "./views/About.vue")
  13. }, ]
  14. },

8》最终页面样式

二、路由整理

(1)简介
  想要各个组件页面间能够顺利跳转,就需要 router 来操作了。
  此处简单写了路由跳转规则,后续会进行修改。

(2)定义路由跳转规则
  path 指的是 路径。
  redirect 指的是 需要跳转的路径。
  name 指的是 路由的名字(此项目中,均使用 name 进行路由跳转)。
  component 指的是 路由的组件,用于显示页面(<router-view /> 会加载组件)。
  children 指的是 子路由(路由中显示另一个路由)。

  1. import Vue from "vue";
  2. import Router from "vue-router";
  3. import Home from "./views/Home.vue";
  4. Vue.use(Router);
  5. const routes = [{
  6. path: "/",
  7. name: "Home",
  8. component: Home,
  9. children: [{
  10. path: "/about",
  11. name: "About",
  12. meta: {
  13. name: '关于我们'
  14. },
  15. component: () =>
  16. import( /* webpackChunkName: "about" */ "./views/About.vue")
  17. }, ]
  18. },
  19. {
  20. path: "/404",
  21. name: "404",
  22. component: () => import("./views/404.vue")
  23. },
  24. {
  25. path: "/login",
  26. name: "Login",
  27. component: () => import("./views/login.vue")
  28. }
  29. ]
  30. const router = new Router({
  31. routes, // 用于定义 路由跳转 规则
  32. mode: "history", // mode 用于去除地址中的 #
  33. base: process.env.BASE_URL,
  34. scrollBehavior: () => ({ // scrollBehavior 用于定义路由切换时,页面滚动。
  35. y: 0
  36. })
  37. });
  38. // 解决相同路径跳转报错
  39. const originalPush = Router.prototype.push
  40. Router.prototype.push = function push(location) {
  41. return originalPush.call(this, location).catch(err => {
  42. err
  43. })
  44. }
  45. export default router

页面展示

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/113498
推荐阅读
相关标签
  

闽ICP备14008679号