Quellcode durchsuchen

完成请求封装

yuanmingze vor 8 Monaten
Ursprung
Commit
1ad5b636e7
6 geänderte Dateien mit 133 neuen und 2 gelöschten Zeilen
  1. 2 0
      package.json
  2. 21 0
      pnpm-lock.yaml
  3. 3 0
      src/services/index.ts
  4. 11 0
      src/services/request/config.ts
  5. 90 0
      src/services/request/index.ts
  6. 6 2
      src/stores/modules/user.ts

+ 2 - 0
package.json

@@ -35,8 +35,10 @@
     "dayjs": "^1.11.19",
     "lodash-es": "^4.17.22",
     "luch-request": "^3.1.1",
+    "nanoid": "^5.1.6",
     "pinia": "^3.0.4",
     "pinia-plugin-persistedstate": "^4.7.1",
+    "qs": "^6.14.1",
     "vue": "^3.4.21",
     "vue-i18n": "^9.1.9"
   },

+ 21 - 0
pnpm-lock.yaml

@@ -68,12 +68,18 @@ importers:
       luch-request:
         specifier: ^3.1.1
         version: 3.1.1
+      nanoid:
+        specifier: ^5.1.6
+        version: 5.1.6
       pinia:
         specifier: ^3.0.4
         version: 3.0.4(typescript@4.9.5)(vue@3.5.26(typescript@4.9.5))
       pinia-plugin-persistedstate:
         specifier: ^4.7.1
         version: 4.7.1(pinia@3.0.4(typescript@4.9.5)(vue@3.5.26(typescript@4.9.5)))
+      qs:
+        specifier: ^6.14.1
+        version: 6.14.1
       vue:
         specifier: ^3.4.21
         version: 3.5.26(typescript@4.9.5)
@@ -3443,6 +3449,11 @@ packages:
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
+  nanoid@5.1.6:
+    resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==}
+    engines: {node: ^18 || >=20}
+    hasBin: true
+
   natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
 
@@ -3768,6 +3779,10 @@ packages:
     resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
     engines: {node: '>=0.6'}
 
+  qs@6.14.1:
+    resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==}
+    engines: {node: '>=0.6'}
+
   quansync@0.2.11:
     resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
 
@@ -8770,6 +8785,8 @@ snapshots:
 
   nanoid@3.3.11: {}
 
+  nanoid@5.1.6: {}
+
   natural-compare@1.4.0: {}
 
   negotiator@0.6.3: {}
@@ -9062,6 +9079,10 @@ snapshots:
     dependencies:
       side-channel: 1.1.0
 
+  qs@6.14.1:
+    dependencies:
+      side-channel: 1.1.0
+
   quansync@0.2.11: {}
 
   querystringify@2.2.0: {}

+ 3 - 0
src/services/index.ts

@@ -0,0 +1,3 @@
+import http from './request'
+
+export default http

+ 11 - 0
src/services/request/config.ts

@@ -0,0 +1,11 @@
+// utils/request/config.ts
+
+export const BASE_API = import.meta.env.VITE_BASE_API
+export const MODE = import.meta.env.MODE
+export const TIMEOUT = 10000
+
+// 业务成功码(仅用于校验,不拆包)
+export const SUCCESS_CODE_LIST = [0, '0', 200, '200', 2000, '2000', '0000']
+
+export const NOT_OAUTH_BASIC_TOKEN = 'Basic cGlnOnBpZw=='
+export const OAUTH_BASIC_TOKEN = 'Basic cGlnOnBpZw=='

+ 90 - 0
src/services/request/index.ts

@@ -0,0 +1,90 @@
+import Request from 'luch-request'
+import {
+  BASE_API,
+  MODE,
+  TIMEOUT,
+  SUCCESS_CODE_LIST,
+  NOT_OAUTH_BASIC_TOKEN,
+  OAUTH_BASIC_TOKEN,
+} from './config'
+import { useUserStore } from '@/stores/modules/user'
+
+const http = new Request({
+  timeout: TIMEOUT,
+})
+
+/* -------------------------------------------------------------------------- */
+/*                                  全局配置                                   */
+/* -------------------------------------------------------------------------- */
+
+// #ifdef MP-WEIXIN
+http.setConfig((config) => {
+  // 小程序:始终直连后端
+  config.baseURL = BASE_API
+  return config
+})
+// #endif
+
+// #ifdef H5
+http.setConfig((config) => {
+  // H5:dev 走代理,prod 直连
+  config.baseURL = MODE === 'development' ? '' : BASE_API
+  return config
+})
+// #endif
+
+/* -------------------------------------------------------------------------- */
+/*                               请求拦截器                                   */
+/* -------------------------------------------------------------------------- */
+
+http.interceptors.request.use(
+  (config) => {
+    config.header = config.header || {}
+    const userStore = useUserStore()
+    const token = userStore.token
+    const url = config.url || ''
+    // 1️⃣ 短信验证码(未登录)
+    if (url.includes('auth/mobile/token/sms')) {
+      config.header.Authorization = NOT_OAUTH_BASIC_TOKEN
+    } else if (url.includes('auth/oauth/token')) {
+      config.header.Authorization = OAUTH_BASIC_TOKEN
+      config.header['TENANT-ID'] = '1'
+    } else if (token) {
+      config.header.Authorization = `Bearer ${token}`
+    }
+
+    return config
+  },
+  (config) => Promise.reject(config)
+)
+/* -------------------------------------------------------------------------- */
+/*                               响应拦截器                                   */
+/* -------------------------------------------------------------------------- */
+
+http.interceptors.response.use(
+  (response) => {
+    const { data } = response
+    const { code, msg } = data || {}
+
+    // 仅做业务码校验
+    if (!SUCCESS_CODE_LIST.includes(code)) {
+      uni.showToast({
+        title: msg || '业务错误',
+        icon: 'none',
+      })
+      return Promise.reject(response)
+    }
+
+    // ⚠️ 必须返回 response(luch-request 规则)
+    return response
+  },
+  (response) => {
+    uni.showToast({
+      title: '网络异常',
+      icon: 'none',
+    })
+    return Promise.reject(response)
+  }
+)
+
+export default http

+ 6 - 2
src/stores/modules/user.ts

@@ -1,10 +1,14 @@
 import { defineStore } from 'pinia'
 import { uniStorage } from '@/utils/uniStorage'
 
-interface UserState {}
+interface UserState {
+  token: string
+}
 
 export const useUserStore = defineStore('user', {
-  state: (): UserState => ({}),
+  state: (): UserState => ({
+    token: 'asads',
+  }),
   actions: {
     setTokenInfo() {},
   },