request.js 2.5 KB

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