import { getToken } from '@/utils/auth' import { getLocale } from '@/utils/index' import { $http } from '@escook/request-miniprogram' import store from '@/store' class Request { constructor(options = {}) { // 请求的根路径 this.baseUrl = options.baseUrl || '' // 请求的 url 地址 this.url = options.url || '' // 请求方式 this.method = 'GET' // 请求的参数对象 this.data = null // header 请求头 this.header = options.header || {} this.beforeRequest = null this.afterRequest = null } get(url, data = {}) { this.method = 'GET' this.url = this.baseUrl + url this.data = data return this._() } post(url, data = {}) { this.method = 'POST' this.url = this.baseUrl + url this.data = data return this._() } put(url, data = {}) { this.method = 'PUT' this.url = this.baseUrl + url this.data = data return this._() } delete(url, data = {}) { this.method = 'DELETE' this.url = this.baseUrl + url this.data = data return this._() } _() { // 清空 header 对象 this.header = {} // 请求之前做一些事 this.beforeRequest && typeof this.beforeRequest === 'function' && this.beforeRequest(this) // 发起请求 return new Promise((resolve, reject) => { let weixin = wx // 适配 uniapp if (typeof uni !== 'undefined') { weixin = uni } if (process.env.NODE_ENV !== 'development') { console.log("请求地址:" + this.url, this.data) } weixin.request({ url: this.url, method: this.method, data: this.data, header: this.header, success: res => { if (this.afterRequest) { this.afterRequest(res) } }, fail: err => { reject(err) }, complete: res => { resolve(res.data) }, }) }) } } const request = new Request() /** * 创建请求 * @param baseURL */ request.baseUrl = process.env.BASE_API request.config = { retry: 3, retryDelay: 1000, timeout: 50000, } request.beforeRequest = _request => { _request.header['Language-Set'] = getLocale() _request.header['X-Requested-With'] = 'XMLHttpRequest' const apiToken = getToken() if (apiToken) { _request.header.token = `${apiToken}` } } request.afterRequest = response => { if (process.env.NODE_ENV !== 'development') { console.log("返回数据", response) } if (response.header && response.header['authorization']) { // 刷新token const token = response.header['authorization'].replace('Bearer ', '') if (token !== store.getters.token) { store.commit('SET_TOKEN', token) } } const res = response.data if (res.code !== 0) { if (res.code === 401) { if (res.message === 'Token has expired') { res.message = '登录超时' } store.dispatch('fedLogOut').then(() => { uni.navigateTo({ url: '/pages/user/login' }) }) } else { uni.showModal({ content: res.message || 'Error', success(r) { if (r.confirm) { } else if (r.cancel) { } } }) } return Promise.reject(new Error(res.message || 'Error')) } else { return res } } export default request /** * GET请求 * @param {Object} url * @param {Object} params */ export const get = (url) => (params,baseUrl=null) => { if (baseUrl) { request.baseUrl = baseUrl } return request.get(url, params) } /** * POST请求 * @param {Object} url * @param {Object} params */ export const post = (url) => (params,baseUrl=null) => { if (baseUrl) { request.baseUrl = baseUrl } return request.post(url, params) } export const link = (url) => { return process.env.BASE_API + url } export const upload = (url) => (params) => { return new Promise((resolve, reject) => { uni.uploadFile({ url: process.env.BASE_API + url, filePath: params.filePath, name: params.name || 'file', header: { 'X-Requested-With': 'XMLHttpRequest', 'token': getToken(), 'Content-Type': 'application/json;charset=UTF-8' }, success(res) { if (res.data) { try { res.data = JSON.parse(res.data) resolve(res.data) return } catch(e) {} } uni.showToast({ icon: 'error', title: '上传文件失败' }) }, fail(error) { uni.showToast({ icon: 'none', title: error.message }) reject(error) } }) }) }