冯诚 3 年 前
コミット
4a70958a22
5 ファイル変更97 行追加0 行削除
  1. 1 0
      .env
  2. 1 0
      package.json
  3. 4 0
      src/env.d.ts
  4. 79 0
      src/service/request.ts
  5. 12 0
      yarn.lock

+ 1 - 0
.env

@@ -0,0 +1 @@
+VITE_API_BASE=https://mockapi.eolink.com/9A5KfUCbe99f2b17204d98bfebe7a77757ce256af3e4e90

+ 1 - 0
package.json

@@ -7,6 +7,7 @@
     "preview": "vite preview"
   },
   "dependencies": {
+    "axios": "^0.25.0",
     "vue": "^3.2.25",
     "vue-router": "4"
   },

+ 4 - 0
src/env.d.ts

@@ -6,3 +6,7 @@ declare module '*.vue' {
   const component: DefineComponent<{}, {}, any>
   export default component
 }
+
+interface ImportMetaEnv {
+  VITE_API_BASE: string
+}

+ 79 - 0
src/service/request.ts

@@ -0,0 +1,79 @@
+import axios, { AxiosRequestConfig, Canceler } from 'axios'
+
+const Toast = (message: string) => {}
+Toast.loading = () => {}
+Toast.hide = () => {}
+
+export const netErrMsg = '系统开小差了,请稍候再试'
+
+interface RequestConfig extends AxiosRequestConfig {
+  contentType?: 'json' | 'form'
+  reportError?: boolean
+  showLoading?: boolean
+  cancelable?: boolean
+}
+
+interface ResponseData<T = any> {
+  success: boolean
+  results: T
+  message: string
+}
+
+const _axios = axios.create({
+  baseURL: import.meta.env.VITE_API_BASE,
+})
+const cancelMethods: Record<string, Canceler> = {}
+
+_axios.interceptors.request.use((config: RequestConfig) => {
+  config.showLoading && Toast.loading()
+  cancelMethods[config.url!]?.()
+  delete cancelMethods[config.url!]
+  if (config.cancelable) {
+    config.cancelToken = new axios.CancelToken(
+      c => (cancelMethods[config.url!] = c)
+    )
+  }
+  if (
+    config.method === 'post' &&
+    config.contentType !== 'json' &&
+    Object.prototype.toString.call(config.data) === '[object Object]'
+  ) {
+    config.data = new URLSearchParams(config.data)
+  }
+
+  return config
+})
+
+_axios.interceptors.response.use(
+  response => {
+    const config = response.config as RequestConfig
+    config.showLoading && Toast.hide()
+    const data = response.data as ResponseData | Blob | undefined
+    if (!data || data instanceof Blob || data.success) return data
+    config.reportError && Toast(data.message || netErrMsg)
+    return Promise.reject(data)
+  },
+  error => {
+    Toast.hide()
+    if (!axios.isCancel(error) && error.config?.reportError) {
+      Toast(netErrMsg)
+    }
+    return Promise.reject(error)
+  }
+)
+
+export default function request<T = any>(
+  config: RequestConfig
+): Promise<ResponseData<T>> {
+  config.transformRequest = ([] as any[]).concat(
+    config.transformRequest || [],
+    axios.defaults.transformRequest
+  )
+  return _axios(config) as any
+}
+
+request.get = <T = any>(url: string, config?: RequestConfig) =>
+  request<T>({ ...config, url })
+
+request.post = <T = any>(url: string, data?: any, config?: RequestConfig) =>
+  request<T>({ ...config, method: 'POST', url, data })

+ 12 - 0
yarn.lock

@@ -426,6 +426,13 @@ astral-regex@^2.0.0:
   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
 
+axios@^0.25.0:
+  version "0.25.0"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a"
+  integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==
+  dependencies:
+    follow-redirects "^1.14.7"
+
 babel-walk@3.0.0-canary-5:
   version "3.0.0-canary-5"
   resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11"
@@ -992,6 +999,11 @@ flatted@^3.1.0:
   resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2"
   integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==
 
+follow-redirects@^1.14.7:
+  version "1.14.8"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
+  integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
+
 fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"