import { ref } from "vue"; import { defineStore } from "pinia"; import { resetRouter } from "../../router"; import { customStorage } from "../persist"; import userRoutes from "@/config/routes"; export const useUserStore = defineStore( "user", () => { const token = ref(""); const userInfo = ref(null); const menu = ref([]); const permissions = ref([]); // 设置 token function setToken(newToken) { token.value = newToken; } // 设置用户信息 function setUserInfo(info) { userInfo.value = info; } // 设置菜单 function setMenu(newMenu) { const staticMenus = userRoutes || []; // 合并静态菜单和后端菜单 // 如果后端菜单为空,只使用静态菜单 // 如果后端菜单不为空,合并两个菜单,后端菜单优先 let mergedMenus = [...staticMenus]; if (newMenu && newMenu.length > 0) { // 创建菜单映射,用于去重(以路径为唯一标识) const menuMap = new Map(); // 先添加静态菜单 staticMenus.forEach((menu) => { if (menu.path) { menuMap.set(menu.path, menu); } }); // 添加后端菜单,如果路径重复则覆盖 newMenu.forEach((menu) => { if (menu.path) { menuMap.set(menu.path, menu); } }); // 转换为数组 mergedMenus = Array.from(menuMap.values()); } menu.value = mergedMenus; } // 获取菜单 function getMenu() { return menu.value; } // 清除菜单 function clearMenu() { menu.value = []; } // 设置权限 function setPermissions(data) { permissions.value = data; } // 登出 function logout() { token.value = ""; userInfo.value = null; menu.value = []; // 重置路由 resetRouter(); } // 检查是否已登录 function isLoggedIn() { return !!token.value; } // 检查用户信息是否完整(用于 WebSocket 初始化) function isUserInfoComplete() { return !!(token.value && userInfo.value && userInfo.value.id); } return { token, userInfo, menu, setToken, setUserInfo, setMenu, getMenu, clearMenu, setPermissions, logout, isLoggedIn, isUserInfoComplete, }; }, { persist: { key: "user-store", storage: customStorage, pick: ["token", "userInfo", "menu"], }, }, );