mirror of
https://github.com/fugary/simple-element-plus-template.git
synced 2025-11-12 14:27:49 +00:00
菜单加载数据
This commit is contained in:
@@ -49,7 +49,6 @@ const inputType = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const modelAttrs = computed(() => {
|
const modelAttrs = computed(() => {
|
||||||
console.info(inputType.value)
|
|
||||||
if (['input', 'select', 'autocomplete', 'cascader'].includes(props.option.type || 'input')) {
|
if (['input', 'select', 'autocomplete', 'cascader'].includes(props.option.type || 'input')) {
|
||||||
return Object.assign({ clearable: true }, props.option.attrs || {})
|
return Object.assign({ clearable: true }, props.option.attrs || {})
|
||||||
}
|
}
|
||||||
@@ -68,14 +67,12 @@ const formModel = computed(() => props.option.model || props.model)
|
|||||||
|
|
||||||
const modelValue = computed({
|
const modelValue = computed({
|
||||||
get () {
|
get () {
|
||||||
console.info('=================', formModel.value)
|
|
||||||
if (formModel.value && props.option.prop) {
|
if (formModel.value && props.option.prop) {
|
||||||
return formModel.value[props.option.prop]
|
return formModel.value[props.option.prop]
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
},
|
},
|
||||||
set (val) {
|
set (val) {
|
||||||
console.info('set===============', formModel.value)
|
|
||||||
if (formModel.value && props.option.prop) {
|
if (formModel.value && props.option.prop) {
|
||||||
formModel.value[props.option.prop] = val
|
formModel.value[props.option.prop] = val
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
||||||
import { useBusinessMenus } from '@/services/global/GlobalService'
|
import { useMenuStore } from '@/stores/MenuStore'
|
||||||
const globalConfigStore = useGlobalConfigStore()
|
const globalConfigStore = useGlobalConfigStore()
|
||||||
const businessMenus = useBusinessMenus()
|
const menuStore = useMenuStore()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -10,7 +10,7 @@ const businessMenus = useBusinessMenus()
|
|||||||
<common-menu
|
<common-menu
|
||||||
class="el-menu-left"
|
class="el-menu-left"
|
||||||
:collapse="globalConfigStore.isCollapseLeft"
|
:collapse="globalConfigStore.isCollapseLeft"
|
||||||
:menus="businessMenus"
|
:menus="menuStore.businessMenus"
|
||||||
:default-openeds="['1']"
|
:default-openeds="['1']"
|
||||||
/>
|
/>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { useBaseTopMenus, useBusinessMenus } from '@/services/global/GlobalService'
|
|
||||||
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
||||||
|
import { useMenuStore } from '@/stores/MenuStore'
|
||||||
import { GlobalLayoutMode } from '@/consts/GlobalConstants'
|
import { GlobalLayoutMode } from '@/consts/GlobalConstants'
|
||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
const globalConfigStore = useGlobalConfigStore()
|
const globalConfigStore = useGlobalConfigStore()
|
||||||
const topMenus = useBaseTopMenus()
|
const menuStore = useMenuStore()
|
||||||
const businessMenus = useBusinessMenus()
|
|
||||||
|
|
||||||
const allMenus = computed(() => {
|
const allMenus = computed(() => {
|
||||||
|
const topMenus = menuStore.baseTopMenus
|
||||||
|
const businessMenus = menuStore.businessMenus
|
||||||
if (globalConfigStore.layoutMode === GlobalLayoutMode.TOP) {
|
if (globalConfigStore.layoutMode === GlobalLayoutMode.TOP) {
|
||||||
return [...businessMenus.value, ...topMenus.value.slice(1)]
|
return [...businessMenus, ...topMenus.slice(1)]
|
||||||
}
|
}
|
||||||
return topMenus.value
|
return topMenus
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import { GlobalLocales } from '@/consts/GlobalConstants'
|
import { GlobalLocales } from '@/consts/GlobalConstants'
|
||||||
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
||||||
import { ref } from 'vue'
|
import { loadBusinessMenus } from '@/services/mock/MockGlobalService'
|
||||||
import { $i18nBundle } from '@/messages'
|
|
||||||
|
|
||||||
export const useBaseTopMenus = () => {
|
export const useBaseTopMenus = () => {
|
||||||
const globalConfigStore = useGlobalConfigStore()
|
const globalConfigStore = useGlobalConfigStore()
|
||||||
return ref([
|
return [
|
||||||
{
|
{
|
||||||
iconIf: () => globalConfigStore.isCollapseLeft ? 'expand' : 'fold',
|
iconIf: () => globalConfigStore.isCollapseLeft ? 'expand' : 'fold',
|
||||||
click: globalConfigStore.collapseLeft
|
click: globalConfigStore.collapseLeft
|
||||||
@@ -58,71 +57,9 @@ export const useBaseTopMenus = () => {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
])
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useBusinessMenus = () => {
|
export const useBusinessMenus = () => {
|
||||||
return ref([
|
return loadBusinessMenus()
|
||||||
{
|
|
||||||
icon: 'HomeFilled',
|
|
||||||
index: '/',
|
|
||||||
labelIf: () => $i18nBundle('common.label.title')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: 'setting',
|
|
||||||
labelKey: 'menu.label.systemManagement',
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
index: '/admin/users',
|
|
||||||
icon: 'user',
|
|
||||||
labelKey: 'menu.label.userManagement'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '/admin/roles',
|
|
||||||
icon: 'GroupFilled',
|
|
||||||
labelKey: 'menu.label.roleManagement'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '/admin/authority',
|
|
||||||
icon: 'lock',
|
|
||||||
labelKey: 'menu.label.authorityManagement'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '/admin/menus',
|
|
||||||
icon: 'menu',
|
|
||||||
labelKey: 'menu.label.menuManagement'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: 'BuildFilled',
|
|
||||||
labelKey: 'menu.label.toolsManagement',
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
index: '/not-found',
|
|
||||||
icon: 'WarningFilled',
|
|
||||||
labelKey: 'menu.label.errorPage404'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '/icons',
|
|
||||||
icon: 'InsertEmoticonOutlined',
|
|
||||||
labelKey: 'menu.label.toolsIcons'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '/forms',
|
|
||||||
icon: 'TableRowsFilled',
|
|
||||||
labelKey: 'menu.label.toolsForms'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '/tables',
|
|
||||||
icon: 'Grid',
|
|
||||||
labelKey: 'menu.label.toolsTables'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '/tests',
|
|
||||||
icon: 'TipsAndUpdatesOutlined',
|
|
||||||
labelKey: 'menu.label.toolsTests'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}])
|
|
||||||
}
|
}
|
||||||
|
|||||||
76
src/services/mock/MockGlobalService.js
Normal file
76
src/services/mock/MockGlobalService.js
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
import { $i18nBundle } from '@/messages'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试假数据
|
||||||
|
* @returns {Promise<unknown>}
|
||||||
|
*/
|
||||||
|
export const loadBusinessMenus = () => {
|
||||||
|
// 模拟加载业务数据
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
resolve([
|
||||||
|
{
|
||||||
|
icon: 'HomeFilled',
|
||||||
|
index: '/',
|
||||||
|
labelIf: () => $i18nBundle('common.label.title')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: 'setting',
|
||||||
|
labelKey: 'menu.label.systemManagement',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
index: '/admin/users',
|
||||||
|
icon: 'user',
|
||||||
|
labelKey: 'menu.label.userManagement'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index: '/admin/roles',
|
||||||
|
icon: 'GroupFilled',
|
||||||
|
labelKey: 'menu.label.roleManagement'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index: '/admin/authority',
|
||||||
|
icon: 'lock',
|
||||||
|
labelKey: 'menu.label.authorityManagement'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index: '/admin/menus',
|
||||||
|
icon: 'menu',
|
||||||
|
labelKey: 'menu.label.menuManagement'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: 'BuildFilled',
|
||||||
|
labelKey: 'menu.label.toolsManagement',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
index: '/not-found',
|
||||||
|
icon: 'WarningFilled',
|
||||||
|
labelKey: 'menu.label.errorPage404'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index: '/icons',
|
||||||
|
icon: 'InsertEmoticonOutlined',
|
||||||
|
labelKey: 'menu.label.toolsIcons'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index: '/forms',
|
||||||
|
icon: 'TableRowsFilled',
|
||||||
|
labelKey: 'menu.label.toolsForms'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index: '/tables',
|
||||||
|
icon: 'Grid',
|
||||||
|
labelKey: 'menu.label.toolsTables'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index: '/tests',
|
||||||
|
icon: 'TipsAndUpdatesOutlined',
|
||||||
|
labelKey: 'menu.label.toolsTests'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
28
src/stores/MenuStore.js
Normal file
28
src/stores/MenuStore.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { useBaseTopMenus, useBusinessMenus } from '@/services/global/GlobalService'
|
||||||
|
|
||||||
|
export const useMenuStore = defineStore('menu', () => {
|
||||||
|
/**
|
||||||
|
* @type {[CommonMenuItem]}
|
||||||
|
*/
|
||||||
|
const baseTopMenus = ref([])
|
||||||
|
/**
|
||||||
|
* @type {[CommonMenuItem]}
|
||||||
|
*/
|
||||||
|
const businessMenus = ref([])
|
||||||
|
return {
|
||||||
|
baseTopMenus,
|
||||||
|
businessMenus,
|
||||||
|
loadBaseTopMenus () {
|
||||||
|
baseTopMenus.value = useBaseTopMenus()
|
||||||
|
console.info('顶部数据', businessMenus.value)
|
||||||
|
},
|
||||||
|
async loadBusinessMenus () {
|
||||||
|
businessMenus.value = await useBusinessMenus()
|
||||||
|
console.info('菜单数据', businessMenus.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
persist: true
|
||||||
|
})
|
||||||
@@ -3,14 +3,18 @@ import LeftMenu from '@/layout/LeftMenu.vue'
|
|||||||
import TopNav from '@/layout/TopNav.vue'
|
import TopNav from '@/layout/TopNav.vue'
|
||||||
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
|
||||||
import { useTabsViewStore } from '@/stores/TabsViewStore'
|
import { useTabsViewStore } from '@/stores/TabsViewStore'
|
||||||
|
import { useMenuStore } from '@/stores/MenuStore'
|
||||||
import { GlobalLayoutMode } from '@/consts/GlobalConstants'
|
import { GlobalLayoutMode } from '@/consts/GlobalConstants'
|
||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
import GlobalSettings from '@/views/components/global/GlobalSettings.vue'
|
import GlobalSettings from '@/views/components/global/GlobalSettings.vue'
|
||||||
const globalConfigStore = useGlobalConfigStore()
|
const globalConfigStore = useGlobalConfigStore()
|
||||||
|
const menuStore = useMenuStore()
|
||||||
const tabsViewStore = useTabsViewStore()
|
const tabsViewStore = useTabsViewStore()
|
||||||
const showLeftMenu = computed(() => {
|
const showLeftMenu = computed(() => {
|
||||||
return globalConfigStore.layoutMode === GlobalLayoutMode.LEFT
|
return globalConfigStore.layoutMode === GlobalLayoutMode.LEFT
|
||||||
})
|
})
|
||||||
|
menuStore.loadBaseTopMenus()
|
||||||
|
menuStore.loadBusinessMenus()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
Reference in New Issue
Block a user