This commit is contained in:
2025-09-09 14:43:04 +08:00
parent c191002cc6
commit 6ab8f89770
14 changed files with 722 additions and 1731 deletions
+178
View File
@@ -0,0 +1,178 @@
/**
* HTTP模块统一配置常量文件
* 统一管理所有配置模板、Loading文本常量和其他共享常量
*/
// ==================== 配置模板 ====================
/**
* 统一的请求配置模板
* 合并了REQUEST_CONFIG_TEMPLATES、COMMON_CONFIG_TEMPLATES、DEFAULT_CONFIG_TEMPLATES
*/
export const CONFIG_TEMPLATES = {
// 需要认证的查询请求(无loading)
AUTHENTICATED_QUERY: {
auth: true,
loading: false,
toast: true
},
// 需要认证的查询请求(有loading)
AUTHENTICATED_QUERY_WITH_LOADING: {
auth: true,
loading: true,
toast: true
},
// 需要认证的更新请求
AUTHENTICATED_UPDATE: {
auth: true,
loading: true,
toast: true
},
// 需要认证的删除请求
AUTHENTICATED_DELETE: {
auth: true,
loading: true,
toast: true
},
// 无需认证的公开请求
PUBLIC_REQUEST: {
auth: false,
loading: true,
toast: true
},
// 静默请求(无loading和toast)
SILENT_REQUEST: {
auth: false,
loading: false,
toast: false
},
// 需要认证的上传请求
AUTHENTICATED_UPLOAD: {
auth: true,
loading: true,
toast: true
},
// 需要认证的提交请求
AUTHENTICATED_SUBMIT: {
auth: true,
loading: true,
toast: true
},
// 公开的下载请求
PUBLIC_DOWNLOAD: {
auth: false,
loading: true,
toast: true
},
// 静默的配置获取请求
SILENT_CONFIG: {
auth: false,
loading: false,
toast: false
}
}
// ==================== Loading文本常量 ====================
/**
* 统一的Loading文本配置
* 合并了所有模块中的LOADING_TEXTS常量
*/
export const LOADING_TEXTS = {
// 通用操作
LOADING: '正在加载...',
SAVING: '正在保存...',
DELETING: '正在删除...',
UPDATING: '正在更新...',
SUBMITTING: '正在提交...',
UPLOADING: '正在上传...',
// 认证相关
LOGIN: '正在登录...',
LOGOUT: '正在退出...',
REGISTER: '正在注册...',
PHONE_VERIFY: '正在验证手机号...',
SEND_SMS: '正在发送验证码...',
VERIFY_SMS: '正在验证...',
RESET_PASSWORD: '正在重置密码...',
// 用户相关
UPDATING_USER_INFO: '正在更新用户信息...',
UPLOADING_AVATAR: '正在上传头像...',
SAVING_PROFILE: '正在保存...',
DELETING_ACCOUNT: '正在注销账户...',
LOADING_DATA: '正在加载...',
// 宠物相关
ADD_PET: '正在添加宠物...',
UPDATE_PET: '正在更新宠物信息...',
DELETE_PET: '正在删除宠物...',
ADD_RECORD: '正在添加记录...',
UPDATE_RECORD: '正在更新记录...',
DELETE_RECORD: '正在删除记录...',
// 文件相关
UPLOAD_IMAGE: '正在上传图片...',
UPLOAD_FILE: '正在上传文件...',
UPLOAD_IMAGES: '正在批量上传...',
DOWNLOAD_FILE: '正在下载文件...',
// AI助手相关
AI_THINKING: 'AI正在思考中...',
SPEECH_RECOGNITION: '正在识别语音...',
// 领养相关
SUBMIT_APPLICATION: '正在提交申请...',
CANCEL_APPLICATION: '正在取消申请...',
// 评价相关
SUBMIT_REVIEW: '正在提交评价...',
UPDATE_REVIEW: '正在更新评价...',
DELETE_REVIEW: '正在删除评价...',
SUBMIT_REPORT: '正在提交举报...',
REPLY_REVIEW: '正在回复评价...',
// 其他
SUBMIT_FEEDBACK: '正在提交反馈...',
CHECK_UPDATE: '正在检查更新...'
}
// ==================== 工具函数 ====================
/**
* 创建标准化的请求配置
* @param {string} template 配置模板名称
* @param {Object} customConfig 自定义配置
* @param {string} loadingText 自定义loading文本
* @returns {Object} 标准化的请求配置
*/
export const createRequestConfig = (template, customConfig = {}, loadingText = null) => {
const baseConfig = CONFIG_TEMPLATES[template] || {}
const config = {
custom: {
...baseConfig,
...(loadingText && { loadingText }),
...customConfig.custom
},
...customConfig
}
// 移除custom属性中的undefined值
Object.keys(config.custom).forEach(key => {
if (config.custom[key] === undefined) {
delete config.custom[key]
}
})
return config
}
+2 -101
View File
@@ -1,111 +1,12 @@
// HTTP请求配置和拦截器
// 基于uView-next的luch-request库实现
import { HTTP_CONFIG, checkApiAuth, AUTH_REQUIRED_APIS } from './config.js'
import { HTTP_CONFIG, checkApiAuth, checkAuthRequiredApi } from './config.js'
import { clearAuthData, isUserLoggedIn, handleAuthRequired, tryAutoLogin } from '../utils/auth-helper.js'
/**
* 清理认证数据
*/
function clearAuthData() {
console.log('HTTP拦截器: 清理认证数据被调用')
console.trace('调用堆栈:')
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')
}
/**
* 检查接口是否需要强制登录
* @param {String} url 接口URL
* @returns {Boolean} 是否需要强制登录
*/
function checkAuthRequiredApi(url) {
// 移除查询参数,只保留路径
const path = url.split('?')[0]
// 检查是否在需要强制登录的列表中
for (const authApi of AUTH_REQUIRED_APIS) {
// 支持通配符匹配
if (authApi.includes('*')) {
const regex = new RegExp('^' + authApi.replace(/\*/g, '.*') + '$')
if (regex.test(path)) {
return true
}
} else if (path === authApi || path.startsWith(authApi + '/')) {
return true
}
}
return false
}
/**
* 检查用户是否已完成登录
* @returns {Boolean} 是否已完成登录
*/
function isUserLoggedIn() {
const token = uni.getStorageSync(HTTP_CONFIG.storageKeys.token)
const loginStep = uni.getStorageSync('loginStep')
// 检查是否有有效的token和完成的登录流程
return !!(token && (loginStep === 'profile_completed' || loginStep === 'phone_authed'))
}
/**
* 尝试自动登录
* @returns {Promise<Boolean>} 是否登录成功
*/
async function tryAutoLogin() {
try {
return await autoLogin()
} catch (error) {
console.error('自动登录失败:', error)
return false
}
}
/**
* 处理需要鉴权的情况
*/
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)
}
/**
* 初始化HTTP配置