diff --git a/package.json b/package.json index 19ec2cc..c0822a3 100644 --- a/package.json +++ b/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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 940debd..711b391 100644 --- a/pnpm-lock.yaml +++ b/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 diff --git a/src/pages.json b/src/pages.json index 1fe326b..3c4f228 100644 --- a/src/pages.json +++ b/src/pages.json @@ -59,6 +59,14 @@ "style": { "navigationBarTitleText": "关于" } + }, + { + "path": "pages/about/alova", + "type": "page", + "layout": "default", + "style": { + "navigationBarTitleText": "Alova 请求演示" + } } ], "subPackages": [] diff --git a/src/pages/about/about.vue b/src/pages/about/about.vue index 71ca5fe..396e273 100644 --- a/src/pages/about/about.vue +++ b/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', + }) +} diff --git a/src/pages/about/alova.vue b/src/pages/about/alova.vue new file mode 100644 index 0000000..fada4e6 --- /dev/null +++ b/src/pages/about/alova.vue @@ -0,0 +1,60 @@ + +{ + layout: 'default', + style: { + navigationBarTitleText: 'Alova 请求演示', + }, +} + + + + + + + diff --git a/src/utils/request/alova.ts b/src/utils/request/alova.ts new file mode 100644 index 0000000..77584d3 --- /dev/null +++ b/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 + 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 || '请求错误') + } + }, +})