初始化
This commit is contained in:
@ -4,11 +4,13 @@ import store from '@/store';
|
||||
import { getRouters } from '@/api/menu';
|
||||
import auth from '@/plugins/auth';
|
||||
import { RouteRecordRaw } from 'vue-router';
|
||||
|
||||
import Layout from '@/layout/index.vue';
|
||||
import ParentView from '@/components/ParentView/index.vue';
|
||||
import InnerLink from '@/layout/components/InnerLink/index.vue';
|
||||
import { ref } from 'vue';
|
||||
|
||||
import { createCustomNameComponent } from '@/utils/createCustomNameComponent';
|
||||
import { useUserStore } from './user';
|
||||
|
||||
// 匹配views里面所有的.vue文件
|
||||
const modules = import.meta.glob('./../../views/**/*.vue');
|
||||
@ -22,9 +24,6 @@ export const usePermissionStore = defineStore('permission', () => {
|
||||
const getRoutes = (): RouteRecordRaw[] => {
|
||||
return routes.value as RouteRecordRaw[];
|
||||
};
|
||||
const getDefaultRoutes = (): RouteRecordRaw[] => {
|
||||
return defaultRoutes.value as RouteRecordRaw[];
|
||||
};
|
||||
const getSidebarRoutes = (): RouteRecordRaw[] => {
|
||||
return sidebarRouters.value as RouteRecordRaw[];
|
||||
};
|
||||
@ -46,7 +45,7 @@ export const usePermissionStore = defineStore('permission', () => {
|
||||
sidebarRouters.value = routes;
|
||||
};
|
||||
const generateRoutes = async (): Promise<RouteRecordRaw[]> => {
|
||||
const res = await getRouters();
|
||||
const res = await getRouters(useUserStore().selectedProject?.id || '0');
|
||||
const { data } = res;
|
||||
const sdata = JSON.parse(JSON.stringify(data));
|
||||
const rdata = JSON.parse(JSON.stringify(data));
|
||||
@ -100,12 +99,27 @@ export const usePermissionStore = defineStore('permission', () => {
|
||||
const filterChildren = (childrenMap: RouteRecordRaw[], lastRouter?: RouteRecordRaw): RouteRecordRaw[] => {
|
||||
let children: RouteRecordRaw[] = [];
|
||||
childrenMap.forEach((el) => {
|
||||
el.path = lastRouter ? lastRouter.path + '/' + el.path : el.path;
|
||||
if (el.children && el.children.length && el.component?.toString() === 'ParentView') {
|
||||
children = children.concat(filterChildren(el.children, el));
|
||||
} else {
|
||||
children.push(el);
|
||||
if (el.children && el.children.length) {
|
||||
if (el.component?.toString() === 'ParentView' && !lastRouter) {
|
||||
el.children.forEach((c) => {
|
||||
c.path = el.path + '/' + c.path;
|
||||
if (c.children && c.children.length) {
|
||||
children = children.concat(filterChildren(c.children, c));
|
||||
return;
|
||||
}
|
||||
children.push(c);
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (lastRouter) {
|
||||
el.path = lastRouter.path + '/' + el.path;
|
||||
if (el.children && el.children.length) {
|
||||
children = children.concat(filterChildren(el.children, el));
|
||||
return;
|
||||
}
|
||||
}
|
||||
children = children.concat(el);
|
||||
});
|
||||
return children;
|
||||
};
|
||||
@ -116,7 +130,6 @@ export const usePermissionStore = defineStore('permission', () => {
|
||||
defaultRoutes,
|
||||
|
||||
getRoutes,
|
||||
getDefaultRoutes,
|
||||
getSidebarRoutes,
|
||||
getTopbarRoutes,
|
||||
|
||||
@ -205,3 +218,5 @@ function duplicateRouteChecker(localRoutes: Route[], routes: Route[]) {
|
||||
nameList.push(route.name.toString());
|
||||
});
|
||||
}
|
||||
|
||||
export default usePermissionStore;
|
||||
|
||||
@ -1,10 +1,22 @@
|
||||
import { to } from 'await-to-js';
|
||||
import { getToken, removeToken, setToken } from '@/utils/auth';
|
||||
import { login as loginApi, logout as logoutApi, getInfo as getUserInfo } from '@/api/login';
|
||||
import { LoginData } from '@/api/types';
|
||||
import { login as loginApi, logout as logoutApi, getInfo as getUserInfo, getUserProject } from '@/api/login';
|
||||
import { LoginData, UserProject } from '@/api/types';
|
||||
import defAva from '@/assets/images/profile.jpg';
|
||||
import store from '@/store';
|
||||
import { defineStore } from 'pinia';
|
||||
import { ref } from 'vue';
|
||||
import $cache from '@/plugins/cache';
|
||||
// 添加两个函数用于操作localStorage
|
||||
const saveSelectedProjectToStorage = (project) => {
|
||||
// localStorage.setItem('selectedProject', JSON.stringify(project));
|
||||
$cache.local.setJSON('selectedProject', project);
|
||||
};
|
||||
|
||||
const getSelectedProjectFromStorage = () => {
|
||||
// localStorage.getItem('selectedProject');
|
||||
const stored = $cache.local.getJSON('selectedProject');
|
||||
return stored ? stored : null;
|
||||
};
|
||||
|
||||
export const useUserStore = defineStore('user', () => {
|
||||
const token = ref(getToken());
|
||||
@ -12,9 +24,16 @@ export const useUserStore = defineStore('user', () => {
|
||||
const nickname = ref('');
|
||||
const userId = ref<string | number>('');
|
||||
const tenantId = ref<string>('');
|
||||
const deptId = ref<string | number>('');
|
||||
const avatar = ref('');
|
||||
const roles = ref<Array<string>>([]); // 用户角色编码集合 → 判断路由权限
|
||||
const permissions = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限
|
||||
const permissions = ref<Array<any>>([]); // 用户权限编码集合 → 判断按钮权限
|
||||
const permissionList = ref<Array<any>>([]); // 用户所有权限列表
|
||||
const roleList = ref<Array<any>>([]); // 用户所有角色列表
|
||||
|
||||
const projects = ref<Array<{ id: string; name: string }>>([]);
|
||||
// 从localStorage获取缓存的项目,如果没有则默认为null
|
||||
const selectedProject = ref<{ id: string; name: string } | null>(getSelectedProjectFromStorage());
|
||||
|
||||
/**
|
||||
* 登录
|
||||
@ -34,16 +53,37 @@ export const useUserStore = defineStore('user', () => {
|
||||
|
||||
// 获取用户信息
|
||||
const getInfo = async (): Promise<void> => {
|
||||
// **新增项目数据获取**
|
||||
const [projectErr, projectRes] = await to(getUserProject());
|
||||
if (projectRes?.data) {
|
||||
const projectList = projectRes.data.map((p) => ({
|
||||
id: p.projectId,
|
||||
name: p.projectName || '未知项目'
|
||||
}));
|
||||
|
||||
setProjects(projectList);
|
||||
|
||||
// 如果有缓存的选中项目,且该项目在当前项目列表中存在,则使用缓存的项目
|
||||
const storedProject = getSelectedProjectFromStorage();
|
||||
if (storedProject && projectList.some((p) => p.id === storedProject.id)) {
|
||||
setSelectedProject(storedProject);
|
||||
} else if (projectList.length > 0) {
|
||||
// 否则默认选择第一个项目
|
||||
setSelectedProject(projectList[0]);
|
||||
}
|
||||
}
|
||||
const [err, res] = await to(getUserInfo());
|
||||
console.log(111111111111);
|
||||
|
||||
if (res) {
|
||||
const data = res.data;
|
||||
const user = data.user;
|
||||
const profile = user.avatar == '' || user.avatar == null ? defAva : user.avatar;
|
||||
|
||||
if (data.roles && data.roles.length > 0) {
|
||||
// 验证返回的roles是否是一个非空数组
|
||||
roles.value = data.roles;
|
||||
permissions.value = data.permissions;
|
||||
setRoles();
|
||||
permissionList.value = data.permissions;
|
||||
roleList.value = data.roles;
|
||||
} else {
|
||||
roles.value = ['ROLE_DEFAULT'];
|
||||
}
|
||||
@ -52,11 +92,44 @@ export const useUserStore = defineStore('user', () => {
|
||||
avatar.value = profile;
|
||||
userId.value = user.userId;
|
||||
tenantId.value = user.tenantId;
|
||||
deptId.value = user.deptId;
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
return Promise.reject(err);
|
||||
};
|
||||
|
||||
const setInfo = async () => {
|
||||
const [err, res] = await to(getUserInfo());
|
||||
|
||||
if (res) {
|
||||
const data = res.data;
|
||||
const user = data.user;
|
||||
const profile = user.avatar == '' || user.avatar == null ? defAva : user.avatar;
|
||||
|
||||
if (data.roles && data.roles.length > 0) {
|
||||
setRoles();
|
||||
permissionList.value = data.permissions;
|
||||
roleList.value = data.roles;
|
||||
} else {
|
||||
roles.value = ['ROLE_DEFAULT'];
|
||||
}
|
||||
name.value = user.userName;
|
||||
nickname.value = user.nickName;
|
||||
avatar.value = profile;
|
||||
userId.value = user.userId;
|
||||
tenantId.value = user.tenantId;
|
||||
deptId.value = user.deptId;
|
||||
}
|
||||
};
|
||||
|
||||
const setRoles = () => {
|
||||
const projectRole = roleList.value.find((item) => item.projectId == selectedProject.value?.id)?.projectRoles || [];
|
||||
roles.value = projectRole;
|
||||
const projectPermissions = permissionList.value.find((item) => item.projectId == selectedProject.value?.id)?.projectPermissions || [];
|
||||
permissions.value = projectPermissions;
|
||||
};
|
||||
|
||||
// 注销
|
||||
const logout = async (): Promise<void> => {
|
||||
await logoutApi();
|
||||
@ -64,15 +137,28 @@ export const useUserStore = defineStore('user', () => {
|
||||
roles.value = [];
|
||||
permissions.value = [];
|
||||
removeToken();
|
||||
// 清除项目缓存
|
||||
$cache.local.remove('selectedProject');
|
||||
$cache.local.remove('ProjectTeamList');
|
||||
};
|
||||
|
||||
const setAvatar = (value: string) => {
|
||||
avatar.value = value;
|
||||
};
|
||||
|
||||
const setProjects = (projectList: Array<{ id: string; name: string }>) => {
|
||||
projects.value = projectList;
|
||||
};
|
||||
|
||||
const setSelectedProject = (project: { id: string; name: string }) => {
|
||||
selectedProject.value = project;
|
||||
saveSelectedProjectToStorage(project);
|
||||
};
|
||||
|
||||
return {
|
||||
userId,
|
||||
tenantId,
|
||||
deptId,
|
||||
token,
|
||||
nickname,
|
||||
avatar,
|
||||
@ -81,6 +167,19 @@ export const useUserStore = defineStore('user', () => {
|
||||
login,
|
||||
getInfo,
|
||||
logout,
|
||||
setAvatar
|
||||
setAvatar,
|
||||
setProjects,
|
||||
setSelectedProject,
|
||||
projects,
|
||||
selectedProject,
|
||||
setInfo,
|
||||
setRoles
|
||||
};
|
||||
});
|
||||
|
||||
export default useUserStore;
|
||||
|
||||
// 非 setup 方式
|
||||
export function useUserStoreHook() {
|
||||
return useUserStore(store);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user