my-uniapp-tools 1.0.6 → 1.0.8
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 +445 -445
- package/dist/clipboard/index.d.ts +9 -0
- package/dist/index.d.ts +6 -0
- package/dist/localStorage/index.d.ts +26 -0
- package/dist/my-uniapp-tools.cjs.js +486 -0
- package/dist/my-uniapp-tools.cjs.js.map +1 -0
- package/dist/my-uniapp-tools.esm.js +470 -0
- package/dist/my-uniapp-tools.esm.js.map +1 -0
- package/dist/navigation/index.d.ts +10 -0
- package/dist/system/index.d.ts +66 -0
- package/{src/ui/index.ts → dist/ui/index.d.ts} +1 -14
- package/dist/utils/index.d.ts +11 -0
- package/package.json +28 -16
- package/examples/payment-example.js +0 -179
- package/src/clipboard/index.ts +0 -57
- package/src/index.js +0 -16
- package/src/localStorage/index.ts +0 -69
- package/src/navigation/index.ts +0 -37
- package/src/system/index.ts +0 -223
- package/src/utils/index.ts +0 -89
- package/tsconfig.json +0 -20
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地存储相关工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 同步设置本地缓存
|
|
6
|
+
* @param key 缓存键
|
|
7
|
+
* @param obj 要缓存的值,可以是任何类型
|
|
8
|
+
* @description 如果值是字符串,直接存储;否则,尝试将其 JSON 序列化后存储。
|
|
9
|
+
* 添加了错误处理,以防 JSON 序列化失败。
|
|
10
|
+
*/
|
|
11
|
+
export declare function setStorageSync(key: string, obj: unknown): void;
|
|
12
|
+
/**
|
|
13
|
+
* 同步获取本地缓存
|
|
14
|
+
* @param key 缓存键
|
|
15
|
+
* @returns 缓存的值。如果存储的是 JSON 字符串,则返回解析后的对象;否则返回原始值。
|
|
16
|
+
* @description 获取指定键的值。如果值是非空字符串,尝试进行 JSON 解析。
|
|
17
|
+
* 如果解析成功,返回解析后的对象;如果解析失败或值不是有效字符串,返回原始值。
|
|
18
|
+
*/
|
|
19
|
+
export declare function getStorageSync(key: string): any;
|
|
20
|
+
/**
|
|
21
|
+
* 同步清理本地缓存
|
|
22
|
+
* @param key 可选的缓存键
|
|
23
|
+
* @description 如果传入 key,则删除对应的缓存项。
|
|
24
|
+
* 如果不传入 key,则清除所有本地缓存。
|
|
25
|
+
*/
|
|
26
|
+
export declare function clearStorageSync(key?: string): void;
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* UI交互相关工具函数
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 显示消息提示框
|
|
8
|
+
* @param title 提示的内容,默认为空字符串
|
|
9
|
+
* @param mask 是否显示透明蒙层,默认为 false
|
|
10
|
+
* @param icon 图标类型,默认为 'none'
|
|
11
|
+
* @param duration 提示的延迟时间,默认为 2000 毫秒
|
|
12
|
+
*/
|
|
13
|
+
const useToast = (title = '', mask = false, icon = 'none', duration = 2000) => {
|
|
14
|
+
uni.showToast({
|
|
15
|
+
title,
|
|
16
|
+
icon,
|
|
17
|
+
mask,
|
|
18
|
+
duration,
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 导航相关工具函数
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* 返回上一页并支持传递参数给上一页的 init 方法
|
|
27
|
+
* @param params 返回上一页时传入的参数,默认为空字符串
|
|
28
|
+
* @returns 无返回值
|
|
29
|
+
* @description 调用此函数会返回到上一页,如果上一页存在 init 方法,会自动调用并传入参数
|
|
30
|
+
*/
|
|
31
|
+
const useBack = (params = '') => {
|
|
32
|
+
// 调用uni.navigateBack方法,用于导航回前一页
|
|
33
|
+
uni.navigateBack({
|
|
34
|
+
delta: 1, // 默认返回上一页
|
|
35
|
+
success() {
|
|
36
|
+
// 获取当前所有页面栈
|
|
37
|
+
const pages = getCurrentPages();
|
|
38
|
+
if (pages.length < 2) {
|
|
39
|
+
console.warn('没有上一页');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// 获取前一个页面的实例对象
|
|
43
|
+
const prevPage = pages[pages.length - 2];
|
|
44
|
+
// 检查前一个页面实例 (prevPage.$vm) 是否存在,并且是否包含 init 方法
|
|
45
|
+
// 这是一个约定:需要刷新的页面需要暴露一个 init 方法供调用
|
|
46
|
+
if (prevPage.$vm && typeof prevPage.$vm.init === 'function') {
|
|
47
|
+
// 如果存在 init 方法,则调用该方法并传入参数,用于页面刷新或数据更新
|
|
48
|
+
prevPage.$vm.init(params);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.warn('前一个页面没有init方法');
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
fail() {
|
|
55
|
+
console.error('导航失败');
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 剪贴板相关工具函数
|
|
62
|
+
*/
|
|
63
|
+
/**
|
|
64
|
+
* 跨平台文本复制功能
|
|
65
|
+
* @param text 要复制的文本内容
|
|
66
|
+
* @description 支持 H5、App、小程序。H5 平台优先使用现代的 Clipboard API,失败时回退到传统方法
|
|
67
|
+
*/
|
|
68
|
+
function copyText(text) {
|
|
69
|
+
// #ifndef H5
|
|
70
|
+
// 条件编译:非 H5 平台(如 App、小程序)执行此代码块
|
|
71
|
+
uni.setClipboardData({
|
|
72
|
+
data: text, // 要复制的文本内容
|
|
73
|
+
success: function () {
|
|
74
|
+
useToast('复制成功!');
|
|
75
|
+
},
|
|
76
|
+
fail: function () {
|
|
77
|
+
useToast('复制失败!');
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
// #endif
|
|
81
|
+
// #ifdef H5
|
|
82
|
+
// 条件编译:仅 H5 平台执行此代码块
|
|
83
|
+
// 优先使用现代的 Clipboard API
|
|
84
|
+
if (navigator.clipboard && window.isSecureContext) {
|
|
85
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
86
|
+
useToast('复制成功');
|
|
87
|
+
}).catch(() => {
|
|
88
|
+
// 如果 Clipboard API 失败,回退到传统方法
|
|
89
|
+
fallbackCopyTextToClipboard(text);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// 回退到传统的复制方法
|
|
94
|
+
fallbackCopyTextToClipboard(text);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 传统复制方法的辅助函数
|
|
98
|
+
* @param text 要复制的文本内容
|
|
99
|
+
* @description 使用 document.execCommand 方式进行文本复制
|
|
100
|
+
*/
|
|
101
|
+
function fallbackCopyTextToClipboard(text) {
|
|
102
|
+
const createInput = document.createElement('textarea');
|
|
103
|
+
createInput.value = text; // 设置 textarea 的值为要复制的文本
|
|
104
|
+
document.body.appendChild(createInput);
|
|
105
|
+
createInput.select();
|
|
106
|
+
document.execCommand('Copy');
|
|
107
|
+
createInput.className = 'createInput';
|
|
108
|
+
createInput.style.display = 'none';
|
|
109
|
+
useToast('复制成功');
|
|
110
|
+
createInput.remove(); // 复制完成后移除临时创建的 textarea 元素
|
|
111
|
+
}
|
|
112
|
+
// #endif
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 系统信息相关工具函数
|
|
117
|
+
*/
|
|
118
|
+
/**
|
|
119
|
+
* 获取窗口信息
|
|
120
|
+
* @returns 窗口信息对象,包含窗口尺寸、像素比等信息
|
|
121
|
+
* @description 调用 uni.getWindowInfo() 获取当前设备的窗口相关信息
|
|
122
|
+
*/
|
|
123
|
+
const useWindowInfo = () => {
|
|
124
|
+
// 调用 uni.getWindowInfo() 获取窗口尺寸、像素比等信息
|
|
125
|
+
return uni.getWindowInfo();
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* 获取当前运行平台
|
|
129
|
+
* @returns 平台类型字符串 ('weixin' | 'web' | 'app' | 'alipay' | 'h5')
|
|
130
|
+
* @description 通过条件编译判断当前代码运行的平台环境
|
|
131
|
+
*/
|
|
132
|
+
const getPlatform = () => {
|
|
133
|
+
let platform;
|
|
134
|
+
// #ifdef MP-WEIXIN
|
|
135
|
+
platform = 'weixin';
|
|
136
|
+
// #endif
|
|
137
|
+
// #ifdef WEB
|
|
138
|
+
platform = 'web';
|
|
139
|
+
// #endif
|
|
140
|
+
// #ifdef APP
|
|
141
|
+
platform = 'app';
|
|
142
|
+
// #endif
|
|
143
|
+
// #ifdef MP-ALIPAY
|
|
144
|
+
platform = 'alipay';
|
|
145
|
+
// #endif
|
|
146
|
+
// #ifdef H5
|
|
147
|
+
platform = 'h5';
|
|
148
|
+
// #endif
|
|
149
|
+
return platform;
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* 获取小程序账户信息
|
|
153
|
+
* @returns 小程序账户信息对象,包含appId、版本、环境等信息
|
|
154
|
+
* @description 调用 uni.getAccountInfoSync() 获取当前小程序的账户相关信息
|
|
155
|
+
*/
|
|
156
|
+
const getCurrentEnv = () => {
|
|
157
|
+
try {
|
|
158
|
+
// 调用 uni.getAccountInfoSync() 获取小程序账户信息
|
|
159
|
+
const accountInfo = uni.getAccountInfoSync();
|
|
160
|
+
return {
|
|
161
|
+
// 小程序appId
|
|
162
|
+
appId: accountInfo.miniProgram?.appId || '',
|
|
163
|
+
// 小程序版本号
|
|
164
|
+
version: accountInfo.miniProgram?.version || '',
|
|
165
|
+
// 小程序环境版本(develop开发版、trial体验版、release正式版)
|
|
166
|
+
envVersion: accountInfo.miniProgram?.envVersion || '',
|
|
167
|
+
// 完整的账户信息
|
|
168
|
+
accountInfo
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error('获取小程序账户信息失败:', error);
|
|
173
|
+
return {
|
|
174
|
+
appId: '',
|
|
175
|
+
version: '',
|
|
176
|
+
envVersion: '',
|
|
177
|
+
accountInfo: null
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* 检查小程序版本更新
|
|
183
|
+
* @description 检查小程序是否有新版本,如果有则提示用户更新并重启应用
|
|
184
|
+
* @returns void
|
|
185
|
+
* @example
|
|
186
|
+
* // 在App.vue的onLaunch或onShow中调用
|
|
187
|
+
* onCheckForUpdate()
|
|
188
|
+
*/
|
|
189
|
+
const onCheckForUpdate = () => {
|
|
190
|
+
try {
|
|
191
|
+
// 获取全局唯一的版本更新管理器对象
|
|
192
|
+
const updateManager = uni.getUpdateManager();
|
|
193
|
+
// 检查小程序是否有新版本发布
|
|
194
|
+
updateManager.onCheckForUpdate(function (res) {
|
|
195
|
+
// 请求完新版本信息的回调
|
|
196
|
+
console.log('检查更新结果:', res.hasUpdate);
|
|
197
|
+
if (res.hasUpdate) {
|
|
198
|
+
console.log('发现新版本,开始下载...');
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
// 小程序有新版本,静默下载新版本,做好更新准备
|
|
202
|
+
updateManager.onUpdateReady(function (res) {
|
|
203
|
+
uni.showModal({
|
|
204
|
+
title: '更新提示',
|
|
205
|
+
content: '新版本已经准备好,是否重启应用?',
|
|
206
|
+
showCancel: true,
|
|
207
|
+
cancelText: '稍后',
|
|
208
|
+
confirmText: '立即重启',
|
|
209
|
+
success(modalRes) {
|
|
210
|
+
if (modalRes.confirm) {
|
|
211
|
+
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
|
|
212
|
+
updateManager.applyUpdate();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
// 新版本下载失败处理
|
|
218
|
+
updateManager.onUpdateFailed(function (res) {
|
|
219
|
+
console.error('新版本下载失败:', res);
|
|
220
|
+
uni.showModal({
|
|
221
|
+
title: '更新失败',
|
|
222
|
+
content: '新版本下载失败,请检查网络连接或稍后重试',
|
|
223
|
+
showCancel: false,
|
|
224
|
+
confirmText: '知道了'
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
console.error('版本更新检查失败:', error);
|
|
230
|
+
// 静默处理错误,不影响用户正常使用
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* 获取状态栏高度
|
|
235
|
+
* @returns 状态栏高度(单位:px)
|
|
236
|
+
* @description 获取设备状态栏的高度,用于适配不同设备的状态栏
|
|
237
|
+
*/
|
|
238
|
+
const getStatusBarHeight = () => {
|
|
239
|
+
try {
|
|
240
|
+
// 获取系统信息中的状态栏高度
|
|
241
|
+
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0;
|
|
242
|
+
console.log("🚀 ~ 状态栏高度:", statusBarHeight);
|
|
243
|
+
return statusBarHeight;
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.error('获取状态栏高度失败:', error);
|
|
247
|
+
return 0;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* 获取菜单按钮边界信息
|
|
252
|
+
* @returns 菜单按钮边界信息对象或null
|
|
253
|
+
* @description 获取小程序右上角菜单按钮的边界信息,仅在小程序平台有效
|
|
254
|
+
*/
|
|
255
|
+
const getMenuButtonBoundingClientRect = () => {
|
|
256
|
+
try {
|
|
257
|
+
const platform = getPlatform();
|
|
258
|
+
// 只有在小程序平台才执行getMenuButtonBoundingClientRect
|
|
259
|
+
if (platform === 'weixin' || platform === 'alipay') {
|
|
260
|
+
return uni.getMenuButtonBoundingClientRect();
|
|
261
|
+
}
|
|
262
|
+
// 非小程序平台返回null
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
console.error('获取菜单按钮边界信息失败:', error);
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
/**
|
|
271
|
+
* 获取导航栏高度
|
|
272
|
+
* @returns 导航栏高度(单位:px)
|
|
273
|
+
* @description 获取导航栏的总高度,根据不同平台采用不同的计算方式
|
|
274
|
+
*/
|
|
275
|
+
const getNavHeight = () => {
|
|
276
|
+
try {
|
|
277
|
+
// 获取状态栏高度
|
|
278
|
+
const statusBarHeight = getStatusBarHeight();
|
|
279
|
+
const platform = getPlatform();
|
|
280
|
+
// 小程序平台:状态栏高度 + 菜单按钮高度
|
|
281
|
+
if (platform === 'weixin' || platform === 'alipay') {
|
|
282
|
+
const menuButtonInfo = getMenuButtonBoundingClientRect();
|
|
283
|
+
if (menuButtonInfo) {
|
|
284
|
+
const navHeight = menuButtonInfo.height + statusBarHeight;
|
|
285
|
+
console.log("🚀 ~ 小程序导航栏高度:", navHeight);
|
|
286
|
+
return navHeight;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// App和H5平台:使用默认导航栏高度
|
|
290
|
+
const defaultNavHeight = 0; // 默认导航栏高度
|
|
291
|
+
const totalHeight = statusBarHeight + defaultNavHeight;
|
|
292
|
+
console.log(`🚀 ~ ${platform}平台导航栏高度:`, totalHeight);
|
|
293
|
+
return totalHeight;
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
console.error('获取导航栏高度失败:', error);
|
|
297
|
+
// 返回默认高度(状态栏高度 + 44px 默认导航栏高度)
|
|
298
|
+
return getStatusBarHeight() + 0;
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
/**
|
|
302
|
+
* @returns 包含状态栏高度和导航栏高度的配置对象
|
|
303
|
+
* @description 一次性获取应用所需的状态栏和导航栏高度配置信息
|
|
304
|
+
*/
|
|
305
|
+
const getTopNavBarHeight = () => {
|
|
306
|
+
try {
|
|
307
|
+
// 获取状态栏高度
|
|
308
|
+
const statusBarHeight = getStatusBarHeight();
|
|
309
|
+
// 获取导航栏高度
|
|
310
|
+
const navHeight = getNavHeight();
|
|
311
|
+
return {
|
|
312
|
+
statusBarHeight,
|
|
313
|
+
navHeight
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
console.error('获取全局配置失败:', error);
|
|
318
|
+
return {
|
|
319
|
+
statusBarHeight: 0,
|
|
320
|
+
navHeight: 44
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* 本地存储相关工具函数
|
|
327
|
+
*/
|
|
328
|
+
/**
|
|
329
|
+
* 同步设置本地缓存
|
|
330
|
+
* @param key 缓存键
|
|
331
|
+
* @param obj 要缓存的值,可以是任何类型
|
|
332
|
+
* @description 如果值是字符串,直接存储;否则,尝试将其 JSON 序列化后存储。
|
|
333
|
+
* 添加了错误处理,以防 JSON 序列化失败。
|
|
334
|
+
*/
|
|
335
|
+
function setStorageSync(key, obj) {
|
|
336
|
+
// 检查传入的值是否为字符串类型
|
|
337
|
+
if (typeof obj === 'string') {
|
|
338
|
+
// 如果是字符串,直接使用 uni.setStorageSync 存储
|
|
339
|
+
uni.setStorageSync(key, obj);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// 如果不是字符串,尝试将其 JSON 序列化
|
|
343
|
+
try {
|
|
344
|
+
// 使用 uni.setStorageSync 存储序列化后的字符串
|
|
345
|
+
uni.setStorageSync(key, JSON.stringify(obj));
|
|
346
|
+
}
|
|
347
|
+
catch (e) {
|
|
348
|
+
// 如果 JSON 序列化失败,打印错误日志
|
|
349
|
+
console.error('Failed to stringify object for localStorage:', e);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* 同步获取本地缓存
|
|
355
|
+
* @param key 缓存键
|
|
356
|
+
* @returns 缓存的值。如果存储的是 JSON 字符串,则返回解析后的对象;否则返回原始值。
|
|
357
|
+
* @description 获取指定键的值。如果值是非空字符串,尝试进行 JSON 解析。
|
|
358
|
+
* 如果解析成功,返回解析后的对象;如果解析失败或值不是有效字符串,返回原始值。
|
|
359
|
+
*/
|
|
360
|
+
function getStorageSync(key) {
|
|
361
|
+
// 使用 uni.getStorageSync 获取原始值
|
|
362
|
+
let val = uni.getStorageSync(key);
|
|
363
|
+
// 检查获取到的值是否为非空字符串
|
|
364
|
+
if (typeof val === 'string' && val) {
|
|
365
|
+
// 如果是非空字符串,尝试进行 JSON 解析
|
|
366
|
+
try {
|
|
367
|
+
// 解析成功,返回解析后的对象
|
|
368
|
+
return JSON.parse(val);
|
|
369
|
+
}
|
|
370
|
+
catch (e) {
|
|
371
|
+
// 解析失败,返回原始值
|
|
372
|
+
return val;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// 如果值不是非空字符串,直接返回原始值
|
|
376
|
+
return val;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* 同步清理本地缓存
|
|
380
|
+
* @param key 可选的缓存键
|
|
381
|
+
* @description 如果传入 key,则删除对应的缓存项。
|
|
382
|
+
* 如果不传入 key,则清除所有本地缓存。
|
|
383
|
+
*/
|
|
384
|
+
function clearStorageSync(key) {
|
|
385
|
+
// 检查是否传入了 key
|
|
386
|
+
if (key) {
|
|
387
|
+
// 如果传入 key,使用 uni.removeStorageSync 删除对应的缓存项
|
|
388
|
+
uni.removeStorageSync(key);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
// 如果没有传入 key,使用 uni.clearStorageSync 清除所有缓存
|
|
392
|
+
uni.clearStorageSync();
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* 工具函数库
|
|
398
|
+
*/
|
|
399
|
+
/**
|
|
400
|
+
* 深拷贝对象
|
|
401
|
+
* @param target 目标对象,将被拷贝的内容覆盖
|
|
402
|
+
* @param source 源对象,被拷贝的对象
|
|
403
|
+
* @returns 返回深拷贝后的目标对象
|
|
404
|
+
* @description 支持对象、数组、基本数据类型的深度拷贝,处理循环引用问题
|
|
405
|
+
*/
|
|
406
|
+
function useDeepCopyByObj(target, source) {
|
|
407
|
+
// 处理循环引用的WeakMap
|
|
408
|
+
const visited = new WeakMap();
|
|
409
|
+
/**
|
|
410
|
+
* 内部递归拷贝函数
|
|
411
|
+
* @param targetObj 目标对象
|
|
412
|
+
* @param sourceObj 源对象
|
|
413
|
+
* @returns 拷贝后的对象
|
|
414
|
+
*/
|
|
415
|
+
function copyRecursive(targetObj, sourceObj) {
|
|
416
|
+
// 处理null和undefined
|
|
417
|
+
if (sourceObj === null || sourceObj === undefined) {
|
|
418
|
+
return sourceObj;
|
|
419
|
+
}
|
|
420
|
+
// 处理基本数据类型
|
|
421
|
+
if (typeof sourceObj !== 'object') {
|
|
422
|
+
return sourceObj;
|
|
423
|
+
}
|
|
424
|
+
// 处理循环引用
|
|
425
|
+
if (visited.has(sourceObj)) {
|
|
426
|
+
return visited.get(sourceObj);
|
|
427
|
+
}
|
|
428
|
+
// 处理Date对象
|
|
429
|
+
if (sourceObj instanceof Date) {
|
|
430
|
+
return new Date(sourceObj.getTime());
|
|
431
|
+
}
|
|
432
|
+
// 处理RegExp对象
|
|
433
|
+
if (sourceObj instanceof RegExp) {
|
|
434
|
+
return new RegExp(sourceObj.source, sourceObj.flags);
|
|
435
|
+
}
|
|
436
|
+
// 处理数组
|
|
437
|
+
if (Array.isArray(sourceObj)) {
|
|
438
|
+
const result = [];
|
|
439
|
+
visited.set(sourceObj, result);
|
|
440
|
+
for (let i = 0; i < sourceObj.length; i++) {
|
|
441
|
+
result[i] = copyRecursive(undefined, sourceObj[i]);
|
|
442
|
+
}
|
|
443
|
+
return result;
|
|
444
|
+
}
|
|
445
|
+
// 处理普通对象
|
|
446
|
+
const result = {};
|
|
447
|
+
visited.set(sourceObj, result);
|
|
448
|
+
// 拷贝所有可枚举属性
|
|
449
|
+
for (const key in sourceObj) {
|
|
450
|
+
if (sourceObj.hasOwnProperty(key)) {
|
|
451
|
+
result[key] = copyRecursive(undefined, sourceObj[key]);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return result;
|
|
455
|
+
}
|
|
456
|
+
// 如果target是对象类型,则将source的属性拷贝到target中
|
|
457
|
+
if (typeof target === 'object' && target !== null && !Array.isArray(target)) {
|
|
458
|
+
const copiedSource = copyRecursive(undefined, source);
|
|
459
|
+
// 将拷贝后的source属性合并到target中
|
|
460
|
+
for (const key in copiedSource) {
|
|
461
|
+
if (copiedSource.hasOwnProperty(key)) {
|
|
462
|
+
target[key] = copiedSource[key];
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return target;
|
|
466
|
+
}
|
|
467
|
+
// 如果target不是对象,则直接返回source的深拷贝
|
|
468
|
+
return copyRecursive(undefined, source);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
exports.clearStorageSync = clearStorageSync;
|
|
472
|
+
exports.copyText = copyText;
|
|
473
|
+
exports.getCurrentEnv = getCurrentEnv;
|
|
474
|
+
exports.getMenuButtonBoundingClientRect = getMenuButtonBoundingClientRect;
|
|
475
|
+
exports.getNavHeight = getNavHeight;
|
|
476
|
+
exports.getPlatform = getPlatform;
|
|
477
|
+
exports.getStatusBarHeight = getStatusBarHeight;
|
|
478
|
+
exports.getStorageSync = getStorageSync;
|
|
479
|
+
exports.getTopNavBarHeight = getTopNavBarHeight;
|
|
480
|
+
exports.onCheckForUpdate = onCheckForUpdate;
|
|
481
|
+
exports.setStorageSync = setStorageSync;
|
|
482
|
+
exports.useBack = useBack;
|
|
483
|
+
exports.useDeepCopyByObj = useDeepCopyByObj;
|
|
484
|
+
exports.useToast = useToast;
|
|
485
|
+
exports.useWindowInfo = useWindowInfo;
|
|
486
|
+
//# sourceMappingURL=my-uniapp-tools.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"my-uniapp-tools.cjs.js","sources":["../src/ui/index.ts","../src/navigation/index.ts","../src/clipboard/index.ts","../src/system/index.ts","../src/localStorage/index.ts","../src/utils/index.ts"],"sourcesContent":["/**\n * UI交互相关工具函数\n */\n\n/**\n * 显示消息提示框\n * @param title 提示的内容,默认为空字符串\n * @param mask 是否显示透明蒙层,默认为 false\n * @param icon 图标类型,默认为 'none'\n * @param duration 提示的延迟时间,默认为 2000 毫秒\n */\nexport const useToast = (\n title: string = '',\n mask: boolean = false,\n icon: 'none' | 'success' | 'loading' | 'error' | 'fail' | 'exception' | undefined = 'none',\n duration: number = 2000\n) => {\n uni.showToast({\n title,\n icon,\n mask,\n duration,\n });\n};","/**\n * 导航相关工具函数\n */\n\n/**\n * 返回上一页并支持传递参数给上一页的 init 方法\n * @param params 返回上一页时传入的参数,默认为空字符串\n * @returns 无返回值\n * @description 调用此函数会返回到上一页,如果上一页存在 init 方法,会自动调用并传入参数\n */\nexport const useBack = (params: any = ''): void => {\n // 调用uni.navigateBack方法,用于导航回前一页\n uni.navigateBack({\n delta: 1, // 默认返回上一页\n success() {\n // 获取当前所有页面栈\n const pages = getCurrentPages();\n if (pages.length < 2) {\n console.warn('没有上一页');\n return;\n }\n // 获取前一个页面的实例对象\n const prevPage = pages[pages.length - 2];\n // 检查前一个页面实例 (prevPage.$vm) 是否存在,并且是否包含 init 方法\n // 这是一个约定:需要刷新的页面需要暴露一个 init 方法供调用\n if (prevPage.$vm && typeof prevPage.$vm.init === 'function') {\n // 如果存在 init 方法,则调用该方法并传入参数,用于页面刷新或数据更新\n prevPage.$vm.init(params);\n } else {\n console.warn('前一个页面没有init方法');\n }\n },\n fail() {\n console.error('导航失败');\n },\n });\n};","/**\n * 剪贴板相关工具函数\n */\n\nimport { useToast } from '../ui';\n\n/**\n * 跨平台文本复制功能\n * @param text 要复制的文本内容\n * @description 支持 H5、App、小程序。H5 平台优先使用现代的 Clipboard API,失败时回退到传统方法\n */\nexport function copyText(text: string) {\n // #ifndef H5\n // 条件编译:非 H5 平台(如 App、小程序)执行此代码块\n uni.setClipboardData({\n data: text, // 要复制的文本内容\n success: function () {\n useToast('复制成功!');\n },\n fail: function () {\n useToast('复制失败!');\n },\n });\n // #endif\n // #ifdef H5\n // 条件编译:仅 H5 平台执行此代码块\n // 优先使用现代的 Clipboard API\n if (navigator.clipboard && window.isSecureContext) {\n navigator.clipboard.writeText(text).then(() => {\n useToast('复制成功');\n }).catch(() => {\n // 如果 Clipboard API 失败,回退到传统方法\n fallbackCopyTextToClipboard(text);\n });\n } else {\n // 回退到传统的复制方法\n fallbackCopyTextToClipboard(text);\n }\n\n /**\n * 传统复制方法的辅助函数\n * @param text 要复制的文本内容\n * @description 使用 document.execCommand 方式进行文本复制\n */\n function fallbackCopyTextToClipboard(text: string) {\n const createInput = document.createElement('textarea');\n createInput.value = text; // 设置 textarea 的值为要复制的文本\n document.body.appendChild(createInput);\n createInput.select();\n document.execCommand('Copy');\n createInput.className = 'createInput';\n createInput.style.display = 'none';\n useToast('复制成功');\n createInput.remove(); // 复制完成后移除临时创建的 textarea 元素\n }\n // #endif\n}","/**\n * 系统信息相关工具函数\n */\n\n/**\n * 获取窗口信息\n * @returns 窗口信息对象,包含窗口尺寸、像素比等信息\n * @description 调用 uni.getWindowInfo() 获取当前设备的窗口相关信息\n */\nexport const useWindowInfo = () => {\n // 调用 uni.getWindowInfo() 获取窗口尺寸、像素比等信息\n return uni.getWindowInfo();\n};\n\n/**\n * 获取当前运行平台\n * @returns 平台类型字符串 ('weixin' | 'web' | 'app' | 'alipay' | 'h5')\n * @description 通过条件编译判断当前代码运行的平台环境\n */\nexport const getPlatform = () => {\n let platform\n // #ifdef MP-WEIXIN\n platform = 'weixin'\n // #endif\n // #ifdef WEB\n platform = 'web'\n // #endif\n // #ifdef APP\n platform = 'app'\n // #endif\n // #ifdef MP-ALIPAY\n platform = 'alipay'\n // #endif\n // #ifdef H5\n platform = 'h5'\n // #endif\n return platform\n}\n\n/**\n * 获取小程序账户信息\n * @returns 小程序账户信息对象,包含appId、版本、环境等信息\n * @description 调用 uni.getAccountInfoSync() 获取当前小程序的账户相关信息\n */\nexport const getCurrentEnv = () => {\n try {\n // 调用 uni.getAccountInfoSync() 获取小程序账户信息\n const accountInfo = uni.getAccountInfoSync();\n return {\n // 小程序appId\n appId: accountInfo.miniProgram?.appId || '',\n // 小程序版本号\n version: accountInfo.miniProgram?.version || '',\n // 小程序环境版本(develop开发版、trial体验版、release正式版)\n envVersion: accountInfo.miniProgram?.envVersion || '',\n // 完整的账户信息\n accountInfo\n };\n } catch (error) {\n console.error('获取小程序账户信息失败:', error);\n return {\n appId: '',\n version: '',\n envVersion: '',\n accountInfo: null\n };\n }\n}\n\n\n/**\n * 检查小程序版本更新\n * @description 检查小程序是否有新版本,如果有则提示用户更新并重启应用\n * @returns void\n * @example\n * // 在App.vue的onLaunch或onShow中调用\n * onCheckForUpdate()\n */\nexport const onCheckForUpdate = () => {\n try {\n // 获取全局唯一的版本更新管理器对象\n const updateManager = uni.getUpdateManager();\n\n // 检查小程序是否有新版本发布\n updateManager.onCheckForUpdate(function (res) {\n // 请求完新版本信息的回调\n console.log('检查更新结果:', res.hasUpdate);\n if (res.hasUpdate) {\n console.log('发现新版本,开始下载...');\n }\n });\n\n // 小程序有新版本,静默下载新版本,做好更新准备\n updateManager.onUpdateReady(function (res) {\n uni.showModal({\n title: '更新提示',\n content: '新版本已经准备好,是否重启应用?',\n showCancel: true,\n cancelText: '稍后',\n confirmText: '立即重启',\n success(modalRes) {\n if (modalRes.confirm) {\n // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启\n updateManager.applyUpdate();\n }\n }\n });\n });\n\n // 新版本下载失败处理\n updateManager.onUpdateFailed(function (res) {\n console.error('新版本下载失败:', res);\n uni.showModal({\n title: '更新失败',\n content: '新版本下载失败,请检查网络连接或稍后重试',\n showCancel: false,\n confirmText: '知道了'\n });\n });\n\n } catch (error) {\n console.error('版本更新检查失败:', error);\n // 静默处理错误,不影响用户正常使用\n }\n}\n\n/**\n * 获取状态栏高度\n * @returns 状态栏高度(单位:px)\n * @description 获取设备状态栏的高度,用于适配不同设备的状态栏\n */\nexport const getStatusBarHeight = () => {\n try {\n // 获取系统信息中的状态栏高度\n const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0;\n console.log(\"🚀 ~ 状态栏高度:\", statusBarHeight);\n return statusBarHeight;\n } catch (error) {\n console.error('获取状态栏高度失败:', error);\n return 0;\n }\n}\n\n/**\n * 获取菜单按钮边界信息\n * @returns 菜单按钮边界信息对象或null\n * @description 获取小程序右上角菜单按钮的边界信息,仅在小程序平台有效\n */\nexport const getMenuButtonBoundingClientRect = () => {\n try {\n const platform = getPlatform();\n\n // 只有在小程序平台才执行getMenuButtonBoundingClientRect\n if (platform === 'weixin' || platform === 'alipay') {\n return uni.getMenuButtonBoundingClientRect();\n }\n\n // 非小程序平台返回null\n return null;\n } catch (error) {\n console.error('获取菜单按钮边界信息失败:', error);\n return null;\n }\n}\n\n/**\n * 获取导航栏高度\n * @returns 导航栏高度(单位:px)\n * @description 获取导航栏的总高度,根据不同平台采用不同的计算方式\n */\nexport const getNavHeight = () => {\n try {\n // 获取状态栏高度\n const statusBarHeight = getStatusBarHeight();\n const platform = getPlatform();\n\n // 小程序平台:状态栏高度 + 菜单按钮高度\n if (platform === 'weixin' || platform === 'alipay') {\n const menuButtonInfo = getMenuButtonBoundingClientRect();\n if (menuButtonInfo) {\n const navHeight = menuButtonInfo.height + statusBarHeight;\n console.log(\"🚀 ~ 小程序导航栏高度:\", navHeight);\n return navHeight;\n }\n }\n\n // App和H5平台:使用默认导航栏高度\n const defaultNavHeight = 0; // 默认导航栏高度\n const totalHeight = statusBarHeight + defaultNavHeight;\n console.log(`🚀 ~ ${platform}平台导航栏高度:`, totalHeight);\n\n return totalHeight;\n } catch (error) {\n console.error('获取导航栏高度失败:', error);\n // 返回默认高度(状态栏高度 + 44px 默认导航栏高度)\n return getStatusBarHeight() + 0;\n }\n}\n\n/**\n * @returns 包含状态栏高度和导航栏高度的配置对象\n * @description 一次性获取应用所需的状态栏和导航栏高度配置信息\n */\nexport const getTopNavBarHeight = () => {\n try {\n // 获取状态栏高度\n const statusBarHeight = getStatusBarHeight();\n\n // 获取导航栏高度\n const navHeight = getNavHeight();\n\n return {\n statusBarHeight,\n navHeight\n };\n } catch (error) {\n console.error('获取全局配置失败:', error);\n return {\n statusBarHeight: 0,\n navHeight: 44\n };\n }\n}\n","/**\n * 本地存储相关工具函数\n */\n\n/**\n * 同步设置本地缓存\n * @param key 缓存键\n * @param obj 要缓存的值,可以是任何类型\n * @description 如果值是字符串,直接存储;否则,尝试将其 JSON 序列化后存储。\n * 添加了错误处理,以防 JSON 序列化失败。\n */\nexport function setStorageSync(key: string, obj: unknown) {\n // 检查传入的值是否为字符串类型\n if (typeof obj === 'string') {\n // 如果是字符串,直接使用 uni.setStorageSync 存储\n uni.setStorageSync(key, obj);\n } else {\n // 如果不是字符串,尝试将其 JSON 序列化\n try {\n // 使用 uni.setStorageSync 存储序列化后的字符串\n uni.setStorageSync(key, JSON.stringify(obj));\n } catch (e) {\n // 如果 JSON 序列化失败,打印错误日志\n console.error('Failed to stringify object for localStorage:', e);\n }\n }\n}\n\n/**\n * 同步获取本地缓存\n * @param key 缓存键\n * @returns 缓存的值。如果存储的是 JSON 字符串,则返回解析后的对象;否则返回原始值。\n * @description 获取指定键的值。如果值是非空字符串,尝试进行 JSON 解析。\n * 如果解析成功,返回解析后的对象;如果解析失败或值不是有效字符串,返回原始值。\n */\nexport function getStorageSync(key: string) {\n // 使用 uni.getStorageSync 获取原始值\n let val = uni.getStorageSync(key);\n // 检查获取到的值是否为非空字符串\n if (typeof val === 'string' && val) {\n // 如果是非空字符串,尝试进行 JSON 解析\n try {\n // 解析成功,返回解析后的对象\n return JSON.parse(val);\n } catch (e) {\n // 解析失败,返回原始值\n return val;\n }\n }\n // 如果值不是非空字符串,直接返回原始值\n return val;\n}\n\n/**\n * 同步清理本地缓存\n * @param key 可选的缓存键\n * @description 如果传入 key,则删除对应的缓存项。\n * 如果不传入 key,则清除所有本地缓存。\n */\nexport function clearStorageSync(key?: string) {\n // 检查是否传入了 key\n if (key) {\n // 如果传入 key,使用 uni.removeStorageSync 删除对应的缓存项\n uni.removeStorageSync(key);\n } else {\n // 如果没有传入 key,使用 uni.clearStorageSync 清除所有缓存\n uni.clearStorageSync();\n }\n}\n","/**\n * 工具函数库\n */\n\n/**\n * 深拷贝对象\n * @param target 目标对象,将被拷贝的内容覆盖\n * @param source 源对象,被拷贝的对象\n * @returns 返回深拷贝后的目标对象\n * @description 支持对象、数组、基本数据类型的深度拷贝,处理循环引用问题\n */\nexport function useDeepCopyByObj<T>(target: T, source: any): T {\n // 处理循环引用的WeakMap\n const visited = new WeakMap();\n\n /**\n * 内部递归拷贝函数\n * @param targetObj 目标对象\n * @param sourceObj 源对象\n * @returns 拷贝后的对象\n */\n function copyRecursive(targetObj: any, sourceObj: any): any {\n // 处理null和undefined\n if (sourceObj === null || sourceObj === undefined) {\n return sourceObj;\n }\n\n // 处理基本数据类型\n if (typeof sourceObj !== 'object') {\n return sourceObj;\n }\n\n // 处理循环引用\n if (visited.has(sourceObj)) {\n return visited.get(sourceObj);\n }\n\n // 处理Date对象\n if (sourceObj instanceof Date) {\n return new Date(sourceObj.getTime());\n }\n\n // 处理RegExp对象\n if (sourceObj instanceof RegExp) {\n return new RegExp(sourceObj.source, sourceObj.flags);\n }\n\n // 处理数组\n if (Array.isArray(sourceObj)) {\n const result: any[] = [];\n visited.set(sourceObj, result);\n\n for (let i = 0; i < sourceObj.length; i++) {\n result[i] = copyRecursive(undefined, sourceObj[i]);\n }\n return result;\n }\n\n // 处理普通对象\n const result: any = {};\n visited.set(sourceObj, result);\n\n // 拷贝所有可枚举属性\n for (const key in sourceObj) {\n if (sourceObj.hasOwnProperty(key)) {\n result[key] = copyRecursive(undefined, sourceObj[key]);\n }\n }\n\n return result;\n }\n\n // 如果target是对象类型,则将source的属性拷贝到target中\n if (typeof target === 'object' && target !== null && !Array.isArray(target)) {\n const copiedSource = copyRecursive(undefined, source);\n\n // 将拷贝后的source属性合并到target中\n for (const key in copiedSource) {\n if (copiedSource.hasOwnProperty(key)) {\n (target as any)[key] = copiedSource[key];\n }\n }\n\n return target;\n }\n\n // 如果target不是对象,则直接返回source的深拷贝\n return copyRecursive(undefined, source) as T;\n}\n"],"names":[],"mappings":"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"}
|