// 导入模块、包提供的类
|
import WxRequest from 'mina-request'
|
// 导入封装的本地存储操作模块
|
import { getStorage, clearStorage } from './storage'
|
// 导入封装的增强 API
|
import { toast, modal } from './extendApi'
|
//#region ====================== 后端 res.err_code ======================
|
export const ErrorCode = {
|
/** @description 权限验证失败 */
|
Message: 'MESSAGE',
|
/** @description 内部错误 */
|
Exception: 'EXCEPTION',
|
/** @description 无权使用 */
|
Auth: 'AUTH',
|
}
|
//#endregion
|
|
export const checkAuth = () => {
|
const session = getStorage('session');
|
if (!session) {
|
// 既然用户需要重新进行登录,就需要把之前用户存储的信息(过期的 token) 进行清除
|
clearStorage()
|
wx.reLaunch({
|
url: '/pages/login/login'
|
})
|
}
|
return !!session;
|
}
|
|
|
const debounceCheckAuth = wx.$_.debounce(checkAuth);
|
// 对类进行实例化
|
const instance = new WxRequest({
|
baseURL: 'https://wi.cpolar.top',
|
timeout: 15000
|
})
|
|
instance.defaults.header['content-type'] = 'application/x-www-form-urlencoded'
|
|
// 添加请求拦截器 (在请求发送之前对请求参数进行新增或者修改)
|
instance.interceptors.request = (config) => {
|
// 在实际开发中,有一些接口需要使用访问令牌 session
|
// 访问令牌 session 通常是存储到本地
|
// 需要先从本地获取到存储的 session
|
const session = getStorage('session')
|
|
// 如果本地存在 session,这时候就需要在请求头中添加 session 字段
|
if (session) {
|
config.header['hswatersession'] = session
|
} else {
|
// 需要权限验证接口
|
if (!config.noAuth) {
|
debounceCheckAuth();
|
}
|
}
|
|
// 在发送请求之前做些什么
|
return config
|
}
|
|
// 添加响应拦截器 (在服务器响应数据以后,对返回的数据进行逻辑处理)
|
instance.interceptors.response = async (response) => {
|
// 从 response 对象中解构两个数据
|
const { isSuccess, data } = response
|
|
// response 服务器响应的数据,只不过数据被 wx.request 进行了一层包装
|
// console.log(response)
|
|
// response.config 封装的包里面提供的 config 属性,是请求的参数信息
|
// 可以使用请求参数进行代码的调试
|
|
// response.data 服务器真正响应的数据
|
|
// response.isSuccess 判断代码执行了哪一个回调函数
|
// isSuccess = true,说明代码执行了 wx.request 方法的 success 回调函数
|
// isSuccess = false,说明代码执行了 wx.request 方法的 fail 回调函数
|
|
// 如果 isSuccess = false,说明网络出现了问题
|
if (!isSuccess) {
|
toast({
|
title: '网络异常请重试',
|
icon: 'error'
|
})
|
|
return Promise.reject(response)
|
}
|
|
// 如果 isSuccess = true,说明代码执行到了 success 回调函数
|
// 需要开发者对返回的参数进行逻辑判断
|
// 需要对后端返回的业务状态码进行判断
|
// 业务状态码 === 200,接口调用成功,服务器成功返回了数据
|
// 业务状态码 === 208,没有 token 或者 token 失效,需要让用户重新进行登录
|
// 业务状态码既不等于 200,也不等于 208,说明出现了其他异常,需要给用户统一进行提示
|
if (!data.json_ok) {
|
switch (data?.err_code) {
|
|
case ErrorCode.Auth:
|
clearStorage()
|
wx.redirectTo({
|
url: '/pages/login/login'
|
})
|
return Promise.reject(response)
|
|
case ErrorCode.Exception:
|
toast({ title: '内部错误' });
|
return Promise.reject(response)
|
|
// case 200:
|
// // 接口调用成功,服务器成功返回了数据,只需要将数据简化以后返回即可
|
// return data
|
|
default:
|
// toast({
|
// title: '程序出现异常,请联系客服或稍后重试!'
|
// })
|
// return Promise.reject(response)
|
return data;
|
|
}
|
}
|
|
return data
|
}
|
|
// 导出实例
|
export default instance
|