| | |
| | | /** |
| | | * http事件委托 |
| | | * |
| | | * |
| | | * udData 说明 |
| | | * udData.noloading 不需要请求 |
| | | * udData.fullData 使用 reponse 返回的对象进行 success 回调 (jun_http.js) |
| | |
| | | import Login from './jun_login' |
| | | // import { MessageBox, Message, Loading } from 'element-ui' |
| | | import fn from './fn' |
| | | import xioFn from '../utils/xio_fn.js' |
| | | import resStatusCode from './jun_httpStatus' |
| | | // 过滤 html |
| | | function filterHtml (str) { |
| | | if (typeof str !== 'string') { |
| | | return str |
| | | function filterHtml(str) { |
| | | if (typeof str !== 'string') { |
| | | return str |
| | | } |
| | | return str.replace(/\n|\t|\s/g, '').replace(/<script\s?.+><\/script>/g, '').replace(/<[^>]+>/g, '') |
| | | } |
| | | // 对象转url参数 |
| | | function urlEncode(param, key, encode) { |
| | | if (param == null) return '' |
| | | var paramStr = '' |
| | | var t = typeof (param) |
| | | if (t === 'string' || t === 'number' || t === 'boolean') { |
| | | paramStr += '&' + key + '=' + ((encode == null || encode) ? encodeURIComponent(param) : param) |
| | | } else { |
| | | for (var i in param) { |
| | | var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i) |
| | | paramStr += urlEncode(param[i], k, encode) |
| | | } |
| | | return str.replace(/\n|\t|\s/g, '').replace(/<script\s?.+><\/script>/g, '').replace(/<[^>]+>/g, '') |
| | | }screenLeft |
| | | return paramStr |
| | | } |
| | | |
| | | /** |
| | |
| | | // } |
| | | |
| | | // 开始loading |
| | | function startLoading(request_option){ |
| | | // |
| | | // console.log(request_option.udData) |
| | | // request_option.udData && typeof request_option.udData.loading === 'function' && request_option.udData.loading() |
| | | typeof window.appLoading === 'function' && window.appLoading() |
| | | function startLoading(__request_option) { |
| | | // console.log(request_option.udData) |
| | | // request_option.udData && typeof request_option.udData.loading === 'function' && request_option.udData.loading() |
| | | typeof window.appLoading === 'function' && window.appLoading() |
| | | } |
| | | |
| | | // 结束loading |
| | | function endLoading(request_option){ |
| | | // |
| | | // request_option.udData && typeof request_option.udData.hideLoading === 'function' && request_option.udData.hideLoading() |
| | | typeof window.appHideLoading === 'function' && window.appHideLoading() |
| | | function endLoading(_request_option) { |
| | | // request_option.udData && typeof request_option.udData.hideLoading === 'function' && request_option.udData.hideLoading() |
| | | typeof window.appHideLoading === 'function' && window.appHideLoading() |
| | | } |
| | | |
| | | // 请求前处理参数 - get |
| | | function getChangeRequestOption (get_option) { |
| | | if (!get_option.udData || !get_option.udData.nokey) { |
| | | if (!get_option.params) { |
| | | get_option.params = {} |
| | | } |
| | | // 补充参数 |
| | | // 需要 we_session |
| | | var we_session = fn.getLocalStorage('we_session') |
| | | if (we_session && we_session.we_session) { |
| | | get_option.params.key = we_session.we_session |
| | | get_option.params.mpToken = we_session.we_session |
| | | } |
| | | } |
| | | return get_option |
| | | function getChangeRequestOption(get_option) { |
| | | get_option = xioFn.httpOptionMd5Handle(get_option) |
| | | if (!get_option.udData || !get_option.udData.nokey) { |
| | | if (!get_option.params) { |
| | | get_option.params = {} |
| | | } |
| | | // 补充参数 |
| | | // 需要 we_session |
| | | var we_session = fn.getLocalStorage('we_session') |
| | | if (we_session && we_session.we_session) { |
| | | get_option.params.key = we_session.we_session |
| | | get_option.params.mpToken = we_session.we_session |
| | | } |
| | | } |
| | | return get_option |
| | | } |
| | | // 请求前处理参数 - post |
| | | function postChangeRequestOption (post_option) { |
| | | if (!post_option.udData || !post_option.udData.nokey) { |
| | | if (!post_option.data) { |
| | | post_option.data = {} |
| | | } |
| | | // 补充参数 |
| | | // 需要 we_session |
| | | var we_session = fn.getLocalStorage('we_session') |
| | | if (we_session && we_session.we_session) { |
| | | post_option.data.key = we_session.we_session |
| | | post_option.data.mpToken = we_session.we_session |
| | | } |
| | | } |
| | | return post_option |
| | | function postChangeRequestOption(post_option) { |
| | | // console.log('============================>', post_option) |
| | | // adminToken |
| | | // var adminToken = fn.getSessionStorage('adminToken') |
| | | // var urlEncodes = {} |
| | | // if (adminToken && (!post_option.udData || !post_option.udData.nokey)) { |
| | | // urlEncodes = { adminToken: adminToken, mpToken: adminToken } |
| | | // } |
| | | // // // 将请求参数放到链接后面 |
| | | // var paramsUrl = urlEncode(urlEncodes) |
| | | // if (!/\?/.test(post_option.url)) { |
| | | // paramsUrl = paramsUrl.replace('&', '?') |
| | | // } |
| | | // post_option.url = post_option.url + paramsUrl |
| | | |
| | | // 请求头md5处理 |
| | | post_option = xioFn.httpOptionMd5Handle(post_option) |
| | | if (!post_option.udData || !post_option.udData.nokey) { |
| | | if (!post_option.data) { |
| | | post_option.data = {} |
| | | } |
| | | // 补充参数 |
| | | // 需要 we_session |
| | | var we_session = fn.getLocalStorage('we_session') |
| | | if (we_session && we_session.we_session) { |
| | | post_option.data.key = we_session.we_session |
| | | post_option.data.mpToken = we_session.we_session |
| | | } |
| | | } |
| | | return post_option |
| | | } |
| | | |
| | | var httpEventCode = { |
| | | code200 (data) { |
| | | // console.log(data, 200) |
| | | }, |
| | | code404 (data, url) { |
| | | // element-ui |
| | | // Message.error('无法访问接口,状态404:' + url) |
| | | }, |
| | | code500 (data, url) { |
| | | // element-ui |
| | | // Message.error('请求失败,状态500:' + url) |
| | | } |
| | | code200() { |
| | | // console.log(data, 200) |
| | | }, |
| | | code404(_url) { |
| | | // element-ui |
| | | // Message.error('无法访问接口,状态404:' + url) |
| | | }, |
| | | code500(_data, __url) { |
| | | // element-ui |
| | | // Message.error('请求失败,状态500:' + url) |
| | | } |
| | | } |
| | | |
| | | var g_login_counter = 0 // 登录请求次数 |
| | |
| | | var g_flag_config_requested = false // 其余配置请求 |
| | | var g_config_result = null // 配置请求返回 |
| | | // 请求前 |
| | | function beforeRequest (res) { |
| | | // 开启loading |
| | | if (!g_flag_loading && (!res.request_option.udData || !res.request_option.udData.noLoading)) { |
| | | res.http_option.debug && console.log('jun_httpEvent beforeRequest loading') |
| | | // wx.showLoading({ |
| | | // title: '加载中', |
| | | // mask: true |
| | | // }) |
| | | // loading |
| | | startLoading(res.request_option) |
| | | g_flag_loading = true |
| | | } |
| | | function beforeRequest(res) { |
| | | // 开启loading |
| | | if (!g_flag_loading && (!res.request_option.udData || !res.request_option.udData.noLoading)) { |
| | | res.http_option.debug && console.log('jun_httpEvent beforeRequest loading') |
| | | // wx.showLoading({ |
| | | // title: '加载中', |
| | | // mask: true |
| | | // }) |
| | | // loading |
| | | startLoading(res.request_option) |
| | | g_flag_loading = true |
| | | } |
| | | |
| | | // 重置登录请求标记 |
| | | var we_session = fn.getLocalStorage('we_session') |
| | | if (we_session && we_session.we_session) { |
| | | g_flag_login_requested = false |
| | | } |
| | | // 重置登录请求标记 |
| | | var we_session = fn.getLocalStorage('we_session') |
| | | if (we_session && we_session.we_session) { |
| | | g_flag_login_requested = false |
| | | } |
| | | } |
| | | |
| | | // 请求后 |
| | | function afterRequest (res) { |
| | | // console.log('请求后') |
| | | function afterRequest(_res) { |
| | | // console.log('请求后') |
| | | } |
| | | |
| | | // 处理返回数据 |
| | | // @return {Object} 处理过的数据 |
| | | function successChangeData (res) { |
| | | return res |
| | | function successChangeData(res) { |
| | | return res |
| | | } |
| | | |
| | | // 批量请求完成 |
| | | function afterMultiRequests (request_option) { |
| | | // console.log("多个请求结束之后") |
| | | // 关闭loading |
| | | if (g_flag_loading) { |
| | | // wx.hideLoading() |
| | | endLoading(request_option) |
| | | g_flag_loading = false |
| | | } |
| | | function afterMultiRequests(request_option) { |
| | | // console.log("多个请求结束之后") |
| | | // 关闭loading |
| | | if (g_flag_loading) { |
| | | // wx.hideLoading() |
| | | endLoading(request_option) |
| | | g_flag_loading = false |
| | | } |
| | | } |
| | | |
| | | function updateKey (res, key) { |
| | | // 更新 key 值 |
| | | if (res.request_option.method === 'GET' && (!res.request_option.udData || !res.request_option.udData.nokey)) { |
| | | res.request_option.url = res.request_option.url.replace(/mpToken=[^&]*/g, `mpToken=${key}`) |
| | | } |
| | | if (res.request_option.method === 'POST' && (!res.request_option.udData || !res.request_option.udData.nokey)) { |
| | | res.request_option.data.mpToken = key |
| | | } |
| | | return res |
| | | function updateKey(res, key) { |
| | | // 更新 key 值 |
| | | if (res.request_option.method === 'GET' && (!res.request_option.udData || !res.request_option.udData.nokey)) { |
| | | res.request_option.url = res.request_option.url.replace(/mpToken=[^&]*/g, `mpToken=${key}`) |
| | | } |
| | | if (res.request_option.method === 'POST' && (!res.request_option.udData || !res.request_option.udData.nokey)) { |
| | | res.request_option.data.mpToken = key |
| | | } |
| | | return res |
| | | } |
| | | |
| | | // 模拟数据处理流程 |
| | | function mockFlow (res) { |
| | | return new Promise(async (resolve, reject) => { |
| | | // 打印请求信息 |
| | | res.http_option.debug && console.log('模拟请求', res.request_option) |
| | | function mockFlow(res) { |
| | | return new Promise(async(resolve, _reject) => { |
| | | // 打印请求信息 |
| | | res.http_option.debug && console.log('模拟请求', res.request_option) |
| | | |
| | | var mockData = res.request_option.mockData || {code: 100, data: {}, message: 'success'} |
| | | var mockData = res.request_option.mockData || { code: 100, data: {}, message: 'success' } |
| | | |
| | | // 打印返回信息 |
| | | res.http_option.debug && console.log('模拟返回', {data: mockData}) |
| | | res.http_option.debug && console.log('开始模拟等待800ms') |
| | | var timer = setTimeout(()=>{ |
| | | clearTimeout(timer) |
| | | // 关闭loading |
| | | if (g_flag_loading) { |
| | | // wx.hideLoading() |
| | | endLoading(res.request_option) |
| | | g_flag_loading = false |
| | | } |
| | | res.http_option.debug && console.log('结束模拟等待800ms') |
| | | if (res.request_option.udData && res.request_option.fullData) { |
| | | resolve({data: mockData}) |
| | | } else { |
| | | resolve(mockData) |
| | | } |
| | | }, 800) |
| | | }) |
| | | // 打印返回信息 |
| | | res.http_option.debug && console.log('模拟返回', { data: mockData }) |
| | | res.http_option.debug && console.log('开始模拟等待800ms') |
| | | var timer = setTimeout(() => { |
| | | clearTimeout(timer) |
| | | // 关闭loading |
| | | if (g_flag_loading) { |
| | | // wx.hideLoading() |
| | | endLoading(res.request_option) |
| | | g_flag_loading = false |
| | | } |
| | | res.http_option.debug && console.log('结束模拟等待800ms') |
| | | if (res.request_option.udData && res.request_option.fullData) { |
| | | resolve({ data: mockData }) |
| | | } else { |
| | | resolve(mockData) |
| | | } |
| | | }, 800) |
| | | }) |
| | | } |
| | | |
| | | // 请求前处理流程 |
| | | function beforeFlow (res) { |
| | | return new Promise(async (resolve, reject) => { |
| | | // 预留请求前处理 |
| | | // 设置为true,下次处理跳过 beforeFlow,避免死循环 |
| | | res.request_option.skip_before_flow = true |
| | | // 再次请求 |
| | | resolve(res.Request(res.request_option)) |
| | | }) |
| | | function beforeFlow(res) { |
| | | return new Promise(async(resolve) => { |
| | | // 预留请求前处理 |
| | | // 设置为true,下次处理跳过 beforeFlow,避免死循环 |
| | | res.request_option.skip_before_flow = true |
| | | // 再次请求 |
| | | resolve(res.Request(res.request_option)) |
| | | }) |
| | | } |
| | | |
| | | // 预留其余处理 |
| | | function configRequest(){ |
| | | return new Promise((resolve, reject) => { |
| | | resolve({}) |
| | | }) |
| | | function configRequest() { |
| | | return new Promise((resolve, reject) => { |
| | | resolve({}) |
| | | }) |
| | | } |
| | | |
| | | // 登录处理 |
| | | function appLogin (option={}) { |
| | | return new Promise((resolve, reject) => { |
| | | // Login.checkLogin({ |
| | | // force: !!option.forceLogin, |
| | | // callback: (key)=>{ |
| | | // resolve(key) |
| | | // } |
| | | // }) |
| | | Login.toLongUrl() |
| | | }) |
| | | function appLogin(option = {}) { |
| | | return new Promise((resolve, reject) => { |
| | | // Login.checkLogin({ |
| | | // force: !!option.forceLogin, |
| | | // callback: (key)=>{ |
| | | // resolve(key) |
| | | // } |
| | | // }) |
| | | Login.toLongUrl() |
| | | }) |
| | | } |
| | | |
| | | // 请求后处理 |
| | | function afterFlow (res) { |
| | | return new Promise((resolve, reject)=>{ |
| | | var data = res.res.data |
| | | |
| | | // 登录超时 |
| | | if ( |
| | | (data && data.res && data.res.status == 2) |
| | | || (data && data.code == 603) |
| | | ) { |
| | | res.http_option.debug && console.log('登录超时,需要重新登录', res.res) |
| | | // 登录超时,需要重新登录 |
| | | // 清空we_session |
| | | // getApp().globalData.we_session = null |
| | | fn.removeLocalStorage('we_session') |
| | | resolve(retryLogin(res)) |
| | | return |
| | | } |
| | | function afterFlow(res) { |
| | | return new Promise((resolve, reject) => { |
| | | var data = res.res.data |
| | | // console.log('0000000000000000000', res) |
| | | // 登录超时 |
| | | if ( |
| | | (data && data.res && data.res.status == 2) || |
| | | (data && data.code == 603) |
| | | ) { |
| | | res.http_option.debug && console.log('登录超时,需要重新登录', res.res) |
| | | // 登录超时,需要重新登录 |
| | | // 清空we_session |
| | | // getApp().globalData.we_session = null |
| | | // fn.removeLocalStorage('we_session') |
| | | // resolve(retryLogin(res)) |
| | | // todo |
| | | // // 清空登录凭证和用户数据 |
| | | // sessionStorage.clear() |
| | | // // 未登录,跳转登录页面 |
| | | // this.$router.replace({ path: '/login' }) |
| | | return |
| | | } |
| | | |
| | | // status不为0 |
| | | if ( |
| | | (data && data.res && data.res.status != 0) |
| | | || (data && data.code != 100) |
| | | ) { |
| | | if (data.res) { |
| | | console.error('status不为0:' + (res.res.errMsg || ''), res.res) |
| | | // 弹出提示 |
| | | // wx.showModal({ |
| | | // title: '请求提示', |
| | | // content: data.res.errMsg || `请求有误,status=${data.res.status}`, |
| | | // confirmText: '确定', |
| | | // confirmColor: '#576B95', |
| | | // showCancel: false |
| | | // }) |
| | | |
| | | // element-ui |
| | | // Message.error(data.res.errMsg || `请求有误,status=${data.res.status}`) |
| | | |
| | | // 根据status处理 |
| | | if (typeof resStatusCode['status' + data.res.status] === 'function') { |
| | | resStatusCode['status' + data.res.status](data) |
| | | } |
| | | } |
| | | // status不为0 |
| | | if ( |
| | | (data && data.res && data.res.status != 0) || |
| | | (data && data.code != 100) |
| | | ) { |
| | | if (data.res) { |
| | | console.error('status不为0:' + (res.res.errMsg || ''), res.res) |
| | | // 弹出提示 |
| | | // wx.showModal({ |
| | | // title: '请求提示', |
| | | // content: data.res.errMsg || `请求有误,status=${data.res.status}`, |
| | | // confirmText: '确定', |
| | | // confirmColor: '#576B95', |
| | | // showCancel: false |
| | | // }) |
| | | |
| | | if (typeof data.code !== 'undefined') { |
| | | console.error('code不为100:' + data.code, data.msg, res.res) |
| | | } |
| | | // element-ui |
| | | // Message.error(data.res.errMsg || `请求有误,status=${data.res.status}`) |
| | | |
| | | reject(res.res) |
| | | return |
| | | } |
| | | |
| | | // 根据status处理 |
| | | if (typeof resStatusCode['status' + data.res.status] === 'function') { |
| | | resStatusCode['status' + data.res.status](data) |
| | | } |
| | | } |
| | | |
| | | // status为空 |
| | | if (data && !data.res && typeof data.code === 'undefined') { |
| | | console.error('status为空', res.res) |
| | | let tips = '' |
| | | if (res.res.statusCode=='500') { |
| | | tips = '当前网络状态不佳,请稍后再试:statusCode=500;' |
| | | } else if (res.res.statusCode=='200') { |
| | | if (typeof res.data === 'string') { |
| | | tips = filterHtml(res.data) |
| | | } |
| | | if (typeof res.data === 'object') { |
| | | tips = filterHtml(JSON.stringify(res.data)) |
| | | } |
| | | tips = '网络状况不佳,点击确定重试:statusCode=200;' + tips |
| | | } else { |
| | | tips = `连接服务器失败,点击确定重试:statusCode=${res.res.statusCode};` |
| | | } |
| | | // 请求提示 |
| | | if (typeof data.code !== 'undefined') { |
| | | console.error('code不为100:' + data.code, data.msg, res.res) |
| | | } |
| | | |
| | | // 小程序 |
| | | // wx.showModal({ |
| | | // title: '请求提示', |
| | | // content: tips, |
| | | // confirmText: '确定', |
| | | // confirmColor: '#576B95', |
| | | // showCancel: false, |
| | | // success (res) { |
| | | // if (res.confirm) { |
| | | // // 点击确认后重新请求 |
| | | // resolve(res.Request(res.request_option)) |
| | | // } |
| | | // } |
| | | // }) |
| | | reject(res.res) |
| | | return |
| | | } |
| | | |
| | | // element-ui |
| | | // MessageBox.alert(tips, '网络提示', { |
| | | // confirmButtonText: '确定', |
| | | // type: 'error' |
| | | // }).then(()=>{ |
| | | // resolve(res.Request(res.request_option)) |
| | | // }).catch(()=>{ |
| | | // // 点击取消 |
| | | // }) |
| | | return |
| | | } |
| | | // status为空 |
| | | if (data && !data.res && typeof data.code === 'undefined') { |
| | | console.error('status为空', res.res) |
| | | let tips = '' |
| | | if (res.res.statusCode == '500') { |
| | | tips = '当前网络状态不佳,请稍后再试:statusCode=500;' |
| | | } else if (res.res.statusCode == '200') { |
| | | if (typeof res.data === 'string') { |
| | | tips = filterHtml(res.data) |
| | | } |
| | | if (typeof res.data === 'object') { |
| | | tips = filterHtml(JSON.stringify(res.data)) |
| | | } |
| | | tips = '网络状况不佳,点击确定重试:statusCode=200;' + tips |
| | | } else { |
| | | tips = `连接服务器失败,点击确定重试:statusCode=${res.res.statusCode};` |
| | | } |
| | | // 请求提示 |
| | | |
| | | // 打印返回信息 |
| | | res.http_option.debug && console.log('返回', res.res) |
| | | if (res.request_option.udData) { |
| | | // 返回全部数据 |
| | | if (res.request_option.udData.fullData === true) { |
| | | resolve(res.res) |
| | | } |
| | | } |
| | | g_login_counter && (g_login_counter = 0) |
| | | resolve(data) |
| | | }) |
| | | // 小程序 |
| | | // wx.showModal({ |
| | | // title: '请求提示', |
| | | // content: tips, |
| | | // confirmText: '确定', |
| | | // confirmColor: '#576B95', |
| | | // showCancel: false, |
| | | // success (res) { |
| | | // if (res.confirm) { |
| | | // // 点击确认后重新请求 |
| | | // resolve(res.Request(res.request_option)) |
| | | // } |
| | | // } |
| | | // }) |
| | | |
| | | // element-ui |
| | | // MessageBox.alert(tips, '网络提示', { |
| | | // confirmButtonText: '确定', |
| | | // type: 'error' |
| | | // }).then(()=>{ |
| | | // resolve(res.Request(res.request_option)) |
| | | // }).catch(()=>{ |
| | | // // 点击取消 |
| | | // }) |
| | | return |
| | | } |
| | | |
| | | // 打印返回信息 |
| | | res.http_option.debug && console.log('返回', res.res) |
| | | if (res.request_option.udData) { |
| | | // 返回全部数据 |
| | | if (res.request_option.udData.fullData === true) { |
| | | resolve(res.res) |
| | | } |
| | | } |
| | | g_login_counter && (g_login_counter = 0) |
| | | resolve(data) |
| | | }) |
| | | } |
| | | |
| | | // 重新登录 |
| | | async function retryLogin (res) { |
| | | // 次数+1 |
| | | g_login_counter++ |
| | | return new Promise(async (resolve, reject) => { |
| | | // 等待登录 |
| | | var login_result = await appLogin({forceLogin: true}) |
| | | // 登录失败 |
| | | if (!login_result && g_login_counter < g_LOGIN_MAX) { |
| | | // 2秒后重试 |
| | | var timer = setTimeout(()=>{ |
| | | clearTimeout(timer) |
| | | resolve(retryLogin(res)) |
| | | }, 2000) |
| | | } |
| | | // 登录成功 |
| | | if (login_result) { |
| | | // 更新key值 |
| | | res = updateKey(res, login_result) |
| | | // 再次请求 |
| | | resolve(res.Request(res.request_option)) |
| | | } |
| | | }) |
| | | async function retryLogin(res) { |
| | | // 次数+1 |
| | | g_login_counter++ |
| | | return new Promise(async(resolve, _reject) => { |
| | | // 等待登录 |
| | | var login_result = await appLogin({ forceLogin: true }) |
| | | // 登录失败 |
| | | if (!login_result && g_login_counter < g_LOGIN_MAX) { |
| | | // 2秒后重试 |
| | | var timer = setTimeout(() => { |
| | | clearTimeout(timer) |
| | | resolve(retryLogin(res)) |
| | | }, 2000) |
| | | } |
| | | // 登录成功 |
| | | if (login_result) { |
| | | // 更新key值 |
| | | res = updateKey(res, login_result) |
| | | // 再次请求 |
| | | resolve(res.Request(res.request_option)) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | export default { |
| | | httpEventCode, |
| | | |
| | | getChangeRequestOption, |
| | | postChangeRequestOption, |
| | | successChangeData, |
| | | httpEventCode, |
| | | |
| | | beforeRequest, |
| | | afterRequest, |
| | | afterMultiRequests, |
| | | getChangeRequestOption, |
| | | postChangeRequestOption, |
| | | successChangeData, |
| | | |
| | | mockFlow, |
| | | beforeFlow, |
| | | afterFlow, |
| | | } |
| | | beforeRequest, |
| | | afterRequest, |
| | | afterMultiRequests, |
| | | |
| | | mockFlow, |
| | | beforeFlow, |
| | | afterFlow |
| | | } |