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'], }] }, })