@hlw-uni/mp-vue 2.1.70 → 2.1.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +230 -386
- package/dist/app.d.ts +1 -1
- package/dist/core/index.d.ts +3 -0
- package/dist/core/{theme.d.ts → theme/index.d.ts} +6 -1
- package/dist/hlw.d.ts +1 -10
- package/dist/index.d.ts +2 -2
- package/dist/index.js +834 -804
- package/dist/index.mjs +836 -806
- package/dist/utils/ad/index.d.ts +61 -0
- package/dist/{composables/utils → utils/common}/index.d.ts +1 -24
- package/dist/{composables → utils}/device/index.d.ts +7 -8
- package/dist/utils/index.d.ts +5 -0
- package/dist/{composables → utils}/navigator/index.d.ts +14 -30
- package/dist/{composables → utils}/request/client.d.ts +2 -8
- package/dist/{composables → utils}/request/index.d.ts +1 -1
- package/dist/{composables → utils}/request/service.d.ts +2 -2
- package/package.json +1 -1
- package/src/app.ts +2 -2
- package/src/components/hlw-add-mini/README.md +56 -9
- package/src/components/hlw-add-mini/index.vue +12 -9
- package/src/components/hlw-avatar-upload/index.vue +103 -0
- package/src/components/hlw-back-top/index.vue +1 -1
- package/src/components/hlw-button/index.vue +5 -16
- package/src/components/hlw-canvas/index.vue +7 -7
- package/src/components/hlw-cell/index.vue +1 -1
- package/src/components/{hlw-custom/hlw-custom.vue → hlw-custom-service/hlw-custom-service.vue} +27 -15
- package/src/components/hlw-empty/index.vue +14 -0
- package/src/components/hlw-header/index.vue +1 -1
- package/src/components/hlw-menu/index.vue +40 -37
- package/src/components/hlw-nav-bar/index.vue +23 -8
- package/src/components/hlw-nickname/index.vue +185 -0
- package/src/components/hlw-notice-bar/index.vue +23 -0
- package/src/components/hlw-page/index.vue +19 -1
- package/src/components/hlw-paging/index.vue +36 -0
- package/src/components/hlw-popup/index.vue +23 -0
- package/src/components/hlw-reward-ad/index.vue +133 -0
- package/src/components/hlw-search/index.vue +25 -0
- package/src/components/hlw-sheet/index.vue +1 -1
- package/src/components/hlw-status-bar/index.vue +113 -0
- package/src/components/hlw-tag/index.vue +22 -0
- package/src/core/index.ts +3 -0
- package/src/{composables → core}/msg/index.ts +0 -1
- package/src/{composables → core}/refs/index.ts +0 -1
- package/src/core/theme/index.ts +115 -0
- package/src/hlw.ts +1 -21
- package/src/index.ts +3 -11
- package/src/utils/ad/README.md +114 -0
- package/src/utils/ad/index.ts +234 -0
- package/src/{composables/utils → utils/common}/index.ts +1 -27
- package/src/{composables → utils}/device/index.ts +13 -21
- package/src/utils/index.ts +5 -0
- package/src/{composables → utils}/navigator/index.ts +30 -31
- package/src/{composables → utils}/request/client.ts +3 -11
- package/src/{composables → utils}/request/index.ts +1 -1
- package/src/{composables → utils}/request/service.ts +5 -6
- package/src/{composables → utils}/request/types.ts +0 -1
- package/dist/composables/ad/index.d.ts +0 -42
- package/dist/composables/index.d.ts +0 -11
- package/src/composables/ad/README.md +0 -58
- package/src/composables/ad/index.ts +0 -227
- package/src/composables/device/README.md +0 -50
- package/src/composables/index.ts +0 -38
- package/src/composables/msg/README.md +0 -79
- package/src/composables/navigator/README.md +0 -71
- package/src/composables/refs/README.md +0 -40
- package/src/composables/request/README.md +0 -124
- package/src/composables/share/README.md +0 -53
- package/src/composables/utils/README.md +0 -81
- package/src/core/theme.ts +0 -62
- /package/dist/{composables → core}/msg/index.d.ts +0 -0
- /package/dist/{composables → core}/refs/index.d.ts +0 -0
- /package/dist/{composables → core}/share/index.d.ts +0 -0
- /package/dist/{composables → utils}/request/adapters/alist.d.ts +0 -0
- /package/dist/{composables → utils}/request/adapters/base.d.ts +0 -0
- /package/dist/{composables → utils}/request/adapters/cos.d.ts +0 -0
- /package/dist/{composables → utils}/request/adapters/index.d.ts +0 -0
- /package/dist/{composables → utils}/request/adapters/oss.d.ts +0 -0
- /package/dist/{composables → utils}/request/adapters/qiniu.d.ts +0 -0
- /package/dist/{composables → utils}/request/types.d.ts +0 -0
- /package/src/{composables → core}/share/index.ts +0 -0
- /package/src/{composables → utils}/request/adapters/alist.ts +0 -0
- /package/src/{composables → utils}/request/adapters/base.ts +0 -0
- /package/src/{composables → utils}/request/adapters/cos.ts +0 -0
- /package/src/{composables → utils}/request/adapters/index.ts +0 -0
- /package/src/{composables → utils}/request/adapters/oss.ts +0 -0
- /package/src/{composables → utils}/request/adapters/qiniu.ts +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# 广告模块 (Ad Utility & Component)
|
|
2
|
+
|
|
3
|
+
提供微信小程序**插屏广告 (Interstitial Ad)** 与 **激励视频广告 (Rewarded Video Ad)** 的注册、预加载与展示播放能力,并提供了开箱即用的高层封装组件 `<hlw-reward-ad>`。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 推荐:高层组件 `<hlw-reward-ad>`
|
|
8
|
+
|
|
9
|
+
组件内部全面封装并接管了激励视频广告的完整生命周期管理:
|
|
10
|
+
* **自动预加载**:组件挂载或广告 ID(`unitId`)变更时,在后台自动完成首帧广告的静默加载。
|
|
11
|
+
* **Loading 状态处理**:拉起广告时自动弹出全局模态 Loading,防止穿透及多重点击。
|
|
12
|
+
* **智能断点续看 (中途退出拦截)**:当用户中途关闭广告时,组件内会自动拦截并弹出二级确认对话框(“继续观看”与“取消”),选择继续将自动递归重新拉起播放。
|
|
13
|
+
* **关闭后自动滚加载**:当一次广告播放流关闭(完成或中途取消)后,组件立即在后台重新静默预加载下一个广告,保证下一次秒开。
|
|
14
|
+
|
|
15
|
+
### 引入组件 (easycom / 直接引用)
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<template>
|
|
19
|
+
<hlw-reward-ad :unit-id="rewardUnitId" @onHandle="handleRewardAd">
|
|
20
|
+
<hlw-button type="primary" round>点击观看广告获取金币</hlw-button>
|
|
21
|
+
</hlw-reward-ad>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script setup lang="ts">
|
|
25
|
+
import { ref } from "vue";
|
|
26
|
+
import type { AdRes } from "@hlw-uni/mp-vue";
|
|
27
|
+
|
|
28
|
+
const rewardUnitId = ref("adunit-xxx");
|
|
29
|
+
|
|
30
|
+
function handleRewardAd(res: AdRes) {
|
|
31
|
+
if (res.success && res.isEnded) {
|
|
32
|
+
// 用户已成功并且完整看完激励视频广告
|
|
33
|
+
hlw.$msg.success("观看完成,奖励已发放!");
|
|
34
|
+
} else if (res.err) {
|
|
35
|
+
// 播放出错
|
|
36
|
+
hlw.$msg.toast("广告播放失败,请稍后重试");
|
|
37
|
+
} else {
|
|
38
|
+
// 用户主动中途退出并拒绝继续观看,或其它拉起失败情况
|
|
39
|
+
hlw.$msg.toast("播放中途退出或拉起失败");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 2. 底层接口 (Low-Level APIs)
|
|
48
|
+
|
|
49
|
+
在不需要使用标准 UI 组件而需要通过代码细粒度控盘的自定义场景下,可以直接导入并调用底层方法。
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
import {
|
|
53
|
+
setPopupAd,
|
|
54
|
+
showPopupAd,
|
|
55
|
+
setRewardAd,
|
|
56
|
+
showRewardAd,
|
|
57
|
+
confirmRewardAd
|
|
58
|
+
} from "@hlw-uni/mp-vue";
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 插屏广告 (Interstitial Ad)
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
// 1. 初始化并注册插屏广告单元,提供可选的关闭回调
|
|
65
|
+
setPopupAd("adunit-popup-id", (success) => {
|
|
66
|
+
console.log("插屏广告被关闭,是否播放成功:", success);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// 2. 延迟拉起展示插屏广告 (默认延迟 3000 毫秒展示)
|
|
70
|
+
await showPopupAd(1000);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 激励视频广告 (Rewarded Video Ad)
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
// 1. 注册并预加载激励视频广告单元
|
|
77
|
+
await setRewardAd("adunit-reward-id");
|
|
78
|
+
|
|
79
|
+
// 2. 立即拉起播放广告
|
|
80
|
+
const res = await showRewardAd();
|
|
81
|
+
|
|
82
|
+
if (res.success && res.isEnded) {
|
|
83
|
+
// 成功发放奖励
|
|
84
|
+
} else {
|
|
85
|
+
// 处理退出或报错
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 3. API 列表
|
|
92
|
+
|
|
93
|
+
| 方法名 | 参数 | 返回值 | 说明 |
|
|
94
|
+
| :--- | :--- | :--- | :--- |
|
|
95
|
+
| `setPopupAd(adId, done?)` | `adId: string, done?: (ok: boolean) => void` | `boolean` | 创建/拉取缓存的插屏广告实例。 |
|
|
96
|
+
| `showPopupAd(delay?)` | `delay?: number` | `Promise<boolean>` | 延迟展示已配置的插屏广告(默认 3000ms)。 |
|
|
97
|
+
| `setRewardAd(adId, done?)` | `adId: string, done?: (res: AdRes) => void` | `Promise<AdRes>` | 预加载激励视频广告实例,并在 `onClose` 事件回调中自动加入重新静默预加载功能。 |
|
|
98
|
+
| `showRewardAd(onShowSuccess?)` | `onShowSuccess?: () => void` | `Promise<AdRes>` | 立即拉起展示激励视频,拉起失败时自动执行 `load()` 并二次重试。 |
|
|
99
|
+
| `confirmRewardAd()` | 无 | `Promise<boolean>` | 内置的通用二级确认模态框,内置灰色取消文字(`#999999`)与蓝色确认文字(`#3b82f6`)。 |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 4. 类型定义
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
export interface AdRes {
|
|
107
|
+
/** 广告是否正常加载或成功展示完成 */
|
|
108
|
+
success: boolean;
|
|
109
|
+
/** 激励视频是否完全播放完毕 (仅激励视频有此属性) */
|
|
110
|
+
isEnded: boolean;
|
|
111
|
+
/** 加载或展示失败时的错误对象 */
|
|
112
|
+
err?: any;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 小程序广告工具。
|
|
3
|
+
* 提供插屏广告 (Interstitial Ad) 与激励视频广告 (Rewarded Video Ad) 的注册、缓存与展示能力。
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
declare const uni: any;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 广告播放/加载结果数据结构。
|
|
10
|
+
*/
|
|
11
|
+
export interface AdRes {
|
|
12
|
+
/** 广告是否正常加载或成功展示完成 */
|
|
13
|
+
success: boolean;
|
|
14
|
+
/** 激励视频是否完全播放完毕 (仅激励视频有此属性) */
|
|
15
|
+
isEnded: boolean;
|
|
16
|
+
/** 加载或展示失败时的错误对象 */
|
|
17
|
+
err?: any;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// 缓存不同 Unit ID 的广告实例,防止重复创建导致内存泄露或回调叠加
|
|
21
|
+
const adInstances = new Map<string, any>();
|
|
22
|
+
|
|
23
|
+
// 当前激活的广告单元 ID 与回调函数句柄
|
|
24
|
+
let activePopupId = "";
|
|
25
|
+
let activeRewardId = "";
|
|
26
|
+
|
|
27
|
+
let popupCallback: ((ok: boolean) => void) | undefined;
|
|
28
|
+
let rewardCallback: ((res: AdRes) => void) | undefined;
|
|
29
|
+
|
|
30
|
+
let rewardPromise: Promise<AdRes> | null = null;
|
|
31
|
+
let rewardResolve: ((res: AdRes) => void) | null = null;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 统一触发激励视频广告结束回调并销毁当前的 Promise 句柄
|
|
35
|
+
*/
|
|
36
|
+
function resolveReward(res: AdRes) {
|
|
37
|
+
rewardCallback?.(res);
|
|
38
|
+
rewardResolve?.(res);
|
|
39
|
+
rewardResolve = null;
|
|
40
|
+
rewardPromise = null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 配置/预加载插屏广告
|
|
45
|
+
*
|
|
46
|
+
* @param adId 广告单元 ID
|
|
47
|
+
* @param done 广告关闭后的回调(可选)
|
|
48
|
+
* @returns 是否配置成功
|
|
49
|
+
*/
|
|
50
|
+
export function setPopupAd(adId: string, done?: (ok: boolean) => void): boolean {
|
|
51
|
+
popupCallback = done;
|
|
52
|
+
if (!adId || !uni.createInterstitialAd) return false;
|
|
53
|
+
|
|
54
|
+
activePopupId = adId;
|
|
55
|
+
if (!adInstances.has(adId)) {
|
|
56
|
+
try {
|
|
57
|
+
const ad = uni.createInterstitialAd({ adUnitId: adId });
|
|
58
|
+
ad.onLoad?.(() => console.log(`[Ad] Interstitial loaded: ${adId}`));
|
|
59
|
+
ad.onError?.((err: any) => {
|
|
60
|
+
console.error("[Ad] Interstitial load error:", err);
|
|
61
|
+
if (activePopupId === adId) popupCallback?.(false);
|
|
62
|
+
});
|
|
63
|
+
ad.onClose?.(() => {
|
|
64
|
+
if (activePopupId === adId) popupCallback?.(true);
|
|
65
|
+
});
|
|
66
|
+
adInstances.set(adId, ad);
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.error("[Ad] Interstitial creation failed:", e);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* 延迟展示已配置的插屏广告
|
|
77
|
+
*
|
|
78
|
+
* @param delay 延迟毫秒数,默认 3000ms
|
|
79
|
+
* @returns 返回 Promise,指示是否成功显示且被关闭
|
|
80
|
+
*/
|
|
81
|
+
export function showPopupAd(delay = 3000): Promise<boolean> {
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
const ad = adInstances.get(activePopupId);
|
|
84
|
+
if (!ad) {
|
|
85
|
+
resolve(false);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const originalDone = popupCallback;
|
|
90
|
+
popupCallback = (ok: boolean) => {
|
|
91
|
+
originalDone?.(ok);
|
|
92
|
+
resolve(ok);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
setTimeout(
|
|
96
|
+
() => {
|
|
97
|
+
ad.show().catch((err: any) => {
|
|
98
|
+
console.error("[Ad] Interstitial show error:", err);
|
|
99
|
+
popupCallback?.(false);
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
Math.max(0, delay),
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 配置/预加载激励视频广告
|
|
109
|
+
*
|
|
110
|
+
* @param adId 广告单元 ID
|
|
111
|
+
* @param done 播放结束的回调(可选)
|
|
112
|
+
* @returns 返回 Promise<AdRes>
|
|
113
|
+
*/
|
|
114
|
+
export function setRewardAd(adId: string, done?: (res: AdRes) => void): Promise<AdRes> {
|
|
115
|
+
rewardCallback = done;
|
|
116
|
+
rewardPromise = new Promise((resolve) => {
|
|
117
|
+
rewardResolve = resolve;
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
if (!adId || !uni.createRewardedVideoAd) {
|
|
121
|
+
resolveReward({ success: false, isEnded: false });
|
|
122
|
+
return rewardPromise;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
activeRewardId = adId;
|
|
126
|
+
if (!adInstances.has(adId)) {
|
|
127
|
+
try {
|
|
128
|
+
const ad = uni.createRewardedVideoAd({ adUnitId: adId });
|
|
129
|
+
ad.onLoad?.(() => console.log(`[Ad] Rewarded video loaded: ${adId}`));
|
|
130
|
+
ad.onError?.((err: any) => {
|
|
131
|
+
console.error("[Ad] Rewarded video load error:", err);
|
|
132
|
+
if (activeRewardId === adId) {
|
|
133
|
+
resolveReward({ success: false, isEnded: false, err });
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
ad.onClose?.((res: { isEnded?: boolean }) => {
|
|
137
|
+
if (activeRewardId === adId) {
|
|
138
|
+
const ended = !!res?.isEnded;
|
|
139
|
+
resolveReward({ success: ended, isEnded: ended });
|
|
140
|
+
// 播放结束后立即在后台静默预加载下一个广告,以保证后续拉起流畅且支持重试逻辑
|
|
141
|
+
ad.load().catch((err: any) => {
|
|
142
|
+
console.warn("[Ad] Silent preload after close failed:", err);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
adInstances.set(adId, ad);
|
|
147
|
+
} catch (e) {
|
|
148
|
+
console.error("[Ad] Rewarded video creation failed:", e);
|
|
149
|
+
resolveReward({ success: false, isEnded: false, err: e });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return rewardPromise;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 立即播放已加载的激励视频广告
|
|
157
|
+
*
|
|
158
|
+
* @param onShowSuccess 广告成功拉起播放时的回调(常用于关闭 Loading 等待提示)
|
|
159
|
+
* @returns 返回 Promise<AdRes>,指示广告是否正常播放完毕
|
|
160
|
+
*/
|
|
161
|
+
export function showRewardAd(onShowSuccess?: () => void): Promise<AdRes> {
|
|
162
|
+
const ad = adInstances.get(activeRewardId);
|
|
163
|
+
if (!ad) {
|
|
164
|
+
return Promise.resolve({ success: false, isEnded: false });
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const current =
|
|
168
|
+
rewardPromise ||
|
|
169
|
+
new Promise<AdRes>((resolve) => {
|
|
170
|
+
rewardResolve = resolve;
|
|
171
|
+
});
|
|
172
|
+
rewardPromise = current;
|
|
173
|
+
|
|
174
|
+
ad.show()
|
|
175
|
+
.then(() => {
|
|
176
|
+
onShowSuccess?.();
|
|
177
|
+
})
|
|
178
|
+
.catch(() => {
|
|
179
|
+
ad.load()
|
|
180
|
+
.then(() => {
|
|
181
|
+
ad.show()
|
|
182
|
+
.then(() => {
|
|
183
|
+
onShowSuccess?.();
|
|
184
|
+
})
|
|
185
|
+
.catch((err: any) => {
|
|
186
|
+
console.error("[Ad] Rewarded video show error:", err);
|
|
187
|
+
resolveReward({ success: false, isEnded: false, err });
|
|
188
|
+
});
|
|
189
|
+
})
|
|
190
|
+
.catch((err: any) => {
|
|
191
|
+
console.error("[Ad] Rewarded video load error:", err);
|
|
192
|
+
resolveReward({ success: false, isEnded: false, err });
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
return current;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 弹窗提示需要看完广告才有奖励。
|
|
201
|
+
* 提供“继续观看”和“取消”按钮。
|
|
202
|
+
* @returns 返回 Promise<boolean>,用户点击“继续”返回 true,点击“取消”返回 false
|
|
203
|
+
*/
|
|
204
|
+
export function confirmRewardAd(): Promise<boolean> {
|
|
205
|
+
return new Promise((resolve) => {
|
|
206
|
+
uni.showModal({
|
|
207
|
+
title: "提示",
|
|
208
|
+
content: "需要看完广告才有奖励哦",
|
|
209
|
+
cancelText: "取消",
|
|
210
|
+
confirmText: "继续观看",
|
|
211
|
+
cancelColor: "#999999",
|
|
212
|
+
confirmColor: "#3b82f6",
|
|
213
|
+
success: (res: any) => {
|
|
214
|
+
resolve(!!res.confirm);
|
|
215
|
+
},
|
|
216
|
+
fail: () => {
|
|
217
|
+
resolve(false);
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @deprecated 推荐直接从库导入独立函数使用 (例如:import { showRewardAd } from '@hlw-uni/mp-vue')
|
|
225
|
+
*/
|
|
226
|
+
export function useHlwAd() {
|
|
227
|
+
return {
|
|
228
|
+
setPopupAd,
|
|
229
|
+
showPopupAd,
|
|
230
|
+
setRewardAd,
|
|
231
|
+
showRewardAd,
|
|
232
|
+
confirmRewardAd,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
@@ -44,7 +44,7 @@ export function withQuery(url: string, qs: string): string {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
|
-
* 将键值对对象转换为 URL
|
|
47
|
+
* 将键值对对象转换为 URL 编码 of Query String。
|
|
48
48
|
* 会自动过滤值为 `undefined` 或 `null` 的键。
|
|
49
49
|
* @param data 需要转换的键值对数据对象
|
|
50
50
|
* @returns 格式化后的 Query String 字符串
|
|
@@ -275,29 +275,3 @@ export async function saveVideoUrl(url: string, progress?: (value: number) => vo
|
|
|
275
275
|
return false;
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* 获取系统通用工具方法的 hook。
|
|
281
|
-
*
|
|
282
|
-
* @example
|
|
283
|
-
* ```ts
|
|
284
|
-
* const { copy, saveImageUrl } = useUtils();
|
|
285
|
-
* copy('hello');
|
|
286
|
-
* ```
|
|
287
|
-
*/
|
|
288
|
-
export function useUtils() {
|
|
289
|
-
return {
|
|
290
|
-
withQuery,
|
|
291
|
-
toQuery,
|
|
292
|
-
signText,
|
|
293
|
-
toNumber,
|
|
294
|
-
toBoolean,
|
|
295
|
-
copy,
|
|
296
|
-
paste,
|
|
297
|
-
saveImage,
|
|
298
|
-
saveVideoFile,
|
|
299
|
-
download,
|
|
300
|
-
saveImageUrl,
|
|
301
|
-
saveVideoUrl,
|
|
302
|
-
};
|
|
303
|
-
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 设备信息与接口 query
|
|
3
3
|
* 提供一致的、缓存后的多端设备系统信息接口。
|
|
4
4
|
*/
|
|
5
|
-
import { toQuery } from "../
|
|
5
|
+
import { toQuery } from "../common";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* 完整设备系统信息接口,包含小程序环境与宿主系统的关键元数据。
|
|
@@ -18,7 +18,7 @@ export interface DeviceInfo {
|
|
|
18
18
|
app_version_code: string;
|
|
19
19
|
/** 小程序来源渠道 */
|
|
20
20
|
app_channel: string;
|
|
21
|
-
/**
|
|
21
|
+
/** 设备 brand。如:apple、huawei */
|
|
22
22
|
device_brand: string;
|
|
23
23
|
/** 设备型号 */
|
|
24
24
|
device_model: string;
|
|
@@ -167,14 +167,6 @@ function getAppid(device: Record<string, unknown>) {
|
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
/**
|
|
171
|
-
* 读取或延迟初始化缓存的设备信息。
|
|
172
|
-
*/
|
|
173
|
-
function getDevice() {
|
|
174
|
-
deviceCache ??= collectDevice();
|
|
175
|
-
return deviceCache;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
170
|
/**
|
|
179
171
|
* 抽取供接口调用的缩略版设备 query 字段。
|
|
180
172
|
*/
|
|
@@ -203,17 +195,18 @@ function getQueryInfo(info: DeviceInfo): DeviceQueryInfo {
|
|
|
203
195
|
}
|
|
204
196
|
|
|
205
197
|
/**
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* @returns 包含 `info` (原始数据) 和 `query` (用于 HTTP 报头/URL query 的 urlencoded 字符串)
|
|
198
|
+
* 获取缓存后的设备信息数据。
|
|
209
199
|
*/
|
|
210
|
-
export function
|
|
211
|
-
|
|
200
|
+
export function getDevice(): DeviceInfo {
|
|
201
|
+
deviceCache ??= collectDevice();
|
|
202
|
+
return deviceCache;
|
|
203
|
+
}
|
|
212
204
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
205
|
+
/**
|
|
206
|
+
* 获取接口请求专用的设备信息 query 字符串。
|
|
207
|
+
*/
|
|
208
|
+
export function getDeviceQuery(): string {
|
|
209
|
+
return toQuery(getQueryInfo(getDevice()));
|
|
217
210
|
}
|
|
218
211
|
|
|
219
212
|
/**
|
|
@@ -222,4 +215,3 @@ export function useDevice() {
|
|
|
222
215
|
export function clearDeviceCache(): void {
|
|
223
216
|
deviceCache = null;
|
|
224
217
|
}
|
|
225
|
-
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* uni-app 路由跳转工具
|
|
3
3
|
* 封装并统一原生的页面跳转、重定向、Switch Tab、返回、以及打开外部小程序或 WebView 等方法。
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -60,7 +60,7 @@ function failHandler(target: string, options: NavigateOptions = {}) {
|
|
|
60
60
|
* @param url 跳转目标路径或小程序 AppId
|
|
61
61
|
* @param options 额外的控制参数
|
|
62
62
|
*/
|
|
63
|
-
function navigate(type: NavigateType = "navigateTo", url = "", options: NavigateOptions = {}) {
|
|
63
|
+
export function navigate(type: NavigateType = "navigateTo", url = "", options: NavigateOptions = {}) {
|
|
64
64
|
if (type === "navigateBack") {
|
|
65
65
|
uni.navigateBack({ delta: options.delta || 1, fail: failHandler("返回上一页", options) });
|
|
66
66
|
return;
|
|
@@ -113,36 +113,35 @@ function navigate(type: NavigateType = "navigateTo", url = "", options: Navigate
|
|
|
113
113
|
return;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
uni.navigateTo({ url, fail: onFail });
|
|
116
|
+
uni.navigateTo({ url, animationType: "none", fail: onFail });
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
/**
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
* @example
|
|
123
|
-
* ```ts
|
|
124
|
-
* const router = useNavigate();
|
|
125
|
-
* router.to('/pages/index/index');
|
|
126
|
-
* router.back();
|
|
127
|
-
* router.miniProgram('app-id');
|
|
128
|
-
* ```
|
|
129
|
-
*/
|
|
130
|
-
export function useNavigate() {
|
|
131
|
-
return {
|
|
132
|
-
/** 核心底层路由分发函数 */
|
|
133
|
-
navigate,
|
|
134
|
-
/** 保留当前页面,跳转到应用内的某个页面 */
|
|
135
|
-
to: (url: string, options?: NavigateOptions) => navigate("navigateTo", url, options),
|
|
136
|
-
/** 关闭当前页面,跳转到应用内的某个页面 */
|
|
137
|
-
redirect: (url: string, options?: NavigateOptions) => navigate("redirectTo", url, options),
|
|
138
|
-
/** 跳转到 switchTab 页面,并关闭其他所有非 tabBar 页面 */
|
|
139
|
-
tab: (url: string, options?: NavigateOptions) => navigate("switchTab", url, options),
|
|
140
|
-
/** 关闭所有页面,打开到应用内的某个页面 */
|
|
141
|
-
reLaunch: (url: string, options?: NavigateOptions) => navigate("reLaunch", url, options),
|
|
142
|
-
/** 关闭当前页面,返回上一页面或多级页面 */
|
|
143
|
-
back: (delta = 1, options: NavigateOptions = {}) => navigate("navigateBack", "", { ...options, delta }),
|
|
144
|
-
/** 打开另一个小程序 */
|
|
145
|
-
miniProgram: (appId: string, options?: NavigateOptions) => navigate("miniprogram", appId, options),
|
|
146
|
-
};
|
|
119
|
+
/** 保留当前页面,跳转到应用内的某个页面 */
|
|
120
|
+
export function navigateTo(url: string, options?: NavigateOptions) {
|
|
121
|
+
return navigate("navigateTo", url, options);
|
|
147
122
|
}
|
|
148
123
|
|
|
124
|
+
/** 关闭当前页面,跳转到应用内的某个页面 */
|
|
125
|
+
export function redirectTo(url: string, options?: NavigateOptions) {
|
|
126
|
+
return navigate("redirectTo", url, options);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** 跳转到 switchTab 页面,并关闭其他所有非 tabBar 页面 */
|
|
130
|
+
export function switchTab(url: string, options?: NavigateOptions) {
|
|
131
|
+
return navigate("switchTab", url, options);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** 关闭所有页面,打开到应用内的某个页面 */
|
|
135
|
+
export function reLaunch(url: string, options?: NavigateOptions) {
|
|
136
|
+
return navigate("reLaunch", url, options);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** 关闭当前页面,返回上一页面或多级页面 */
|
|
140
|
+
export function navigateBack(delta = 1, options: NavigateOptions = {}) {
|
|
141
|
+
return navigate("navigateBack", "", { ...options, delta });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** 打开另一个小程序 */
|
|
145
|
+
export function navigateToMiniProgram(appId: string, options?: NavigateOptions) {
|
|
146
|
+
return navigate("miniprogram", appId, options);
|
|
147
|
+
}
|
|
@@ -214,7 +214,7 @@ class UniRequestClient implements RequestClient {
|
|
|
214
214
|
filePath: config.filePath,
|
|
215
215
|
fileName,
|
|
216
216
|
credentials: config.credentials,
|
|
217
|
-
|
|
217
|
+
});
|
|
218
218
|
|
|
219
219
|
return new Promise((resolve, reject) => {
|
|
220
220
|
uni.uploadFile({
|
|
@@ -311,17 +311,9 @@ function isAbsolute(url: string): boolean {
|
|
|
311
311
|
const requestClient = new UniRequestClient();
|
|
312
312
|
|
|
313
313
|
/**
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
* @example
|
|
317
|
-
* ```ts
|
|
318
|
-
* const http = useRequest();
|
|
319
|
-
* http.setBaseURL('https://api.example.com');
|
|
320
|
-
* ```
|
|
314
|
+
* 全局请求客户端单例。
|
|
321
315
|
*/
|
|
322
|
-
export
|
|
323
|
-
return requestClient;
|
|
324
|
-
}
|
|
316
|
+
export const request: RequestClient = requestClient;
|
|
325
317
|
|
|
326
318
|
/**
|
|
327
319
|
* 文件上传 composable。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { request } from "./client";
|
|
2
2
|
import type { ApiResponse, RequestConfig } from "./types";
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -52,9 +52,9 @@ export class BaseService {
|
|
|
52
52
|
* @returns 响应结果 Promise
|
|
53
53
|
*/
|
|
54
54
|
request<T = unknown>(options: ServiceRequestConfig): Promise<ApiResponse<T>> {
|
|
55
|
-
return
|
|
55
|
+
return request.request<T>({
|
|
56
56
|
...options,
|
|
57
|
-
url:
|
|
57
|
+
url: request.resolveServiceUrl(this.namespace ?? "", options.url, this.servicePrefix ?? ""),
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -70,7 +70,7 @@ export class BaseService {
|
|
|
70
70
|
/**
|
|
71
71
|
* 快捷发送 POST 请求。
|
|
72
72
|
* @param url 请求相对路径
|
|
73
|
-
* @param data
|
|
73
|
+
* @param data 请求携带 the body
|
|
74
74
|
*/
|
|
75
75
|
post<T = unknown>(url: string, data?: unknown): Promise<ApiResponse<T>> {
|
|
76
76
|
return this.request<T>({ url, method: "POST", data });
|
|
@@ -79,7 +79,7 @@ export class BaseService {
|
|
|
79
79
|
/**
|
|
80
80
|
* 快捷发送 PUT 请求。
|
|
81
81
|
* @param url 请求相对路径
|
|
82
|
-
* @param data
|
|
82
|
+
* @param data 请求携带 the body
|
|
83
83
|
*/
|
|
84
84
|
put<T = unknown>(url: string, data?: unknown): Promise<ApiResponse<T>> {
|
|
85
85
|
return this.request<T>({ url, method: "PUT", data });
|
|
@@ -130,4 +130,3 @@ export function PluginService(target: any) {
|
|
|
130
130
|
configurable: true
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
|
-
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 小程序广告工具。
|
|
3
|
-
* 提供插屏广告 (Interstitial Ad) 与激励视频广告 (Rewarded Video Ad) 的注册、缓存与展示能力。
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* 广告播放/加载结果数据结构。
|
|
7
|
-
*/
|
|
8
|
-
export interface AdRes {
|
|
9
|
-
/** 广告是否正常加载或成功展示完成 */
|
|
10
|
-
ok: boolean;
|
|
11
|
-
/** 激励视频是否完全播放完毕 (仅激励视频有此属性) */
|
|
12
|
-
isEnded?: boolean;
|
|
13
|
-
/** 加载或展示失败时的错误对象 */
|
|
14
|
-
err?: unknown;
|
|
15
|
-
}
|
|
16
|
-
type AdDone = (res: AdRes) => void;
|
|
17
|
-
/**
|
|
18
|
-
* 小程序广告 Composables。
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```ts
|
|
22
|
-
* const { setAdPopup, showAdPopup, setAdReward, showAdReward } = useHlwAd();
|
|
23
|
-
*
|
|
24
|
-
* // 1. 插屏广告
|
|
25
|
-
* setAdPopup('ad-unit-id');
|
|
26
|
-
* await showAdPopup();
|
|
27
|
-
*
|
|
28
|
-
* // 2. 激励视频
|
|
29
|
-
* await setAdReward('ad-unit-id');
|
|
30
|
-
* const res = await showAdReward();
|
|
31
|
-
* if (res.ok && res.isEnded) {
|
|
32
|
-
* // 发放奖励
|
|
33
|
-
* }
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export declare function useHlwAd(): {
|
|
37
|
-
setAdPopup: (adId: string, done?: ((ok: boolean) => void) | undefined) => boolean;
|
|
38
|
-
showAdPopup: (delay?: number) => Promise<boolean>;
|
|
39
|
-
setAdReward: (adId: string, done?: AdDone) => Promise<AdRes>;
|
|
40
|
-
showAdReward: () => Promise<AdRes>;
|
|
41
|
-
};
|
|
42
|
-
export {};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Composables 统一导出
|
|
3
|
-
*/
|
|
4
|
-
export * from './request';
|
|
5
|
-
export { useMsg, type HlwMsg, type ToastOptions, type ModalOptions, type ToastIcon } from './msg';
|
|
6
|
-
export { useDevice, clearDeviceCache, type DeviceInfo, type DeviceQueryInfo, } from './device';
|
|
7
|
-
export { useRefs } from './refs';
|
|
8
|
-
export { useShare, type ShareConfig, } from './share';
|
|
9
|
-
export { useHlwAd, type AdRes } from './ad';
|
|
10
|
-
export { useUtils, withQuery, toQuery, signText, toNumber, toBoolean, copy, paste, auth, saveImage, saveVideoFile, download, saveImageUrl, saveVideoUrl, type DownloadOpt, type DownloadRes, } from './utils';
|
|
11
|
-
export { useNavigate, type NavigateType, type NavigateOptions } from './navigator';
|