Files
jurong_circle_front_app/util/api.js
Sun_sun 19e4c8bf08 2025-10-24
购物车
2025-10-23 17:25:39 +08:00

392 lines
8.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// api.js - 适配uView3+uni-app版本
// 基础配置
const TIMEOUT = 10000
// 初始化时设置token
const token = uni.getStorageSync('token')
const commonHeaders = {
'Content-Type': 'application/json'
}
// 请求队列用于管理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 currToken = uni.getStorageSync('token')
if (currToken) {
commonHeaders.Authorization = `Bearer ${currToken}`
}
// 合并请求头
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 if (!data.success) {
uni.redirectTo({
url: '/pages/login/login'
})
} 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
}