long
2024-05-13 6e089f294207e13459ad872a2fb6e701721f5506
src/utils/jun_httpEvent.js
@@ -1,6 +1,6 @@
/**
 * http事件委托
 *
 *
 * udData 说明
 * udData.noloading 不需要请求
 * udData.fullData 使用 reponse 返回的对象进行 success 回调 (jun_http.js)
@@ -11,13 +11,29 @@
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
}
/**
@@ -39,65 +55,80 @@
// }
// 开始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 // 登录请求次数
@@ -109,268 +140,272 @@
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
}