import { hideLoading, showLoading } from '../../utils/message/index' import { getLoginCode, loginid, setLoginCode, xtoken } from '../utils' import { Method, HttpConfig, HttpRequest, HttpResponse, ResultCode } from './interface' import { addPending, removePending } from './pending/index' /** * 根据url参数生成唯一key */ function getRequestKey(config: HttpConfig) { const { method, url, data } = config const requestKey: string[] = [method, url] if (data) { // 参数转换查询字符串 const queryString = Object.entries(data).reduce((res, property, index) => { const str = property[0] + '=' + property[1] return index > 0 ? res + '&' + str : str }, '') requestKey.push(queryString) } return requestKey.join('&') } function logout() { /// 获取上次登录账号 const username = getLoginCode() /// 清楚所有的缓存数据 wx.clearStorage() /// 设置登录账号 setLoginCode(username) /// loding.... showLoading(()=>{ /// 登出 setTimeout(function () { hideLoading(()=>{ // on confirm wx.reLaunch({ url: '/pages/login/index' }) }) }, 3000) }, '登出中....') } /** * Http请求 */ function httpMiddleware(config: HttpConfig) { const { url, method, enableAuthorization, data } = config // 过滤字符串前面所有 '/' 字符 const requestUrl = url.replace(/^\/+/, '') // 请求头 const header = { 'Authorization': xtoken(), 'Group': 5, 'LoginID': loginid(), 'x-token': xtoken() } return new Promise((resolve, reject) => { const requestKey = getRequestKey(config) // 在请求开始前,对之前的请求做检查取消操作 removePending(requestKey) const requestTask = wx.request({ url: requestUrl, method, header: enableAuthorization ? header : {}, data: data ?? {}, success: (res) => { resolve(res.data) }, fail: (err) => { reject('请求异常,请稍后再试'+err) }, complete: () => { // 在请求结束后,移除本次请求 removePending(requestKey) } }) // 将当前请求添加到列表中 addPending(requestKey, requestTask) }) } /** * Http请求结果 */ export async function httpRequest(url: string, method: Method, params: HttpRequest): Promise { const { data, enableAuthorization, success, fail, complete } = params; const config: HttpConfig = { url, method, enableAuthorization: enableAuthorization ?? true, data, } await httpMiddleware(config).then((res) => { const data = res as HttpResponse switch (data.code) { case ResultCode.InvalidToken: // 退出登录 // logout(); return Promise.reject('令牌无效') case ResultCode.UnvalidToken: logout(); return Promise.reject('异地登录,请重新登录') case ResultCode.Success: success && success(data) return Promise.resolve() case ResultCode.Code: success && success(data) return Promise.resolve() default: return Promise.reject(data.msg) } }).catch((err) => { fail && fail(err); return Promise.reject(err); }).finally(() => { complete && complete() }) }