import Taro from '@tarojs/taro' import { authClient } from '../api' import { InferResponseType } from 'hono' // 用户类型定义 export type User = InferResponseType // 认证状态管理 class AuthManager { private static instance: AuthManager static getInstance(): AuthManager { if (!AuthManager.instance) { AuthManager.instance = new AuthManager() } return AuthManager.instance } // 获取token getToken(): string | null { return Taro.getStorageSync('token') } // 设置token setToken(token: string): void { Taro.setStorageSync('token', token) } // 清除token removeToken(): void { Taro.removeStorageSync('token') } // 获取用户信息 getUserInfo(): User | null { const userInfo = Taro.getStorageSync('userInfo') return userInfo ? JSON.parse(userInfo) : null } // 设置用户信息 setUserInfo(user: User): void { Taro.setStorageSync('userInfo', JSON.stringify(user)) } // 清除用户信息 removeUserInfo(): void { Taro.removeStorageSync('userInfo') } // 检查是否已登录 isLoggedIn(): boolean { return !!this.getToken() } // 登录 async login(username: string, password: string): Promise { try { const response = await authClient.login.$post({ json: { username, password } }) if (response.status !== 200) { throw new Error('登录失败') } const { token, user } = await response.json() this.setToken(token) this.setUserInfo(user) return user } catch (error) { throw new Error('登录失败,请检查用户名和密码') } } // 注册 async register(data: { username: string password: string email?: string }): Promise { try { const response = await authClient.register.$post({ json: data }) if (response.status !== 201) { throw new Error('注册失败') } const { token, user } = await response.json() this.setToken(token) this.setUserInfo(user) return user } catch (error) { throw new Error('注册失败,请重试') } } // 登出 async logout(): Promise { try { const response = await authClient.logout.$post({}) if (response.status !== 200) { throw new Error('登出失败') } } catch (error) { console.error('Logout error:', error) } finally { this.removeToken() this.removeUserInfo() Taro.redirectTo({ url: '/pages/login/index' }) } } // 获取当前用户信息 async getCurrentUser(): Promise { if (!this.isLoggedIn()) { return null } try { const response = await authClient.me.$get({}) if (response.status !== 200) { throw new Error('获取用户信息失败') } const user = await response.json() this.setUserInfo(user) return user } catch (error) { this.removeToken() this.removeUserInfo() return null } } } // 导出单例实例 export const authManager = AuthManager.getInstance()