387 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			387 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // api.js - 适配uView3+uni-app版本
 | ||
| 
 | ||
| // 基础配置
 | ||
| const TIMEOUT = 10000
 | ||
| 
 | ||
| // 初始化时设置token
 | ||
| const token = uni.getStorageSync('token')
 | ||
| const commonHeaders = {
 | ||
| 	'Content-Type': 'application/json'
 | ||
| }
 | ||
| if (token) {
 | ||
| 	commonHeaders['Authorization'] = `Bearer ${token}`
 | ||
| }
 | ||
| 
 | ||
| // 请求队列,用于管理loading
 | ||
| let requestQueue = 0
 | ||
| let loadingTimer = null
 | ||
| 
 | ||
| // 显示加载动画
 | ||
| const showLoading = () => {
 | ||
| 	requestQueue++
 | ||
| 	if (loadingTimer) {
 | ||
| 		clearTimeout(loadingTimer)
 | ||
| 		loadingTimer = null
 | ||
| 	}
 | ||
| 
 | ||
| 	loadingTimer = setTimeout(() => {
 | ||
| 		if (requestQueue > 0) {
 | ||
| 			uni.showLoading({
 | ||
| 				title: '加载中...',
 | ||
| 				mask: true
 | ||
| 			})
 | ||
| 		}
 | ||
| 	}, 300)
 | ||
| }
 | ||
| 
 | ||
| // 隐藏加载动画
 | ||
| const hideLoading = () => {
 | ||
| 	requestQueue--
 | ||
| 	if (requestQueue <= 0) {
 | ||
| 		requestQueue = 0
 | ||
| 		if (loadingTimer) {
 | ||
| 			clearTimeout(loadingTimer)
 | ||
| 			loadingTimer = null
 | ||
| 		}
 | ||
| 		uni.hideLoading()
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // 核心请求函数
 | ||
| const request = (config) => {
 | ||
| 	return new Promise((resolve, reject) => {
 | ||
| 		// 请求配置处理
 | ||
| 		const {
 | ||
| 			url,
 | ||
| 			method = 'GET',
 | ||
| 			data = {},
 | ||
| 			params = {},
 | ||
| 			header = {},
 | ||
| 			showLoading = true
 | ||
| 		} = config
 | ||
| 
 | ||
| 		// 处理请求参数
 | ||
| 		// const BASE_URL = 'http://192.168.0.4:3005'
 | ||
| 		// let requestUrl = BASE_URL + url
 | ||
| 		// if (url.includes('/group')) {
 | ||
| 		// 	requestUrl = "http://192.168.0.15:3007" + url
 | ||
| 		// }
 | ||
| 		let requestUrl = url
 | ||
| 
 | ||
| 
 | ||
| 		let queryString = ''
 | ||
| 
 | ||
| 		if (Object.keys(params).length > 0) {
 | ||
| 			queryString = Object.keys(params)
 | ||
| 				.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
 | ||
| 				.join('&')
 | ||
| 			requestUrl += (requestUrl.includes('?') ? '&' : '?') + queryString
 | ||
| 		}
 | ||
| 
 | ||
| 		// 合并请求头
 | ||
| 		const requestHeader = {
 | ||
| 			...commonHeaders,
 | ||
| 			...header
 | ||
| 		}
 | ||
| 
 | ||
| 		// 显示loading
 | ||
| 		if (showLoading) {
 | ||
| 			uni.showLoading()
 | ||
| 		}
 | ||
| 
 | ||
| 		// 发送请求
 | ||
| 		uni.request({
 | ||
| 			url: requestUrl,
 | ||
| 			method: method.toUpperCase(),
 | ||
| 			data: data,
 | ||
| 			header: requestHeader,
 | ||
| 			timeout: TIMEOUT,
 | ||
| 			success: (response) => {
 | ||
| 				// 处理响应
 | ||
| 				const res = response.data
 | ||
| 				const statusCode = response.statusCode
 | ||
| 
 | ||
| 				if (statusCode >= 200 && statusCode < 300) {
 | ||
| 					resolve(res)
 | ||
| 				} else {
 | ||
| 					// 处理HTTP错误状态
 | ||
| 					handleError({
 | ||
| 						response,
 | ||
| 						config
 | ||
| 					})
 | ||
| 					reject(response)
 | ||
| 				}
 | ||
| 			},
 | ||
| 			fail: (error) => {
 | ||
| 				console.log(error);
 | ||
| 				// 处理网络错误
 | ||
| 				handleError({
 | ||
| 					error,
 | ||
| 					config
 | ||
| 				})
 | ||
| 				reject(error)
 | ||
| 			},
 | ||
| 			complete: () => {
 | ||
| 				// 隐藏loading
 | ||
| 				if (showLoading) {
 | ||
| 					uni.hideLoading()
 | ||
| 				}
 | ||
| 			}
 | ||
| 		})
 | ||
| 	})
 | ||
| }
 | ||
| 
 | ||
| // 错误处理函数
 | ||
| const handleError = (errorInfo) => {
 | ||
| 	const {
 | ||
| 		response,
 | ||
| 		error,
 | ||
| 		config
 | ||
| 	} = errorInfo
 | ||
| 
 | ||
| 	if (response) {
 | ||
| 		const {
 | ||
| 			statusCode,
 | ||
| 			data
 | ||
| 		} = response
 | ||
| 
 | ||
| 		switch (statusCode) {
 | ||
| 			case 401:
 | ||
| 				// 未授权,清除token并根据当前页面跳转到相应的登录页
 | ||
| 				uni.removeStorageSync('token')
 | ||
| 				uni.removeStorageSync('agentInfo') // 清除代理信息
 | ||
| 				delete commonHeaders['Authorization']
 | ||
| 
 | ||
| 				// 获取当前页面栈
 | ||
| 				const pages = getCurrentPages()
 | ||
| 				const currentPage = pages[pages.length - 1]
 | ||
| 				const currentRoute = currentPage ? currentPage.route : ''
 | ||
| 
 | ||
| 				console.log(data);
 | ||
| 
 | ||
| 				// 判断当前是否在代理相关页面
 | ||
| 				if (currentRoute && currentRoute.includes('agent')) {
 | ||
| 					uni.redirectTo({
 | ||
| 						url: '/pages/agent/mylogin'
 | ||
| 					})
 | ||
| 					// uToast.error('')
 | ||
| 					uni.showToast({
 | ||
| 						title: '代理登录已过期,请重新登录',
 | ||
| 						icon: "error"
 | ||
| 					})
 | ||
| 				} else {
 | ||
| 					uni.showToast({
 | ||
| 						title: data.message,
 | ||
| 						icon: "error"
 | ||
| 					})
 | ||
| 					// uToast.error('登录已过期,请重新登录')
 | ||
| 				}
 | ||
| 				break
 | ||
| 
 | ||
| 			case 403:
 | ||
| 				// 检查是否是用户被拉黑
 | ||
| 				if (data.code === 'USER_BLACKLISTED') {
 | ||
| 					// 清除token并跳转到登录页
 | ||
| 					uni.removeStorageSync('token')
 | ||
| 					delete commonHeaders['Authorization']
 | ||
| 					uni.redirectTo({
 | ||
| 						url: '/pages/user/mylogin'
 | ||
| 					})
 | ||
| 					// uToast.error(data.message || '账户已被拉黑,请联系管理员')
 | ||
| 					uni.showToast({
 | ||
| 						title: data.message || '账户已被拉黑,请联系管理员',
 | ||
| 						icon: "error"
 | ||
| 					})
 | ||
| 				} else if (data.code === 'PAYMENT_REQUIRED') {
 | ||
| 					// 需要支付,跳转到支付页面
 | ||
| 					// 获取当前页面避免重复跳转
 | ||
| 					const currentPages = getCurrentPages()
 | ||
| 					const currentPage = currentPages[currentPages.length - 1]
 | ||
| 					if (!currentPage || currentPage.route !== 'pages/payment/index') {
 | ||
| 						uni.redirectTo({
 | ||
| 							url: '/pages/payment/index'
 | ||
| 						})
 | ||
| 						uni.showToast({
 | ||
| 							title: data.message || '您的账户尚未激活,请完成支付后再使用',
 | ||
| 							icon: "error"
 | ||
| 						})
 | ||
| 						// uToast.warning(data.message || '您的账户尚未激活,请完成支付后再使用')
 | ||
| 					}
 | ||
| 				} else {
 | ||
| 					// uToast.error(data.message || '权限不足')
 | ||
| 					uni.showToast({
 | ||
| 						title: data.message || '权限不足',
 | ||
| 						icon: "error"
 | ||
| 					})
 | ||
| 				}
 | ||
| 				break
 | ||
| 
 | ||
| 			case 404:
 | ||
| 				// uToast.error(data.message || '请求的资源不存在')
 | ||
| 				uni.showToast({
 | ||
| 					title: data.message || '请求的资源不存在',
 | ||
| 					icon: "error"
 | ||
| 				})
 | ||
| 				break
 | ||
| 
 | ||
| 			case 422:
 | ||
| 				// uToast.error(data.message || '请求参数错误')
 | ||
| 				uni.showToast({
 | ||
| 					title: data.message || '请求参数错误',
 | ||
| 					icon: "error"
 | ||
| 				})
 | ||
| 				break
 | ||
| 
 | ||
| 			case 429:
 | ||
| 				// uToast.error('请求过于频繁,请稍后再试')
 | ||
| 				uni.showToast({
 | ||
| 					title: '请求过于频繁,请稍后再试',
 | ||
| 					icon: "error"
 | ||
| 				})
 | ||
| 				break
 | ||
| 
 | ||
| 			case 500:
 | ||
| 				// uToast.error('服务器内部错误')
 | ||
| 				uni.showToast({
 | ||
| 					title: '服务器内部错误',
 | ||
| 					icon: "error"
 | ||
| 				})
 | ||
| 				break
 | ||
| 
 | ||
| 				// case 400:
 | ||
| 				// 处理业务逻辑错误(如坏账等)
 | ||
| 				// uToast.error(data.error?.message || data.message || '请求失败')
 | ||
| 				// uni.showToast({
 | ||
| 				// 	title: data.error?.message || data.message || '请求失败',
 | ||
| 				// 	icon: "error"
 | ||
| 				// })
 | ||
| 				// break
 | ||
| 
 | ||
| 			default:
 | ||
| 				// uToast.error(data.error?.message || data.message || '请求失败')
 | ||
| 				uni.showToast({
 | ||
| 					title: data.error?.message || data.message || '请求失败',
 | ||
| 					icon: "error"
 | ||
| 				})
 | ||
| 		}
 | ||
| 	} else if (error) {
 | ||
| 		// 网络错误
 | ||
| 		// uToast.error('网络连接失败,请检查网络设置')
 | ||
| 		uni.showToast({
 | ||
| 			title: '网络连接失败,请检查网络设置',
 | ||
| 			icon: "error"
 | ||
| 		})
 | ||
| 	} else {
 | ||
| 		// 其他错误
 | ||
| 		// uToast.error('请求配置错误')
 | ||
| 		uni.showToast({
 | ||
| 			title: '请求配置错误',
 | ||
| 			icon: "error"
 | ||
| 		})
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // 封装常用的请求方法
 | ||
| export const http = {
 | ||
| 	get: (url, params = {}, config = {}) => request({
 | ||
| 		url,
 | ||
| 		params,
 | ||
| 		method: 'GET',
 | ||
| 		...config
 | ||
| 	}),
 | ||
| 	post: (url, data = {}, config = {}) => request({
 | ||
| 		url,
 | ||
| 		data,
 | ||
| 		method: 'POST',
 | ||
| 		...config
 | ||
| 	}),
 | ||
| 	put: (url, data = {}, config = {}) => request({
 | ||
| 		url,
 | ||
| 		data,
 | ||
| 		method: 'PUT',
 | ||
| 		...config
 | ||
| 	}),
 | ||
| 	delete: (url, config = {}) => request({
 | ||
| 		url,
 | ||
| 		method: 'DELETE',
 | ||
| 		...config
 | ||
| 	}),
 | ||
| 	patch: (url, data = {}, config = {}) => request({
 | ||
| 		url,
 | ||
| 		data,
 | ||
| 		method: 'PATCH',
 | ||
| 		...config
 | ||
| 	})
 | ||
| }
 | ||
| 
 | ||
| // 设置token
 | ||
| export const setToken = (newToken) => {
 | ||
| 	if (newToken) {
 | ||
| 		commonHeaders['Authorization'] = `Bearer ${newToken}`
 | ||
| 		uni.setStorageSync('token', newToken)
 | ||
| 	} else {
 | ||
| 		delete commonHeaders['Authorization']
 | ||
| 		uni.removeStorageSync('token')
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // 文件上传API
 | ||
| export const uploadAPI = {
 | ||
| 	// 上传图片
 | ||
| 	uploadImage: (filePath, formData = {}) => {
 | ||
| 		return new Promise((resolve, reject) => {
 | ||
| 			uni.uploadFile({
 | ||
| 				url: BASE_URL + '/upload/image',
 | ||
| 				filePath: filePath,
 | ||
| 				name: 'image',
 | ||
| 				formData: formData,
 | ||
| 				header: {
 | ||
| 					'Authorization': commonHeaders['Authorization']
 | ||
| 				},
 | ||
| 				success: (uploadFileRes) => {
 | ||
| 					const data = JSON.parse(uploadFileRes.data)
 | ||
| 					resolve(data)
 | ||
| 				},
 | ||
| 				fail: (error) => {
 | ||
| 					reject(error)
 | ||
| 				}
 | ||
| 			})
 | ||
| 		})
 | ||
| 	},
 | ||
| 
 | ||
| 	// 上传文件
 | ||
| 	uploadFile: (filePath, formData = {}) => {
 | ||
| 		return new Promise((resolve, reject) => {
 | ||
| 			uni.uploadFile({
 | ||
| 				url: BASE_URL + '/upload/file',
 | ||
| 				filePath: filePath,
 | ||
| 				name: 'file',
 | ||
| 				formData: formData,
 | ||
| 				header: {
 | ||
| 					'Authorization': commonHeaders['Authorization']
 | ||
| 				},
 | ||
| 				success: (uploadFileRes) => {
 | ||
| 					const data = JSON.parse(uploadFileRes.data)
 | ||
| 					resolve(data)
 | ||
| 				},
 | ||
| 				fail: (error) => {
 | ||
| 					reject(error)
 | ||
| 				}
 | ||
| 			})
 | ||
| 		})
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| export const distributionAPI = {
 | ||
| 	getLowerUsers: (params) => http.get('/agents/distribution', {
 | ||
| 		params
 | ||
| 	}),
 | ||
| }
 | ||
| 
 | ||
| export default {
 | ||
| 	http,
 | ||
| 	setToken,
 | ||
| 	uploadAPI,
 | ||
| 	distributionAPI
 | ||
| } |