Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

150 wiersze
4.0 KiB

  1. import config from './config.js'
  2. import { clearAuth } from './auth.js'
  3. import { guid, getNonce, getVersion, getClient, isLoginTop } from './util.js'
  4. let BASE_URL = config.BASE_URL
  5. // #ifdef H5
  6. // H5 通过 manifest.json 的 devServer.proxy 代理到 /api,规避跨域
  7. BASE_URL = '/api'
  8. // #endif
  9. function clearLoginState() {
  10. clearAuth()
  11. // 动态引入避免和 Pinia store 形成循环依赖;storage 先同步清掉,页面状态随后刷新。
  12. import('@/store/user.js').then(({ useUserStore }) => {
  13. useUserStore().clear()
  14. }).catch(() => {})
  15. }
  16. function normalizeResponse(response) {
  17. // uni-app Promise 形式在部分端可能返回 [err, res],这里保留兼容;
  18. // 主流程已改用 success/fail callback,避免小程序端 response.data 解析不稳定。
  19. if (Array.isArray(response)) {
  20. const [err, res] = response
  21. if (err) throw err
  22. return res || {}
  23. }
  24. return response || {}
  25. }
  26. /**
  27. * 统一请求封装(沿用旧版鉴权约定)
  28. * - 自动附加 token / uid / mac / client / source / version 等公共参数
  29. * - 响应 code===0 视为成功;code===1009 登录失效,清空登录态并跳转登录
  30. * @param {{ url: string, method?: string, params?: object, headers?: object, loading?: boolean, authSilent?: boolean }} options
  31. */
  32. export default function request({
  33. url = '',
  34. method = 'GET',
  35. params = {},
  36. headers = {},
  37. loading = false,
  38. authSilent = false
  39. } = {}) {
  40. const fullUrl = BASE_URL + url
  41. const timestamp = parseInt(Date.now() / 1000)
  42. const token = uni.getStorageSync('token')
  43. const uid = uni.getStorageSync('open_id')
  44. let mac = uni.getStorageSync('mac')
  45. const source = uni.getStorageSync('source') || ''
  46. if (!mac) {
  47. const sysInfo = uni.getSystemInfoSync()
  48. mac = sysInfo.deviceId || guid()
  49. uni.setStorageSync('mac', mac)
  50. }
  51. const { timeStr, nonce } = getNonce()
  52. const { version, version_code } = getVersion()
  53. const header = Object.assign(
  54. {
  55. 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
  56. timestr: timeStr,
  57. nonce
  58. },
  59. headers
  60. )
  61. if (token) header.token = token
  62. let data = {
  63. token,
  64. uid,
  65. mac,
  66. base_timestamp: timestamp,
  67. client: getClient(),
  68. source,
  69. client_ios: uni.getSystemInfoSync().platform === 'ios' ? 1 : 0,
  70. version,
  71. version_code,
  72. ...params
  73. }
  74. // 去除空字符串字段
  75. Object.keys(data).forEach((k) => {
  76. if (data[k] === '') delete data[k]
  77. })
  78. if (loading) uni.showLoading({ mask: true, title: '加载中...' })
  79. return new Promise((resolve, reject) => {
  80. const finish = () => {
  81. if (loading) uni.hideLoading()
  82. }
  83. const handleResponse = (response) => {
  84. const normalized = normalizeResponse(response)
  85. const res = (normalized && normalized.data) || {}
  86. if (res.code === 0) {
  87. resolve(res)
  88. return
  89. }
  90. if (res.code === 1009) {
  91. clearLoginState()
  92. if (authSilent) {
  93. resolve({
  94. code: 0,
  95. data: { authExpired: true },
  96. list: [],
  97. msg: '',
  98. authExpired: true,
  99. raw: res
  100. })
  101. return
  102. }
  103. if (!isLoginTop()) {
  104. let loginUrl = '/pages/login/login'
  105. // #ifdef H5
  106. loginUrl += `?redirect=${encodeURIComponent(location.pathname + location.search)}`
  107. // #endif
  108. uni.navigateTo({ url: loginUrl })
  109. }
  110. reject(Object.assign({}, res, { authExpired: true }))
  111. return
  112. }
  113. reject(res)
  114. }
  115. uni.request({
  116. url: fullUrl,
  117. method,
  118. header,
  119. data,
  120. success: (response) => {
  121. try {
  122. handleResponse(response)
  123. } catch (e) {
  124. const status = e && e.statusCode
  125. reject({ code: 1, msg: status ? `网络异常 (${status})` : '网络异常,请重试!' })
  126. } finally {
  127. finish()
  128. }
  129. },
  130. fail: (e) => {
  131. const status = e && e.statusCode
  132. reject({ code: 1, msg: status ? `网络异常 (${status})` : '网络异常,请重试!' })
  133. finish()
  134. }
  135. })
  136. })
  137. }