dbRequest.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * 地磅模块 HTTP(裸 JSON,非门户 code/data 信封)
  3. * 对齐 mobile-h5/src/utils/http/db.ts
  4. */
  5. import { API_BASE, TOKEN_KEY, REFRESH_TOKEN_KEY, USER_INFO_KEY } from '@/config/api'
  6. const DB_COLLECTION_ROOT = /^\/(plans|inventory|weighing)$/
  7. function normalizeDbUrl(url) {
  8. if (!url || url.endsWith('/')) return url
  9. return DB_COLLECTION_ROOT.test(url) ? `${url}/` : url
  10. }
  11. function buildQuery(params) {
  12. if (!params || typeof params !== 'object') return ''
  13. const parts = []
  14. Object.keys(params).forEach((key) => {
  15. const val = params[key]
  16. if (val === undefined || val === null || val === '') return
  17. parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(val))}`)
  18. })
  19. return parts.length ? `?${parts.join('&')}` : ''
  20. }
  21. function parseDetailMessage(data) {
  22. if (!data || typeof data !== 'object') return ''
  23. const detail = data.detail
  24. if (typeof detail === 'string') return detail
  25. if (Array.isArray(detail)) {
  26. return detail
  27. .map((x) => (x && x.msg) || '')
  28. .filter(Boolean)
  29. .join(';')
  30. }
  31. return data.message || data.msg || ''
  32. }
  33. async function onUnauthorized() {
  34. uni.removeStorageSync(TOKEN_KEY)
  35. uni.removeStorageSync(REFRESH_TOKEN_KEY)
  36. uni.removeStorageSync(USER_INFO_KEY)
  37. try {
  38. const { useUserStore } = await import('@/stores/user')
  39. useUserStore().clearLoginInfo()
  40. } catch (e) {
  41. // ignore
  42. }
  43. uni.showToast({ title: '登录已过期,请重新登录', icon: 'none' })
  44. setTimeout(() => {
  45. uni.reLaunch({ url: '/pages/login/login' })
  46. }, 800)
  47. }
  48. /**
  49. * @param {{ url: string, method?: string, data?: any, params?: any, showError?: boolean }} options
  50. */
  51. export function dbRequest(options = {}) {
  52. const method = String(options.method || 'GET').toUpperCase()
  53. const showError = options.showError !== false
  54. const token = uni.getStorageSync(TOKEN_KEY) || ''
  55. let path = normalizeDbUrl(options.url || '')
  56. const query = method === 'GET' ? buildQuery(options.params) : buildQuery(options.params)
  57. const rawUrl = `${path}${query}`
  58. const url = rawUrl.startsWith('http')
  59. ? rawUrl
  60. : `${API_BASE}${rawUrl.startsWith('/') ? rawUrl : `/${rawUrl}`}`
  61. return new Promise((resolve, reject) => {
  62. uni.request({
  63. url,
  64. method,
  65. data: method === 'GET' ? undefined : options.data,
  66. header: {
  67. 'Content-Type': 'application/json',
  68. ...(token ? { Authorization: `Bearer ${token}` } : {})
  69. },
  70. success: (res) => {
  71. const status = res.statusCode
  72. const data = res.data
  73. if (status === 401) {
  74. onUnauthorized()
  75. reject(new Error('登录已过期'))
  76. return
  77. }
  78. if (status >= 200 && status < 300) {
  79. resolve(data)
  80. return
  81. }
  82. const message = parseDetailMessage(data) || `请求失败(${status})`
  83. if (showError) {
  84. uni.showToast({ title: message.slice(0, 40), icon: 'none' })
  85. }
  86. reject(new Error(message))
  87. },
  88. fail: (err) => {
  89. if (showError) {
  90. uni.showToast({ title: '网络异常', icon: 'none' })
  91. }
  92. reject(err)
  93. }
  94. })
  95. })
  96. }
  97. export const db = {
  98. get: (url, params, opts) => dbRequest({ ...opts, url, method: 'GET', params }),
  99. post: (url, data, opts) => dbRequest({ ...opts, url, method: 'POST', data }),
  100. put: (url, data, opts) => dbRequest({ ...opts, url, method: 'PUT', data }),
  101. patch: (url, data, opts) => dbRequest({ ...opts, url, method: 'PATCH', data }),
  102. del: (url, opts) => dbRequest({ ...opts, url, method: 'DELETE' })
  103. }
  104. export default db