auth.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /**
  2. * 认证工具函数
  3. * 提供登录状态检查、token管理等功能
  4. */
  5. import { logger } from './logger';
  6. /**
  7. * 获取本地存储的token
  8. */
  9. export const getToken = (): string => {
  10. const token = uni.getStorageSync('accessToken');
  11. logger.log('[Auth] 获取token:', token ? '存在(长度:' + token.length + ')' : '不存在');
  12. return token || '';
  13. };
  14. /**
  15. * 保存token到本地存储
  16. */
  17. export const setToken = (token: string): void => {
  18. logger.log('[Auth] 保存token:', token ? '有效(长度:' + token.length + ')' : '无效');
  19. uni.setStorageSync('accessToken', token);
  20. // 验证保存是否成功
  21. const saved = uni.getStorageSync('accessToken');
  22. logger.log('[Auth] 保存后验证:', saved === token ? '成功' : '失败');
  23. };
  24. /**
  25. * 清除本地存储的token
  26. */
  27. export const removeToken = (): void => {
  28. uni.removeStorageSync('accessToken');
  29. };
  30. /**
  31. * 检查是否已登录
  32. */
  33. export const isLoggedIn = (): boolean => {
  34. return !!getToken();
  35. };
  36. /**
  37. * 获取用户信息
  38. */
  39. export const getUserInfo = (): any => {
  40. return uni.getStorageSync('haha-user-info') || null;
  41. };
  42. /**
  43. * 保存用户信息
  44. */
  45. export const setUserInfo = (userInfo: any): void => {
  46. uni.setStorageSync('haha-user-info', userInfo);
  47. };
  48. /**
  49. * 清除用户信息
  50. */
  51. export const removeUserInfo = (): void => {
  52. uni.removeStorageSync('haha-user-info');
  53. };
  54. /**
  55. * 清除所有登录信息及会话数据
  56. */
  57. export const clearAuth = (): void => {
  58. removeToken();
  59. removeUserInfo();
  60. // 清除购物流程相关数据
  61. uni.removeStorageSync('currentDeviceId');
  62. uni.removeStorageSync('currentOutTradeNo');
  63. uni.removeStorageSync('currentOrderNo');
  64. uni.removeStorageSync('shoppingPollingActive');
  65. };
  66. /**
  67. * 路由守卫:检查登录状态
  68. * 如果未登录,则跳转到登录页
  69. * @param redirectUrl 登录后要跳转的页面(可选)
  70. * @returns 是否已登录
  71. */
  72. export const checkAuth = (redirectUrl?: string): boolean => {
  73. if (!isLoggedIn()) {
  74. // 构建登录页URL,带上redirect参数
  75. let loginUrl = '/pages/login/login';
  76. if (redirectUrl) {
  77. loginUrl += `?redirect=${encodeURIComponent(redirectUrl)}`;
  78. }
  79. uni.reLaunch({
  80. url: loginUrl
  81. });
  82. return false;
  83. }
  84. return true;
  85. };
  86. /**
  87. * 全局401未授权处理
  88. * 清除所有登录信息并跳转到登录页
  89. * 任何接口遇到401时都应调用此函数
  90. */
  91. export const handleUnauthorized = (): void => {
  92. logger.log('[Auth] token无效或已过期,清除登录信息并跳转登录页');
  93. clearAuth();
  94. uni.reLaunch({
  95. url: '/pages/login/login'
  96. });
  97. };
  98. /**
  99. * 退出登录
  100. */
  101. export const logout = (): void => {
  102. clearAuth();
  103. uni.reLaunch({
  104. url: '/pages/login/login'
  105. });
  106. };