<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      若依左側(cè)一級菜單點(diǎn)擊會消失

      后端(Java):

      ruoyi/src/main/java/com/ruoyi/common/constant/UserConstants.java:

        /** 是否菜單外鏈(否) */
          public static final String NO_FRAME = "1";
      
          /** 菜單類型(目錄) */
          public static final String TYPE_DIR = "M";
      
          /** 菜單類型(菜單) */
          public static final String TYPE_MENU = "C";
      
          /** 菜單類型(按鈕) */
          public static final String TYPE_BUTTON = "F";
      
          /** Layout組件標(biāo)識 */
          public final static String LAYOUT = "Layout";
      
          /** 校驗(yàn)返回結(jié)果碼 */
          public final static String UNIQUE = "0";
          public final static String NOT_UNIQUE = "1";
      View Code

      ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysMenuServiceImpl.java:

                  router.setHidden("1".equals(menu.getVisible()));
                  router.setName(StringUtils.capitalize(menu.getPath()));
                  router.setPath(getRouterPath(menu));
                  router.setComponent(StringUtils.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent());
                  router.setComponent(getComponent(menu));
                  router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
                  List<SysMenu> cMenus = menu.getChildren();
                  if (!cMenus.isEmpty() && cMenus.size() > 0 && "M".equals(menu.getMenuType()))
                  if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()))
                  {
                      router.setAlwaysShow(true);
                      router.setRedirect("noRedirect");
                      router.setChildren(buildMenus(cMenus));
                  }
                  else if (isMeunFrame(menu))
                  {
                      List<RouterVo> childrenList = new ArrayList<RouterVo>();
                      RouterVo children = new RouterVo();
                      children.setPath(menu.getPath());
                      children.setComponent(menu.getComponent());
                      children.setName(StringUtils.capitalize(menu.getPath()));
                      children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
                      childrenList.add(children);
                      router.setChildren(childrenList);
                  }
                  routers.add(router);
              }
              return routers;
      @@ -297,14 +308,48 @@ public class SysMenuServiceImpl implements ISysMenuService
          public String getRouterPath(SysMenu menu)
          {
              String routerPath = menu.getPath();
              // 非外鏈并且是一級目錄
              if (0 == menu.getParentId() && UserConstants.NO_FRAME.equals(menu.getIsFrame()))
              // 非外鏈并且是一級目錄(類型為目錄)
              if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType())
                      && UserConstants.NO_FRAME.equals(menu.getIsFrame()))
              {
                  routerPath = "/" + menu.getPath();
              }
              // 非外鏈并且是一級目錄(類型為菜單)
              else if (isMeunFrame(menu))
              {
                  routerPath = StringUtils.EMPTY;
              }
              return routerPath;
          }
      
          /**
           * 獲取組件信息
           * 
           * @param menu 菜單信息
           * @return 組件信息
           */
          public String getComponent(SysMenu menu)
          {
              String component = UserConstants.LAYOUT;
              if (StringUtils.isNotEmpty(menu.getComponent()) && !isMeunFrame(menu))
              {
                  component = menu.getComponent();
              }
              return component;
          }
      
          /**
           * 是否為菜單內(nèi)部跳轉(zhuǎn)
           * 
           * @param menu 菜單信息
           * @return 結(jié)果
           */
          public boolean isMeunFrame(SysMenu menu)
          {
              return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType())
                      && menu.getIsFrame().equals(UserConstants.NO_FRAME);
          }
      
          /**
           * 根據(jù)父節(jié)點(diǎn)的ID獲取所有子節(jié)點(diǎn)
           * 
      View Code

      前端:

      ruoyi-ui/src/store/modules/permission.js:

      import auth from '@/plugins/auth'
      import router, { constantRoutes, dynamicRoutes } from '@/router'
      import { getRouters } from '@/api/menu'
      import Layout from '@/layout/index'
      import ParentView from '@/components/ParentView'
      import InnerLink from '@/layout/components/InnerLink'
      
      const permission = {
          state: {
              routes: [],
              addRoutes: [],
              defaultRoutes: [],
              topbarRouters: [],
              sidebarRouters: []
          },
          mutations: {
              SET_ROUTES: (state, routes) => {
                  state.addRoutes = routes
                  state.routes = constantRoutes.concat(routes)
              },
              SET_DEFAULT_ROUTES: (state, routes) => {
                  state.defaultRoutes = constantRoutes.concat(routes)
              },
              SET_TOPBAR_ROUTES: (state, routes) => {
                  state.topbarRouters = routes
              },
              SET_SIDEBAR_ROUTERS: (state, routes) => {
                  state.sidebarRouters = routes
              },
          },
          actions: {
              // 生成路由
              GenerateRoutes({ commit }) {
                  return new Promise(resolve => {
                      // 向后端請求路由數(shù)據(jù)
                      getRouters().then(res => {
                          const sdata = JSON.parse(JSON.stringify(res.data))
                          const rdata = JSON.parse(JSON.stringify(res.data))
                          const sidebarRoutes = filterAsyncRouter(sdata)
                          const rewriteRoutes = filterAsyncRouter(rdata, false, true)
                          const asyncRoutes = filterDynamicRoutes(sdata);
                          rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
                          router.addRoutes(asyncRoutes);
                          commit('SET_ROUTES', rewriteRoutes)
                          commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
                          commit('SET_DEFAULT_ROUTES', sidebarRoutes)
                          commit('SET_TOPBAR_ROUTES', sidebarRoutes)
                          resolve(rewriteRoutes)
                      })
                  })
              }
          }
      }
      
      // 遍歷后臺傳來的路由字符串,轉(zhuǎn)換為組件對象
      function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
          return asyncRouterMap.filter(route => {
              // console.log(route);
              // console.log(route.menuId);
              route.meta.menuId = route.menuId
              if (!route.path) {
                  // 防止空路由出現(xiàn)的警告,設(shè)置默認(rèn)path
                  route.path = '';
              }
              if (type && route.children) {
                  route.children = filterChildren(route.children)
              }
              // console.log(route.menuId);
              if (route.component) {
                  // Layout ParentView 組件特殊處理
                  if (route.component === 'Layout') {
                      route.component = Layout
                  } else if (route.component === 'ParentView') {
                      route.component = ParentView
                  } else if (route.component === 'InnerLink') {
                      route.component = InnerLink
                  } else {
                      route.component = loadView(route.component)
                  }
              }
              if (route.children != null && route.children && route.children.length) {
                  route.children = filterAsyncRouter(route.children, route, type)
              } else {
                  delete route['children']
                  delete route['redirect']
              }
              return true
          })
      }
      
      function filterChildren(childrenMap, lastRouter = false) {
          var children = []
          childrenMap.forEach((el, index) => {
              if (el.children && el.children.length) {
                  if (el.component === 'ParentView' && !lastRouter) {
                      el.children.forEach(c => {
                          c.path = el.path + '/' + c.path
                          if (c.children && c.children.length) {
                              children = children.concat(filterChildren(c.children, c))
                              return
                          }
                          children.push(c)
                      })
                      return
                  }
              }
              if (lastRouter) {
                  el.path = lastRouter.path + '/' + el.path
              }
              children = children.concat(el)
          })
          return children
      }
      
      // 動態(tài)路由遍歷,驗(yàn)證是否具備權(quán)限
      export function filterDynamicRoutes(routes) {
          const res = []
          routes.forEach(route => {
              if (route.permissions) {
                  if (auth.hasPermiOr(route.permissions)) {
                      res.push(route)
                  }
              } else if (route.roles) {
                  if (auth.hasRoleOr(route.roles)) {
                      res.push(route)
                  }
              }
          })
          return res
      }
      
      export const loadView = (view) => {
          if (process.env.NODE_ENV === 'development') {
              return (resolve) => require([`@/views/${view}`], resolve)
          } else {
              // 使用 import 實(shí)現(xiàn)生產(chǎn)環(huán)境的路由懶加載
              // return () => import(`@/views/${view}`)
              return (resolve) => require([`@/views/${view}`], resolve)
          }
      }
      
      export default permission
      View Code

      src/layout/components/Sidebar/index.vue

      <!-- <template>
          <div :class="{ 'has-logo': showLogo }">
              <logo v-if="showLogo" :collapse="isCollapse" />
              <el-scrollbar wrap-class="scrollbar-wrapper">
                  <el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="variables.menuBg"
                      :text-color="variables.menuText" :unique-opened="true" :active-text-color="variables.menuActiveText"
                      :collapse-transition="false" mode="vertical">
                      <sidebar-item v-for="route in permission_routes" :key="route.path" :index="route.menuId" :item="route"
                          :base-path="route.path" />
                  </el-menu>
              </el-scrollbar>
          </div>
      </template> -->
      <template>
          <div :class="{ 'has-logo': showLogo }">
              <logo v-if="showLogo" :collapse="isCollapse" />
              <el-scrollbar wrap-class="scrollbar-wrapper">
                  <el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="variables.menuBg"
                      :text-color="variables.menuText" :unique-opened="true" :active-text-color="variables.menuActiveText"
                      :collapse-transition="false" mode="vertical">
                      <sidebar-item v-for="(route, index) in permission_routes" :key="route.path + index" :item="route"
                          :base-path="route.path" />
                  </el-menu>
              </el-scrollbar>
          </div>
      </template>
      <script>
      import { mapGetters } from 'vuex'
      import Logo from './Logo'
      import SidebarItem from './SidebarItem'
      import variables from '@/assets/styles/variables.scss'
      
      export default {
          components: { SidebarItem, Logo },
          computed: {
              ...mapGetters([
                  'permission_routes',
                  'sidebar'
              ]),
              activeMenu() {
                  const route = this.$route;
                  // console.log(route);
                  const { meta, path } = route
                  if (meta.activeMenu) {
                      return meta.activeMenu
                  }
                  if(!route.meta.menuId) {
                      route.meta.menuId = route.matched[0].meta.menuId;
                  }
                  return path
              },
              showLogo() {
                  return this.$store.state.settings.sidebarLogo
              },
              variables() {
                  return variables
              },
              isCollapse() {
                  return !this.sidebar.opened
              }
          }
      }
      </script>
      View Code

      點(diǎn)擊菜單的時候,判斷是否有獲取到菜單Id:

      activeMenu() {
          const route = this.$route;
          // console.log(route);
          const { meta, path } = route
          if (meta.activeMenu) {
              return meta.activeMenu
          }
          if(!route.meta.menuId) {
              route.meta.menuId = route.matched[0].meta.menuId;
          }
          return path
      },

       

      posted @ 2023-10-27 10:25  小蘑菇123  閱讀(51)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 狠狠色婷婷久久综合频道日韩 | 亚洲国产成人久久精品app| 亚洲国模精品一区二区| 国产精品欧美福利久久| 亚洲v欧美v日韩v国产v| 麻豆久久天天躁夜夜狠狠躁| 精品一区二区三区日韩版| 国产丰满乱子伦无码专区| 婷婷开心深爱五月天播播| 亚洲欧美日韩综合久久久| 精品国产中文字幕懂色| 97一区二区国产好的精华液| 国产伦一区二区三区久久| 国产蜜臀久久av一区二区| 黑森林福利视频导航| 天天做天天爱夜夜爽毛片 | 制服丝袜美腿一区二区| 午夜在线不卡| 久久99久久99精品免视看动漫| 精品综合久久久久久98| 野花社区视频www官网| 国产精品久久久福利| 免费A级毛片无码A∨蜜芽试看| 日本极品少妇videossexhd| 亚洲中文久久久久久精品国产| 国产免费踩踏调教视频| 乱60一70归性欧老妇| 狠狠干| 迭部县| 亚洲熟女国产熟女二区三区| 欧美精欧美乱码一二三四区| 国产精品69人妻我爱绿帽子 | 国产一区二区三区尤物视频| 少妇被无套内谢免费看| 人人人澡人人肉久久精品| 韩国V欧美V亚洲V日本V| 国产精品天天在线午夜更新| 九九热在线观看精品视频| 99麻豆久久精品一区二区| 精品国产这么小也不放过| 国产精品 欧美激情 在线播放|