@10yun/cv-mobile-ui 0.5.23 → 0.5.26

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@10yun/cv-mobile-ui",
3
- "version": "0.5.23",
3
+ "version": "0.5.26",
4
4
  "description": "十云cvjs移动端ui,适用uniapp",
5
5
  "author": "10yun",
6
6
  "license": "Apache-2.0",
@@ -12,8 +12,7 @@
12
12
  "type": "git",
13
13
  "url": "https://gitee.com/cvjs/cv-mobile-ui"
14
14
  },
15
- "dependencies": {},
16
- "devDependencies": {},
15
+ "scripts": {},
17
16
  "browserslist": [
18
17
  "Android >= 7",
19
18
  "ios >= 9"
@@ -29,16 +29,37 @@ function showErrorMsg(msg) {
29
29
  title: msg || ''
30
30
  });
31
31
  }
32
+ /*
33
+ * 收集错误信息
34
+ */
35
+ const EnumStatusToTitle = {
36
+ 400: '请求错误',
37
+ 400: '无效请求',
38
+ 401: '未经授权',
39
+ 403: '拒绝访问',
40
+ 404: '请求出错',
41
+ 408: '请求超时',
42
+ 422: '请求参数错误',
43
+ 500: '服务器错误',
44
+ 501: '服务未实现',
45
+ 502: '网络错误',
46
+ 503: '服务不可用',
47
+ 504: '网络超时',
48
+ 505: 'HTTP版本不受支持',
49
+ 10001: '未登录',
50
+ 10002: 'token过期',
51
+ 10009: '退出登录'
52
+ };
53
+ const EnumStatusToMsg = {
54
+ 401: '没有权限,请重新登录'
55
+ };
32
56
 
33
57
  class RequestClass {
34
58
  constructor(options = {}) {
35
- this.storeHandle = options.storeHandle || null;
36
- this.jumpHandle = options.jumpHandle || null;
37
- /* 新创建 axios 实例配置 */
38
59
  this.flagMap = options.flagMap || {};
39
60
  this.flagFunc = options.flagFunc;
40
61
  this.baseURL = options.baseURL || '';
41
- this.requests = options.requests || {};
62
+ this.requests = Object.assign({}, options.requests || {});
42
63
  /**
43
64
  * 内置的,支持的 methods
44
65
  * 处理,需要转换的 methods
@@ -64,9 +85,13 @@ class RequestClass {
64
85
  };
65
86
 
66
87
  this.headers = Object.assign({}, {}, options.headers || {});
67
-
88
+ // 需要加密的url
89
+ this.encryptURL = options.encryptURL || [];
90
+ this.encryptFlag = false;
68
91
  this.canshuOpt = {};
69
-
92
+ this.retries = 3;
93
+ this.debugState = options.debug || false;
94
+ this.requestHandle = null;
70
95
  /* 新创建 axios 实例配置 */
71
96
  this.creSett = Object.assign(
72
97
  {},
@@ -80,13 +105,16 @@ class RequestClass {
80
105
  },
81
106
  {}
82
107
  );
83
-
84
108
  this._initReqHandle();
85
- // this.flagApi = this.flagApi.bind(this);
86
109
  }
87
- /*初始化 request 句柄 */
110
+ debugLog() {
111
+ if (this.debugState) {
112
+ console.log('[调试]', ...arguments);
113
+ }
114
+ }
115
+ /* 初始化 request 句柄 */
88
116
  _initReqHandle() {
89
- var _this = this;
117
+ let _this = this;
90
118
  }
91
119
 
92
120
  /**
@@ -115,7 +143,7 @@ class RequestClass {
115
143
  */
116
144
  setDefHeaders(options) {
117
145
  this.headers = Object.assign({}, this.headers, options || {});
118
- this.reqObj.defaults.headers = this.headers;
146
+ // this.reqObj.defaults.headers = this.headers;
119
147
  return this;
120
148
  }
121
149
  setHeaders(options) {
@@ -129,7 +157,7 @@ class RequestClass {
129
157
  */
130
158
  setDefRequests(options) {
131
159
  this.requests = Object.assign({}, this.requests, options || {});
132
- this.reqObj.defaults.requests = this.requests;
160
+ // this.reqObj.defaults.requests = this.requests;
133
161
  return this;
134
162
  }
135
163
  setRequests(options) {
@@ -137,41 +165,95 @@ class RequestClass {
137
165
  return this;
138
166
  }
139
167
  /**
140
- * 设置响应
168
+ * 设置body 参数
169
+ * 设置 额外参数
170
+ * @param {Object} options
171
+ * @returns {Class} this
172
+ */
173
+ setOptions(options = {}) {
174
+ this.canshuOpt = Object.assign({}, this.canshuOpt, options || {});
175
+ return this;
176
+ }
177
+ /**
178
+ * 设置 signal
179
+ */
180
+ setSignal(signal) {}
181
+ /**
182
+ * 请求前置
183
+ * 请求后置
141
184
  */
142
- setResponse(apiResData) {
143
- var apiResStatus = apiResData.status || -1;
185
+ requestBefore(callFunc) {
186
+ this.requestBeforeCall = callFunc;
187
+ }
188
+ requestAfter(callFunc) {
189
+ this.requestAfterCall = callFunc;
190
+ }
191
+ /**
192
+ * 加密
193
+ */
194
+ encrypt() {
195
+ this.encryptFlag = true;
196
+ return this;
197
+ }
198
+ /***
199
+ * ================== ================== ================== ==================
200
+ * 允许重写
201
+ * ================== ================== ================== ==================
202
+ */
203
+ /**
204
+ * 设置错误时响应
205
+ */
206
+ resetNetError(error) {
207
+ showErrorMsg(error.message || '');
208
+ console.log(error.message || '');
209
+ }
210
+ /**
211
+ * 设置网络请求响应
212
+ * 设置自定义业务响应
213
+ */
214
+ resetNetResponse(apiResData) {
215
+ // 修改请求状态
216
+ _hideUniapp();
217
+
218
+ let apiResStatus = apiResData.status || apiResData.code || -1;
219
+ let apiResMessage = apiResData.msg || apiResData.message || '操作失败';
220
+ apiResStatus = parseInt(apiResStatus);
144
221
  // 这里根据后端提供的数据进行对应的处理
145
222
  switch (apiResStatus) {
146
223
  // 没有凭证,请登录
147
- case '100101':
148
224
  case 100101:
149
- _hideUniapp();
150
- this.storeHandle.dispatch('storeUser/ssLogout', false);
151
- this.jumpHandle.jumpsLogin();
225
+ // 【退出登录操作】
226
+ this.resetNetError({ type: 'error', message: apiResMessage });
152
227
  break;
153
228
  // 无效凭证,请重新登录
154
- case '100102':
155
229
  case 100102:
156
- _hideUniapp();
157
- this.storeHandle.dispatch('storeUser/ssLogout', false);
158
- this.jumpHandle.jumpsLogin();
230
+ // 【退出登录操作】
231
+ let errorData = Object.assign(apiResData, { type: 'error', message: apiResMessage });
232
+ this.resetNetError(errorData);
159
233
  break;
160
234
  // 凭证过期,请重新登录
161
- case '100103':
162
235
  case 100103:
163
- _hideUniapp();
164
- this.storeHandle.dispatch('storeUser/ssLogout', false);
165
- this.jumpHandle.jumpsLogin();
236
+ // 【退出登录操作】
166
237
  return;
167
238
  break;
168
- // 无效凭证,请重新登录
169
- case '100109':
239
+ // syOpenAppToken 错误
240
+ case 100109:
241
+ break;
242
+ case 422:
243
+ case 100422:
244
+ let msg422 = apiResMessage || '操作失败';
245
+ this.resetNetError({ type: 'error', message: `${msg422}` });
246
+ return Promise.reject(apiResData);
170
247
  break;
248
+ case 404:
249
+ case 100404:
250
+ let msg404 = apiResMessage || '操作失败';
251
+ this.resetNetError({ type: 'error', message: `${msg404}` });
252
+ return Promise.reject(apiResData);
253
+ // return new Promise((resolve, reject) => {});
171
254
  case '8002':
172
255
  case 8002: // uni.login 微信注册
173
- _hideUniapp();
174
- this.jumpHandle.jumpsLogin();
256
+ //
175
257
  break;
176
258
  case '13001':
177
259
  case 13001:
@@ -189,35 +271,20 @@ class RequestClass {
189
271
  });
190
272
  break;
191
273
  // 处理成功
192
- case '200':
193
274
  case 200:
194
- // if (apiResData.length == 0) {
195
- //
196
- // }
275
+ // this.requestAfterCall?.();
197
276
  return apiResData;
277
+ return Promise.resolve(apiResData);
278
+ break;
279
+ // 调试
280
+ case -1:
281
+ return Promise.reject({ message: 'error' });
198
282
  break;
199
- // 默认错误
200
283
  default:
201
- // clearTimeout(time);
202
- _hideUniapp();
203
- var apiResMsg = apiResData.msg || '';
204
- if (apiResMsg == 'Unknown') {
205
- apiResMsg = '';
206
- }
207
- uni.showModal({
208
- title: '提示',
209
- content: apiResMsg || '目前服务繁忙,请稍后重试',
210
- showCancel: false,
211
- success: function (res) {
212
- if (res.confirm) {
213
- console.log('用户点击确定');
214
- }
215
- }
216
- });
284
+ return apiResData;
217
285
  break;
218
286
  }
219
- //返回reject状态 会被最后catch捕获。
220
- return new Promise((resolve, reject) => {});
287
+ console.log('---');
221
288
  }
222
289
  /**
223
290
  * 调用 API 统一 请求 方法
@@ -226,18 +293,26 @@ class RequestClass {
226
293
  * @version 2018-12-20
227
294
  * @param apiUrl 不需要域名,域名统一拼接,只填写相关请求接口 【必须】
228
295
  * @param reqData 提交参数
229
- * @returns
296
+ * @return
230
297
  *
231
298
  */
232
299
  apiAll(type, apiUrl, reqData) {
233
- var _this = this;
234
- let request_setttings = {
235
- url: this.baseURL + apiUrl,
236
- header: this.headers
237
- };
238
- if (apiUrl.indexOf('http://') != -1 || apiUrl.indexOf('https://') != -1) {
239
- request_setttings.url = apiUrl;
300
+ let request_url = this.baseURL + apiUrl;
301
+ // if (apiUrl.indexOf('http://') != -1 || apiUrl.indexOf('https://') != -1) {
302
+ if (apiUrl.includes('http://') || apiUrl.includes('https://')) {
303
+ request_url = apiUrl;
240
304
  }
305
+ /**
306
+ * TODO 过滤除了 https:// 和 http:// 以外的 // 和 ///,但保留 ? 后面的内容
307
+ * request_url = request_url.replace(/^(https?:\/\/[^/]+)\/+/g, '$1/');
308
+ */
309
+ /**
310
+ * 使用正则表达式进行过滤
311
+ * 过滤除了 https:// 和 http:// 以外的 // 和 ///
312
+ */
313
+ request_url = request_url.replace(/([^:]\/)\/+/g, '$1');
314
+
315
+ var _this = this;
241
316
 
242
317
  reqData = reqData || {};
243
318
  reqData = Object.assign({}, this.requests, reqData);
@@ -251,7 +326,10 @@ class RequestClass {
251
326
 
252
327
  // 初始化句柄
253
328
  let $requestHandle = null;
254
-
329
+ let request_setttings = {
330
+ url: request_url,
331
+ header: this.headers
332
+ };
255
333
  if (type == 'upload') {
256
334
  /* 文件上传 */
257
335
  // 一定要删除这个,让uni.uploadFile自己携带
@@ -297,124 +375,103 @@ class RequestClass {
297
375
  // }
298
376
  $requestHandle = uni.request(request_setttings);
299
377
  }
300
- return $requestHandle
301
- .then((uniRes) => {
302
- // uniRes 为微信返回 + 接口返回 拼接的数据
303
- if (uniRes.statusCode == 200) {
304
- uni.hideNavigationBarLoading();
305
- // apiResData 接口返回 拼接的数据,一般 success 成功,开发者只需要 apiResData
306
- // let apiResData = JSON.parse(uniRes.data, true);
307
- let apiResData = uniRes.data || {};
378
+ return $requestHandle.then((uniRes) => {
379
+ _hideUniapp();
380
+ // console.log('----开始请求啊 ------', uniRes);
381
+ let apiResData = uniRes.data || {};
382
+ // uniRes 为微信返回 + 接口返回 拼接的数据
383
+ if (uniRes.statusCode == 200) {
384
+ // uni.hideNavigationBarLoading();
308
385
 
309
- // upload需要json转数组
310
- if (type == 'upload') {
311
- apiResData = JSON.parse(apiResData, true);
312
- }
313
- return _this.setResponse(apiResData);
314
- } else if (uniRes.statusCode == 502) {
315
- } else {
316
- _hideUniapp();
317
- if (type == 'POST') {
318
- uni.showModal({
319
- content: '加载错误!请稍后重试',
320
- showCancel: false,
321
- success: function (res) {
322
- if (res.confirm) {
323
- console.log('用户点击确定');
324
- } else {
325
- console.log('用户点击取消');
326
- }
327
- }
328
- });
329
- }
386
+ // apiResData 为 接口返回 拼接的数据,一般 success 成功,开发者只需要 apiResData
387
+ // let apiResData = JSON.parse(uniRes.data, true);
388
+
389
+ // upload需要json转数组
390
+ if (type == 'upload') {
391
+ apiResData = JSON.parse(apiResData, true);
330
392
  }
331
- })
332
- .catch(function (uniRes) {
333
- _hideUniapp();
334
- console.log('--catch--', uniRes);
335
- // MessageTip.info('网络繁忙,请稍后再试');
336
- // uni.showModal({
337
- // content: '请求超时!请检查网络',
338
- // showCancel: false,
339
- // success: function (res) {
340
- // if (res.confirm) {
341
- // console.log('用户点击确定');
342
- // }
343
- // }
344
- // });
345
- });
393
+ return _this.resetNetResponse(apiResData);
394
+ } else if (uniRes.statusCode == 502) {
395
+ } else {
396
+ return _this.resetNetResponse(apiResData);
397
+ }
398
+ });
399
+ // .catch((uniRes) => {
400
+ // console.log('--request-catch--', uniRes);
401
+ // return Promise.reject(uniRes);
402
+ // });
346
403
  }
347
404
  /**
348
405
  * GET 请求
349
406
  */
350
407
  flagGet() {
351
- let argumentsArr = arguments;
408
+ const argumentsArr = arguments;
352
409
  return this.unifyApi('flag', 'GET', argumentsArr);
353
410
  }
354
411
  urlGet() {
355
- let argumentsArr = arguments;
412
+ const argumentsArr = arguments;
356
413
  return this.unifyApi('url', 'GET', argumentsArr);
357
414
  }
358
415
  /**
359
416
  * POST 请求
360
417
  */
361
418
  flagPost() {
362
- let argumentsArr = arguments;
419
+ const argumentsArr = arguments;
363
420
  return this.unifyApi('flag', 'POST', argumentsArr);
364
421
  }
365
422
  urlPost() {
366
- let argumentsArr = arguments;
423
+ const argumentsArr = arguments;
367
424
  return this.unifyApi('url', 'POST', argumentsArr);
368
425
  }
369
426
  /**
370
427
  * PUT 请求
371
428
  */
372
429
  flagPut() {
373
- let argumentsArr = arguments;
430
+ const argumentsArr = arguments;
374
431
  return this.unifyApi('flag', 'PUT', argumentsArr);
375
432
  }
376
433
  urlPut() {
377
- let argumentsArr = arguments;
434
+ const argumentsArr = arguments;
378
435
  return this.unifyApi('url', 'PUT', argumentsArr);
379
436
  }
380
437
  /**
381
438
  * PATCH 请求
382
439
  */
383
440
  flagPatch() {
384
- let argumentsArr = arguments;
441
+ const argumentsArr = arguments;
385
442
  return this.unifyApi('flag', 'PATCH', argumentsArr);
386
443
  }
387
444
  urlPatch() {
388
- let argumentsArr = arguments;
445
+ const argumentsArr = arguments;
389
446
  return this.unifyApi('url', 'PATCH', argumentsArr);
390
447
  }
391
448
  /**
392
449
  * DELETE 请求
393
450
  */
394
451
  flagDel() {
395
- let argumentsArr = arguments;
452
+ const argumentsArr = arguments;
396
453
  return this.unifyApi('flag', 'DELETE', argumentsArr);
397
454
  }
398
455
  urlDel() {
399
- let argumentsArr = arguments;
456
+ const argumentsArr = arguments;
400
457
  return this.unifyApi('url', 'DELETE', argumentsArr);
401
458
  }
402
459
  /* 文件上传通用 */
403
460
  flagUpload() {
404
- let argumentsArr = arguments;
461
+ const argumentsArr = arguments;
405
462
  return this.unifyApi('flag', 'UPLOAD', argumentsArr);
406
463
  }
407
464
  urlUpload() {
408
- let argumentsArr = arguments;
465
+ const argumentsArr = arguments;
409
466
  return this.unifyApi('url', 'UPLOAD', argumentsArr);
410
467
  }
411
468
  /* 图片上传通用 */
412
469
  flagUpImg() {
413
- let argumentsArr = arguments;
470
+ const argumentsArr = arguments;
414
471
  return this.unifyApi('flag', 'UPLOAD', argumentsArr);
415
472
  }
416
473
  urlUpImg() {
417
- let argumentsArr = arguments;
474
+ const argumentsArr = arguments;
418
475
  return this.unifyApi('url', 'UPLOAD', argumentsArr);
419
476
  }
420
477
  /**
@@ -425,8 +482,10 @@ class RequestClass {
425
482
  let argNum = argumentsArr.length || 0;
426
483
  if (argNum <= 0 || argNum > 3) {
427
484
  let errorMsg = `-- ${methodType} : 参数为(1-3)个---`;
428
- console.warn('[cv-ui warn]: ', errorMsg);
429
- return false;
485
+ return new Promise((resolve, reject) => {
486
+ this.resetNetError({ message: errorMsg });
487
+ return reject({ message: errorMsg });
488
+ });
430
489
  }
431
490
  let apiUrl = '';
432
491
  let apiUrlNoMsg = '';
@@ -447,8 +506,8 @@ class RequestClass {
447
506
  }
448
507
  if (apiUrl == '') {
449
508
  return new Promise((resolve, reject) => {
450
- showErrorMsg(apiUrlNoMsg);
451
- return reject({ msg: apiUrlNoMsg });
509
+ this.resetNetError({ message: apiUrlNoMsg });
510
+ return reject({ message: apiUrlNoMsg });
452
511
  });
453
512
  }
454
513
 
@@ -463,13 +522,15 @@ class RequestClass {
463
522
  let arg2Type = Object.prototype.toString.call(arg2Val);
464
523
  // let argType2_2 = typeof argumentsArr[1] === 'object';
465
524
  if (arg2Type === '[object String]' || arg2Type === '[object Number]') {
466
- // console.log('----转换-----', parseInt(arg2Val), Number(arg2Val));
467
- var isEndId = Number(arg2Val);
468
- if (!isNaN(isEndId)) {
525
+ // console.log('----转换-----', BigInt(arg2Val), Number(arg2Val)); 超过17位
526
+ if (!isNaN(arg2Val)) {
469
527
  // console.log('---数字');
470
- let isEndStr = confirmEnding(apiUrl, '/');
471
- let endAppendStr = isEndStr ? isEndId : '/' + isEndId;
472
- apiUrl = apiUrl + endAppendStr;
528
+ let bigIntNum = BigInt(`${arg2Val}`);
529
+ let isEndId = bigIntNum.toString();
530
+ if (!confirmEnding(apiUrl, '/')) {
531
+ apiUrl = apiUrl + '/';
532
+ }
533
+ apiUrl = apiUrl + isEndId;
473
534
  } else {
474
535
  // console.log('---字符');
475
536
  }
@@ -486,7 +547,7 @@ class RequestClass {
486
547
  return _this.apiAll(methodType, apiUrl, reqData);
487
548
  } else {
488
549
  return new Promise((resolve, reject) => {
489
- return reject({ msg: ' 请求错误 ' });
550
+ return reject({ message: ' 请求错误 ' });
490
551
  });
491
552
  }
492
553
  }
@@ -20,11 +20,13 @@ class StorageClass {
20
20
  constructor(options = {}) {
21
21
  this.config = Object.assign(
22
22
  {
23
+ cache_keys: 'syCacheKeys',
23
24
  prefix: '',
24
25
  suffix: ''
25
26
  },
26
27
  options
27
28
  );
29
+ this.KEYS_CACHE_FLAG = this.config.cache_keys;
28
30
  }
29
31
  _getAllCache() {
30
32
  let fullKey = this._getFullKey('___') || {};
@@ -54,6 +56,46 @@ class StorageClass {
54
56
  }
55
57
  return key;
56
58
  }
59
+ localGet(key) {
60
+ return this.getSync(key) || '';
61
+ }
62
+ localSet(key, value) {
63
+ this.updateKey(key);
64
+ this.setAsync(key, value);
65
+ this.setSync(key, value);
66
+ }
67
+ localDel(key) {
68
+ this.removeAsync(key);
69
+ this.removeSync(key);
70
+ }
71
+ updateKey(key) {
72
+ let allCacheKeys = this.getSync(this.KEYS_CACHE_FLAG) || {};
73
+ // 当前时间
74
+ let currTime = parseInt(new Date().getTime() / 1000);
75
+ allCacheKeys[key] = currTime + 60 * 60 * 24 * 7; // 7天
76
+ this.setSync(this.KEYS_CACHE_FLAG, allCacheKeys);
77
+ }
78
+ checkKey(key) {
79
+ // 所有缓存keys
80
+ let allCacheKeys = this.getSync(this.KEYS_CACHE_FLAG) || {};
81
+ // 缓存时间
82
+ let currCacheExpires = allCacheKeys[key] || 0;
83
+ if (currCacheExpires > 0) {
84
+ return true;
85
+ }
86
+ // 当前时间
87
+ let currTime = parseInt(new Date().getTime() / 1000);
88
+ // 当前缓存
89
+ let currCache = this.getSync(key) || null;
90
+ if (!currCache) {
91
+ return false;
92
+ }
93
+ console.log(currCache);
94
+ if (currCache.length == 0 || currTime > currCacheExpires) {
95
+ return false;
96
+ }
97
+ return true;
98
+ }
57
99
  /**
58
100
  * 设置缓存 - 异步
59
101
  * @param {[type]} key [键名]
@@ -14,9 +14,8 @@ const SECRET_KEY = CryptoJS.enc.Utf8.parse('3333e6e143439161');
14
14
  // 十六位十六进制数作为密钥偏移量
15
15
  const SECRET_IV = CryptoJS.enc.Utf8.parse('e3bbe7e3ba84431a');
16
16
 
17
- // 类型 window.localStorage,window.sessionStorage,
18
17
  const config = {
19
- type: 'localStorage', // 本地存储类型 sessionStorage
18
+ type: 'localStorage', // 本地存储类型localStorage、 sessionStorage
20
19
  prefix: 'SDF_0.0.1', // 名称前缀 建议:项目名 + 项目版本
21
20
  expire: 1, //过期时间 单位:秒
22
21
  isEncrypt: true // 默认加密 为了调试方便, 开发过程中可以不加密
@@ -1,5 +1,5 @@
1
1
  let cacheMap = new Map();
2
- let timeoutDefault = 86400; // 设置默认超时时间,单位秒 3600*24
2
+ let timeoutDefault = 86400; // 设置默认超时时间,单位秒 60 * 60 * 24 (1天)
3
3
 
4
4
  function isTimeout(name) {
5
5
  const data = cacheMap.get(name);