auth.ts 2.6 KB

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