247 lines
4.9 KiB
JavaScript
247 lines
4.9 KiB
JavaScript
/**
|
|
* 认证工具类
|
|
* 提供登录状态检查、token 管理等功能
|
|
*/
|
|
|
|
import { AppServer } from '@/modules/api/AppServer'
|
|
|
|
/**
|
|
* 检查是否已登录
|
|
* @returns {Boolean} 是否已登录
|
|
*/
|
|
export function isLoggedIn() {
|
|
const token = uni.getStorageSync('token')
|
|
return !!token
|
|
}
|
|
|
|
/**
|
|
* 获取当前用户信息
|
|
* @returns {Object|null} 用户信息
|
|
*/
|
|
export function getCurrentUser() {
|
|
try {
|
|
const userStr = uni.getStorageSync('user')
|
|
if (userStr) {
|
|
return JSON.parse(userStr)
|
|
}
|
|
} catch (e) {
|
|
console.error('获取用户信息失败:', e)
|
|
}
|
|
return null
|
|
}
|
|
|
|
/**
|
|
* 获取用户信息(别名)
|
|
* @returns {Object|null} 用户信息
|
|
*/
|
|
export function getUserInfo() {
|
|
return getCurrentUser()
|
|
}
|
|
|
|
/**
|
|
* 保存用户信息
|
|
* @param {Object} user - 用户信息
|
|
*/
|
|
export function saveUserInfo(user) {
|
|
try {
|
|
if (user) {
|
|
const userStr = JSON.stringify(user)
|
|
uni.setStorageSync('user', userStr)
|
|
|
|
// 更新全局数据
|
|
const app = getApp()
|
|
if (app && app.globalData) {
|
|
app.globalData.user = user
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('保存用户信息失败:', error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取 Token
|
|
* @returns {String} Token
|
|
*/
|
|
export function getToken() {
|
|
return uni.getStorageSync('token') || ''
|
|
}
|
|
|
|
/**
|
|
* 保存认证信息
|
|
* @param {String} token - 访问令牌
|
|
* @param {String} refreshToken - 刷新令牌
|
|
* @param {Object} user - 用户信息
|
|
*/
|
|
export function saveAuthData(token, refreshToken, user) {
|
|
try {
|
|
console.log('保存认证信息:', { token: token ? 'exists' : 'missing', refreshToken: refreshToken ? 'exists' : 'missing', user: user ? 'exists' : 'missing' });
|
|
|
|
// 保存到本地存储
|
|
if (token) {
|
|
uni.setStorageSync('token', token)
|
|
console.log('Token 已保存');
|
|
}
|
|
|
|
if (refreshToken) {
|
|
uni.setStorageSync('refreshToken', refreshToken)
|
|
console.log('RefreshToken 已保存');
|
|
}
|
|
|
|
if (user) {
|
|
const userStr = JSON.stringify(user)
|
|
uni.setStorageSync('user', userStr)
|
|
console.log('用户信息已保存:', userStr);
|
|
}
|
|
|
|
// 更新全局数据
|
|
const app = getApp()
|
|
if (app && app.globalData) {
|
|
app.globalData.token = token
|
|
app.globalData.user = user
|
|
app.globalData.loginTime = Date.now()
|
|
console.log('全局数据已更新');
|
|
}
|
|
|
|
console.log('认证信息保存成功');
|
|
} catch (error) {
|
|
console.error('保存认证信息失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清除认证信息
|
|
*/
|
|
export function clearAuthData() {
|
|
// 清除本地存储
|
|
uni.removeStorageSync('token')
|
|
uni.removeStorageSync('refreshToken')
|
|
uni.removeStorageSync('user')
|
|
|
|
// 清除全局数据
|
|
const app = getApp()
|
|
if (app && app.globalData) {
|
|
app.globalData.token = ''
|
|
app.globalData.user = null
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证 Token 是否有效
|
|
* @returns {Promise<Boolean>} Token 是否有效
|
|
*/
|
|
export async function validateToken() {
|
|
if (!isLoggedIn()) {
|
|
return false
|
|
}
|
|
|
|
try {
|
|
const appServer = new AppServer()
|
|
const result = await appServer.GetUserProfile()
|
|
|
|
if (result.success) {
|
|
// Token 有效,更新用户信息
|
|
saveAuthData(getToken(), uni.getStorageSync('refreshToken'), result.data)
|
|
return true
|
|
} else {
|
|
// Token 无效
|
|
return false
|
|
}
|
|
} catch (error) {
|
|
console.error('验证 Token 失败:', error)
|
|
return false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 检查登录状态,如果未登录则跳转到登录页
|
|
* @param {Boolean} showToast - 是否显示提示
|
|
* @returns {Boolean} 是否已登录
|
|
*/
|
|
export function requireAuth(showToast = true) {
|
|
if (!isLoggedIn()) {
|
|
if (showToast) {
|
|
uni.showToast({
|
|
title: '请先登录',
|
|
icon: 'none',
|
|
duration: 1500
|
|
})
|
|
}
|
|
|
|
setTimeout(() => {
|
|
uni.navigateTo({
|
|
url: '/pages/login/login-page'
|
|
})
|
|
}, showToast ? 1000 : 0)
|
|
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
/**
|
|
* 登出
|
|
*/
|
|
export async function logout() {
|
|
try {
|
|
// 调用登出接口
|
|
const appServer = new AppServer()
|
|
await appServer.Logout()
|
|
} catch (error) {
|
|
console.error('登出接口调用失败:', error)
|
|
} finally {
|
|
// 无论接口是否成功,都清除本地数据
|
|
clearAuthData()
|
|
|
|
// 跳转到登录页
|
|
uni.reLaunch({
|
|
url: '/pages/login/login-page'
|
|
})
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 刷新 Token
|
|
* @returns {Promise<Boolean>} 是否刷新成功
|
|
*/
|
|
export async function refreshToken() {
|
|
const refreshToken = uni.getStorageSync('refreshToken')
|
|
if (!refreshToken) {
|
|
return false
|
|
}
|
|
|
|
try {
|
|
const appServer = new AppServer()
|
|
const result = await appServer.RefreshToken(refreshToken)
|
|
|
|
if (result.success && result.data && result.data.token) {
|
|
// 保存新的 token
|
|
saveAuthData(
|
|
'Bearer ' + result.data.token,
|
|
result.data.refreshToken || refreshToken,
|
|
getCurrentUser()
|
|
)
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
} catch (error) {
|
|
console.error('刷新 Token 失败:', error)
|
|
return false
|
|
}
|
|
}
|
|
|
|
export default {
|
|
isLoggedIn,
|
|
getCurrentUser,
|
|
getToken,
|
|
saveAuthData,
|
|
clearAuthData,
|
|
validateToken,
|
|
requireAuth,
|
|
logout,
|
|
refreshToken
|
|
}
|