Files
sh-app/store/modules/menu.js
T
2026-06-18 15:10:50 +08:00

126 lines
3.0 KiB
JavaScript

import {
defineStore
} from 'pinia'
import {
ref,
computed,
watch
} from 'vue'
import {pastelColors,defaultApps} from '@/utils/constant.js'
import {reqMenuPowerList} from '@/api/auth.js'
export const useMenuStore = defineStore('menu', () => {
// 持久化:仅缓存快捷应用的 menuId 列表,不缓存全部菜单
const quickAppIds = ref([])
// 根据默认配置 + 持久化状态重建应用列表
const buildAppsList = () => {
return defaultApps.map(app => ({
...app,
selected: quickAppIds.value.includes(app.path)
}))
}
// 应用列表(从默认配置构建 + 持久化 selected 状态)
const appsList = ref(buildAppsList())
// 持久化恢复后,appsList 需重新根据 quickAppIds 构建
watch(quickAppIds, (ids) => {
if (ids && ids.length > 0) {
appsList.value = buildAppsList()
}
}, { deep: true })
// 编辑时的临时缓存
const editCache = ref([])
// 菜单的权限列表(后端返回的有权限的菜单 code 数组)
const menuProwerList = ref([])
// 快捷应用列表(已选择的)
const quickApps = computed(() => appsList.value.filter(app => app.selected && hasMenuPermission(app.menuId)))
// 业务查询列表(未选择的)
const queryApps = computed(() => appsList.value.filter(app => !app.selected && hasMenuPermission(app.menuId)))
/**
* 打开编辑弹窗(备份当前状态)
*/
const openEdit = () => {
editCache.value = appsList.value.filter(app => hasMenuPermission(app.menuId))
}
/**
* 切换应用选择状态
*/
const toggleSelect = (item) => {
item.selected = !item.selected
}
/**
* 确认编辑(保存更改)
*/
const confirmEdit = () => {
appsList.value = editCache.value.map(app => ({ ...app }))
// 只持久化快捷应用的 menuId 列表
quickAppIds.value = appsList.value
.filter(app => app.selected)
.map(app => app.path)
}
/**
* 请求菜单权限列表
*/
const fetchMenuPowerList = async (userId, projectId) => {
if (!userId || !projectId) return
try {
const res = await reqMenuPowerList(userId, projectId)
menuProwerList.value = res.data || []
} catch (err) {
console.error('获取菜单权限失败:', err)
menuProwerList.value = []
}
}
/**
* 判断菜单是否有权限打开
* @param {string} menuCode - 菜单编码/标识
* @returns {boolean} 是否有权限
*/
const hasMenuPermission = (menuCode) => {
if (!menuCode) return true
return menuProwerList.value.includes(menuCode)
}
/**
* 根据权限过滤快捷应用
*/
const quickAppsWithPermission = computed(() => {
if (menuProwerList.value.length === 0) return quickApps.value
return quickApps.value.filter(app => {
return hasMenuPermission(app.permissionCode)
})
})
return {
appsList,
quickAppIds,
editCache,
quickApps,
quickAppsWithPermission,
queryApps,
menuProwerList,
pastelColors,
openEdit,
toggleSelect,
confirmEdit,
fetchMenuPowerList,
hasMenuPermission
}
}, {
persist: {
enabled: true,
strategies: [{
key: 'menu',
paths: ['quickAppIds'],
}]
},
})