Files
laravel_swoole/resources/admin/src/stores/modules/user.js
T

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