2025-09-24 21:28:48 +08:00

201 lines
6.0 KiB
TypeScript
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.

/**
* @description: HTTP请求方法枚举
*/
export enum HttpMethod {
GET = 'GET',
POST = 'POST',
OPTIONS = 'OPTIONS',
PUT = 'PUT',
DELETE = 'DELETE'
}
/**
* @description: HTTP请求配置
*/
interface RequestConfig {
/** API路径 */
url?: string
/** Method类型 */
method?: HttpMethod
/** 接口返回数据 */
data?: any
/** 无TOKEN触发异常捕获时是否执行异常逻辑 */
needToken?: boolean
/** Header头部 */
header?: object
/** 返回的数据格式 */
dataType?: string
/** 请求报错时是否弹出message提示默认弹出*/
noShowMsg?: boolean
}
class HttpRequest {
private static instance: HttpRequest
private constructor() { }
public static getInstance(): HttpRequest {
if (!this.instance) {
this.instance = new HttpRequest()
}
return this.instance
}
// 处理请求异常状态码
private handerErrorStatus(statusCode: number, requestConfig: RequestConfig) {
let msg = '服务找不到'
if (statusCode === 502 || statusCode === 503) {
msg = '服务器开小差了~'
}
!requestConfig.noShowMsg && wx.showToast({
title: `${msg},错误码:${statusCode}`,
icon: 'none'
})
return msg
}
// 处理请求异常
private handerError(err: { errMsg: string }, requestConfig: RequestConfig) {
let msg = `请求异常`
if (/timeout/.test(err.errMsg)) {
msg = '请求超时'
}
!requestConfig.noShowMsg && wx.showToast({
title: msg,
icon: 'none'
});
return msg
}
// 服务器接口请求
public request<T>(requestConfig: RequestConfig): Promise<T> {
const _this = this
const wxSystemInfo = wx.getSystemInfoSync()
const reqData = Object.assign(requestConfig.data, {
channelCode: 'CJTG_XCX_LZ',
devType: wxSystemInfo.platform === 'ios' ? 0 : 1
})
const user_info = wx.getStorageSync('user_info')
if (user_info) {
Object.assign(reqData, { token: user_info.token, userName: user_info.userName })
}
return new Promise((resolve, reject) => {
wx.request({
method: requestConfig.method,
url: `${requestConfig.url}`,
data: reqData,
header: requestConfig?.header,
dataType: 'json',
success (res) {
const code = res.statusCode || -404
const data = res.data
const isWhiteApi = requestConfig.url?.indexOf('/front/problem')
/** 接口请求成功*/
if (code == 200) {
if (isWhiteApi === -1) {
if ([1003, 1004, 1005, 1006].includes((data as any).code)) {
wx.showModal({
content: (data as any).msg,
success (res) {
if (res.confirm) {
wx.removeStorageSync('user_info')
wx.navigateTo({ url: '/pages/login/index' })
} else if (res.cancel) {
try {
wx.removeStorageSync('user_info')
} catch (e) {
console.log('登录失效catch', e)
}
wx.reLaunch({ url: '/pages/index/index' })
wx.hideLoading()
}
}
})
} else {
resolve(data as any)
}
} else {
resolve(data as any)
}
} else if (code === 401) {
// 未授权
!requestConfig.noShowMsg && wx.showModal({
title: '登录失效',
content: '登录失效,请重新登录',
}).then(resModa => {
if (resModa.confirm) {
wx.removeStorageSync('user_info')
wx.navigateTo({ url: '/pages/login/index' })
} else if (resModa.cancel) {
try {
wx.removeStorageSync('user_info')
wx.reLaunch({ url: '/pages/index/index' })
} catch (e) {
console.log('登录失效catch', e)
}
}
})
reject({ code, msg: '未登录', data: data })
} else {
//非200及401状态码-数据处理
const errMsg = _this.handerErrorStatus(code, requestConfig)
reject({ code, msg: errMsg, data })
}
},
fail: err => {
console.log('失败了', err);
let msg = _this.handerError(err, requestConfig)
reject({ msg })
}
})
})
}
/**
* @description: get请求函数
* @param {string} url 请求地址
* @param {Object} data 请求参数
* @param {RequestConfig} OtherConfig request其他配置
* @return {*}
*/
public get<T>(url: string, data?: Object, OtherConfig?: RequestConfig) {
return this.request<T>({ method: HttpMethod.GET, url, data, ...OtherConfig })
}
/**
* @description: post请求函数
* @param {string} url 请求地址
* @param {Object} data 请求参数
* @param {Object} thrid 三方接口
* @param {RequestConfig} OtherConfig request其他配置
* @return {*}
*/
public post<T>(url: string, data: Object, OtherConfig?: RequestConfig) {
return this.request<T>({ method: HttpMethod.POST, url, data, ...OtherConfig })
}
/**
* @description: delete请求函数
* @param {string} url 请求地址
* @param {Object} data 请求参数
* @param {RequestConfig} OtherConfig request其他配置
* @return {*}
*/
public delete<T>(url: string, data: Object, OtherConfig?: RequestConfig) {
return this.request<T>({ method: HttpMethod.DELETE, url, data, ...OtherConfig })
}
/**
* @description: put请求函数
* @param {string} url 请求地址
* @param {Object} data 请求参数
* @param {RequestConfig} OtherConfig request其他配置
* @return {*}
*/
public put<T>(url: string, data?: Object, OtherConfig?: RequestConfig) {
return this.request<T>({ method: HttpMethod.PUT, url, data, ...OtherConfig })
}
}
export const httpRequest = HttpRequest.getInstance()