nvue3 1.1.28 → 1.1.30
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/package.json +1 -1
- package/src/http.js +87 -74
- package/src/soft.js +17 -22
package/package.json
CHANGED
package/src/http.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const tstShow = 350;
|
|
1
|
+
const tstShow = 350; //如果请求太快,toast会一闪而过,这里限制为至少350ms后执行hideLoading
|
|
2
|
+
const nextPost = []; //页面不紧急的消息暂存在这里,下一次请求时顺带捎上_append
|
|
3
|
+
const failBox = []; //保存错误消息,若服务器不可达,则临时存在这里
|
|
5
4
|
const isDebug = (process.env.NODE_ENV === 'development');
|
|
6
|
-
const nextPost = [];
|
|
7
|
-
const failBox = [];
|
|
8
5
|
|
|
9
6
|
const baseResp = {
|
|
10
7
|
success: 1,
|
|
@@ -14,15 +11,32 @@ const baseResp = {
|
|
|
14
11
|
};
|
|
15
12
|
|
|
16
13
|
const toastConf = {
|
|
17
|
-
'l': '
|
|
18
|
-
'r': '
|
|
19
|
-
'f': '
|
|
20
|
-
's': '
|
|
21
|
-
'd': '
|
|
22
|
-
'm': '
|
|
23
|
-
'p': '
|
|
14
|
+
'l': 'Loading...',
|
|
15
|
+
'r': 'Reading ...',
|
|
16
|
+
'f': 'Refreshing...',
|
|
17
|
+
's': 'Saving...',
|
|
18
|
+
'd': 'Deletion...',
|
|
19
|
+
'm': 'Sending...',
|
|
20
|
+
'p': 'Paying...',
|
|
24
21
|
};
|
|
25
22
|
|
|
23
|
+
const dimMsg = {
|
|
24
|
+
apierr: 'The API request target must be a string type address and must be mandatory',
|
|
25
|
+
cert: 'Network error or certificate error',
|
|
26
|
+
failed: 'Data request failed',
|
|
27
|
+
system: 'System exception',
|
|
28
|
+
server: 'Server connection failed',
|
|
29
|
+
timeout: 'Connection timeout, please check the network',
|
|
30
|
+
resolve: 'Unable to resolve host',
|
|
31
|
+
network: 'Network request failed',
|
|
32
|
+
bakin: 'Currently using a backup line, should we switch to the main line?',
|
|
33
|
+
bakout: 'Should we switch to the backup line?',
|
|
34
|
+
valid: 'The server did not respond with valid data',
|
|
35
|
+
upload: 'Upload failed',
|
|
36
|
+
frequent: 'Operation too frequent',
|
|
37
|
+
notexist: 'File does not exist',
|
|
38
|
+
}
|
|
39
|
+
|
|
26
40
|
const aliasConf = {};
|
|
27
41
|
|
|
28
42
|
const config = {
|
|
@@ -38,25 +52,28 @@ let justModalTime = 0;
|
|
|
38
52
|
let justPostTime = 0;
|
|
39
53
|
let justPostApi = '';
|
|
40
54
|
|
|
41
|
-
|
|
42
|
-
|
|
43
55
|
const _request = class {
|
|
44
56
|
|
|
45
57
|
constructor(uri, data, method) {
|
|
46
58
|
this.method = method.toUpperCase();
|
|
59
|
+
|
|
47
60
|
if (!data || data === undefined) data = {};
|
|
48
61
|
if (typeof data !== 'object') data = { value: data };
|
|
49
|
-
if ((typeof uri !== 'string') || (!uri)) {
|
|
50
|
-
console.error('error', uri)
|
|
51
|
-
throw new Error('api 请求目标必须是string类型地址,且必填');
|
|
52
|
-
}
|
|
53
|
-
|
|
54
62
|
if ((nextPost.length > 0) && (this.method === 'POST')) {
|
|
55
63
|
data._append = JSON.parse(JSON.stringify(nextPost));
|
|
56
64
|
nextPost.length = 0;
|
|
57
65
|
}
|
|
66
|
+
this.request = data;
|
|
58
67
|
|
|
59
|
-
|
|
68
|
+
if ((typeof uri !== 'string') || (!uri)) {
|
|
69
|
+
if (isDebug) console.error('error', uri)
|
|
70
|
+
throw new Error(dimMsg.apierr);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (uri.slice(0, 4) === 'http') {
|
|
74
|
+
this.api = uri;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
60
77
|
|
|
61
78
|
if (uri[0] === '!') { //uri第1个字符为!,静默处理
|
|
62
79
|
this.silent = true;
|
|
@@ -67,20 +84,12 @@ const _request = class {
|
|
|
67
84
|
uri = uri.slice(1);
|
|
68
85
|
}
|
|
69
86
|
|
|
70
|
-
if (uri.slice(0, 4) === 'http') {
|
|
71
|
-
//https://domain.com/cont/action
|
|
72
|
-
let tmp = uri.split('/');
|
|
73
|
-
uri = '/' + tmp.slice(3).join('/'); //提取URL中的uri部分
|
|
74
|
-
host = `${tmp[0]}//${tmp[2]}`; //提取URL中的host部分
|
|
75
|
-
}
|
|
76
|
-
|
|
77
87
|
if (uri[0] !== '/') { //uri第1个字符为toast,提取出来
|
|
78
88
|
this.toast = toastConf[uri[0]] || '';
|
|
79
89
|
uri = uri.slice(1);
|
|
80
90
|
}
|
|
81
91
|
|
|
82
|
-
this.api =
|
|
83
|
-
this.request = data;
|
|
92
|
+
this.api = config.path + apiAlias(uri);
|
|
84
93
|
}
|
|
85
94
|
|
|
86
95
|
api = '';
|
|
@@ -109,7 +118,6 @@ const _request = class {
|
|
|
109
118
|
response = {};
|
|
110
119
|
}
|
|
111
120
|
|
|
112
|
-
|
|
113
121
|
function apiAlias(api) {
|
|
114
122
|
let uri = api.split('/');
|
|
115
123
|
if (!uri[1]) uri[1] = 'index';
|
|
@@ -132,6 +140,8 @@ function apiAlias(api) {
|
|
|
132
140
|
|
|
133
141
|
/**
|
|
134
142
|
* 请求后台数据出错时,统一弹窗
|
|
143
|
+
*
|
|
144
|
+
*
|
|
135
145
|
*/
|
|
136
146
|
function failMessage(RFM, resolve, reject) {
|
|
137
147
|
|
|
@@ -141,10 +151,10 @@ function failMessage(RFM, resolve, reject) {
|
|
|
141
151
|
RFM.loading = false;
|
|
142
152
|
uni.hideLoading();
|
|
143
153
|
uni.showToast({
|
|
144
|
-
title:
|
|
154
|
+
title: dim.dimMsg,
|
|
145
155
|
icon: 'none'
|
|
146
156
|
});
|
|
147
|
-
reject({ error: 1, message:
|
|
157
|
+
reject({ error: 1, message: dim.dimMsg });
|
|
148
158
|
return;
|
|
149
159
|
}
|
|
150
160
|
if (typeof reject !== 'function') reject = () => {};
|
|
@@ -168,7 +178,7 @@ function failMessage(RFM, resolve, reject) {
|
|
|
168
178
|
const { title, message, cancel } = RFM.response.modal;
|
|
169
179
|
uni.showModal({
|
|
170
180
|
showCancel: Boolean(cancel || false),
|
|
171
|
-
title: title ||
|
|
181
|
+
title: title || dimMsg.failed,
|
|
172
182
|
content: message || RFM.message,
|
|
173
183
|
success(res) {
|
|
174
184
|
RFM.response.confirm = res.confirm;
|
|
@@ -264,7 +274,7 @@ function doSuccess(REQ, res, resolve, reject) {
|
|
|
264
274
|
else {
|
|
265
275
|
//PHP框架级错误,得到的是一个json格式错误信息,基本为php直接返回非200的状态
|
|
266
276
|
REQ.error = REQ.response.error || 502;
|
|
267
|
-
REQ.message = REQ.response.message ||
|
|
277
|
+
REQ.message = REQ.response.message || dimMsg.system;
|
|
268
278
|
Object.assign(REQ.response, baseResp, {
|
|
269
279
|
success: 0,
|
|
270
280
|
error: REQ.error,
|
|
@@ -276,9 +286,9 @@ function doSuccess(REQ, res, resolve, reject) {
|
|
|
276
286
|
}
|
|
277
287
|
catch (err) {
|
|
278
288
|
//上面try里自身出错
|
|
279
|
-
console.error(err)
|
|
289
|
+
if (isDebug) console.error(err)
|
|
280
290
|
REQ.error = 9;
|
|
281
|
-
REQ.message = err.description || err.message ||
|
|
291
|
+
REQ.message = err.description || err.message || dimMsg.system;
|
|
282
292
|
Object.assign(REQ.response, baseResp, {
|
|
283
293
|
success: 0,
|
|
284
294
|
error: 9
|
|
@@ -298,16 +308,42 @@ function doFail(REF, res, resolve, reject) {
|
|
|
298
308
|
host: info[2],
|
|
299
309
|
port: info[3]
|
|
300
310
|
}
|
|
301
|
-
res.message =
|
|
311
|
+
res.message = dimMsg.server + info[2];
|
|
302
312
|
}
|
|
303
313
|
else if (res.errMsg.includes('timeout')) {
|
|
304
|
-
res.message =
|
|
314
|
+
res.message = dimMsg.timeout;
|
|
305
315
|
}
|
|
306
|
-
else if (res.errMsg.includes('Unable to resolve host')) {
|
|
307
|
-
res.message =
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
316
|
+
else if (res.errMsg.includes('Unable to resolve host') || res.errMsg.includes('NAME_NOT_RESOLVED')) {
|
|
317
|
+
res.message = dimMsg.resolve;
|
|
318
|
+
|
|
319
|
+
if (import.meta.env.VITE_API_BACKUP) {
|
|
320
|
+
if (config.path === import.meta.env.VITE_API_BACKUP) {
|
|
321
|
+
uni.showModal({
|
|
322
|
+
title: dimMsg.network,
|
|
323
|
+
content: dimMsg.bakin,
|
|
324
|
+
showCancel: true,
|
|
325
|
+
success(cnf) {
|
|
326
|
+
if (cnf.confirm) {
|
|
327
|
+
config.path = import.meta.env.VITE_API;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
uni.showModal({
|
|
334
|
+
title: dimMsg.network,
|
|
335
|
+
content: dimMsg.bakout,
|
|
336
|
+
showCancel: true,
|
|
337
|
+
success(cnf) {
|
|
338
|
+
if (cnf.confirm) {
|
|
339
|
+
config.path = import.meta.env.VITE_API_BACKUP;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
}
|
|
346
|
+
|
|
311
347
|
}
|
|
312
348
|
else {
|
|
313
349
|
let mer = res.errMsg.match(/<title>(.+)<\/title>/);
|
|
@@ -343,15 +379,11 @@ function doComplete(request, res, resolve, reject) {
|
|
|
343
379
|
console.log(request)
|
|
344
380
|
}
|
|
345
381
|
|
|
346
|
-
|
|
347
382
|
function postFailBox() {
|
|
348
383
|
if (failBox.length === 0) return;
|
|
349
384
|
return doRequest(new _request(`!${api}`, failBox, 'post'));
|
|
350
385
|
}
|
|
351
386
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
387
|
async function doRequest(request) {
|
|
356
388
|
|
|
357
389
|
if (request.toast) {
|
|
@@ -362,10 +394,10 @@ async function doRequest(request) {
|
|
|
362
394
|
});
|
|
363
395
|
}
|
|
364
396
|
|
|
365
|
-
|
|
366
397
|
return new Promise(async (resolve, reject) => {
|
|
367
398
|
request.timer.ready = Date.now();
|
|
368
|
-
|
|
399
|
+
await processor.preprocessing(request);
|
|
400
|
+
// request.header.put = await processor.header(request.api, request.request, request.method);
|
|
369
401
|
const contType = (request.method === 'UPLOAD') ? 'multipart/form-data' : 'application/json';
|
|
370
402
|
request.header.put['content-type'] = contType;
|
|
371
403
|
delete request.header.put['referer'];
|
|
@@ -394,14 +426,10 @@ async function doRequest(request) {
|
|
|
394
426
|
});
|
|
395
427
|
}
|
|
396
428
|
|
|
397
|
-
|
|
398
429
|
function thisPost(api, data = {}) {
|
|
399
430
|
return doRequest(new _request(api, data, 'post'));
|
|
400
431
|
}
|
|
401
432
|
|
|
402
|
-
/**
|
|
403
|
-
* @param {Object} option
|
|
404
|
-
*/
|
|
405
433
|
/**
|
|
406
434
|
* @param {Object} uri
|
|
407
435
|
* @param {Object} option
|
|
@@ -426,7 +454,7 @@ async function doUploadAliYun(uri, option) {
|
|
|
426
454
|
const { url, formData, name, save } = resConf.data;
|
|
427
455
|
// console.log({ url, formData, name });
|
|
428
456
|
if (!url) {
|
|
429
|
-
return reject({ success: false, error: 505, message:
|
|
457
|
+
return reject({ success: false, error: 505, message: dimMsg.valid });
|
|
430
458
|
}
|
|
431
459
|
|
|
432
460
|
uni.uploadFile({
|
|
@@ -462,10 +490,9 @@ async function doUploadAliYun(uri, option) {
|
|
|
462
490
|
}
|
|
463
491
|
|
|
464
492
|
else {
|
|
465
|
-
reject({ success: false, error: resUp.statusCode, message:
|
|
493
|
+
reject({ success: false, error: resUp.statusCode, message: dimMsg.upload });
|
|
466
494
|
}
|
|
467
495
|
|
|
468
|
-
|
|
469
496
|
},
|
|
470
497
|
fail: errUp => {
|
|
471
498
|
// console.log({ errUp });
|
|
@@ -480,15 +507,9 @@ async function doUploadAliYun(uri, option) {
|
|
|
480
507
|
}
|
|
481
508
|
);
|
|
482
509
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
510
|
})
|
|
489
511
|
}
|
|
490
512
|
|
|
491
|
-
|
|
492
513
|
/**
|
|
493
514
|
* 操作频率检查
|
|
494
515
|
* @param {Object} api
|
|
@@ -503,7 +524,7 @@ async function FrequencyDetection(api) {
|
|
|
503
524
|
// console.log({ nowTime, justPostTime, just: nowTime - justPostTime, detection: config.detection });
|
|
504
525
|
|
|
505
526
|
return new Promise((resolve, reject) => {
|
|
506
|
-
reject({ error: 1, success: 0, message:
|
|
527
|
+
reject({ error: 1, success: 0, message: dimMsg.frequent })
|
|
507
528
|
});
|
|
508
529
|
|
|
509
530
|
}
|
|
@@ -514,8 +535,6 @@ async function FrequencyDetection(api) {
|
|
|
514
535
|
return null; //操作正常,可以继续
|
|
515
536
|
}
|
|
516
537
|
|
|
517
|
-
|
|
518
|
-
|
|
519
538
|
async function downloadFile(url, callback) {
|
|
520
539
|
|
|
521
540
|
const key = url.md5();
|
|
@@ -549,7 +568,7 @@ async function downloadFile(url, callback) {
|
|
|
549
568
|
}
|
|
550
569
|
else {
|
|
551
570
|
console.log('download null', { res })
|
|
552
|
-
resolve({ success: false, message:
|
|
571
|
+
resolve({ success: false, message: dimMsg.notexist })
|
|
553
572
|
}
|
|
554
573
|
},
|
|
555
574
|
fail: err => {
|
|
@@ -569,13 +588,10 @@ async function downloadFile(url, callback) {
|
|
|
569
588
|
|
|
570
589
|
});
|
|
571
590
|
|
|
572
|
-
|
|
573
|
-
|
|
574
591
|
});
|
|
575
592
|
|
|
576
593
|
}
|
|
577
594
|
|
|
578
|
-
|
|
579
595
|
return new Promise(async (resolve, reject) => {
|
|
580
596
|
|
|
581
597
|
let cache = uni.getStorageSync(key);
|
|
@@ -602,8 +618,6 @@ async function downloadFile(url, callback) {
|
|
|
602
618
|
|
|
603
619
|
}
|
|
604
620
|
|
|
605
|
-
|
|
606
|
-
|
|
607
621
|
export default class {
|
|
608
622
|
processor = null;
|
|
609
623
|
|
|
@@ -612,6 +626,7 @@ export default class {
|
|
|
612
626
|
for (let k in config) config[k] = conf[k];
|
|
613
627
|
if (conf.toast) Object.assign(toastConf, conf.toast);
|
|
614
628
|
if (conf.alias) Object.assign(aliasConf, conf.alias);
|
|
629
|
+
if (conf.locale) Object.assign(dimMsg, conf.locale);
|
|
615
630
|
if (isDebug) console.log(config);
|
|
616
631
|
}
|
|
617
632
|
|
|
@@ -658,6 +673,4 @@ export default class {
|
|
|
658
673
|
return await downloadFile(uri, callback);
|
|
659
674
|
}
|
|
660
675
|
|
|
661
|
-
|
|
662
|
-
|
|
663
676
|
};
|
package/src/soft.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export default class {
|
|
2
2
|
system = ''; //操作系统及版本
|
|
3
|
-
platform = process.env.VUE_APP_PLATFORM; //mp-weixin,h5,app
|
|
3
|
+
platform = process.env.VUE_APP_PLATFORM; //mp-weixin,h5,app等
|
|
4
4
|
mode = process.env.NODE_ENV; //运行环境
|
|
5
5
|
|
|
6
6
|
brand = ''; //手机品牌,huawei,xiaomi,vivo,oppo
|
|
@@ -9,7 +9,7 @@ export default class {
|
|
|
9
9
|
|
|
10
10
|
singlePage = false; //是否从朋友圈进入的单页模式
|
|
11
11
|
|
|
12
|
-
// #ifdef APP
|
|
12
|
+
// #ifdef APP
|
|
13
13
|
os = '';
|
|
14
14
|
ua = '';
|
|
15
15
|
packName = ''; //APP包名
|
|
@@ -51,7 +51,7 @@ export default class {
|
|
|
51
51
|
const base = uni.getAppBaseInfo();
|
|
52
52
|
this.name = base.appName || 'unknow'; //应用名称
|
|
53
53
|
this.sdk = base.SDKVersion || '0.0.0'; //SDK主版本号
|
|
54
|
-
this.appid = base.appId; //这是uniAPP的ID,不是小程序的ID
|
|
54
|
+
this.appid = base.appId; //这是DCloud uniAPP的ID,不是小程序的ID
|
|
55
55
|
this.version = base.appVersion; //APP的版本号,也就是在manifest中设置的版本号,小程序为提交申核的版本号
|
|
56
56
|
this.theme = base.theme; //主体色
|
|
57
57
|
|
|
@@ -96,11 +96,11 @@ export default class {
|
|
|
96
96
|
const system = uni.getSystemInfoSync();
|
|
97
97
|
|
|
98
98
|
this.brand = (system.brand || 'unknow').toLowerCase(); //手机品牌
|
|
99
|
-
this.name = system.name || 'unknow';
|
|
99
|
+
this.name = system.appName || system.name || 'unknow'; //应用名称,manifest中设的名称
|
|
100
100
|
this.model = system.model || 'unknow'; //手机品牌下的型号
|
|
101
101
|
this.devid = system.deviceId || 'unknow'; //设备唯一编码
|
|
102
|
-
this.sdk = system.SDKVersion || '0.0.0'; //小程序主版本号
|
|
103
|
-
this.appid = system.appId;
|
|
102
|
+
this.sdk = system.SDKVersion || system.hostSDKVersion || '0.0.0'; //小程序主版本号
|
|
103
|
+
this.appid = system.appId; //这是DCloud uniapp的appID
|
|
104
104
|
this.os = system.osName;
|
|
105
105
|
this.osver = system.osVersion;
|
|
106
106
|
this.version = system.appVersion; //APP的版本号,也就是在manifest中设置的版本号,小程序为提交申核的版本号
|
|
@@ -141,7 +141,6 @@ export default class {
|
|
|
141
141
|
if (!this.version) this.version = accountTou.microapp.envType;
|
|
142
142
|
// #endif
|
|
143
143
|
|
|
144
|
-
|
|
145
144
|
//胶囊按钮
|
|
146
145
|
// #ifdef MP-WEIXIN||MP-ALIPAY||MP-BAIDU||MP-TOUTIAO||MP-QQ
|
|
147
146
|
this.size.button = uni.getMenuButtonBoundingClientRect();
|
|
@@ -152,7 +151,7 @@ export default class {
|
|
|
152
151
|
this.size.button = { bottom: 56, height: 32, left: (width - 94), right: (width - 7), top: 24, width: 87 };
|
|
153
152
|
// #endif
|
|
154
153
|
|
|
155
|
-
// #ifdef APP
|
|
154
|
+
// #ifdef APP
|
|
156
155
|
this.os = plus.os.name.toLowerCase(); //操作系统,android或ios
|
|
157
156
|
this.osver = plus.os.version; //操作系统版本号
|
|
158
157
|
this.version = import.meta.env.VITE_VERSION; //热更包版本号
|
|
@@ -184,7 +183,6 @@ export default class {
|
|
|
184
183
|
});
|
|
185
184
|
}
|
|
186
185
|
|
|
187
|
-
|
|
188
186
|
plus.device.getInfo({
|
|
189
187
|
success: (res) => {
|
|
190
188
|
// console.log('plus.device.getInfo', res)
|
|
@@ -206,8 +204,6 @@ export default class {
|
|
|
206
204
|
|
|
207
205
|
}
|
|
208
206
|
|
|
209
|
-
|
|
210
|
-
|
|
211
207
|
/**
|
|
212
208
|
* 设置屏幕常亮
|
|
213
209
|
*
|
|
@@ -220,7 +216,7 @@ export default class {
|
|
|
220
216
|
keepScreenOn: keep
|
|
221
217
|
});
|
|
222
218
|
//#endif
|
|
223
|
-
//#ifdef APP
|
|
219
|
+
//#ifdef APP
|
|
224
220
|
plus.device.setWakelock(keep);
|
|
225
221
|
//#endif
|
|
226
222
|
}
|
|
@@ -235,7 +231,7 @@ export default class {
|
|
|
235
231
|
version: this.version,
|
|
236
232
|
theme: this.theme,
|
|
237
233
|
|
|
238
|
-
//#ifdef APP
|
|
234
|
+
//#ifdef APP
|
|
239
235
|
os: this.os,
|
|
240
236
|
packName: this.packName,
|
|
241
237
|
simulator: this.simulator, //模拟器可能性判断,oaid,aaid,uuid其中任一个读取出错各加1
|
|
@@ -248,7 +244,6 @@ export default class {
|
|
|
248
244
|
}
|
|
249
245
|
}
|
|
250
246
|
|
|
251
|
-
|
|
252
247
|
/**
|
|
253
248
|
* 为了防止快速点按返回键导致程序退出重写quit方法改为隐藏至后台
|
|
254
249
|
* 重写toast方法如果内容为 ‘再次返回退出应用’ 就隐藏应用,其他正常toast
|
|
@@ -264,18 +259,18 @@ export default class {
|
|
|
264
259
|
/**
|
|
265
260
|
* 再次返回退出应用
|
|
266
261
|
*/
|
|
267
|
-
|
|
262
|
+
const title = 'Press again to exit the application';
|
|
263
|
+
if (str === title) {
|
|
268
264
|
plus.runtime.quit();
|
|
265
|
+
return;
|
|
269
266
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
267
|
+
|
|
268
|
+
uni.showToast({
|
|
269
|
+
title,
|
|
270
|
+
icon: 'none'
|
|
271
|
+
})
|
|
276
272
|
});
|
|
277
273
|
|
|
278
274
|
}
|
|
279
275
|
|
|
280
|
-
|
|
281
276
|
}
|