my-uniapp-tools 1.0.0
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 +457 -0
- package/RECORD.md +34 -0
- package/package.json +16 -0
- package/src/clipboard/index.ts +55 -0
- package/src/index.js +14 -0
- package/src/localStorage/index.ts +69 -0
- package/src/navigation/index.ts +37 -0
- package/src/system/index.ts +192 -0
- package/src/ui/index.ts +24 -0
- package/tsconfig.json +20 -0
package/README.md
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
# Huang UniApp Toolkit
|
|
2
|
+
|
|
3
|
+
一个专为 UniApp 开发设计的实用工具函数库,提供常用的功能模块,帮助开发者快速构建跨平台应用。
|
|
4
|
+
|
|
5
|
+
## 📦 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 使用 npm
|
|
9
|
+
npm install huang-uniapp-toolkit
|
|
10
|
+
|
|
11
|
+
# 使用 yarn
|
|
12
|
+
yarn add huang-uniapp-toolkit
|
|
13
|
+
|
|
14
|
+
# 使用 pnpm
|
|
15
|
+
pnpm add huang-uniapp-toolkit
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 🚀 快速开始
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
// 导入所有工具函数
|
|
22
|
+
import * from 'huang-uniapp-toolkit'
|
|
23
|
+
|
|
24
|
+
// 或者按需导入
|
|
25
|
+
import {
|
|
26
|
+
useToast,
|
|
27
|
+
useBack,
|
|
28
|
+
copyText,
|
|
29
|
+
setStorageSync,
|
|
30
|
+
getStorageSync,
|
|
31
|
+
getPlatform,
|
|
32
|
+
getCurrentEnv,
|
|
33
|
+
onCheckForUpdate,
|
|
34
|
+
getStatusBarHeight,
|
|
35
|
+
getNavHeight,
|
|
36
|
+
getAppConfig
|
|
37
|
+
} from 'huang-uniapp-toolkit'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 📚 API 文档
|
|
41
|
+
|
|
42
|
+
### 🎨 UI交互工具 (UI)
|
|
43
|
+
|
|
44
|
+
#### `useToast(title, mask, icon, duration)`
|
|
45
|
+
|
|
46
|
+
显示消息提示框
|
|
47
|
+
|
|
48
|
+
**参数:**
|
|
49
|
+
- `title` (string): 提示的内容,默认为空字符串
|
|
50
|
+
- `mask` (boolean): 是否显示透明蒙层,默认为 `false`
|
|
51
|
+
- `icon` (string): 图标类型,可选值:`'none'` | `'success'` | `'loading'` | `'error'` | `'fail'` | `'exception'`,默认为 `'none'`
|
|
52
|
+
- `duration` (number): 提示的延迟时间,默认为 `2000` 毫秒
|
|
53
|
+
|
|
54
|
+
**示例:**
|
|
55
|
+
```javascript
|
|
56
|
+
// 基础用法
|
|
57
|
+
useToast('操作成功')
|
|
58
|
+
|
|
59
|
+
// 完整参数
|
|
60
|
+
useToast(
|
|
61
|
+
'操作成功', // 提示文字
|
|
62
|
+
false, // 是否显示透明蒙层
|
|
63
|
+
'success', // 图标类型
|
|
64
|
+
2000 // 显示时长(毫秒)
|
|
65
|
+
)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### `useBack(params)`
|
|
69
|
+
|
|
70
|
+
返回上一页并支持传递参数给上一页的 init 方法
|
|
71
|
+
|
|
72
|
+
**参数:**
|
|
73
|
+
- `params` (any): 传递给上一页 init 方法的参数,默认为空字符串
|
|
74
|
+
|
|
75
|
+
**示例:**
|
|
76
|
+
```javascript
|
|
77
|
+
// 简单返回
|
|
78
|
+
useBack()
|
|
79
|
+
|
|
80
|
+
// 返回并传递参数
|
|
81
|
+
useBack({ refresh: true, data: 'some data' })
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**注意:** 上一页需要暴露 `init` 方法来接收参数
|
|
85
|
+
|
|
86
|
+
#### `copyText(text)`
|
|
87
|
+
|
|
88
|
+
跨平台文本复制功能,支持 H5、App、小程序。H5 平台优先使用现代的 Clipboard API,失败时回退到传统方法。
|
|
89
|
+
|
|
90
|
+
**参数:**
|
|
91
|
+
- `text` (string): 要复制的文本内容
|
|
92
|
+
|
|
93
|
+
**示例:**
|
|
94
|
+
```javascript
|
|
95
|
+
copyText('要复制的文本内容')
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
#### `useWindowInfo()`
|
|
99
|
+
|
|
100
|
+
获取当前窗口的尺寸、像素比等信息
|
|
101
|
+
|
|
102
|
+
**返回值:**
|
|
103
|
+
- 窗口信息对象
|
|
104
|
+
|
|
105
|
+
**示例:**
|
|
106
|
+
```javascript
|
|
107
|
+
const windowInfo = useWindowInfo()
|
|
108
|
+
console.log(windowInfo.windowWidth) // 窗口宽度
|
|
109
|
+
console.log(windowInfo.windowHeight) // 窗口高度
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
#### `getPlatform()`
|
|
113
|
+
|
|
114
|
+
获取当前运行平台类型
|
|
115
|
+
|
|
116
|
+
**返回值:**
|
|
117
|
+
- `string`: 平台类型,可能的值:`'weixin'` | `'web'` | `'app'` | `'alipay'` | `'h5'`
|
|
118
|
+
|
|
119
|
+
**示例:**
|
|
120
|
+
```javascript
|
|
121
|
+
const platform = getPlatform()
|
|
122
|
+
console.log(platform) // 'weixin' | 'web' | 'app' | 'alipay' | 'h5'
|
|
123
|
+
|
|
124
|
+
// 根据平台执行不同逻辑
|
|
125
|
+
if (platform === 'weixin') {
|
|
126
|
+
// 微信小程序特有逻辑
|
|
127
|
+
} else if (platform === 'h5') {
|
|
128
|
+
// H5 特有逻辑
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### `getCurrentEnv()`
|
|
133
|
+
|
|
134
|
+
获取小程序账户信息,包含appId、版本、环境等信息
|
|
135
|
+
|
|
136
|
+
**返回值:**
|
|
137
|
+
- `object`: 小程序账户信息对象
|
|
138
|
+
- `appId` (string): 小程序appId
|
|
139
|
+
- `version` (string): 小程序版本号
|
|
140
|
+
- `envVersion` (string): 小程序环境版本(develop开发版、trial体验版、release正式版)
|
|
141
|
+
- `accountInfo` (object): 完整的账户信息对象
|
|
142
|
+
|
|
143
|
+
**示例:**
|
|
144
|
+
```javascript
|
|
145
|
+
const envInfo = getCurrentEnv()
|
|
146
|
+
console.log(envInfo.appId) // 小程序appId
|
|
147
|
+
console.log(envInfo.version) // 小程序版本号
|
|
148
|
+
console.log(envInfo.envVersion) // 环境版本
|
|
149
|
+
|
|
150
|
+
// 根据环境执行不同逻辑
|
|
151
|
+
if (envInfo.envVersion === 'develop') {
|
|
152
|
+
// 开发版特有逻辑
|
|
153
|
+
} else if (envInfo.envVersion === 'release') {
|
|
154
|
+
// 正式版特有逻辑
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### `onCheckForUpdate()`
|
|
159
|
+
|
|
160
|
+
检查小程序版本更新,自动处理版本检查、下载和更新流程
|
|
161
|
+
|
|
162
|
+
**参数:**
|
|
163
|
+
- 无参数
|
|
164
|
+
|
|
165
|
+
**功能说明:**
|
|
166
|
+
- 自动检查小程序是否有新版本
|
|
167
|
+
- 发现新版本时静默下载
|
|
168
|
+
- 下载完成后弹窗提示用户是否重启应用
|
|
169
|
+
- 处理下载失败的情况
|
|
170
|
+
- 支持用户选择稍后更新或立即重启
|
|
171
|
+
|
|
172
|
+
**平台支持:**
|
|
173
|
+
- ✅ 微信小程序
|
|
174
|
+
- ✅ 支付宝小程序
|
|
175
|
+
- ✅ 百度小程序
|
|
176
|
+
- ✅ 抖音小程序
|
|
177
|
+
- ✅ QQ小程序
|
|
178
|
+
- ✅ 快手小程序
|
|
179
|
+
- ✅ 京东小程序
|
|
180
|
+
- ❌ App (App端请使用其他更新方案)
|
|
181
|
+
- ❌ H5 (H5端无需此功能)
|
|
182
|
+
|
|
183
|
+
**示例:**
|
|
184
|
+
```javascript
|
|
185
|
+
// 在App.vue中使用
|
|
186
|
+
export default {
|
|
187
|
+
onLaunch() {
|
|
188
|
+
// 应用启动时检查更新
|
|
189
|
+
onCheckForUpdate()
|
|
190
|
+
},
|
|
191
|
+
onShow() {
|
|
192
|
+
// 每次从后台切换到前台时检查更新
|
|
193
|
+
onCheckForUpdate()
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 或在页面中手动调用
|
|
198
|
+
onCheckForUpdate()
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**注意事项:**
|
|
202
|
+
- 建议在App.vue的onLaunch或onShow生命周期中调用
|
|
203
|
+
- 开发版和体验版无法检查版本更新,需要在正式版中测试
|
|
204
|
+
- 在开发者工具中可以通过"模拟更新编译"来测试更新功能
|
|
205
|
+
- 函数内部已处理异常情况,不会影响应用正常运行
|
|
206
|
+
|
|
207
|
+
#### `getStatusBarHeight()`
|
|
208
|
+
|
|
209
|
+
获取设备状态栏高度
|
|
210
|
+
|
|
211
|
+
**返回值:**
|
|
212
|
+
- `number`: 状态栏高度(单位:px)
|
|
213
|
+
|
|
214
|
+
**示例:**
|
|
215
|
+
```javascript
|
|
216
|
+
const statusBarHeight = getStatusBarHeight()
|
|
217
|
+
console.log(statusBarHeight) // 44 (iPhone) 或其他设备的状态栏高度
|
|
218
|
+
|
|
219
|
+
// 用于页面布局适配
|
|
220
|
+
const pageStyle = {
|
|
221
|
+
paddingTop: statusBarHeight + 'px'
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
#### `getNavHeight()`
|
|
226
|
+
|
|
227
|
+
获取小程序导航栏总高度,包含状态栏高度和菜单按钮高度
|
|
228
|
+
|
|
229
|
+
**返回值:**
|
|
230
|
+
- `number`: 导航栏总高度(单位:px)
|
|
231
|
+
|
|
232
|
+
**示例:**
|
|
233
|
+
```javascript
|
|
234
|
+
const navHeight = getNavHeight()
|
|
235
|
+
console.log(navHeight) // 88 (iPhone) 或其他设备的导航栏总高度
|
|
236
|
+
|
|
237
|
+
// 用于自定义导航栏高度设置
|
|
238
|
+
const customNavStyle = {
|
|
239
|
+
height: navHeight + 'px'
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
#### `getAppConfig()`
|
|
244
|
+
|
|
245
|
+
一次性获取应用所需的状态栏和导航栏高度配置信息
|
|
246
|
+
|
|
247
|
+
**返回值:**
|
|
248
|
+
- `object`: 配置信息对象
|
|
249
|
+
- `statusBarHeight` (number): 状态栏高度(单位:px)
|
|
250
|
+
- `navHeight` (number): 导航栏总高度(单位:px)
|
|
251
|
+
|
|
252
|
+
**示例:**
|
|
253
|
+
```javascript
|
|
254
|
+
const appConfig = getAppConfig()
|
|
255
|
+
console.log(appConfig.statusBarHeight) // 状态栏高度
|
|
256
|
+
console.log(appConfig.navHeight) // 导航栏总高度
|
|
257
|
+
|
|
258
|
+
// 用于全局配置
|
|
259
|
+
const globalConfig = {
|
|
260
|
+
...appConfig,
|
|
261
|
+
contentHeight: windowHeight - appConfig.navHeight
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**注意事项:**
|
|
266
|
+
- 这些函数主要用于小程序平台的界面适配
|
|
267
|
+
- 在不同设备上返回的高度值可能不同
|
|
268
|
+
- 建议在应用启动时获取并存储这些配置信息
|
|
269
|
+
- 如果获取失败,会返回默认值确保应用正常运行
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
### 💾 本地存储工具 (Storage)
|
|
274
|
+
|
|
275
|
+
#### `setStorageSync(key, obj)`
|
|
276
|
+
|
|
277
|
+
同步设置本地缓存,自动处理对象序列化
|
|
278
|
+
|
|
279
|
+
**参数:**
|
|
280
|
+
- `key` (string): 缓存键
|
|
281
|
+
- `obj` (unknown): 要缓存的值,可以是任何类型
|
|
282
|
+
|
|
283
|
+
**示例:**
|
|
284
|
+
```javascript
|
|
285
|
+
// 存储字符串
|
|
286
|
+
setStorageSync('username', 'john')
|
|
287
|
+
|
|
288
|
+
// 存储对象(自动序列化)
|
|
289
|
+
setStorageSync('userInfo', { name: 'john', age: 25 })
|
|
290
|
+
|
|
291
|
+
// 存储数组
|
|
292
|
+
setStorageSync('list', [1, 2, 3, 4, 5])
|
|
293
|
+
|
|
294
|
+
// 存储布尔值
|
|
295
|
+
setStorageSync('isLogin', true)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
#### `getStorageSync(key)`
|
|
299
|
+
|
|
300
|
+
同步获取本地缓存,自动处理对象反序列化
|
|
301
|
+
|
|
302
|
+
**参数:**
|
|
303
|
+
- `key` (string): 缓存键
|
|
304
|
+
|
|
305
|
+
**返回值:**
|
|
306
|
+
- 缓存的值。如果存储的是 JSON 字符串,则返回解析后的对象;否则返回原始值
|
|
307
|
+
|
|
308
|
+
**示例:**
|
|
309
|
+
```javascript
|
|
310
|
+
// 获取字符串
|
|
311
|
+
const username = getStorageSync('username')
|
|
312
|
+
|
|
313
|
+
// 获取对象(自动反序列化)
|
|
314
|
+
const userInfo = getStorageSync('userInfo')
|
|
315
|
+
|
|
316
|
+
// 获取数组
|
|
317
|
+
const list = getStorageSync('list')
|
|
318
|
+
|
|
319
|
+
// 获取布尔值
|
|
320
|
+
const isLogin = getStorageSync('isLogin')
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
#### `clearStorageSync(key?)`
|
|
324
|
+
|
|
325
|
+
清理本地缓存,支持清理指定项或全部清理
|
|
326
|
+
|
|
327
|
+
**参数:**
|
|
328
|
+
- `key` (string, 可选): 缓存键。如果传入则删除对应的缓存项,如果不传入则清除所有缓存
|
|
329
|
+
|
|
330
|
+
**示例:**
|
|
331
|
+
```javascript
|
|
332
|
+
// 清理指定缓存
|
|
333
|
+
clearStorageSync('username')
|
|
334
|
+
|
|
335
|
+
// 清理所有缓存
|
|
336
|
+
clearStorageSync()
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## 🛠️ 开发使用
|
|
340
|
+
|
|
341
|
+
### 安装依赖
|
|
342
|
+
```bash
|
|
343
|
+
yarn install
|
|
344
|
+
# 或
|
|
345
|
+
npm install
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### 开发脚本
|
|
349
|
+
```bash
|
|
350
|
+
# 开发模式
|
|
351
|
+
yarn dev
|
|
352
|
+
# 或
|
|
353
|
+
npm run dev
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## 🏗️ 技术栈
|
|
357
|
+
|
|
358
|
+
- **TypeScript** - 类型安全的 JavaScript
|
|
359
|
+
- **UniApp** - 跨平台应用开发框架
|
|
360
|
+
- **ES6 Modules** - 模块化开发
|
|
361
|
+
|
|
362
|
+
## 📁 项目结构
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
huang-uniapp-toolkit/
|
|
366
|
+
├── src/
|
|
367
|
+
│ ├── ui/ # UI交互工具函数
|
|
368
|
+
│ │ └── index.ts
|
|
369
|
+
│ ├── navigation/ # 导航相关工具
|
|
370
|
+
│ │ └── index.ts
|
|
371
|
+
│ ├── clipboard/ # 剪贴板工具
|
|
372
|
+
│ │ └── index.ts
|
|
373
|
+
│ ├── system/ # 系统信息工具
|
|
374
|
+
│ │ └── index.ts
|
|
375
|
+
│ ├── localStorage/ # 本地存储工具
|
|
376
|
+
│ │ └── index.ts
|
|
377
|
+
│ └── index.js # 主入口文件
|
|
378
|
+
├── package.json # 项目配置
|
|
379
|
+
├── tsconfig.json # TypeScript 配置
|
|
380
|
+
└── README.md # 项目说明
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## 🔄 版本信息
|
|
384
|
+
|
|
385
|
+
当前版本:v1.0.5
|
|
386
|
+
|
|
387
|
+
## 📄 许可证
|
|
388
|
+
|
|
389
|
+
ISC
|
|
390
|
+
|
|
391
|
+
## 🤝 贡献指南
|
|
392
|
+
|
|
393
|
+
欢迎提交 Issue 和 Pull Request 来完善这个工具库!
|
|
394
|
+
|
|
395
|
+
### 开发规范
|
|
396
|
+
|
|
397
|
+
1. 所有函数都应该遵循单一职责原则
|
|
398
|
+
2. 必须添加详细的中文注释
|
|
399
|
+
3. 新增功能需要在 README.md 中更新文档
|
|
400
|
+
4. 保持代码简洁可读
|
|
401
|
+
5. 确保跨平台兼容性
|
|
402
|
+
|
|
403
|
+
## 📝 更新日志
|
|
404
|
+
|
|
405
|
+
### v1.0.6
|
|
406
|
+
- ✨ **新增功能**:添加状态栏和导航栏高度获取函数
|
|
407
|
+
- 📏 新增 `getStatusBarHeight()` 函数,用于获取设备状态栏高度
|
|
408
|
+
- 📐 新增 `getNavHeight()` 函数,用于获取小程序导航栏总高度
|
|
409
|
+
- ⚙️ 新增 `getAppConfig()` 函数,一次性获取状态栏和导航栏配置信息
|
|
410
|
+
- 🛡️ 添加完善的错误处理机制,确保在获取失败时返回默认值
|
|
411
|
+
- 📚 更新API文档,添加详细的使用说明和界面适配示例
|
|
412
|
+
- 💡 遵循单一职责原则,每个函数专注于特定的高度获取功能
|
|
413
|
+
- 🎯 主要用于小程序平台的界面适配和自定义导航栏开发
|
|
414
|
+
|
|
415
|
+
### v1.0.5
|
|
416
|
+
- ✨ **新增功能**:完善 `onCheckForUpdate()` 函数
|
|
417
|
+
- 📱 实现小程序版本更新检查功能,支持自动检查、下载和提示更新
|
|
418
|
+
- 🔄 支持静默下载新版本,用户可选择立即重启或稍后更新
|
|
419
|
+
- 🛡️ 添加完善的错误处理机制,包括下载失败和异常情况处理
|
|
420
|
+
- 📚 更新API文档,添加详细的平台支持说明和使用示例
|
|
421
|
+
- 💡 遵循单一职责原则,提供用户友好的更新体验
|
|
422
|
+
- 🎯 支持微信、支付宝、百度、抖音、QQ、快手、京东等主流小程序平台
|
|
423
|
+
|
|
424
|
+
### v1.0.4
|
|
425
|
+
- ✨ **新增功能**:完善 `getCurrentEnv()` 函数
|
|
426
|
+
- 📱 新增小程序账户信息获取功能,支持获取appId、版本号、环境版本等信息
|
|
427
|
+
- 🛡️ 添加错误处理机制,确保函数调用的稳定性
|
|
428
|
+
- 📚 更新API文档,添加详细的使用说明和示例
|
|
429
|
+
- 💡 遵循单一职责原则,提供清晰的返回值结构
|
|
430
|
+
|
|
431
|
+
### v1.0.3
|
|
432
|
+
- 🏗️ **重大重构**:按功能类型重新组织代码结构
|
|
433
|
+
- 📁 将原 `common` 模块拆分为 5 个专门模块:
|
|
434
|
+
- `ui` - UI交互工具(useToast)
|
|
435
|
+
- `navigation` - 导航工具(useBack)
|
|
436
|
+
- `clipboard` - 剪贴板工具(copyText)
|
|
437
|
+
- `system` - 系统信息工具(useWindowInfo, getPlatform, getCurrentEnv)
|
|
438
|
+
- `localStorage` - 本地存储工具(保持不变)
|
|
439
|
+
- 📚 更新文档结构,按模块分类展示API
|
|
440
|
+
- 💡 遵循单一职责原则,提高代码可维护性
|
|
441
|
+
- 🔧 完善函数注释,便于后续维护
|
|
442
|
+
|
|
443
|
+
### v1.0.2
|
|
444
|
+
- 🎉 完善项目文档
|
|
445
|
+
- 🔧 优化代码注释
|
|
446
|
+
- 🛡️ 添加错误处理机制
|
|
447
|
+
- ✨ 新增 `getPlatform()` 函数,用于获取当前运行平台
|
|
448
|
+
- 🚀 优化 `copyText()` 函数,H5 平台优先使用现代 Clipboard API
|
|
449
|
+
|
|
450
|
+
### v1.0.1
|
|
451
|
+
- 🎯 初始版本发布
|
|
452
|
+
- 📦 基础工具函数实现
|
|
453
|
+
- 💾 本地存储工具实现
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
如有问题或建议,请提交 Issue 或联系开发者。感谢您的使用! 🙏
|
package/RECORD.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 项目记录 (RECORD.md)
|
|
2
|
+
|
|
3
|
+
## 项目简介
|
|
4
|
+
|
|
5
|
+
本项目名为 `my-uniapp-tool`,是一个基于 Node.js 的工具库,旨在为 UniApp 开发提供便利。根据 `package.json`,当前版本为 `1.0.2`,使用 ES Module 规范。
|
|
6
|
+
|
|
7
|
+
## 核心框架/技术
|
|
8
|
+
|
|
9
|
+
- **主要语言**: TypeScript (从 `tsconfig.json` 和 `.ts` 文件扩展名推断)
|
|
10
|
+
- **运行环境**: Node.js (从 `package.json` 的 `scripts` 和 `main` 指向 `.js` 文件推断)
|
|
11
|
+
- **核心依赖**:
|
|
12
|
+
- `@dcloudio/types`: 提供 DCloud UniApp 相关的类型定义,表明项目与 UniApp 生态紧密相关。
|
|
13
|
+
|
|
14
|
+
## 目录结构
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
.
|
|
18
|
+
├── .gitignore # Git 忽略配置文件
|
|
19
|
+
├── package.json # 项目元数据和依赖管理
|
|
20
|
+
├── tsconfig.json # TypeScript 编译配置文件
|
|
21
|
+
├── yarn.lock # Yarn 依赖版本锁定文件
|
|
22
|
+
├── src/ # 源代码目录
|
|
23
|
+
│ ├── index.js # 项目入口文件 (可能是编译后的 JS)
|
|
24
|
+
│ ├── common/ # 通用工具或模块目录
|
|
25
|
+
│ │ └── index.ts # 通用模块入口文件
|
|
26
|
+
│ └── localStorage/ # 本地存储相关模块目录
|
|
27
|
+
│ └── index.ts # 本地存储模块入口文件
|
|
28
|
+
└── RECORD.md # 本项目记录文件 (即本文档)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- **根目录**: 包含项目的基本配置文件和元数据。
|
|
32
|
+
- **`src` 目录**: 存放项目的主要源代码。
|
|
33
|
+
- `common`: 包含项目中可复用的通用函数、常量或类型定义。
|
|
34
|
+
- `localStorage`: 封装了与浏览器或小程序本地存储相关的操作。
|
package/package.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "my-uniapp-tools",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "src/index.js",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
8
|
+
"dev": "node src/index.js"
|
|
9
|
+
},
|
|
10
|
+
"author": "",
|
|
11
|
+
"license": "ISC",
|
|
12
|
+
"description": "",
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@dcloudio/types": "^3.4.14"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 剪贴板相关工具函数
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { useToast } from '../ui';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 跨平台文本复制功能
|
|
9
|
+
* @param text 要复制的文本内容
|
|
10
|
+
* @description 支持 H5、App、小程序。H5 平台优先使用现代的 Clipboard API,失败时回退到传统方法
|
|
11
|
+
*/
|
|
12
|
+
export function copyText(text: string) {
|
|
13
|
+
// #ifndef H5 条件编译:非 H5 平台(如 App、小程序)执行此代码块
|
|
14
|
+
uni.setClipboardData({
|
|
15
|
+
data: text, // 要复制的文本内容
|
|
16
|
+
success: function () {
|
|
17
|
+
useToast('复制成功!');
|
|
18
|
+
},
|
|
19
|
+
fail: function () {
|
|
20
|
+
useToast('复制失败!');
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
// #endif
|
|
24
|
+
// #ifdef H5 条件编译:仅 H5 平台执行此代码块
|
|
25
|
+
// 优先使用现代的 Clipboard API
|
|
26
|
+
if (navigator.clipboard && window.isSecureContext) {
|
|
27
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
28
|
+
useToast('复制成功');
|
|
29
|
+
}).catch(() => {
|
|
30
|
+
// 如果 Clipboard API 失败,回退到传统方法
|
|
31
|
+
fallbackCopyTextToClipboard(text);
|
|
32
|
+
});
|
|
33
|
+
} else {
|
|
34
|
+
// 回退到传统的复制方法
|
|
35
|
+
fallbackCopyTextToClipboard(text);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 传统复制方法的辅助函数
|
|
40
|
+
* @param text 要复制的文本内容
|
|
41
|
+
* @description 使用 document.execCommand 方式进行文本复制
|
|
42
|
+
*/
|
|
43
|
+
function fallbackCopyTextToClipboard(text: string) {
|
|
44
|
+
const createInput = document.createElement('textarea');
|
|
45
|
+
createInput.value = text; // 设置 textarea 的值为要复制的文本
|
|
46
|
+
document.body.appendChild(createInput);
|
|
47
|
+
createInput.select();
|
|
48
|
+
document.execCommand('Copy');
|
|
49
|
+
createInput.className = 'createInput';
|
|
50
|
+
createInput.style.display = 'none';
|
|
51
|
+
useToast('复制成功');
|
|
52
|
+
createInput.remove(); // 复制完成后移除临时创建的 textarea 元素
|
|
53
|
+
}
|
|
54
|
+
// #endif
|
|
55
|
+
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地存储相关工具函数
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 同步设置本地缓存
|
|
7
|
+
* @param key 缓存键
|
|
8
|
+
* @param obj 要缓存的值,可以是任何类型
|
|
9
|
+
* @description 如果值是字符串,直接存储;否则,尝试将其 JSON 序列化后存储。
|
|
10
|
+
* 添加了错误处理,以防 JSON 序列化失败。
|
|
11
|
+
*/
|
|
12
|
+
export function setStorageSync(key: string, obj: unknown) {
|
|
13
|
+
// 检查传入的值是否为字符串类型
|
|
14
|
+
if (typeof obj === 'string') {
|
|
15
|
+
// 如果是字符串,直接使用 uni.setStorageSync 存储
|
|
16
|
+
uni.setStorageSync(key, obj);
|
|
17
|
+
} else {
|
|
18
|
+
// 如果不是字符串,尝试将其 JSON 序列化
|
|
19
|
+
try {
|
|
20
|
+
// 使用 uni.setStorageSync 存储序列化后的字符串
|
|
21
|
+
uni.setStorageSync(key, JSON.stringify(obj));
|
|
22
|
+
} catch (e) {
|
|
23
|
+
// 如果 JSON 序列化失败,打印错误日志
|
|
24
|
+
console.error('Failed to stringify object for localStorage:', e);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 同步获取本地缓存
|
|
31
|
+
* @param key 缓存键
|
|
32
|
+
* @returns 缓存的值。如果存储的是 JSON 字符串,则返回解析后的对象;否则返回原始值。
|
|
33
|
+
* @description 获取指定键的值。如果值是非空字符串,尝试进行 JSON 解析。
|
|
34
|
+
* 如果解析成功,返回解析后的对象;如果解析失败或值不是有效字符串,返回原始值。
|
|
35
|
+
*/
|
|
36
|
+
export function getStorageSync(key: string) {
|
|
37
|
+
// 使用 uni.getStorageSync 获取原始值
|
|
38
|
+
let val = uni.getStorageSync(key);
|
|
39
|
+
// 检查获取到的值是否为非空字符串
|
|
40
|
+
if (typeof val === 'string' && val) {
|
|
41
|
+
// 如果是非空字符串,尝试进行 JSON 解析
|
|
42
|
+
try {
|
|
43
|
+
// 解析成功,返回解析后的对象
|
|
44
|
+
return JSON.parse(val);
|
|
45
|
+
} catch (e) {
|
|
46
|
+
// 解析失败,返回原始值
|
|
47
|
+
return val;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 如果值不是非空字符串,直接返回原始值
|
|
51
|
+
return val;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 同步清理本地缓存
|
|
56
|
+
* @param key 可选的缓存键
|
|
57
|
+
* @description 如果传入 key,则删除对应的缓存项。
|
|
58
|
+
* 如果不传入 key,则清除所有本地缓存。
|
|
59
|
+
*/
|
|
60
|
+
export function clearStorageSync(key?: string) {
|
|
61
|
+
// 检查是否传入了 key
|
|
62
|
+
if (key) {
|
|
63
|
+
// 如果传入 key,使用 uni.removeStorageSync 删除对应的缓存项
|
|
64
|
+
uni.removeStorageSync(key);
|
|
65
|
+
} else {
|
|
66
|
+
// 如果没有传入 key,使用 uni.clearStorageSync 清除所有缓存
|
|
67
|
+
uni.clearStorageSync();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 导航相关工具函数
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 返回上一页并支持传递参数给上一页的 init 方法
|
|
7
|
+
* @param params 返回上一页时传入的参数,默认为空字符串
|
|
8
|
+
* @returns 无返回值
|
|
9
|
+
* @description 调用此函数会返回到上一页,如果上一页存在 init 方法,会自动调用并传入参数
|
|
10
|
+
*/
|
|
11
|
+
export const useBack = (params: any = ''): void => {
|
|
12
|
+
// 调用uni.navigateBack方法,用于导航回前一页
|
|
13
|
+
uni.navigateBack({
|
|
14
|
+
delta: 1, // 默认返回上一页
|
|
15
|
+
success() {
|
|
16
|
+
// 获取当前所有页面栈
|
|
17
|
+
const pages = getCurrentPages();
|
|
18
|
+
if (pages.length < 2) {
|
|
19
|
+
console.warn('没有上一页');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// 获取前一个页面的实例对象
|
|
23
|
+
const prevPage = pages[pages.length - 2];
|
|
24
|
+
// 检查前一个页面实例 (prevPage.$vm) 是否存在,并且是否包含 init 方法
|
|
25
|
+
// 这是一个约定:需要刷新的页面需要暴露一个 init 方法供调用
|
|
26
|
+
if (prevPage.$vm && typeof prevPage.$vm.init === 'function') {
|
|
27
|
+
// 如果存在 init 方法,则调用该方法并传入参数,用于页面刷新或数据更新
|
|
28
|
+
prevPage.$vm.init(params);
|
|
29
|
+
} else {
|
|
30
|
+
console.warn('前一个页面没有init方法');
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
fail() {
|
|
34
|
+
console.error('导航失败');
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
};
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 系统信息相关工具函数
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 获取窗口信息
|
|
7
|
+
* @returns 窗口信息对象,包含窗口尺寸、像素比等信息
|
|
8
|
+
* @description 调用 uni.getWindowInfo() 获取当前设备的窗口相关信息
|
|
9
|
+
*/
|
|
10
|
+
export const useWindowInfo = () => {
|
|
11
|
+
// 调用 uni.getWindowInfo() 获取窗口尺寸、像素比等信息
|
|
12
|
+
return uni.getWindowInfo();
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 获取当前运行平台
|
|
17
|
+
* @returns 平台类型字符串 ('weixin' | 'web' | 'app' | 'alipay' | 'h5')
|
|
18
|
+
* @description 通过条件编译判断当前代码运行的平台环境
|
|
19
|
+
*/
|
|
20
|
+
export const getPlatform = () => {
|
|
21
|
+
let platform
|
|
22
|
+
// #ifdef MP-WEIXIN
|
|
23
|
+
platform = 'weixin'
|
|
24
|
+
// #endif
|
|
25
|
+
// #ifdef WEB
|
|
26
|
+
platform = 'web'
|
|
27
|
+
// #endif
|
|
28
|
+
// #ifdef APP
|
|
29
|
+
platform = 'app'
|
|
30
|
+
// #endif
|
|
31
|
+
// #ifdef MP-ALIPAY
|
|
32
|
+
platform = 'alipay'
|
|
33
|
+
// #endif
|
|
34
|
+
// #ifdef H5
|
|
35
|
+
platform = 'h5'
|
|
36
|
+
// #endif
|
|
37
|
+
return platform
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 获取小程序账户信息
|
|
42
|
+
* @returns 小程序账户信息对象,包含appId、版本、环境等信息
|
|
43
|
+
* @description 调用 uni.getAccountInfoSync() 获取当前小程序的账户相关信息
|
|
44
|
+
*/
|
|
45
|
+
export const getCurrentEnv = () => {
|
|
46
|
+
try {
|
|
47
|
+
// 调用 uni.getAccountInfoSync() 获取小程序账户信息
|
|
48
|
+
const accountInfo = uni.getAccountInfoSync();
|
|
49
|
+
return {
|
|
50
|
+
// 小程序appId
|
|
51
|
+
appId: accountInfo.miniProgram?.appId || '',
|
|
52
|
+
// 小程序版本号
|
|
53
|
+
version: accountInfo.miniProgram?.version || '',
|
|
54
|
+
// 小程序环境版本(develop开发版、trial体验版、release正式版)
|
|
55
|
+
envVersion: accountInfo.miniProgram?.envVersion || '',
|
|
56
|
+
// 完整的账户信息
|
|
57
|
+
accountInfo
|
|
58
|
+
};
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error('获取小程序账户信息失败:', error);
|
|
61
|
+
return {
|
|
62
|
+
appId: '',
|
|
63
|
+
version: '',
|
|
64
|
+
envVersion: '',
|
|
65
|
+
accountInfo: null
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 检查小程序版本更新
|
|
73
|
+
* @description 检查小程序是否有新版本,如果有则提示用户更新并重启应用
|
|
74
|
+
* @returns void
|
|
75
|
+
* @example
|
|
76
|
+
* // 在App.vue的onLaunch或onShow中调用
|
|
77
|
+
* onCheckForUpdate()
|
|
78
|
+
*/
|
|
79
|
+
export const onCheckForUpdate = () => {
|
|
80
|
+
try {
|
|
81
|
+
// 获取全局唯一的版本更新管理器对象
|
|
82
|
+
const updateManager = uni.getUpdateManager();
|
|
83
|
+
|
|
84
|
+
// 检查小程序是否有新版本发布
|
|
85
|
+
updateManager.onCheckForUpdate(function (res) {
|
|
86
|
+
// 请求完新版本信息的回调
|
|
87
|
+
console.log('检查更新结果:', res.hasUpdate);
|
|
88
|
+
if (res.hasUpdate) {
|
|
89
|
+
console.log('发现新版本,开始下载...');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// 小程序有新版本,静默下载新版本,做好更新准备
|
|
94
|
+
updateManager.onUpdateReady(function (res) {
|
|
95
|
+
uni.showModal({
|
|
96
|
+
title: '更新提示',
|
|
97
|
+
content: '新版本已经准备好,是否重启应用?',
|
|
98
|
+
showCancel: true,
|
|
99
|
+
cancelText: '稍后',
|
|
100
|
+
confirmText: '立即重启',
|
|
101
|
+
success(modalRes) {
|
|
102
|
+
if (modalRes.confirm) {
|
|
103
|
+
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
|
|
104
|
+
updateManager.applyUpdate();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// 新版本下载失败处理
|
|
111
|
+
updateManager.onUpdateFailed(function (res) {
|
|
112
|
+
console.error('新版本下载失败:', res);
|
|
113
|
+
uni.showModal({
|
|
114
|
+
title: '更新失败',
|
|
115
|
+
content: '新版本下载失败,请检查网络连接或稍后重试',
|
|
116
|
+
showCancel: false,
|
|
117
|
+
confirmText: '知道了'
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.error('版本更新检查失败:', error);
|
|
123
|
+
// 静默处理错误,不影响用户正常使用
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 获取状态栏高度
|
|
129
|
+
* @returns 状态栏高度(单位:px)
|
|
130
|
+
* @description 获取设备状态栏的高度,用于适配不同设备的状态栏
|
|
131
|
+
*/
|
|
132
|
+
export const getStatusBarHeight = () => {
|
|
133
|
+
try {
|
|
134
|
+
// 获取系统信息中的状态栏高度
|
|
135
|
+
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0;
|
|
136
|
+
console.log("🚀 ~ 状态栏高度:", statusBarHeight);
|
|
137
|
+
return statusBarHeight;
|
|
138
|
+
} catch (error) {
|
|
139
|
+
console.error('获取状态栏高度失败:', error);
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 获取导航栏高度
|
|
146
|
+
* @returns 导航栏高度(单位:px)
|
|
147
|
+
* @description 获取小程序导航栏的总高度,包含状态栏高度和菜单按钮高度
|
|
148
|
+
*/
|
|
149
|
+
export const getNavHeight = () => {
|
|
150
|
+
try {
|
|
151
|
+
// 获取状态栏高度
|
|
152
|
+
const statusBarHeight = getStatusBarHeight();
|
|
153
|
+
|
|
154
|
+
// 获取菜单按钮的边界信息
|
|
155
|
+
const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
|
|
156
|
+
|
|
157
|
+
// 计算导航栏总高度:状态栏高度 + 菜单按钮高度
|
|
158
|
+
const navHeight = menuButtonInfo.height + statusBarHeight;
|
|
159
|
+
console.log("🚀 ~ 导航栏高度:", navHeight);
|
|
160
|
+
|
|
161
|
+
return navHeight;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.error('获取导航栏高度失败:', error);
|
|
164
|
+
// 返回默认高度(状态栏高度 + 44px 默认导航栏高度)
|
|
165
|
+
return getStatusBarHeight() + 44;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* @returns 包含状态栏高度和导航栏高度的配置对象
|
|
171
|
+
* @description 一次性获取应用所需的状态栏和导航栏高度配置信息
|
|
172
|
+
*/
|
|
173
|
+
export const getTopNavBarHeight = () => {
|
|
174
|
+
try {
|
|
175
|
+
// 获取状态栏高度
|
|
176
|
+
const statusBarHeight = getStatusBarHeight();
|
|
177
|
+
|
|
178
|
+
// 获取导航栏高度
|
|
179
|
+
const navHeight = getNavHeight();
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
statusBarHeight,
|
|
183
|
+
navHeight
|
|
184
|
+
};
|
|
185
|
+
} catch (error) {
|
|
186
|
+
console.error('获取全局配置失败:', error);
|
|
187
|
+
return {
|
|
188
|
+
statusBarHeight: 0,
|
|
189
|
+
navHeight: 44
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
package/src/ui/index.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI交互相关工具函数
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 显示消息提示框
|
|
7
|
+
* @param title 提示的内容,默认为空字符串
|
|
8
|
+
* @param mask 是否显示透明蒙层,默认为 false
|
|
9
|
+
* @param icon 图标类型,默认为 'none'
|
|
10
|
+
* @param duration 提示的延迟时间,默认为 2000 毫秒
|
|
11
|
+
*/
|
|
12
|
+
export const useToast = (
|
|
13
|
+
title: string = '',
|
|
14
|
+
mask: boolean = false,
|
|
15
|
+
icon: 'none' | 'success' | 'loading' | 'error' | 'fail' | 'exception' | undefined = 'none',
|
|
16
|
+
duration: number = 2000
|
|
17
|
+
) => {
|
|
18
|
+
uni.showToast({
|
|
19
|
+
title,
|
|
20
|
+
icon,
|
|
21
|
+
mask,
|
|
22
|
+
duration,
|
|
23
|
+
});
|
|
24
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// tsconfig.json
|
|
2
|
+
{
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"target": "esnext",
|
|
5
|
+
"module": "esnext",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"jsx": "preserve",
|
|
8
|
+
"moduleResolution": "node",
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"sourceMap": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"importHelpers": true,
|
|
13
|
+
"allowSyntheticDefaultImports": true,
|
|
14
|
+
"useDefineForClassFields": true,
|
|
15
|
+
"resolveJsonModule": true,
|
|
16
|
+
"lib": ["esnext", "dom"],
|
|
17
|
+
"types": ["@dcloudio/types"]
|
|
18
|
+
},
|
|
19
|
+
"exclude": ["node_modules", "unpackage", "src/**/*.nvue"]
|
|
20
|
+
}
|