1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/d718781500-sys_v2.0

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
权限菜单.md 6.3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 21:48 a7044ff

В корневом каталоге создайте utils/recursionRoutes и объявите следующую функцию для рекурсивной обработки пользовательских маршрутов:

/**
 * 
 * @param {Array} allRoutes — весь список страниц
 * @param {Array} menuList — список меню, полученный с сервера
 */
const recursionRoutes = (allRoutes = [], menuList = []) => {
    let userRoutes = [];//результат сравнения будет сохранён в этом массиве
    allRoutes.forEach(item => {
        menuList.forEach(v => {
            if (item.meta.name === v.name) {
                if (v.children && v.children.length > 0) {
                    item.children = recursionRoutes(item.children, v.children)
                }
                userRoutes.push(item)
            }
        })
    })
    return userRoutes
}

export default recursionRoutes

3. Определите store:

Запрос к серверу для получения списка меню и сохранение его в vuex store в состоянии sidMenu:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import { getMenuList } from "@/api"
import DynamicRoutes from "@/router/DynamicRoutes" //динамические маршруты
import router from "@/router" //импорт роутера
//импорт функции recursionRoutes для обработки рекурсии пользовательских маршрутов
import recursionRoutes from "../uitils/recursionRoutes"
//импорт allRoutes
import allRoutes from "../router/allRoutes"
export default new Vuex.Store({
  state: {
    sideMenu: []
  },
  mutations: {
    SET_SIDEMENU(state, payload) { //установка пользовательского меню
      state.sideMenu = payload
      //находим маршрут "/" так как все страницы являются его дочерними
      let target = DynamicRoutes.find(item => item.path === '/')
      target.children = [...state.sideMenu]
      console.log(DynamicRoutes)
      router.addRoutes(DynamicRoutes)
    },
    CLEAR_SIDEMENU(state) {
      state.sideMenu = []
    }
  },
  actions: {
    async FETCH_MENULIST({ commit }) { //получение пользовательского меню
      //запуск асинхронного запроса для получения пользовательского меню
      let res = await getMenuList();
      if (res && res.data) { //получен результат
        //рекурсивно получаем пользовательские маршруты
        let userMenu = recursionRoutes(allRoutes, res.data.menuList)
        commit("SET_SIDEMENU", userMenu)
      }
    }
  },
  modules: {
  }
})

4. Извлеките subMenu:

Используйте v-if для рекурсивного управления текущим компонентом и детальной обработки. Для el-menu-item добавьте v-else.

В скрипте добавьте атрибут name «sub-menu» для текущего компонента, чтобы использовать рекурсию:

<template>
  <div class="subMenu">
    <div v-for="item in sideMenu">
      <!-- имеет подменю -->
      <el-submenu index="1"
                  v-if="item.children&&item.children.length>0">
        <template slot="title">
          <i class="el-icon-s-custom"></i>
          <span slot="title">{{item.meta.name}}</span>
        </template>
        <el-menu-item-group>
          <sub-menu :sideMenu="item.children"></sub-menu>
        </el-menu-item-group>
      </el-submenu>
      <!-- обычное меню -->
      <el-menu-item @click="jumpRoute(item.name)">
        <i class="el-icon-menu"></i>
        <span slot="title">{{item.meta.name}}</span>
      </el-menu-item>
    </div>
  </div>
</template>
<script>
  export default {
    name: "sub-menu",//даём имя компоненту, после чего можно использовать рекурсию
    props: {
      sideMenu: {
        type: Array,
        default: ()=>[] //определяем данные по умолчанию
      }
    },
    data() {
      return {
        isCollapse: false
      }
    },
    methods: {
      jumpRoute(name) {
        this.$router.push({ name })
      }
    },
    mounted() {
      console.log(this.sideMenu)
    }
  }
</script>
<style>
</style>

Добавьте следующие стили в глобальный стиль:

body, ul, p, li, h1, h2, h3, h4, h5, h6 {
    margin: 0;
    padding: 0;
}

.el-menu--collapse .el-submenu__title span {
    height: 0;
    width: 0;
    overflow: hidden;
    visibility: hidden;
    display: inline-block;
}

.el-menu--collapse .el-menu-item .el-submenu__icon-arrow, .el-menu--collapse .el-submenu .el-submenu__title .el-submenu__icon-arrow {
    display: none;
}
.el-menu-item-group .el-menu-item{
   padding:0 0 0 30px;

}

.el-menu-item-group .el-menu-item-group__title{
    padding:0
}

5. Обработка логики выхода из системы:

Поскольку есть только addRoues без deleteRoutes, при выходе из системы очистите хранилище sideMenu и обновите страницу:

  methods: {
      quit() {
        //1. перейти на страницу входа
        //2. очистить токен
        //3. очистить хранилище sideMenu
        //4. обновить страницу
         localStorage.removeItem("qftoken")
        this.$router.push("/login")
        this.$store.commit("CLEAR_MENU")
        window.location.reload()
      }

6. Обработка повторяющихся навигационных циклов:

Просто добавьте следующий код в перехватчик ответа в api/config.js, чтобы удалить токен:

Изображение не прикреплено.

Это перевод исходного текста. Если вы заметили ошибку или неточность, пожалуйста, сообщите мне об этом.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/d718781500-sys_v2.0.git
git@api.gitlife.ru:oschina-mirror/d718781500-sys_v2.0.git
oschina-mirror
d718781500-sys_v2.0
d718781500-sys_v2.0
master