request.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import {baseApiUrl} from './config.js'
  2. import {apiWechatLogin} from '@/api/user'
  3. import CryptoJS from './crypto'
  4. import store from '@/store/index'
  5. const ENV=uni.getAccountInfoSync().miniProgram
  6. // 请求错误消息提示
  7. const showError=error=>{
  8. let errMsg=''
  9. switch(error.code){
  10. case 400:
  11. errMsg=error.msg;
  12. break;
  13. default:
  14. errMsg=error.msg;
  15. break;
  16. }
  17. setTimeout(()=>{
  18. uni.showToast({
  19. title:errMsg,
  20. icon:'none'
  21. })
  22. },0)
  23. }
  24. // 微信登录
  25. const wechatLogin=()=>{
  26. return new Promise((resolve,reject)=>{
  27. uni.login({
  28. provider: 'weixin',
  29. success: function (loginRes) {
  30. apiWechatLogin({code:loginRes.code}).then(res=>{
  31. if(res.code===200){
  32. store.commit('setToken', res.data.authorization)
  33. store.dispatch('getUserInfo')
  34. resolve(res.data)
  35. }
  36. })
  37. },
  38. fail:function(loginErr){
  39. uni.showToast({
  40. title:"微信登录失败",
  41. icon:"none"
  42. })
  43. }
  44. })
  45. })
  46. }
  47. let requestList=[]//存放token失效时请求队列
  48. let isRefreshing=false//是否正在刷新token
  49. /**
  50. * 刷新token
  51. */
  52. const refreshToken=async (url,params,method,resolve)=>{
  53. requestList.push(()=>{resolve(http(url,params,method))})
  54. if(!isRefreshing){
  55. isRefreshing=true
  56. const wechatLoginRes=await wechatLogin()
  57. console.log(wechatLoginRes);
  58. // if(!wechatLoginRes.is_bind){
  59. // uni.reLaunch({
  60. // url:'/pages/login'
  61. // })
  62. // isRefreshing=false
  63. // return
  64. // }
  65. // 重新请求队列
  66. requestList.map(MT=>{MT()})
  67. requestList=[]
  68. isRefreshing=false
  69. }
  70. }
  71. let LOADINGCOUNT = 0;// 请求数
  72. const http=(url,params,method)=>{
  73. // 设置loading
  74. if(url!='/public/get_share_poster'){
  75. if (LOADINGCOUNT === 0) {
  76. uni.showLoading({
  77. title:'加载中...'
  78. })
  79. }
  80. LOADINGCOUNT++;
  81. }
  82. return new Promise((resolve,reject)=>{
  83. uni.request({
  84. url:baseApiUrl+url,
  85. data:params,
  86. method:method,
  87. header:{
  88. Authorization:store.state.user.token,
  89. version:'yb11.6'
  90. },
  91. success(e) {
  92. // 接口404
  93. if(e.statusCode===404){
  94. setTimeout(()=>{
  95. uni.showToast({
  96. title:'network:404',
  97. icon:'none'
  98. })
  99. },0)
  100. return
  101. }
  102. let res
  103. if(ENV.envVersion==='release'){
  104. res=JSON.parse(CryptoJS.Des3Decrypt(e.data));//解密
  105. }else{
  106. res=e.data
  107. }
  108. if(res.code!==200&&res.code!==403&&res.code!==4001&&res.code!==401){
  109. showError(res)
  110. }
  111. // 401 token失效
  112. if(res.code===401){
  113. refreshToken(url,params,method,resolve)
  114. return
  115. }
  116. resolve(res)
  117. },
  118. fail(error) {
  119. console.log(error);
  120. setTimeout(()=>{
  121. uni.showToast({
  122. title:'网络异常,稍后重试!',
  123. icon:'none'
  124. })
  125. },0)
  126. },
  127. complete() {
  128. // 关闭loading
  129. LOADINGCOUNT--;
  130. if (LOADINGCOUNT === 0) {
  131. uni.hideLoading()
  132. }
  133. }
  134. })
  135. })
  136. }
  137. // get 请求
  138. export const httpGet=(url,params)=>{
  139. return http(url,params,'GET')
  140. }
  141. // post 请求
  142. export const httpPost=(url,params)=>{
  143. return http(url,params,'POST')
  144. }