150 lines
3.4 KiB
JavaScript
150 lines
3.4 KiB
JavaScript
/**
|
|
* 统一认证工具模块
|
|
* 整合所有认证检查、登录状态管理等功能
|
|
*/
|
|
|
|
import { HTTP_CONFIG } from '../config/config.js'
|
|
|
|
// ==================== 认证状态检查 ====================
|
|
|
|
/**
|
|
* 检查用户是否已完成登录
|
|
* @returns {Boolean} 是否已完成登录
|
|
*/
|
|
export function isUserLoggedIn() {
|
|
const token = uni.getStorageSync(HTTP_CONFIG.storageKeys.token)
|
|
const loginStep = uni.getStorageSync('loginStep')
|
|
|
|
// 检查是否有有效的token和完成的登录流程
|
|
return !!(token && (loginStep === 'profile_completed' || loginStep === 'phone_authed'))
|
|
}
|
|
|
|
/**
|
|
* 检查并验证token有效性
|
|
* @returns {Promise<boolean>} token是否有效
|
|
*/
|
|
export async function validateToken() {
|
|
const token = uni.getStorageSync(HTTP_CONFIG.storageKeys.token)
|
|
if (!token) {
|
|
return false
|
|
}
|
|
|
|
try {
|
|
// 调用一个简单的API来验证token
|
|
const { getUserInfo } = await import('../api/profile.js')
|
|
await getUserInfo({
|
|
custom: {
|
|
loading: false,
|
|
toast: false
|
|
}
|
|
})
|
|
return true
|
|
} catch (error) {
|
|
console.log('Token验证失败:', error)
|
|
return false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 检查登录状态并处理
|
|
* @returns {boolean} 是否已登录
|
|
*/
|
|
export function checkLoginStatus() {
|
|
if (!isUserLoggedIn()) {
|
|
console.log('用户未登录,跳转到登录页')
|
|
navigateToLogin()
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// ==================== 认证数据管理 ====================
|
|
|
|
/**
|
|
* 清理认证数据
|
|
*/
|
|
export function clearAuthData() {
|
|
console.log('清理认证数据被调用')
|
|
uni.removeStorageSync(HTTP_CONFIG.storageKeys.token)
|
|
uni.removeStorageSync(HTTP_CONFIG.storageKeys.refreshToken)
|
|
uni.removeStorageSync(HTTP_CONFIG.storageKeys.userInfo)
|
|
uni.removeStorageSync('loginStep')
|
|
uni.removeStorageSync('wxLoginCode')
|
|
uni.removeStorageSync('wxUserInfo')
|
|
uni.removeStorageSync('loginDate')
|
|
}
|
|
|
|
/**
|
|
* 清理登录流程中的临时数据
|
|
*/
|
|
export function clearTempLoginData() {
|
|
// 清理临时数据,保留重要的用户信息
|
|
uni.removeStorageSync('wxLoginCode')
|
|
console.log('清理临时登录数据')
|
|
}
|
|
|
|
// ==================== 登录流程处理 ====================
|
|
|
|
/**
|
|
* 跳转到登录页面
|
|
*/
|
|
export function navigateToLogin() {
|
|
uni.reLaunch({
|
|
url: HTTP_CONFIG.loginPage
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 处理需要鉴权的情况
|
|
*/
|
|
export function handleAuthRequired() {
|
|
const loginStep = uni.getStorageSync('loginStep')
|
|
|
|
// 根据当前登录状态决定跳转页面
|
|
let targetPage = '/pages/login/login'
|
|
let toastMessage = '请先登录'
|
|
|
|
switch (loginStep) {
|
|
case 'wx_logged':
|
|
targetPage = '/pages/auth/phone-auth'
|
|
toastMessage = '请完成手机号授权'
|
|
break
|
|
case 'phone_authed':
|
|
case 'phone_skipped':
|
|
targetPage = '/pages/profile/user-info?mode=setup'
|
|
toastMessage = '请完善个人信息'
|
|
break
|
|
default:
|
|
targetPage = '/pages/login/login'
|
|
toastMessage = '请先登录'
|
|
}
|
|
|
|
// 显示提示并跳转
|
|
uni.showToast({
|
|
title: toastMessage,
|
|
icon: 'none',
|
|
duration: 1500
|
|
})
|
|
|
|
setTimeout(() => {
|
|
uni.navigateTo({ url: targetPage }).catch(() => {
|
|
uni.reLaunch({ url: targetPage })
|
|
})
|
|
}, 1500)
|
|
}
|
|
|
|
/**
|
|
* 尝试自动登录
|
|
* @returns {Promise<Boolean>} 是否登录成功
|
|
*/
|
|
export async function tryAutoLogin() {
|
|
try {
|
|
// 这里需要导入实际的自动登录函数
|
|
const { autoLogin } = await import('../../utils/loginState.js')
|
|
return await autoLogin()
|
|
} catch (error) {
|
|
console.error('自动登录失败:', error)
|
|
return false
|
|
}
|
|
}
|