auth.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import Taro from '@tarojs/taro'
  2. import { authClient } from '../api'
  3. import { InferResponseType } from 'hono'
  4. // 用户类型定义
  5. export type User = InferResponseType<typeof authClient.me.$get, 200>
  6. // 认证状态管理
  7. class AuthManager {
  8. private static instance: AuthManager
  9. static getInstance(): AuthManager {
  10. if (!AuthManager.instance) {
  11. AuthManager.instance = new AuthManager()
  12. }
  13. return AuthManager.instance
  14. }
  15. // 获取token
  16. getToken(): string | null {
  17. return Taro.getStorageSync('token')
  18. }
  19. // 设置token
  20. setToken(token: string): void {
  21. Taro.setStorageSync('token', token)
  22. }
  23. // 清除token
  24. removeToken(): void {
  25. Taro.removeStorageSync('token')
  26. }
  27. // 获取用户信息
  28. getUserInfo(): User | null {
  29. const userInfo = Taro.getStorageSync('userInfo')
  30. return userInfo ? JSON.parse(userInfo) : null
  31. }
  32. // 设置用户信息
  33. setUserInfo(user: User): void {
  34. Taro.setStorageSync('userInfo', JSON.stringify(user))
  35. }
  36. // 清除用户信息
  37. removeUserInfo(): void {
  38. Taro.removeStorageSync('userInfo')
  39. }
  40. // 检查是否已登录
  41. isLoggedIn(): boolean {
  42. return !!this.getToken()
  43. }
  44. // 登录
  45. async login(username: string, password: string): Promise<User> {
  46. try {
  47. const response = await authClient.login.$post({
  48. json: { username, password }
  49. })
  50. if (response.status !== 200) {
  51. throw new Error('登录失败')
  52. }
  53. const { token, user } = await response.json()
  54. this.setToken(token)
  55. this.setUserInfo(user)
  56. return user
  57. } catch (error) {
  58. throw new Error('登录失败,请检查用户名和密码')
  59. }
  60. }
  61. // 注册
  62. async register(data: {
  63. username: string
  64. password: string
  65. email?: string
  66. }): Promise<User> {
  67. try {
  68. const response = await authClient.register.$post({
  69. json: data
  70. })
  71. if (response.status !== 201) {
  72. throw new Error('注册失败')
  73. }
  74. const { token, user } = await response.json()
  75. this.setToken(token)
  76. this.setUserInfo(user)
  77. return user
  78. } catch (error) {
  79. throw new Error('注册失败,请重试')
  80. }
  81. }
  82. // 登出
  83. async logout(): Promise<void> {
  84. try {
  85. const response = await authClient.logout.$post({})
  86. if (response.status !== 200) {
  87. throw new Error('登出失败')
  88. }
  89. } catch (error) {
  90. console.error('Logout error:', error)
  91. } finally {
  92. this.removeToken()
  93. this.removeUserInfo()
  94. Taro.redirectTo({ url: '/pages/login/index' })
  95. }
  96. }
  97. // 获取当前用户信息
  98. async getCurrentUser(): Promise<User | null> {
  99. if (!this.isLoggedIn()) {
  100. return null
  101. }
  102. try {
  103. const response = await authClient.me.$get({})
  104. if (response.status !== 200) {
  105. throw new Error('获取用户信息失败')
  106. }
  107. const user = await response.json()
  108. this.setUserInfo(user)
  109. return user
  110. } catch (error) {
  111. this.removeToken()
  112. this.removeUserInfo()
  113. return null
  114. }
  115. }
  116. }
  117. // 导出单例实例
  118. export const authManager = AuthManager.getInstance()