xyc
3 天以前 53052625c7c520744a4ca061e204ec9594ca67f8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<template>
  <el-container class="layout">
    <app-header></app-header>
    <el-container class="layout-body">
      <el-aside width="228px" class="layout-aside">
        <div class="aside-caption">业务导航</div>
        <el-menu ref="sideMenu" :default-active="$route.path" router background-color="#f5f8fb" text-color="#2f4257" active-text-color="#1769aa" unique-opened>
          <menu-node v-for="item in menus" :key="item.id" :item="item"></menu-node>
        </el-menu>
      </el-aside>
      <el-main class="layout-main">
        <transition name="fade" mode="out-in">
          <router-view></router-view>
        </transition>
      </el-main>
    </el-container>
  </el-container>
</template>
 
<script>
import api from '@/api'
import AppHeader from '@/components/AppHeader.vue'
import MenuNode from '@/components/MenuNode.vue'
 
export default {
  name: 'AppLayout',
  components: { AppHeader, MenuNode },
  data() {
    return { menus: [] }
  },
  created() {
    this.loadMenus()
  },
  methods: {
    loadMenus() {
      api.get('/system/menu/nav').then(res => {
        this.menus = (res.data || []).filter(item => item.visible !== 0)
      }).catch(() => {})
    }
  }
}
</script>
 
<style scoped>
.layout { display: flex; flex-direction: column; height: 100%; }
.layout-body { flex: 1; min-height: 0; }
.layout-aside { border-right: 1px solid #d9e2eb; background: #f5f8fb; overflow-x: hidden; overflow-y: auto; }
.aside-caption { padding: 14px 18px 8px; color: #8090a2; font-size: 12px; letter-spacing: .08em; }
.layout-main { min-width: 0; padding: 0; overflow: auto; background: #eef2f6; }
.el-menu { border-right: 0; }
.layout-aside ::v-deep .el-menu-item,
.layout-aside ::v-deep .el-submenu__title {
  height: auto;
  min-height: 50px;
  padding-top: 8px;
  padding-bottom: 8px;
  line-height: 20px;
  white-space: normal;
}
.layout-aside ::v-deep .el-menu-item span,
.layout-aside ::v-deep .el-submenu__title span {
  flex: 1;
  min-width: 0;
  white-space: normal;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.fade-enter-active, .fade-leave-active { transition: opacity .12s ease; }
.fade-enter, .fade-leave-to { opacity: 0; }
</style>