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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| <template>
| <template v-for="item in menu">
| <el-menu-item
| v-if="validatenull(item[childrenKey]) && validRoles(item)"
| :index="getPath(item)"
| @click="open(item)"
| :key="item[labelKey]"
| >
| <i :class="item[iconKey]"></i>
| <template #title>
| <span :alt="item[pathKey]">{{ getTitle(item) }}</span>
| </template>
| </el-menu-item>
| <el-sub-menu
| v-else-if="!validatenull(item[childrenKey]) && validRoles(item)"
| :index="getPath(item)"
| :key="item[labelKey]"
| >
| <template #title>
| <i :class="item[iconKey]"></i>
| <span>{{ getTitle(item) }}</span>
| </template>
| <template v-for="(child, cindex) in item[childrenKey]" :key="child[labelKey]">
| <el-menu-item
| :index="getPath(child)"
| @click="open(child)"
| v-if="validatenull(child[childrenKey])"
| >
| <i :class="child[iconKey]"></i>
| <template #title>
| <span>{{ getTitle(child) }}</span>
| </template>
| </el-menu-item>
| <sidebar-item v-else :menu="[child]" :key="cindex"></sidebar-item>
| </template>
| </el-sub-menu>
| </template>
| </template>
| <script>
| import { mapGetters } from 'vuex';
| import { validatenull } from 'utils/validate';
| import website from '@/config/website';
|
| export default {
| name: 'sidebarItem',
| data() {
| return {
| props: website.menu,
| };
| },
| props: {
| menu: Array,
| },
| computed: {
| ...mapGetters(['roles']),
| labelKey() {
| return this.props.label;
| },
| pathKey() {
| return this.props.path;
| },
| queryKey() {
| return this.props.query;
| },
| iconKey() {
| return this.props.icon;
| },
| childrenKey() {
| return this.props.children;
| },
| },
| methods: {
| validatenull,
| getPath(item) {
| return item[this.pathKey];
| },
| getTitle(item) {
| return this.$router.$avueRouter.generateTitle(item, this.props);
| },
| validRoles(item) {
| item.meta = item.meta || {};
| return item.meta.roles ? item.meta.roles.includes(this.roles) : true;
| },
| open(item) {
| this.$router.push({
| path: item[this.pathKey],
| query: item[this.queryKey],
| });
| },
| },
| };
| </script>
|
|