2026-06-10 14:17:54 +08:00
|
|
|
import {
|
|
|
|
|
defineStore
|
|
|
|
|
} from 'pinia'
|
|
|
|
|
import {
|
|
|
|
|
ref,
|
2026-06-11 09:43:42 +08:00
|
|
|
computed,
|
|
|
|
|
watch
|
2026-06-10 14:17:54 +08:00
|
|
|
} from 'vue'
|
|
|
|
|
import {pastelColors,defaultApps} from '@/utils/constant.js'
|
|
|
|
|
import {reqMenuPowerList} from '@/api/auth.js'
|
|
|
|
|
|
|
|
|
|
export const useMenuStore = defineStore('menu', () => {
|
2026-06-11 09:43:42 +08:00
|
|
|
// 持久化:仅缓存快捷应用的 menuId 列表,不缓存全部菜单
|
|
|
|
|
const quickAppIds = ref([])
|
|
|
|
|
|
|
|
|
|
// 根据默认配置 + 持久化状态重建应用列表
|
|
|
|
|
const buildAppsList = () => {
|
|
|
|
|
return defaultApps.map(app => ({
|
|
|
|
|
...app,
|
2026-06-18 15:10:50 +08:00
|
|
|
selected: quickAppIds.value.includes(app.path)
|
2026-06-11 09:43:42 +08:00
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 应用列表(从默认配置构建 + 持久化 selected 状态)
|
|
|
|
|
const appsList = ref(buildAppsList())
|
|
|
|
|
// 持久化恢复后,appsList 需重新根据 quickAppIds 构建
|
|
|
|
|
watch(quickAppIds, (ids) => {
|
|
|
|
|
if (ids && ids.length > 0) {
|
|
|
|
|
appsList.value = buildAppsList()
|
|
|
|
|
}
|
|
|
|
|
}, { deep: true })
|
2026-06-10 14:17:54 +08:00
|
|
|
// 编辑时的临时缓存
|
|
|
|
|
const editCache = ref([])
|
|
|
|
|
// 菜单的权限列表(后端返回的有权限的菜单 code 数组)
|
|
|
|
|
const menuProwerList = ref([])
|
|
|
|
|
|
|
|
|
|
// 快捷应用列表(已选择的)
|
2026-06-11 09:43:42 +08:00
|
|
|
const quickApps = computed(() => appsList.value.filter(app => app.selected && hasMenuPermission(app.menuId)))
|
2026-06-10 14:17:54 +08:00
|
|
|
|
|
|
|
|
// 业务查询列表(未选择的)
|
2026-06-11 09:43:42 +08:00
|
|
|
const queryApps = computed(() => appsList.value.filter(app => !app.selected && hasMenuPermission(app.menuId)))
|
2026-06-10 14:17:54 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 打开编辑弹窗(备份当前状态)
|
|
|
|
|
*/
|
|
|
|
|
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 }))
|
2026-06-11 09:43:42 +08:00
|
|
|
// 只持久化快捷应用的 menuId 列表
|
|
|
|
|
quickAppIds.value = appsList.value
|
|
|
|
|
.filter(app => app.selected)
|
2026-06-18 15:10:50 +08:00
|
|
|
.map(app => app.path)
|
2026-06-10 14:17:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 请求菜单权限列表
|
|
|
|
|
*/
|
|
|
|
|
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,
|
2026-06-11 09:43:42 +08:00
|
|
|
quickAppIds,
|
2026-06-10 14:17:54 +08:00
|
|
|
editCache,
|
|
|
|
|
quickApps,
|
|
|
|
|
quickAppsWithPermission,
|
|
|
|
|
queryApps,
|
|
|
|
|
menuProwerList,
|
|
|
|
|
pastelColors,
|
|
|
|
|
openEdit,
|
|
|
|
|
toggleSelect,
|
|
|
|
|
confirmEdit,
|
|
|
|
|
fetchMenuPowerList,
|
|
|
|
|
hasMenuPermission
|
|
|
|
|
}
|
|
|
|
|
}, {
|
|
|
|
|
persist: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
strategies: [{
|
|
|
|
|
key: 'menu',
|
2026-06-11 09:43:42 +08:00
|
|
|
paths: ['quickAppIds'],
|
2026-06-10 14:17:54 +08:00
|
|
|
}]
|
|
|
|
|
},
|
|
|
|
|
})
|