feige996 10 місяців тому
батько
коміт
f4d4cd472f
6 змінених файлів з 153 додано та 0 видалено
  1. 3 0
      package.json
  2. 38 0
      pnpm-lock.yaml
  3. 8 0
      src/pages.json
  4. 9 0
      src/pages/about/about.vue
  5. 60 0
      src/pages/about/alova.vue
  6. 35 0
      src/utils/request/alova.ts

+ 3 - 0
package.json

@@ -76,6 +76,8 @@
     "lint:fix": "eslint --fix"
   },
   "dependencies": {
+    "@alova/adapter-uniapp": "^2.0.14",
+    "@alova/shared": "^1.3.1",
     "@dcloudio/uni-app": "3.0.0-4060620250520001",
     "@dcloudio/uni-app-harmony": "3.0.0-4060620250520001",
     "@dcloudio/uni-app-plus": "3.0.0-4060620250520001",
@@ -94,6 +96,7 @@
     "@dcloudio/uni-quickapp-webview": "3.0.0-4060620250520001",
     "@tanstack/vue-query": "^5.62.16",
     "abortcontroller-polyfill": "^1.7.8",
+    "alova": "^3.3.3",
     "dayjs": "1.11.10",
     "js-cookie": "^3.0.5",
     "pinia": "2.0.36",

+ 38 - 0
pnpm-lock.yaml

@@ -16,6 +16,12 @@ importers:
 
   .:
     dependencies:
+      '@alova/adapter-uniapp':
+        specifier: ^2.0.14
+        version: 2.0.14(alova@3.3.3)
+      '@alova/shared':
+        specifier: ^1.3.1
+        version: 1.3.1
       '@dcloudio/uni-app':
         specifier: 3.0.0-4060620250520001
         version: 3.0.0-4060620250520001(@dcloudio/types@3.4.14)(postcss@8.4.49)(rollup@4.41.1)(vue@3.5.15(typescript@5.7.2))
@@ -70,6 +76,9 @@ importers:
       abortcontroller-polyfill:
         specifier: ^1.7.8
         version: 1.7.8
+      alova:
+        specifier: ^3.3.3
+        version: 3.3.3
       dayjs:
         specifier: 1.11.10
         version: 1.11.10
@@ -230,6 +239,14 @@ importers:
 
 packages:
 
+  '@alova/adapter-uniapp@2.0.14':
+    resolution: {integrity: sha512-AHrS/evdhONySkmtYHs6Sh1D+a0+zjBeOltcYY2/az/KEPN9p/l4H9Nvy+ghLhzMzfKfnITxeeMOi5ANyERimw==}
+    peerDependencies:
+      alova: ^3.0.20
+
+  '@alova/shared@1.3.1':
+    resolution: {integrity: sha512-ijSOaFLUFcVzMKSY3avoEE5C03/p9atjMDPBwvNkwnzaCrhv6/m4A121NdadF8YlHCRuifyYfz90IyEdMXTsJg==}
+
   '@ampproject/remapping@2.3.0':
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
@@ -2738,6 +2755,10 @@ packages:
   alien-signals@1.0.13:
     resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==}
 
+  alova@3.3.3:
+    resolution: {integrity: sha512-DB1t2qpQUERVaymz+u9bS71kcN5PzZ+G5LawHm9grabv++tfHOeYsKaW+LCpgMIJ/V7lQqFyqwOvTHGDph43Jw==}
+    engines: {node: '>= 18.0.0'}
+
   ansi-escapes@4.3.2:
     resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
     engines: {node: '>=8'}
@@ -5454,6 +5475,9 @@ packages:
     resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
     engines: {node: '>= 0.6'}
 
+  rate-limiter-flexible@5.0.5:
+    resolution: {integrity: sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==}
+
   raw-body@2.5.2:
     resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
     engines: {node: '>= 0.8'}
@@ -6426,6 +6450,13 @@ packages:
 
 snapshots:
 
+  '@alova/adapter-uniapp@2.0.14(alova@3.3.3)':
+    dependencies:
+      '@alova/shared': 1.3.1
+      alova: 3.3.3
+
+  '@alova/shared@1.3.1': {}
+
   '@ampproject/remapping@2.3.0':
     dependencies:
       '@jridgewell/gen-mapping': 0.3.5
@@ -10023,6 +10054,11 @@ snapshots:
 
   alien-signals@1.0.13: {}
 
+  alova@3.3.3:
+    dependencies:
+      '@alova/shared': 1.3.1
+      rate-limiter-flexible: 5.0.5
+
   ansi-escapes@4.3.2:
     dependencies:
       type-fest: 0.21.3
@@ -13260,6 +13296,8 @@ snapshots:
 
   range-parser@1.2.1: {}
 
+  rate-limiter-flexible@5.0.5: {}
+
   raw-body@2.5.2:
     dependencies:
       bytes: 3.1.2

+ 8 - 0
src/pages.json

@@ -59,6 +59,14 @@
       "style": {
         "navigationBarTitleText": "关于"
       }
+    },
+    {
+      "path": "pages/about/alova",
+      "type": "page",
+      "layout": "default",
+      "style": {
+        "navigationBarTitleText": "Alova 请求演示"
+      }
     }
   ],
   "subPackages": []

+ 9 - 0
src/pages/about/about.vue

@@ -20,6 +20,12 @@ const { safeAreaInsets } = uni.getSystemInfoSync()
 // }
 // testOxlint('oxlint')
 console.log('about')
+
+function gotoAlova() {
+  uni.navigateTo({
+    url: '/pages/about/alova',
+  })
+}
 </script>
 
 <template>
@@ -32,6 +38,9 @@ console.log('about')
     </view>
     <RequestComp />
     <UploadComp />
+    <button @click="gotoAlova">
+      前往 alova 页面
+    </button>
   </view>
 </template>
 

+ 60 - 0
src/pages/about/alova.vue

@@ -0,0 +1,60 @@
+<route lang="json5" type="page">
+{
+  layout: 'default',
+  style: {
+    navigationBarTitleText: 'Alova 请求演示',
+  },
+}
+</route>
+
+<script lang="ts" setup>
+import { useRequest } from 'alova/client'
+import { http } from '@/utils/request/alova'
+
+const initialData = undefined
+function list() {
+  return http.Get('/foo', {
+    params: {
+      name: '菲鸽',
+      page: 1,
+      pageSize: 10,
+    },
+  })
+}
+const { loading, data, send } = useRequest(list, {
+  initialData,
+  immediate: true,
+})
+console.log(data)
+function reset() {
+  data.value = initialData
+}
+</script>
+
+<template>
+  <view class="p-6 text-center">
+    <wd-button class="my-6" @click="send">
+      发送请求
+    </wd-button>
+    <view class="h-16">
+      <view v-if="loading">
+        loading...
+      </view>
+      <block v-else>
+        <view class="text-xl">
+          请求数据如下
+        </view>
+        <view class="text-green leading-8">
+          {{ JSON.stringify(data) }}
+        </view>
+      </block>
+    </view>
+    <wd-button type="error" class="my-6" :disabled="!data" @click="reset">
+      重置数据
+    </wd-button>
+  </view>
+</template>
+
+<style lang="scss" scoped>
+//
+</style>

+ 35 - 0
src/utils/request/alova.ts

@@ -0,0 +1,35 @@
+import AdapterUniapp from '@alova/adapter-uniapp'
+import { createAlova } from 'alova'
+
+const baseURL = JSON.parse(__VITE_APP_PROXY__)
+  ? import.meta.env.VITE_APP_PROXY_PREFIX
+  : import.meta.env.VITE_SERVER_BASEURL
+
+export const http = createAlova({
+  baseURL,
+  ...AdapterUniapp(),
+  async responded(res: UniApp.RequestSuccessCallbackResult, method) {
+    console.log('responded:', method, res)
+    // 请求成功的拦截器
+    // 状态码 2xx,参考 axios 的设计
+    const resData = res.data as IResData<any>
+    if (res.statusCode >= 200 && res.statusCode < 300) {
+      // 2.1 提取核心数据 res.data
+      return resData.data
+    }
+    else if (res.statusCode === 401) {
+      // 401错误  -> 清理用户信息,跳转到登录页
+      // userStore.clearUserInfo()
+      // uni.navigateTo({ url: '/pages/login/login' })
+      console.log(res)
+      throw new Error(resData.msg || '401错误')
+    }
+    else {
+      uni.showToast({
+        icon: 'none',
+        title: (resData).msg || '请求错误',
+      })
+      throw new Error(resData.msg || '请求错误')
+    }
+  },
+})