appointment_system/utils/auth.js
2025-12-11 22:50:18 +08:00

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
}