service.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import Request from 'luch-request'
  2. // let baseURL = 'https://ldt.guosen-fumao.cn/api/'
  3. let baseURL = 'http://192.168.1.168:2366/'
  4. let refreshTokenUrl = baseURL + "blade-auth/oauth/token"
  5. //获取token
  6. const getTokenStorage = () => {
  7. let token = ''
  8. try {
  9. token = uni.getStorageSync('token')
  10. } catch (e) {}
  11. return token
  12. }
  13. //缓存token信息
  14. const cacheToken = (data) => {
  15. let tokenInfo = {
  16. accessToken: data.access_token,
  17. //提前500秒过期
  18. expiresIn: new Date().getTime() + (data.expires_in - 500) * 1000,
  19. refreshToken: data.refresh_token,
  20. tenantId: data.tenant_id,
  21. nickName: data.nick_name
  22. }
  23. uni.setStorageSync('token', data.access_token)
  24. uni.setStorageSync('tokenInfo', tokenInfo)
  25. }
  26. const http = new Request()
  27. http.setConfig((config) => {
  28. /* 设置全局配置 */
  29. config.baseURL = baseURL /* 根域名不同 */
  30. config.header = {
  31. ...config.header,
  32. }
  33. return config
  34. })
  35. http.interceptors.request.use((config) => {
  36. /* 请求之前拦截器。可以使用async await 做异步操作 */
  37. config.header = {
  38. ...config.header,
  39. Authorization: "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
  40. "Blade-Auth": getTokenStorage()
  41. }
  42. return config
  43. }, (config) => {
  44. return Promise.reject(config)
  45. })
  46. // 是否正在刷新的标记
  47. let isRefreshing = false
  48. // 重试队列,每一项将是一个待执行的函数形式
  49. let requests = []
  50. http.interceptors.response.use(async (response) => {
  51. /* 请求之后拦截器。可以使用async await 做异步操作 */
  52. //toekn过期处理
  53. //200 返回数据成功 0
  54. if (response.data.code != 200) {
  55. uni.showToast({
  56. icon: 'none',
  57. title: response.data.msg
  58. })
  59. return Promise.reject(response)
  60. }
  61. return response.data
  62. }, async (err) => { // 请求错误做点什么
  63. if (err.data.code == 401) {
  64. let {
  65. config
  66. } = err
  67. if (!isRefreshing) {
  68. isRefreshing = true
  69. let tokenInfo = uni.getStorageSync('tokenInfo')
  70. let [, res] = await uni.request({
  71. url: refreshTokenUrl,
  72. method: 'POST',
  73. header: {
  74. 'Authorization': "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
  75. 'Content-Type': 'application/x-www-form-urlencoded',
  76. 'Tenant-Id': tokenInfo.tenantId
  77. },
  78. data: {
  79. 'tenantId': tokenInfo.tenantId,
  80. 'refresh_token': tokenInfo.refreshToken,
  81. 'grant_type': "refresh_token",
  82. 'scope': "all",
  83. }
  84. })
  85. if (res.data && res.data.error_description=="用户名或密码不正确") {
  86. uni.clearStorage()
  87. uni.reLaunch({
  88. url:"/pages/login/account-login"
  89. })
  90. // uni.showModal({
  91. // title:"提示",
  92. // content:"登录失败",
  93. // showCancel:false,
  94. // success: (res) => {
  95. // if (res.confirm) {
  96. // uni.clearStorage()
  97. // uni.reLaunch({
  98. // url:"/pages/login/account-login"
  99. // })
  100. // }
  101. // }
  102. // })
  103. return
  104. }
  105. //否则保存新的token
  106. cacheToken(res.data)
  107. requests.forEach(cb => cb())
  108. // 重试完了清空这个队列
  109. requests = []
  110. isRefreshing = false
  111. return http.request(config)
  112. } else {
  113. return new Promise((resolve) => {
  114. // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
  115. requests.push(() => {
  116. resolve(http.request(config))
  117. })
  118. })
  119. }
  120. }
  121. if (err.data.code == 500) {
  122. uni.showToast({
  123. title: err.data.msg,
  124. icon: "none"
  125. })
  126. return Promise.reject(err)
  127. }
  128. if (!err.data.success) {
  129. uni.showToast({
  130. title: err.data.msg,
  131. icon: "none"
  132. })
  133. return err.data
  134. } else {
  135. return err.data
  136. }
  137. })
  138. export {
  139. http
  140. }