/** * 权限校验组合式函数 * 提供登录检查、权限验证等功能 */ import { useUserStore } from '~/stores/user' import { useAppStore } from '~/stores/app' /** * 权限校验hook * 用于页面/组件中的权限校验 */ export const useAuth = () => { const userStore = useUserStore() const appStore = useAppStore() /** * 检查是否已登录 * @returns boolean 是否已登录 */ const isAuthenticated = (): boolean => { return userStore.isLogin } /** * 检查是否未登录 * @returns boolean 是否未登录 */ const isGuest = (): boolean => { return !userStore.isLogin } /** * 检查是否拥有指定角色 * @param roles 角色数组 * @returns boolean 是否有权限 */ const hasRole = (roles: string | string[]): boolean => { if (!userStore.isLogin) return false const userRole = userStore.userRole const roleList = Array.isArray(roles) ? roles : [roles] return roleList.includes(userRole) } /** * 检查是否为管理员 * @returns boolean 是否为管理员 */ const isAdmin = (): boolean => { return hasRole('admin') } /** * 获取当前用户ID * @returns number 用户ID */ const getUserId = (): number => { return userStore.userId } /** * 获取当前用户信息 * @returns IUserInfo | null 用户信息 */ const getUserInfo = () => { return userStore.userInfo } /** * 获取当前用户昵称 * @returns string 用户昵称 */ const getNickname = (): string => { return userStore.userNickname } /** * 跳转到登录页(如果未登录) * @param redirectUrl 登录后重定向的URL */ const requireAuth = (redirectUrl?: string) => { if (!userStore.isLogin) { if (typeof window !== 'undefined') { const url = redirectUrl || window.location.href window.location.href = `/login?redirect=${encodeURIComponent(url)}` } return false } return true } /** * 跳转到登录页(如果已登录) * @param redirectUrl 登录后重定向的URL */ const requireGuest = (redirectUrl: string = '/') => { if (userStore.isLogin) { if (typeof window !== 'undefined') { window.location.href = redirectUrl } return false } return true } /** * 检查功能权限(基于角色) * @param permission 权限标识 * @returns boolean 是否有权限 */ const hasPermission = (permission: string): boolean => { // 简化实现,实际项目中可以结合后端返回的权限列表 if (!userStore.isLogin) return false // 管理员拥有所有权限 if (userStore.userRole === 'admin') return true // TODO: 可以从用户信息中获取权限列表进行匹配 return false } /** * 登出 * @param redirectUrl 退出后重定向的URL */ const logout = async (redirectUrl: string = '/login') => { try { // 调用退出登录API(如果需要) // const userService = new UserSERVICE() // await userService.logout() } finally { // 清除用户状态 userStore.clearUserInfo() // 跳转到登录页 if (typeof window !== 'undefined') { window.location.href = redirectUrl } } } return { // 状态 isLogin: computed(() => userStore.isLogin), userInfo: computed(() => userStore.userInfo), userId: computed(() => userStore.userId), nickname: computed(() => userStore.userNickname), userRole: computed(() => userStore.userRole), // 方法 isAuthenticated, isGuest, hasRole, isAdmin, getUserId, getUserInfo, getNickname, requireAuth, requireGuest, hasPermission, logout } }