| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- import Taro from '@tarojs/taro'
- import { authClient } from '../api'
- import { InferResponseType } from 'hono'
- // 用户类型定义
- export type User = InferResponseType<typeof authClient.me.$get, 200>
- // 认证状态管理
- 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<User> {
- 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<User> {
- 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<void> {
- 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<User | null> {
- 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()
|