116 lines
2.3 KiB
JavaScript
116 lines
2.3 KiB
JavaScript
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"],
|
|
},
|
|
},
|
|
);
|