主页布局+通过接口获取菜单数据+实现首页的路由重定向+设置左侧二级菜单的路由链接

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主页布局+通过接口获取菜单数据+实现首页的路由重定向+设置左侧二级菜单的路由链接相关的知识,希望对你有一定的参考价值。

目录

1.通过接口获取数据

API如果需要授权,必须在请求头中使用Authorization字段提供token令牌

通过axios请求拦截器添加token,保证拥有获取数据的权限

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'
// 导入全局样式
import './assets/css/global.css'

import axios from 'axios'

// 配置请求的根目录
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
axios.interceptors.request.use(config => {
  console.log(config)
  config.headers.Authorization = window.sessionStorage.getItem('token')
  return config
})
Vue.prototype.$http = axios

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

2.主页布局

开发流程:主页框架、主页Header布局、主页左侧菜单布局、发起请求获取左侧菜单数据、左侧菜单美化

ps:左侧菜单数据是通过发起请求获取的,具体API接口请查看文档

components/Home.vue

<template>
  <el-container class="home-container">
    <!-- 头部区域 -->
    <el-header>
      <div>
        <img src="../assets/heima.png" />
        <span>电商后台管理系统</span>
      </div>
      <el-button type="info" @click="logout">退出</el-button>
    </el-header>
    <!-- 页面主体区域 -->
    <el-container>
      <!-- 侧边栏 -->
      <el-aside :width="isCollapse ? '64px' : '200px'">
        <div class="toggle-button" @click="toggleCollapse">|||</div>
        <el-menu background-color="#333744" text-color="#fff" active-text-color="#409EFF" :collapse="isCollapse" :collapse-transition="false" router :default-active="activePath">
          <el-submenu :index="item.id + ''" v-for="item in menulist" :key="item.id">
            <template slot="title">
              <i :class="iconsObj[item.id]"></i>
              <span>{{item.authName}}</span>
            </template>
            <el-menu-item :index="'/' + subItem.path" v-for="subItem in item.children" :key="subItem.id" @click="saveNavState('/' + subItem.path)">
              <i class="el-icon-menu"></i>
              <span>{{subItem.authName}}</span>
            </el-menu-item>
          </el-submenu>
        </el-menu>
      </el-aside>
      <!-- 右侧内容主体 -->
      <el-main>
        <router-view></router-view>
      </el-main>
    </el-container>
  </el-container>
</template>

<script>
export default {
  data() {
    return {
      menulist: [],
      iconsObj: {
        125: 'el-icon-s-custom',
        103: 'el-icon-s-management',
        101: 'el-icon-s-goods',
        102: 'el-icon-s-order',
        145: 'el-icon-s-data'
      },
      // 是否折叠
      isCollapse: false,
      // 被激活的链接地址
      activePath: ''
    }
  },
  created() {
    this.getMenuList()
    this.activePath = window.sessionStorage.getItem('activePath')
  },
  methods: {
    logout() {
      window.sessionStorage.clear()
      this.$router.push('login')
    },
    // 获取所有的菜单
    async getMenuList() {
      const { data: res } = await this.$http.get('menus')
      if (res.meta.status !== 200) return this.$message.erro(res.meta.msg)
      this.menulist = res.data
    },
    // 点击按钮,切换菜单的折叠与展开
    toggleCollapse() {
      this.isCollapse = !this.isCollapse
    },
    // 保存链接的激活状态
    saveNavState(activePath) {
      window.sessionStorage.setItem('activePath', activePath)
      this.activePath = activePath
    }
  }
}
</script>

<style lang="less" scoped>
.home-container {
  height: 100%;
}

.el-header {
  background-color: #373d41;
  display: flex;
  justify-content: space-between;
  padding-left: 0;
  align-items: center;
  color: #fff;
  font-size: 20px;
  > div {
    display: flex;
    align-items: center;
    span {
      margin-left: 15px;
    }
  }
}

.el-aside {
  background-color: #333744;
  .el-menu {
    border-right: none;
  }
}

.el-main {
  background-color: #eaedf1;
}

.toggle-button {
  background-color: #4a5064;
  font-size: 10px;
  line-height: 24px;
  color: #fff;
  text-align: center;
  letter-spacing: 0.2em;
  cursor: pointer;
}
</style>

plugins/elements.js

import Vue from 'vue'
import {
  Button,
  Form,
  FormItem,
  Input,
  Message,
  Container,
  Header,
  Aside,
  Main,
  Menu,
  Submenu,
  MenuItemGroup,
  MenuItem
} from 'element-ui'

Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
Vue.use(Container)
Vue.use(Header)
Vue.use(Aside)
Vue.use(Main)
Vue.use(Menu)
Vue.use(Submenu)
Vue.use(MenuItemGroup)
Vue.use(MenuItem)
Vue.prototype.$message = Message

效果

点击下图标志,菜单可折叠收起 

3.实现首页的路由重定向

components/Welcome.vue

<template>
  <div>
    <h3>Welcome</h3>
  </div>
</template>

router/index.js 

import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '../components/Login.vue'
import Home from '../components/Home.vue'
import Welcome from '../components/Welcome.vue'

Vue.use(VueRouter)

const router = new VueRouter({
  routes: [
    { path: '/', redirect: '/login' },
    { path: '/login', component: Login },
    {
      path: '/home',
      component: Home,
      redirect: '/welcome',
      children: [{ path: '/welcome', component: Welcome }]
    }
  ]
})

// 挂载导航守卫
router.beforeEach((to, from, next) => {
  if (to.path === '/login') return next()
  const tokenStr = window.sessionStorage.getItem('token')
  if (!tokenStr) return next('/login')
  next()
})

export default router

效果

4.设置左侧二级菜单的路由链接 

components/Home.vue中修改

查看官方文档可知,el-menu有个router参数

router是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转booleanfalse

对上面的Home.vue做两处修改

给le-menu标签添加router参数

<el-menu background-color="#333744" text-color="#fff" active-text-color="#409EFF" :collapse="isCollapse" :collapse-transition="false" router></el-menu>

②修改二级菜单el-menu-item标签的index

<el-menu-item :index="'/' + subItem.path" v-for="subItem in item.children" :key="subItem.id">
<i class="el-icon-menu"></i>
<span>{{subItem.authName}}</span>
</el-menu-item>

 效果

 

点击之后url改变了 

5.添加功能

如何点击二级菜单高亮显示,并且刷新当前页面之后,之前点击的菜单仍然高亮显示?

el-menu标签中有个default-active参数,你想让哪个el-menu-item标签(二级菜单)高亮,就把该el-menu-item的index赋值给这个参数

思路:我们这里的el-menu-item标签的index是'/' + subItem.path,点击el-menu-item标签,触发事件,将该标签的index传到本地data中的activePath变量中,而default-active就动态绑定这个activePath变量,这样就实现了点击谁,谁就高亮。

点击的同时,我们把activePath的内容存到sessionStorage中,key为'activePath',value为activePath。每当页面刷新时,会执行created()函数中的内容,所以我们把sessionStorage保存的'activePath'的value赋值给本地data中的activePath变量。从而实现了页面刷新前哪个菜单高亮,刷新后仍然高亮。

以上是关于主页布局+通过接口获取菜单数据+实现首页的路由重定向+设置左侧二级菜单的路由链接的主要内容,如果未能解决你的问题,请参考以下文章

电商管理系统项目开发过程的目录

VUE项目实战17通过接口获取菜单并渲染

VUE项目实战21用户列表开发-基本UI布局

VUE项目实战20实现首页路由重定向及左侧菜单路由链接

vue 项目路由权限管理实现

Vue.js+Koa2移动电商实战4