1
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
/**
|
||||
* 统一认证工具模块
|
||||
* 整合所有认证检查、登录状态管理等功能
|
||||
*/
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
/**
|
||||
* HTTP请求统一工具类
|
||||
* 基于BaseRequest类提供标准化的请求配置和执行方法
|
||||
*/
|
||||
|
||||
import { CONFIG_TEMPLATES, LOADING_TEXTS, createRequestConfig } from '../config/constants.js'
|
||||
|
||||
// ==================== BaseRequest工具类 ====================
|
||||
|
||||
/**
|
||||
* 统一的HTTP请求工具类
|
||||
* 提供标准化的请求方法,基于uni.$u.http实现
|
||||
*/
|
||||
class BaseRequest {
|
||||
/**
|
||||
* 执行GET请求
|
||||
* @param {string} url 请求URL
|
||||
* @param {Object} params 查询参数
|
||||
* @param {string} template 配置模板
|
||||
* @param {Object} config 自定义配置
|
||||
* @returns {Promise} 请求Promise
|
||||
*/
|
||||
static get(url, params = {}, template = 'AUTHENTICATED_QUERY', config = {}) {
|
||||
const requestConfig = createRequestConfig(template, config)
|
||||
|
||||
return uni.$u.http.get(url, {
|
||||
...(Object.keys(params).length > 0 && { params }),
|
||||
...requestConfig
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行POST请求
|
||||
* @param {string} url 请求URL
|
||||
* @param {Object} data 请求数据
|
||||
* @param {string} template 配置模板
|
||||
* @param {string} loadingText loading文本
|
||||
* @param {Object} config 自定义配置
|
||||
* @returns {Promise} 请求Promise
|
||||
*/
|
||||
static post(url, data = {}, template = 'AUTHENTICATED_UPDATE', loadingText = null, config = {}) {
|
||||
const requestConfig = createRequestConfig(template, config, loadingText)
|
||||
|
||||
return uni.$u.http.post(url, data, requestConfig)
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行PUT请求
|
||||
* @param {string} url 请求URL
|
||||
* @param {Object} data 请求数据
|
||||
* @param {string} template 配置模板
|
||||
* @param {string} loadingText loading文本
|
||||
* @param {Object} config 自定义配置
|
||||
* @returns {Promise} 请求Promise
|
||||
*/
|
||||
static put(url, data = {}, template = 'AUTHENTICATED_UPDATE', loadingText = null, config = {}) {
|
||||
const requestConfig = createRequestConfig(template, config, loadingText)
|
||||
|
||||
return uni.$u.http.put(url, data, requestConfig)
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行DELETE请求
|
||||
* @param {string} url 请求URL
|
||||
* @param {Object} data 请求数据
|
||||
* @param {string} template 配置模板
|
||||
* @param {string} loadingText loading文本
|
||||
* @param {Object} config 自定义配置
|
||||
* @returns {Promise} 请求Promise
|
||||
*/
|
||||
static delete(url, data = {}, template = 'AUTHENTICATED_DELETE', loadingText = null, config = {}) {
|
||||
const requestConfig = createRequestConfig(template, config, loadingText)
|
||||
|
||||
return uni.$u.http.delete(url, data, requestConfig)
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行上传请求
|
||||
* @param {string} url 上传URL
|
||||
* @param {Object} uploadData 上传数据
|
||||
* @param {string} loadingText loading文本
|
||||
* @param {Object} config 自定义配置
|
||||
* @returns {Promise} 请求Promise
|
||||
*/
|
||||
static upload(url, uploadData, loadingText, config = {}) {
|
||||
const requestConfig = createRequestConfig('AUTHENTICATED_UPLOAD', config, loadingText)
|
||||
|
||||
return uni.$u.http.upload(url, {
|
||||
filePath: uploadData.filePath,
|
||||
name: uploadData.name || 'file',
|
||||
formData: uploadData.formData || {},
|
||||
...requestConfig
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行下载请求
|
||||
* @param {string} url 下载URL
|
||||
* @param {string} loadingText loading文本
|
||||
* @param {Object} config 自定义配置
|
||||
* @returns {Promise} 请求Promise
|
||||
*/
|
||||
static download(url, loadingText, config = {}) {
|
||||
const requestConfig = createRequestConfig('PUBLIC_DOWNLOAD', config, loadingText)
|
||||
|
||||
return uni.$u.http.download(url, {
|
||||
...(config.savePath && { savePath: config.savePath }),
|
||||
...requestConfig
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量上传多个文件
|
||||
* @param {Array} fileList 文件列表数组
|
||||
* @param {string} url 上传URL
|
||||
* @param {Object} config 自定义配置
|
||||
* @returns {Promise} 请求Promise
|
||||
*/
|
||||
static async batchUpload(fileList, url, config = {}) {
|
||||
const { maxConcurrent = 3, showProgress = true } = config
|
||||
|
||||
// 显示整体进度loading
|
||||
if (showProgress) {
|
||||
uni.showLoading({
|
||||
title: config.custom?.loadingText || LOADING_TEXTS.UPLOAD_IMAGES
|
||||
})
|
||||
}
|
||||
|
||||
try {
|
||||
// 分批并发上传
|
||||
const results = []
|
||||
for (let i = 0; i < fileList.length; i += maxConcurrent) {
|
||||
const batch = fileList.slice(i, i + maxConcurrent)
|
||||
const batchPromises = batch.map(fileData => {
|
||||
return BaseRequest.upload(url, fileData, null, {
|
||||
...config,
|
||||
custom: {
|
||||
loading: false, // 批量上传时不显示单个loading
|
||||
...config.custom
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
const batchResults = await Promise.all(batchPromises)
|
||||
results.push(...batchResults)
|
||||
}
|
||||
|
||||
return results
|
||||
} finally {
|
||||
if (showProgress) {
|
||||
uni.hideLoading()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 导出 ====================
|
||||
|
||||
// 默认导出BaseRequest类
|
||||
export default BaseRequest
|
||||
|
||||
// 向后兼容的命名导出
|
||||
export const executeGetRequest = BaseRequest.get
|
||||
export const executePostRequest = BaseRequest.post
|
||||
export const executePutRequest = BaseRequest.put
|
||||
export const executeDeleteRequest = BaseRequest.delete
|
||||
export const executeUploadRequest = BaseRequest.upload
|
||||
export const executeDownloadRequest = BaseRequest.download
|
||||
export const executeBatchUploadRequest = BaseRequest.batchUpload
|
||||
|
||||
// 导出配置相关(从constants.js重新导出)
|
||||
export { CONFIG_TEMPLATES, LOADING_TEXTS, createRequestConfig }
|
||||
Reference in New Issue
Block a user