fstarter 2.10.42 → 2.10.46
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/.babelrc +6 -6
- package/.editorconfig +9 -9
- package/README.md +18 -18
- package/fstarter.iml +9 -0
- package/index.html +22 -22
- package/index.js +222 -222
- package/package.json +104 -104
- package/src/App.vue +38 -38
- package/src/i18n/en-US.js +35 -35
- package/src/i18n/zh-CN.js +35 -35
- package/src/main.js +87 -87
- package/src/plugins/assets/ak.js +948 -948
- package/src/plugins/assets/callNative.js +488 -488
- package/src/plugins/assets/compressImg.js +75 -75
- package/src/plugins/assets/config.js +106 -106
- package/src/plugins/assets/fileServer.js +469 -469
- package/src/plugins/assets/http.js +343 -343
- package/src/plugins/assets/ua.js +27 -27
- package/src/plugins/components/BSButton.vue +61 -61
- package/src/plugins/components/BSCascader.vue +465 -465
- package/src/plugins/components/BSCell.vue +48 -48
- package/src/plugins/components/BSDatePicker.vue +167 -165
- package/src/plugins/components/BSImage.vue +42 -42
- package/src/plugins/components/BSInput.vue +140 -140
- package/src/plugins/components/BSList.vue +81 -81
- package/src/plugins/components/BSPicCode.vue +96 -96
- package/src/plugins/components/BSPopup.vue +43 -43
- package/src/plugins/components/BSRadio.vue +97 -97
- package/src/plugins/components/BSSearch.vue +109 -109
- package/src/plugins/components/BSSelect.vue +144 -144
- package/src/plugins/components/BSSign.vue +454 -454
- package/src/plugins/components/BSStepper.vue +115 -115
- package/src/plugins/components/BSUpload.vue +92 -92
- package/src/plugins/components/BSUpload2.vue +382 -382
- package/src/plugins/components/BSVerCode.vue +131 -134
- package/src/plugins/components/BSViewer.vue +92 -92
- package/src/plugins/components/base.js +496 -496
- package/src/plugins/components/base2.js +489 -489
- package/src/plugins/lib/weixin.js +20 -20
- package/src/plugins/platform/index.js +7 -7
- package/src/plugins/platform/isp_phone.js +306 -306
- package/src/plugins/route/index.js +140 -140
- package/src/plugins/selector/index.js +342 -342
- package/src/plugins/service/index.js +81 -81
- package/src/plugins/services/callCamera.js +53 -53
- package/src/plugins/services/exit.js +36 -36
- package/src/plugins/services/face.js +69 -69
- package/src/plugins/services/faceInApp.js +31 -31
- package/src/plugins/services/getFaceResult.js +104 -104
- package/src/plugins/services/getMenus.js +40 -40
- package/src/plugins/services/getSystemData.js +128 -128
- package/src/plugins/services/getToken.js +79 -79
- package/src/plugins/services/getUserInfo.js +47 -47
- package/src/plugins/services/goSetPage.js +40 -40
- package/src/plugins/services/hideFhoneTitle.js +36 -36
- package/src/plugins/services/index.js +37 -37
- package/src/plugins/services/init.js +35 -35
- package/src/plugins/services/jumpView.js +40 -40
- package/src/plugins/services/logout.js +43 -43
- package/src/plugins/services/share.js +113 -113
- package/src/plugins/services/statusBarHeight.js +39 -39
- package/src/plugins/session/index.js +32 -32
- package/src/services/getAuthInfo.js +22 -22
- package/src/services/index.js +9 -9
- package/src/services/sendVerCode.js +23 -23
- package/src/views/auth.vue +354 -353
- package/src/views/auth2.vue +90 -90
- package/src/views/auth3.vue +148 -148
- package/src/views/auth4.vue +8979 -8979
- package/src/views/auth5.vue +50 -50
- package/src/views/components/BankSelect.vue +55 -55
- package/src/views/foot.vue +140 -140
- package/src/views/page.vue +219 -219
- package/src/views/shellFunc.vue +41 -41
- package/themes/basic.css +1 -1
- package/webpack.config.js +144 -144
package/src/plugins/assets/ak.js
CHANGED
|
@@ -1,948 +1,948 @@
|
|
|
1
|
-
import selector from '../selector'
|
|
2
|
-
|
|
3
|
-
var ak = ak || {};
|
|
4
|
-
|
|
5
|
-
ak.utils = {
|
|
6
|
-
|
|
7
|
-
selector(express){
|
|
8
|
-
|
|
9
|
-
return selector.select(null,express)
|
|
10
|
-
},
|
|
11
|
-
parserToDate(dateText, format) {
|
|
12
|
-
if (!dateText) { //空值
|
|
13
|
-
return new Date();
|
|
14
|
-
}
|
|
15
|
-
//定义默认值,默认值根据当前时间生成
|
|
16
|
-
var defaultVal = new Date();
|
|
17
|
-
var year = defaultVal.getFullYear();
|
|
18
|
-
var month = defaultVal.getMonth() + 1;
|
|
19
|
-
var day = defaultVal.getDate();
|
|
20
|
-
var hours = defaultVal.getHours();
|
|
21
|
-
var minutes = defaultVal.getMinutes();
|
|
22
|
-
var seconds = defaultVal.getSeconds();
|
|
23
|
-
var milliseconds = defaultVal.getMilliseconds();
|
|
24
|
-
//定义正则
|
|
25
|
-
var o = [{
|
|
26
|
-
reg: "y+"
|
|
27
|
-
}, //年份
|
|
28
|
-
{
|
|
29
|
-
reg: "M+"
|
|
30
|
-
}, //月份
|
|
31
|
-
{
|
|
32
|
-
reg: "d+"
|
|
33
|
-
}, //日
|
|
34
|
-
{
|
|
35
|
-
reg: "H+"
|
|
36
|
-
}, //小时
|
|
37
|
-
{
|
|
38
|
-
reg: "m+"
|
|
39
|
-
}, //分
|
|
40
|
-
{
|
|
41
|
-
reg: "s+"
|
|
42
|
-
}, //秒
|
|
43
|
-
{
|
|
44
|
-
reg: "S"
|
|
45
|
-
} //毫秒
|
|
46
|
-
];
|
|
47
|
-
//获取到年月日,时分秒,毫秒几个值在字符串中的先后位置
|
|
48
|
-
var index = 1;
|
|
49
|
-
for (var j = 0; j < format.length; j++) {
|
|
50
|
-
var onechar = format[j];
|
|
51
|
-
for (var i = 0; i < o.length; i++) {
|
|
52
|
-
var onepart = o[i]
|
|
53
|
-
var onepartReg = onepart.reg;
|
|
54
|
-
if (onepartReg[0] == onechar) {
|
|
55
|
-
if (!onepart.index) {
|
|
56
|
-
onepart.index = index; //获取到年月日,时分秒,毫秒几个值在字符串中的先后位置
|
|
57
|
-
index++;
|
|
58
|
-
}
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
//生成匹配的正则表达式
|
|
65
|
-
for (var i = 0; i < o.length; i++) {
|
|
66
|
-
var onepart = o[i]
|
|
67
|
-
var onepartReg = onepart.reg;
|
|
68
|
-
var re = new RegExp("(" + onepartReg + ")");
|
|
69
|
-
var res = re.exec(format);
|
|
70
|
-
if (res) {
|
|
71
|
-
var formatPart = res[0]; //匹配到的格式化字符
|
|
72
|
-
var replaceVal = "([0-9]{" + formatPart.length + "})"; //不能使用/d匹配,会和日期的d冲突
|
|
73
|
-
format = format.replace(formatPart, replaceVal);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
//保存获取到的各个部分和位置
|
|
77
|
-
var dataInfo = {};
|
|
78
|
-
var re = new RegExp(format);
|
|
79
|
-
var res = re.exec(dateText);
|
|
80
|
-
//去掉第一个匹配,记录匹配到的数据
|
|
81
|
-
if (res) {
|
|
82
|
-
for (var i = 1; i < res.length; i++) {
|
|
83
|
-
dataInfo[i] = res[i]; //记录年月日,时分秒,毫秒几个值在字符串中的位置和对应的值
|
|
84
|
-
}
|
|
85
|
-
} else {
|
|
86
|
-
alert(dateText + "格式不匹配" + oldformat);
|
|
87
|
-
}
|
|
88
|
-
if (o[0].index) //年份存在
|
|
89
|
-
{
|
|
90
|
-
var index = o[0].index;
|
|
91
|
-
year = dataInfo[index];
|
|
92
|
-
}
|
|
93
|
-
if (o[1].index) //月份存在
|
|
94
|
-
{
|
|
95
|
-
var index = o[1].index;
|
|
96
|
-
month = dataInfo[index];
|
|
97
|
-
}
|
|
98
|
-
if (o[2].index) //日存在
|
|
99
|
-
{
|
|
100
|
-
var index = o[2].index;
|
|
101
|
-
day = dataInfo[index];
|
|
102
|
-
}
|
|
103
|
-
if (o[3].index) //小时存在
|
|
104
|
-
{
|
|
105
|
-
var index = o[3].index;
|
|
106
|
-
hours = dataInfo[index];
|
|
107
|
-
}
|
|
108
|
-
if (o[4].index) //分存在
|
|
109
|
-
{
|
|
110
|
-
var index = o[4].index;
|
|
111
|
-
minutes = dataInfo[index];
|
|
112
|
-
}
|
|
113
|
-
if (o[5].index) //秒存在
|
|
114
|
-
{
|
|
115
|
-
var index = o[5].index;
|
|
116
|
-
seconds = dataInfo[index];
|
|
117
|
-
}
|
|
118
|
-
if (o[6].index) //毫秒存在
|
|
119
|
-
{
|
|
120
|
-
var index = o[6].index;
|
|
121
|
-
milliseconds = dataInfo[index];
|
|
122
|
-
}
|
|
123
|
-
//月份是从0开始的
|
|
124
|
-
return new Date(year, month - 1, day, hours, minutes, seconds, milliseconds);
|
|
125
|
-
},
|
|
126
|
-
dateFormat(fmt, date) {
|
|
127
|
-
let ret;
|
|
128
|
-
const opt = {
|
|
129
|
-
"y+": date.getFullYear().toString(), // 年
|
|
130
|
-
"M+": (date.getMonth() + 1).toString(), // 月
|
|
131
|
-
"d+": date.getDate().toString(), // 日
|
|
132
|
-
"H+": date.getHours().toString(), // 时
|
|
133
|
-
"m+": date.getMinutes().toString(), // 分
|
|
134
|
-
"s+": date.getSeconds().toString() // 秒
|
|
135
|
-
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
|
136
|
-
};
|
|
137
|
-
for (let k in opt) {
|
|
138
|
-
ret = new RegExp("(" + k + ")").exec(fmt);
|
|
139
|
-
if (ret) {
|
|
140
|
-
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
|
|
141
|
-
};
|
|
142
|
-
};
|
|
143
|
-
return fmt;
|
|
144
|
-
},
|
|
145
|
-
getUrlKey(name,url){
|
|
146
|
-
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(url) || [, ""])[1].replace(/\+/g, '%20')) || null
|
|
147
|
-
|
|
148
|
-
},
|
|
149
|
-
convert2ThumbnailUrl(url){
|
|
150
|
-
|
|
151
|
-
var index = url.lastIndexOf(".");
|
|
152
|
-
if(index > 0){
|
|
153
|
-
var url2 = url.substring(0,index);
|
|
154
|
-
var ext = url.substring(index);
|
|
155
|
-
|
|
156
|
-
return url2 + "_40x40" + "." + ext;
|
|
157
|
-
}else
|
|
158
|
-
return url;
|
|
159
|
-
|
|
160
|
-
},
|
|
161
|
-
randomNum(minNum,maxNum){
|
|
162
|
-
switch(arguments.length){
|
|
163
|
-
case 1:
|
|
164
|
-
return parseInt(Math.random()*minNum+1,10);
|
|
165
|
-
break;
|
|
166
|
-
case 2:
|
|
167
|
-
return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
|
|
168
|
-
break;
|
|
169
|
-
default:
|
|
170
|
-
return 0;
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
guid() {
|
|
175
|
-
return (((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1)));
|
|
176
|
-
},
|
|
177
|
-
guid2() {
|
|
178
|
-
return (((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1)));
|
|
179
|
-
},
|
|
180
|
-
/**
|
|
181
|
-
* 是否为JSON字符串
|
|
182
|
-
* @param {String}
|
|
183
|
-
* @return {Boolean}
|
|
184
|
-
*/
|
|
185
|
-
|
|
186
|
-
isJSON(str) {
|
|
187
|
-
if (typeof str == 'string') {
|
|
188
|
-
try {
|
|
189
|
-
var obj = JSON.parse(str);
|
|
190
|
-
if (str.indexOf('{') > -1) {
|
|
191
|
-
return true;
|
|
192
|
-
} else {
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
} catch (e) {
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return false;
|
|
200
|
-
},
|
|
201
|
-
/**
|
|
202
|
-
* 去除字符串首尾两端空格
|
|
203
|
-
* @param {String} str
|
|
204
|
-
* @return {String}
|
|
205
|
-
*/
|
|
206
|
-
trim(str) {
|
|
207
|
-
if (str) {
|
|
208
|
-
return str.replace(/(^\s*)|(\s*$)/g, '');
|
|
209
|
-
} else {
|
|
210
|
-
return '';
|
|
211
|
-
}
|
|
212
|
-
},
|
|
213
|
-
/**
|
|
214
|
-
* 脱敏
|
|
215
|
-
* @param {String} value 脱敏的对象
|
|
216
|
-
* @return {String}
|
|
217
|
-
*/
|
|
218
|
-
desensitization: function(value) {
|
|
219
|
-
if (value) {
|
|
220
|
-
var valueNew = '';
|
|
221
|
-
const length = value.length;
|
|
222
|
-
valueNew = value
|
|
223
|
-
.split('')
|
|
224
|
-
.map((number, index) => {
|
|
225
|
-
// 脱敏:从倒数第五位开始向前四位脱敏
|
|
226
|
-
const indexMin = length - 8;
|
|
227
|
-
const indexMax = length - 5;
|
|
228
|
-
|
|
229
|
-
if (index >= indexMin && index <= indexMax) {
|
|
230
|
-
return '*';
|
|
231
|
-
} else {
|
|
232
|
-
return number;
|
|
233
|
-
}
|
|
234
|
-
})
|
|
235
|
-
.join('');
|
|
236
|
-
return valueNew;
|
|
237
|
-
} else {
|
|
238
|
-
return '';
|
|
239
|
-
}
|
|
240
|
-
},
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* 判断是否Array对象
|
|
244
|
-
* @param {Object} value 判断的对象
|
|
245
|
-
* @return {Boolean}
|
|
246
|
-
*/
|
|
247
|
-
isArray: function(value) {
|
|
248
|
-
return toString.call(value) === '[object Array]';
|
|
249
|
-
},
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* 判断是否日期对象
|
|
253
|
-
* @param {Object} value 判断的对象
|
|
254
|
-
* @return {Boolean}
|
|
255
|
-
*/
|
|
256
|
-
isDate: function(value) {
|
|
257
|
-
return toString.call(value) === '[object Date]';
|
|
258
|
-
},
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* 判断是否Object对象
|
|
262
|
-
* @param {Object} value 判断的对象
|
|
263
|
-
* @return {Boolean}
|
|
264
|
-
*/
|
|
265
|
-
isObject: function(value) {
|
|
266
|
-
return toString.call(value) === '[object Object]';
|
|
267
|
-
},
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* 判断是否为空
|
|
271
|
-
* @param {Object} value 判断的对象
|
|
272
|
-
* @return {Boolean}
|
|
273
|
-
*/
|
|
274
|
-
isEmpty: function(value) {
|
|
275
|
-
return value === null || value === undefined || value === '' || (this.isArray(value) && value.length === 0) || (typeof obj === 'object' && Object.keys(obj).length === 0);
|
|
276
|
-
},
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* 判断是否移动电话
|
|
280
|
-
* @param {Number} value 判断的值
|
|
281
|
-
* @return {Boolean}
|
|
282
|
-
*/
|
|
283
|
-
isMobilePhone: function(value) {
|
|
284
|
-
value = Number.parseInt(value);
|
|
285
|
-
// 1)是否非数字
|
|
286
|
-
if (Number.isNaN(value)) {
|
|
287
|
-
return false;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// 2)时候移动电话
|
|
291
|
-
return /^1[3|4|5|7|8|9|6][0-9]\d{4,8}$/.test(value);
|
|
292
|
-
},
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* 判断是否为邮箱
|
|
296
|
-
* @param {String} value 判断的值
|
|
297
|
-
* @return {Boolean}
|
|
298
|
-
*/
|
|
299
|
-
isEmail: function(value) {
|
|
300
|
-
return /^[a-zA-Z\-_0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+$/.test(value);
|
|
301
|
-
},
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
*设置SessionStorage的值
|
|
305
|
-
* @param key:要存的键
|
|
306
|
-
* @param value :要存的值
|
|
307
|
-
*/
|
|
308
|
-
setSessionStorage: function(key, value) {
|
|
309
|
-
if (this.isObject(value) || this.isArray(value)) {
|
|
310
|
-
value = this.toJsonStr(value);
|
|
311
|
-
}
|
|
312
|
-
sessionStorage[key] = value;
|
|
313
|
-
},
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
*获取SessionStorage的值
|
|
317
|
-
* @param key:存的键
|
|
318
|
-
*/
|
|
319
|
-
getSessionStorage: function(key) {
|
|
320
|
-
var rs = sessionStorage[key];
|
|
321
|
-
try {
|
|
322
|
-
if (rs != undefined) {
|
|
323
|
-
var obj = this.toJson(rs);
|
|
324
|
-
rs = obj;
|
|
325
|
-
}
|
|
326
|
-
} catch (error) {}
|
|
327
|
-
return rs;
|
|
328
|
-
},
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* 清除SessionStorage的值
|
|
332
|
-
* @param key:存的键
|
|
333
|
-
*/
|
|
334
|
-
removeSessionStorage: function(key) {
|
|
335
|
-
return sessionStorage.removeItem(key);
|
|
336
|
-
},
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
*设置LocalStorage的值
|
|
340
|
-
* @param key:要存的键
|
|
341
|
-
* @param value :要存的值
|
|
342
|
-
*/
|
|
343
|
-
setLocalStorage: function(key, value) {
|
|
344
|
-
if (this.isObject(value) || this.isArray(value)) {
|
|
345
|
-
value = this.toJsonStr(value);
|
|
346
|
-
}
|
|
347
|
-
localStorage[key] = value;
|
|
348
|
-
},
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
*获取LocalStorage的值
|
|
352
|
-
* @param key:存的键
|
|
353
|
-
*/
|
|
354
|
-
getLocalStorage: function(key) {
|
|
355
|
-
var rs = localStorage[key];
|
|
356
|
-
try {
|
|
357
|
-
if (rs != undefined) {
|
|
358
|
-
var obj = this.toJson(rs);
|
|
359
|
-
rs = obj;
|
|
360
|
-
}
|
|
361
|
-
} catch (error) {}
|
|
362
|
-
return rs;
|
|
363
|
-
},
|
|
364
|
-
|
|
365
|
-
/**
|
|
366
|
-
* 对传入的时间值进行格式化。后台传入前台的时间有两种个是:Sql时间和.Net时间
|
|
367
|
-
* @param {String|Date} sValue 传入的时间字符串
|
|
368
|
-
* @param {dateFormat | bool} dateFormat 日期格式,日期格式:eg:'Y-m-d H:i:s'
|
|
369
|
-
* @return {String} 2014-03-01 这种格式
|
|
370
|
-
* @example
|
|
371
|
-
* 1) Sql时间格式:2015-02-24T00:00:00
|
|
372
|
-
* 2) .Net时间格式:/Date(1410744626000)/
|
|
373
|
-
*/
|
|
374
|
-
getDateTimeStr: function(sValue, dateFormat) {
|
|
375
|
-
if (dateFormat == undefined) {
|
|
376
|
-
dateFormat = 'Y-m-d'; // 默认显示年月日
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
var dt;
|
|
380
|
-
// 1.先解析传入的时间对象,
|
|
381
|
-
if (sValue) {
|
|
382
|
-
if (toString.call(sValue) !== '[object Date]') {
|
|
383
|
-
// 不为Date格式,就转换为DateTime类型
|
|
384
|
-
sValue = sValue + '';
|
|
385
|
-
if (sValue.indexOf('T') > 0) {
|
|
386
|
-
// 1)格式:2015-02-24T00:00:00
|
|
387
|
-
var timestr = sValue.replace('T', ' ').replace(/-/g, '/'); //=> 2015/02/24 00:00:00
|
|
388
|
-
dt = new Date(timestr);
|
|
389
|
-
} else if (sValue.indexOf('Date') >= 0) {
|
|
390
|
-
// 2).Net格式:/Date(1410744626000)/
|
|
391
|
-
//Convert date type that .NET can bind to DateTime
|
|
392
|
-
//var date = new Date(parseInt(sValue.substr(6)));
|
|
393
|
-
var timestr = sValue.toString().replace(/\/Date\((\d+)\)\//gi, '$1'); //
|
|
394
|
-
dt = new Date(Math.abs(timestr));
|
|
395
|
-
} else {
|
|
396
|
-
dt = new Date(sValue);
|
|
397
|
-
}
|
|
398
|
-
} else {
|
|
399
|
-
dt = sValue;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// 2.转换
|
|
404
|
-
// 1)转换成对象 'Y-m-d H:i:s'
|
|
405
|
-
var obj = {}; //返回的对象,包含了 year(年)、month(月)、day(日)
|
|
406
|
-
obj.Y = dt.getFullYear(); //年
|
|
407
|
-
obj.m = dt.getMonth() + 1; //月
|
|
408
|
-
obj.d = dt.getDate(); //日期
|
|
409
|
-
obj.H = dt.getHours();
|
|
410
|
-
obj.i = dt.getMinutes();
|
|
411
|
-
obj.s = dt.getSeconds();
|
|
412
|
-
//2.2单位的月、日都转换成双位
|
|
413
|
-
if (obj.m < 10) {
|
|
414
|
-
obj.m = '0' + obj.m;
|
|
415
|
-
}
|
|
416
|
-
if (obj.d < 10) {
|
|
417
|
-
obj.d = '0' + obj.d;
|
|
418
|
-
}
|
|
419
|
-
if (obj.H < 10) {
|
|
420
|
-
obj.H = '0' + obj.H;
|
|
421
|
-
}
|
|
422
|
-
if (obj.i < 10) {
|
|
423
|
-
obj.i = '0' + obj.i;
|
|
424
|
-
}
|
|
425
|
-
if (obj.s < 10) {
|
|
426
|
-
obj.s = '0' + obj.s;
|
|
427
|
-
}
|
|
428
|
-
// 3.解析
|
|
429
|
-
var rs = dateFormat
|
|
430
|
-
.replace('Y', obj.Y)
|
|
431
|
-
.replace('m', obj.m)
|
|
432
|
-
.replace('d', obj.d)
|
|
433
|
-
.replace('H', obj.H)
|
|
434
|
-
.replace('i', obj.i)
|
|
435
|
-
.replace('s', obj.s);
|
|
436
|
-
|
|
437
|
-
return rs;
|
|
438
|
-
},
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* 把总秒数转换为时分秒
|
|
442
|
-
*/
|
|
443
|
-
getSFM: function(seconds, dateFormat) {
|
|
444
|
-
if (dateFormat == undefined) {
|
|
445
|
-
dateFormat = 'H:i:s'; // 默认格式
|
|
446
|
-
}
|
|
447
|
-
var obj = {};
|
|
448
|
-
obj.H = Number.parseInt(seconds / 3600);
|
|
449
|
-
obj.i = Number.parseInt((seconds - obj.H * 3600) / 60);
|
|
450
|
-
obj.s = Number.parseInt(seconds - obj.H * 3600 - obj.i * 60);
|
|
451
|
-
if (obj.H < 10) {
|
|
452
|
-
obj.H = '0' + obj.H;
|
|
453
|
-
}
|
|
454
|
-
if (obj.i < 10) {
|
|
455
|
-
obj.i = '0' + obj.i;
|
|
456
|
-
}
|
|
457
|
-
if (obj.s < 10) {
|
|
458
|
-
obj.s = '0' + obj.s;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
// 3.解析
|
|
462
|
-
var rs = dateFormat
|
|
463
|
-
.replace('H', obj.H)
|
|
464
|
-
.replace('i', obj.i)
|
|
465
|
-
.replace('s', obj.s);
|
|
466
|
-
return rs;
|
|
467
|
-
},
|
|
468
|
-
|
|
469
|
-
/**
|
|
470
|
-
* 是否同一天
|
|
471
|
-
*/
|
|
472
|
-
isSameDay: function(dt1, dt2) {
|
|
473
|
-
if (dt1.getFullYear() == dt2.getFullYear() && dt1.getMonth() == dt2.getMonth() && dt1.getDate() == dt2.getDate()) {
|
|
474
|
-
return true;
|
|
475
|
-
}
|
|
476
|
-
return false;
|
|
477
|
-
},
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* 对象转换为json字符串
|
|
481
|
-
* @param {jsonObj} jsonObj Json对象
|
|
482
|
-
* @return {jsonStr} Json字符串
|
|
483
|
-
*/
|
|
484
|
-
toJsonStr: function(jsonObj) {
|
|
485
|
-
return JSON.stringify(jsonObj);
|
|
486
|
-
},
|
|
487
|
-
|
|
488
|
-
/**
|
|
489
|
-
* 讲json字符串转换为json对象
|
|
490
|
-
* @param {String} jsonStr Json对象字符串
|
|
491
|
-
* @return {jsonObj} Json对象
|
|
492
|
-
*/
|
|
493
|
-
toJson: function(jsonStr) {
|
|
494
|
-
return JSON.parse(jsonStr);
|
|
495
|
-
},
|
|
496
|
-
|
|
497
|
-
cloneBySerialize: function(obj){
|
|
498
|
-
let b = JSON.parse(JSON.stringify(obj))
|
|
499
|
-
return b
|
|
500
|
-
},
|
|
501
|
-
|
|
502
|
-
/**
|
|
503
|
-
* 是否含有特殊字符
|
|
504
|
-
* @param {String} value 传入的值
|
|
505
|
-
* @return {Boolean} true 含有特殊符号;false 不含有特殊符号
|
|
506
|
-
*/
|
|
507
|
-
isHaveSpecialChar: function(value) {
|
|
508
|
-
var oldLength = value.length;
|
|
509
|
-
var newLength = value.replace(/[`~!@#$%^&*_+=\\{}:"<>?\[\];',.\/~!@#¥%……&*——+『』:“”《》?【】;‘’,。? \[\]()()]/g, '').length;
|
|
510
|
-
if (newLength < oldLength) {
|
|
511
|
-
return true;
|
|
512
|
-
}
|
|
513
|
-
return false;
|
|
514
|
-
},
|
|
515
|
-
|
|
516
|
-
/**
|
|
517
|
-
* 合并数组内成员的某个对象
|
|
518
|
-
* @param {Array} arr 需要合并的数组
|
|
519
|
-
* @param {String} fieldName 数组成员内的指定字段
|
|
520
|
-
* @param {String} split 分隔符,默认为','
|
|
521
|
-
* @example
|
|
522
|
-
* var arr = [{name:'tom',age:13},{name:'jack',age:13}] => (arr, 'name') => tom,jack
|
|
523
|
-
*/
|
|
524
|
-
joinArray: function(arr, fieldName, split) {
|
|
525
|
-
split = split == undefined ? ',' : split;
|
|
526
|
-
var rs = arr
|
|
527
|
-
.map((item) => {
|
|
528
|
-
return item[fieldName];
|
|
529
|
-
})
|
|
530
|
-
.join(split);
|
|
531
|
-
return rs;
|
|
532
|
-
}
|
|
533
|
-
};
|
|
534
|
-
|
|
535
|
-
/**
|
|
536
|
-
* http交互模块
|
|
537
|
-
* 包含:ajax
|
|
538
|
-
*/
|
|
539
|
-
ak.http = {
|
|
540
|
-
/**
|
|
541
|
-
* 将`name` - `value`对转换为支持嵌套结构的对象数组
|
|
542
|
-
*
|
|
543
|
-
* var objects = toQueryObjects('hobbies', ['reading', 'cooking', 'swimming']);
|
|
544
|
-
*
|
|
545
|
-
* // objects then equals:
|
|
546
|
-
* [
|
|
547
|
-
* { name: 'hobbies', value: 'reading' },
|
|
548
|
-
* { name: 'hobbies', value: 'cooking' },
|
|
549
|
-
* { name: 'hobbies', value: 'swimming' },
|
|
550
|
-
* ];
|
|
551
|
-
*
|
|
552
|
-
* var objects = toQueryObjects('dateOfBirth', {
|
|
553
|
-
* day: 3,
|
|
554
|
-
* month: 8,
|
|
555
|
-
* year: 1987,
|
|
556
|
-
* extra: {
|
|
557
|
-
* hour: 4
|
|
558
|
-
* minute: 30
|
|
559
|
-
* }
|
|
560
|
-
* }, true); // Recursive
|
|
561
|
-
*
|
|
562
|
-
* // objects then equals:
|
|
563
|
-
* [
|
|
564
|
-
* { name: 'dateOfBirth[day]', value: 3 },
|
|
565
|
-
* { name: 'dateOfBirth[month]', value: 8 },
|
|
566
|
-
* { name: 'dateOfBirth[year]', value: 1987 },
|
|
567
|
-
* { name: 'dateOfBirth[extra][hour]', value: 4 },
|
|
568
|
-
* { name: 'dateOfBirth[extra][minute]', value: 30 },
|
|
569
|
-
* ];
|
|
570
|
-
*
|
|
571
|
-
* @param {String} name
|
|
572
|
-
* @param {object | Array} value
|
|
573
|
-
* @param {boolean} [recursive=false] 是否递归
|
|
574
|
-
* @return {array}
|
|
575
|
-
*/
|
|
576
|
-
toQueryObjects: function(name, value, recursive) {
|
|
577
|
-
var objects = [],
|
|
578
|
-
i,
|
|
579
|
-
ln;
|
|
580
|
-
|
|
581
|
-
if (ak.utils.isArray(value)) {
|
|
582
|
-
for (i = 0, ln = value.length; i < ln; i++) {
|
|
583
|
-
if (recursive) {
|
|
584
|
-
objects = objects.concat(toQueryObjects(name + '[' + i + ']', value[i], true));
|
|
585
|
-
} else {
|
|
586
|
-
objects.push({
|
|
587
|
-
name: name,
|
|
588
|
-
value: value[i]
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
} else if (ak.utils.isObject(value)) {
|
|
593
|
-
for (i in value) {
|
|
594
|
-
if (value.hasOwnProperty(i)) {
|
|
595
|
-
if (recursive) {
|
|
596
|
-
objects = objects.concat(toQueryObjects(name + '[' + i + ']', value[i], true));
|
|
597
|
-
} else {
|
|
598
|
-
objects.push({
|
|
599
|
-
name: name,
|
|
600
|
-
value: value[i]
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
} else {
|
|
606
|
-
objects.push({
|
|
607
|
-
name: name,
|
|
608
|
-
value: value
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
return objects;
|
|
613
|
-
},
|
|
614
|
-
|
|
615
|
-
/**
|
|
616
|
-
* 把对象转换为查询字符串
|
|
617
|
-
* e.g.:
|
|
618
|
-
* toQueryString({foo: 1, bar: 2}); // returns "foo=1&bar=2"
|
|
619
|
-
* toQueryString({foo: null, bar: 2}); // returns "foo=&bar=2"
|
|
620
|
-
* toQueryString({date: new Date(2011, 0, 1)}); // returns "date=%222011-01-01T00%3A00%3A00%22"
|
|
621
|
-
* @param {Object} object 需要转换的对象
|
|
622
|
-
* @param {Boolean} [recursive=false] 是否递归
|
|
623
|
-
* @return {String} queryString
|
|
624
|
-
*/
|
|
625
|
-
toQueryString: function(object, recursive) {
|
|
626
|
-
var paramObjects = [],
|
|
627
|
-
params = [],
|
|
628
|
-
i,
|
|
629
|
-
j,
|
|
630
|
-
ln,
|
|
631
|
-
paramObject,
|
|
632
|
-
value;
|
|
633
|
-
|
|
634
|
-
for (i in object) {
|
|
635
|
-
if (object.hasOwnProperty(i)) {
|
|
636
|
-
paramObjects = paramObjects.concat(this.toQueryObjects(i, object[i], recursive));
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
for (j = 0, ln = paramObjects.length; j < ln; j++) {
|
|
641
|
-
paramObject = paramObjects[j];
|
|
642
|
-
value = paramObject.value;
|
|
643
|
-
|
|
644
|
-
if (ak.utils.isEmpty(value)) {
|
|
645
|
-
value = '';
|
|
646
|
-
} else if (ak.utils.isDate(value)) {
|
|
647
|
-
value =
|
|
648
|
-
value.getFullYear() +
|
|
649
|
-
'-' +
|
|
650
|
-
Ext.String.leftPad(value.getMonth() + 1, 2, '0') +
|
|
651
|
-
'-' +
|
|
652
|
-
Ext.String.leftPad(value.getDate(), 2, '0') +
|
|
653
|
-
'T' +
|
|
654
|
-
Ext.String.leftPad(value.getHours(), 2, '0') +
|
|
655
|
-
':' +
|
|
656
|
-
Ext.String.leftPad(value.getMinutes(), 2, '0') +
|
|
657
|
-
':' +
|
|
658
|
-
Ext.String.leftPad(value.getSeconds(), 2, '0');
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
params.push(encodeURIComponent(paramObject.name) + '=' + encodeURIComponent(String(value)));
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
return params.join('&');
|
|
665
|
-
},
|
|
666
|
-
/**
|
|
667
|
-
* @private
|
|
668
|
-
*/
|
|
669
|
-
getCookieVal: function(offset) {
|
|
670
|
-
var endstr = document.cookie.indexOf(';', offset);
|
|
671
|
-
if (endstr == -1) {
|
|
672
|
-
endstr = document.cookie.length;
|
|
673
|
-
}
|
|
674
|
-
return unescape(document.cookie.substring(offset, endstr));
|
|
675
|
-
},
|
|
676
|
-
|
|
677
|
-
/**
|
|
678
|
-
* 获取指定key的cookie
|
|
679
|
-
* @param {String} key cookie的key
|
|
680
|
-
*/
|
|
681
|
-
getCookie2: function(name) {
|
|
682
|
-
let cookieValue = ""
|
|
683
|
-
let search = name + "="
|
|
684
|
-
if (document.cookie.length > 0)
|
|
685
|
-
{
|
|
686
|
-
let offset = document.cookie.indexOf (search)
|
|
687
|
-
if (offset != -1)
|
|
688
|
-
{
|
|
689
|
-
offset += search.length
|
|
690
|
-
let end = document.cookie.indexOf (";", offset)
|
|
691
|
-
if (end == -1)
|
|
692
|
-
end = document.cookie.length
|
|
693
|
-
cookieValue = unescape (document.cookie.substring (offset, end))
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
return cookieValue
|
|
697
|
-
},
|
|
698
|
-
getCookie: function(key) {
|
|
699
|
-
var arg = key + '=',
|
|
700
|
-
alen = arg.length,
|
|
701
|
-
clen = document.cookie.length,
|
|
702
|
-
i = 0,
|
|
703
|
-
j = 0;
|
|
704
|
-
|
|
705
|
-
while (i < clen) {
|
|
706
|
-
j = i + alen;
|
|
707
|
-
if (document.cookie.substring(i, j) == arg) {
|
|
708
|
-
return this.getCookieVal(j);
|
|
709
|
-
}
|
|
710
|
-
i = document.cookie.indexOf(' ', i) + 1;
|
|
711
|
-
if (i === 0) {
|
|
712
|
-
break;
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
return null;
|
|
716
|
-
},
|
|
717
|
-
|
|
718
|
-
/**
|
|
719
|
-
* 设置cookie
|
|
720
|
-
* @param {String} key cookie的key
|
|
721
|
-
* @param {String} value cookie的value
|
|
722
|
-
*/
|
|
723
|
-
setCookie: function(key, value) {
|
|
724
|
-
var argv = arguments,
|
|
725
|
-
argc = arguments.length,
|
|
726
|
-
expires = argc > 2 ? argv[2] : null,
|
|
727
|
-
path = argc > 3 ? argv[3] : '/',
|
|
728
|
-
domain = argc > 4 ? argv[4] : null,
|
|
729
|
-
secure = argc > 5 ? argv[5] : false;
|
|
730
|
-
|
|
731
|
-
document.cookie =
|
|
732
|
-
key +
|
|
733
|
-
'=' +
|
|
734
|
-
escape(value) +
|
|
735
|
-
(expires === null ? '' : '; expires=' + expires.toGMTString()) +
|
|
736
|
-
(path === null ? '' : '; path=' + path) +
|
|
737
|
-
(domain === null ? '' : '; domain=' + domain) +
|
|
738
|
-
(secure === true ? '; secure' : '');
|
|
739
|
-
},
|
|
740
|
-
getRootPath(url){
|
|
741
|
-
|
|
742
|
-
let rootPath_rtn = ''
|
|
743
|
-
let currentUrl = url ? url : window.location.href
|
|
744
|
-
let index = currentUrl.indexOf('#')
|
|
745
|
-
|
|
746
|
-
if(index >= 0 ){
|
|
747
|
-
let rootPath = currentUrl.substr(0,index)
|
|
748
|
-
if(!rootPath.endWith('/'))
|
|
749
|
-
rootPath_rtn = rootPath + '/'
|
|
750
|
-
else
|
|
751
|
-
rootPath_rtn = rootPath
|
|
752
|
-
}else{
|
|
753
|
-
if(!currentUrl.endWith('/'))
|
|
754
|
-
rootPath_rtn = currentUrl + '/'
|
|
755
|
-
else
|
|
756
|
-
rootPath_rtn = currentUrl
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
if(rootPath_rtn.indexOf('?') > 0 && rootPath_rtn.endWith('/')){
|
|
760
|
-
rootPath_rtn = rootPath_rtn.substr(0,rootPath_rtn.length - 1)
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
return rootPath_rtn
|
|
764
|
-
},
|
|
765
|
-
getRouteUrl(url){
|
|
766
|
-
|
|
767
|
-
let currentUrl = url ? url : window.location.href
|
|
768
|
-
let index = currentUrl.indexOf('#')
|
|
769
|
-
if(index >= 0 ){
|
|
770
|
-
return currentUrl.substr(index+1)
|
|
771
|
-
}else{
|
|
772
|
-
return ''
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
},
|
|
776
|
-
getRoot(url){
|
|
777
|
-
let rootUrl = this.getRootPath(url)
|
|
778
|
-
let index = rootUrl.indexOf('?')
|
|
779
|
-
if(index >= 0)
|
|
780
|
-
return rootUrl.substr(0,index)
|
|
781
|
-
else
|
|
782
|
-
return rootUrl
|
|
783
|
-
},
|
|
784
|
-
getUrlParameters(url){
|
|
785
|
-
let rootUrl = this.getRootPath(url)
|
|
786
|
-
let index = rootUrl.indexOf('?')
|
|
787
|
-
if(index >= 0)
|
|
788
|
-
return rootUrl.substr(index+1)
|
|
789
|
-
else
|
|
790
|
-
return ''
|
|
791
|
-
},
|
|
792
|
-
concatParams(url,param){
|
|
793
|
-
|
|
794
|
-
let rootUrl = this.getRootPath(url)
|
|
795
|
-
let routeUrl = this.getRouteUrl(url)
|
|
796
|
-
|
|
797
|
-
if(rootUrl.includes('?')){
|
|
798
|
-
return rootUrl + '&' + param + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
799
|
-
}else{
|
|
800
|
-
return rootUrl + '?' + param + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
},
|
|
804
|
-
deleteParams(url,ref){
|
|
805
|
-
|
|
806
|
-
let rootUrl = this.getRootPath(url)
|
|
807
|
-
let routeUrl = this.getRouteUrl(url)
|
|
808
|
-
let newParams = ''
|
|
809
|
-
|
|
810
|
-
if(rootUrl.includes('?')){
|
|
811
|
-
|
|
812
|
-
let params = this.getUrlParameters(url)
|
|
813
|
-
let para = params.split('&')
|
|
814
|
-
for (let i = 0; i < para.length; i++) {
|
|
815
|
-
let paired = para[i].split('=')
|
|
816
|
-
if (paired[0] == ref) {
|
|
817
|
-
continue
|
|
818
|
-
}else{
|
|
819
|
-
if(paired.length > 1){
|
|
820
|
-
newParams += paired[0] + '=' + paired[1] + "&"
|
|
821
|
-
}else{
|
|
822
|
-
newParams += paired[0]
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
if(ak.utils.isEmpty(newParams)){
|
|
828
|
-
return this.getRoot(rootUrl) + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
829
|
-
}
|
|
830
|
-
else{
|
|
831
|
-
let remed = newParams.substr(0,newParams.length-1)
|
|
832
|
-
return this.getRoot(rootUrl) + '?' + remed + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
}else{
|
|
837
|
-
return url
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
},
|
|
841
|
-
getQueryString(name) {
|
|
842
|
-
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)")
|
|
843
|
-
var r = window.location.search.substr(1).match(reg)
|
|
844
|
-
if(r!=null)return unescape(r[2]); return null
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
};
|
|
848
|
-
|
|
849
|
-
/**
|
|
850
|
-
* 消息模块
|
|
851
|
-
* 包含:确认框、信息提示框
|
|
852
|
-
*/
|
|
853
|
-
ak.msg = {
|
|
854
|
-
/**
|
|
855
|
-
* 提示框
|
|
856
|
-
* msg {string} :信息内容
|
|
857
|
-
*/
|
|
858
|
-
alert: function(msg,callback, classStr="") {
|
|
859
|
-
|
|
860
|
-
this.vue.prototype.$dialog.alert({
|
|
861
|
-
title: '消息',
|
|
862
|
-
message: msg,
|
|
863
|
-
className: classStr,
|
|
864
|
-
closeOnPopstate: true
|
|
865
|
-
}).then(() => {
|
|
866
|
-
if(callback) callback()
|
|
867
|
-
});
|
|
868
|
-
},
|
|
869
|
-
|
|
870
|
-
/**
|
|
871
|
-
* 确认框
|
|
872
|
-
* msg {string} :信息内容
|
|
873
|
-
* callback {function} :点击'确定'时的回调函数。
|
|
874
|
-
*/
|
|
875
|
-
confirm: function(msg, callback,callback2) {
|
|
876
|
-
|
|
877
|
-
this.vue.prototype.$dialog.confirm({
|
|
878
|
-
title: '消息',
|
|
879
|
-
message: msg,
|
|
880
|
-
closeOnPopstate: true
|
|
881
|
-
})
|
|
882
|
-
.then(() => {
|
|
883
|
-
if(callback) callback()
|
|
884
|
-
})
|
|
885
|
-
.catch(() => {
|
|
886
|
-
if(callback2) callback2()
|
|
887
|
-
});
|
|
888
|
-
|
|
889
|
-
},
|
|
890
|
-
|
|
891
|
-
toast: function(msg) {
|
|
892
|
-
|
|
893
|
-
this.vue.prototype.$toast(msg)
|
|
894
|
-
|
|
895
|
-
}
|
|
896
|
-
};
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
/**
|
|
900
|
-
* 原型:字符串格式化
|
|
901
|
-
* @param args 格式化参数值
|
|
902
|
-
*/
|
|
903
|
-
String.prototype.format = function(args) {
|
|
904
|
-
var result = this;
|
|
905
|
-
if (arguments.length < 1) {
|
|
906
|
-
return result;
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
var data = arguments; // 如果模板参数是数组
|
|
910
|
-
if (arguments.length == 1 && typeof (args) == "object") {
|
|
911
|
-
// 如果模板参数是对象
|
|
912
|
-
data = args;
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
for ( var key in data) {
|
|
916
|
-
var value = data[key];
|
|
917
|
-
if (undefined != value) {
|
|
918
|
-
result = result.replace(new RegExp("\\{" + key + "\\}", "gm"), value);
|
|
919
|
-
}
|
|
920
|
-
}
|
|
921
|
-
return result;
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
String.prototype.endWith=function(str){
|
|
926
|
-
if(str==null||str==""||this.length==0||str.length>this.length)
|
|
927
|
-
return false;
|
|
928
|
-
if(this.substring(this.length-str.length)==str)
|
|
929
|
-
return true;
|
|
930
|
-
else
|
|
931
|
-
return false;
|
|
932
|
-
return true;
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
String.prototype.startWith=function(str){
|
|
936
|
-
if(str==null||str==""||this.length==0||str.length>this.length)
|
|
937
|
-
return false;
|
|
938
|
-
if(this.substr(0,str.length)==str)
|
|
939
|
-
return true;
|
|
940
|
-
else
|
|
941
|
-
return false;
|
|
942
|
-
return true;
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
export default ak;
|
|
1
|
+
import selector from '../selector'
|
|
2
|
+
|
|
3
|
+
var ak = ak || {};
|
|
4
|
+
|
|
5
|
+
ak.utils = {
|
|
6
|
+
|
|
7
|
+
selector(express){
|
|
8
|
+
|
|
9
|
+
return selector.select(null,express)
|
|
10
|
+
},
|
|
11
|
+
parserToDate(dateText, format) {
|
|
12
|
+
if (!dateText) { //空值
|
|
13
|
+
return new Date();
|
|
14
|
+
}
|
|
15
|
+
//定义默认值,默认值根据当前时间生成
|
|
16
|
+
var defaultVal = new Date();
|
|
17
|
+
var year = defaultVal.getFullYear();
|
|
18
|
+
var month = defaultVal.getMonth() + 1;
|
|
19
|
+
var day = defaultVal.getDate();
|
|
20
|
+
var hours = defaultVal.getHours();
|
|
21
|
+
var minutes = defaultVal.getMinutes();
|
|
22
|
+
var seconds = defaultVal.getSeconds();
|
|
23
|
+
var milliseconds = defaultVal.getMilliseconds();
|
|
24
|
+
//定义正则
|
|
25
|
+
var o = [{
|
|
26
|
+
reg: "y+"
|
|
27
|
+
}, //年份
|
|
28
|
+
{
|
|
29
|
+
reg: "M+"
|
|
30
|
+
}, //月份
|
|
31
|
+
{
|
|
32
|
+
reg: "d+"
|
|
33
|
+
}, //日
|
|
34
|
+
{
|
|
35
|
+
reg: "H+"
|
|
36
|
+
}, //小时
|
|
37
|
+
{
|
|
38
|
+
reg: "m+"
|
|
39
|
+
}, //分
|
|
40
|
+
{
|
|
41
|
+
reg: "s+"
|
|
42
|
+
}, //秒
|
|
43
|
+
{
|
|
44
|
+
reg: "S"
|
|
45
|
+
} //毫秒
|
|
46
|
+
];
|
|
47
|
+
//获取到年月日,时分秒,毫秒几个值在字符串中的先后位置
|
|
48
|
+
var index = 1;
|
|
49
|
+
for (var j = 0; j < format.length; j++) {
|
|
50
|
+
var onechar = format[j];
|
|
51
|
+
for (var i = 0; i < o.length; i++) {
|
|
52
|
+
var onepart = o[i]
|
|
53
|
+
var onepartReg = onepart.reg;
|
|
54
|
+
if (onepartReg[0] == onechar) {
|
|
55
|
+
if (!onepart.index) {
|
|
56
|
+
onepart.index = index; //获取到年月日,时分秒,毫秒几个值在字符串中的先后位置
|
|
57
|
+
index++;
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
//生成匹配的正则表达式
|
|
65
|
+
for (var i = 0; i < o.length; i++) {
|
|
66
|
+
var onepart = o[i]
|
|
67
|
+
var onepartReg = onepart.reg;
|
|
68
|
+
var re = new RegExp("(" + onepartReg + ")");
|
|
69
|
+
var res = re.exec(format);
|
|
70
|
+
if (res) {
|
|
71
|
+
var formatPart = res[0]; //匹配到的格式化字符
|
|
72
|
+
var replaceVal = "([0-9]{" + formatPart.length + "})"; //不能使用/d匹配,会和日期的d冲突
|
|
73
|
+
format = format.replace(formatPart, replaceVal);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//保存获取到的各个部分和位置
|
|
77
|
+
var dataInfo = {};
|
|
78
|
+
var re = new RegExp(format);
|
|
79
|
+
var res = re.exec(dateText);
|
|
80
|
+
//去掉第一个匹配,记录匹配到的数据
|
|
81
|
+
if (res) {
|
|
82
|
+
for (var i = 1; i < res.length; i++) {
|
|
83
|
+
dataInfo[i] = res[i]; //记录年月日,时分秒,毫秒几个值在字符串中的位置和对应的值
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
alert(dateText + "格式不匹配" + oldformat);
|
|
87
|
+
}
|
|
88
|
+
if (o[0].index) //年份存在
|
|
89
|
+
{
|
|
90
|
+
var index = o[0].index;
|
|
91
|
+
year = dataInfo[index];
|
|
92
|
+
}
|
|
93
|
+
if (o[1].index) //月份存在
|
|
94
|
+
{
|
|
95
|
+
var index = o[1].index;
|
|
96
|
+
month = dataInfo[index];
|
|
97
|
+
}
|
|
98
|
+
if (o[2].index) //日存在
|
|
99
|
+
{
|
|
100
|
+
var index = o[2].index;
|
|
101
|
+
day = dataInfo[index];
|
|
102
|
+
}
|
|
103
|
+
if (o[3].index) //小时存在
|
|
104
|
+
{
|
|
105
|
+
var index = o[3].index;
|
|
106
|
+
hours = dataInfo[index];
|
|
107
|
+
}
|
|
108
|
+
if (o[4].index) //分存在
|
|
109
|
+
{
|
|
110
|
+
var index = o[4].index;
|
|
111
|
+
minutes = dataInfo[index];
|
|
112
|
+
}
|
|
113
|
+
if (o[5].index) //秒存在
|
|
114
|
+
{
|
|
115
|
+
var index = o[5].index;
|
|
116
|
+
seconds = dataInfo[index];
|
|
117
|
+
}
|
|
118
|
+
if (o[6].index) //毫秒存在
|
|
119
|
+
{
|
|
120
|
+
var index = o[6].index;
|
|
121
|
+
milliseconds = dataInfo[index];
|
|
122
|
+
}
|
|
123
|
+
//月份是从0开始的
|
|
124
|
+
return new Date(year, month - 1, day, hours, minutes, seconds, milliseconds);
|
|
125
|
+
},
|
|
126
|
+
dateFormat(fmt, date) {
|
|
127
|
+
let ret;
|
|
128
|
+
const opt = {
|
|
129
|
+
"y+": date.getFullYear().toString(), // 年
|
|
130
|
+
"M+": (date.getMonth() + 1).toString(), // 月
|
|
131
|
+
"d+": date.getDate().toString(), // 日
|
|
132
|
+
"H+": date.getHours().toString(), // 时
|
|
133
|
+
"m+": date.getMinutes().toString(), // 分
|
|
134
|
+
"s+": date.getSeconds().toString() // 秒
|
|
135
|
+
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
|
136
|
+
};
|
|
137
|
+
for (let k in opt) {
|
|
138
|
+
ret = new RegExp("(" + k + ")").exec(fmt);
|
|
139
|
+
if (ret) {
|
|
140
|
+
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
return fmt;
|
|
144
|
+
},
|
|
145
|
+
getUrlKey(name,url){
|
|
146
|
+
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(url) || [, ""])[1].replace(/\+/g, '%20')) || null
|
|
147
|
+
|
|
148
|
+
},
|
|
149
|
+
convert2ThumbnailUrl(url){
|
|
150
|
+
|
|
151
|
+
var index = url.lastIndexOf(".");
|
|
152
|
+
if(index > 0){
|
|
153
|
+
var url2 = url.substring(0,index);
|
|
154
|
+
var ext = url.substring(index);
|
|
155
|
+
|
|
156
|
+
return url2 + "_40x40" + "." + ext;
|
|
157
|
+
}else
|
|
158
|
+
return url;
|
|
159
|
+
|
|
160
|
+
},
|
|
161
|
+
randomNum(minNum,maxNum){
|
|
162
|
+
switch(arguments.length){
|
|
163
|
+
case 1:
|
|
164
|
+
return parseInt(Math.random()*minNum+1,10);
|
|
165
|
+
break;
|
|
166
|
+
case 2:
|
|
167
|
+
return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
|
|
168
|
+
break;
|
|
169
|
+
default:
|
|
170
|
+
return 0;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
guid() {
|
|
175
|
+
return (((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+"-"+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1)));
|
|
176
|
+
},
|
|
177
|
+
guid2() {
|
|
178
|
+
return (((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+""+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1))+((((1+Math.random())*0x10000)|0).toString(16).substring(1)));
|
|
179
|
+
},
|
|
180
|
+
/**
|
|
181
|
+
* 是否为JSON字符串
|
|
182
|
+
* @param {String}
|
|
183
|
+
* @return {Boolean}
|
|
184
|
+
*/
|
|
185
|
+
|
|
186
|
+
isJSON(str) {
|
|
187
|
+
if (typeof str == 'string') {
|
|
188
|
+
try {
|
|
189
|
+
var obj = JSON.parse(str);
|
|
190
|
+
if (str.indexOf('{') > -1) {
|
|
191
|
+
return true;
|
|
192
|
+
} else {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
} catch (e) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return false;
|
|
200
|
+
},
|
|
201
|
+
/**
|
|
202
|
+
* 去除字符串首尾两端空格
|
|
203
|
+
* @param {String} str
|
|
204
|
+
* @return {String}
|
|
205
|
+
*/
|
|
206
|
+
trim(str) {
|
|
207
|
+
if (str) {
|
|
208
|
+
return str.replace(/(^\s*)|(\s*$)/g, '');
|
|
209
|
+
} else {
|
|
210
|
+
return '';
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
/**
|
|
214
|
+
* 脱敏
|
|
215
|
+
* @param {String} value 脱敏的对象
|
|
216
|
+
* @return {String}
|
|
217
|
+
*/
|
|
218
|
+
desensitization: function(value) {
|
|
219
|
+
if (value) {
|
|
220
|
+
var valueNew = '';
|
|
221
|
+
const length = value.length;
|
|
222
|
+
valueNew = value
|
|
223
|
+
.split('')
|
|
224
|
+
.map((number, index) => {
|
|
225
|
+
// 脱敏:从倒数第五位开始向前四位脱敏
|
|
226
|
+
const indexMin = length - 8;
|
|
227
|
+
const indexMax = length - 5;
|
|
228
|
+
|
|
229
|
+
if (index >= indexMin && index <= indexMax) {
|
|
230
|
+
return '*';
|
|
231
|
+
} else {
|
|
232
|
+
return number;
|
|
233
|
+
}
|
|
234
|
+
})
|
|
235
|
+
.join('');
|
|
236
|
+
return valueNew;
|
|
237
|
+
} else {
|
|
238
|
+
return '';
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* 判断是否Array对象
|
|
244
|
+
* @param {Object} value 判断的对象
|
|
245
|
+
* @return {Boolean}
|
|
246
|
+
*/
|
|
247
|
+
isArray: function(value) {
|
|
248
|
+
return toString.call(value) === '[object Array]';
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* 判断是否日期对象
|
|
253
|
+
* @param {Object} value 判断的对象
|
|
254
|
+
* @return {Boolean}
|
|
255
|
+
*/
|
|
256
|
+
isDate: function(value) {
|
|
257
|
+
return toString.call(value) === '[object Date]';
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* 判断是否Object对象
|
|
262
|
+
* @param {Object} value 判断的对象
|
|
263
|
+
* @return {Boolean}
|
|
264
|
+
*/
|
|
265
|
+
isObject: function(value) {
|
|
266
|
+
return toString.call(value) === '[object Object]';
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* 判断是否为空
|
|
271
|
+
* @param {Object} value 判断的对象
|
|
272
|
+
* @return {Boolean}
|
|
273
|
+
*/
|
|
274
|
+
isEmpty: function(value) {
|
|
275
|
+
return value === null || value === undefined || value === '' || (this.isArray(value) && value.length === 0) || (typeof obj === 'object' && Object.keys(obj).length === 0);
|
|
276
|
+
},
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* 判断是否移动电话
|
|
280
|
+
* @param {Number} value 判断的值
|
|
281
|
+
* @return {Boolean}
|
|
282
|
+
*/
|
|
283
|
+
isMobilePhone: function(value) {
|
|
284
|
+
value = Number.parseInt(value);
|
|
285
|
+
// 1)是否非数字
|
|
286
|
+
if (Number.isNaN(value)) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// 2)时候移动电话
|
|
291
|
+
return /^1[3|4|5|7|8|9|6][0-9]\d{4,8}$/.test(value);
|
|
292
|
+
},
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* 判断是否为邮箱
|
|
296
|
+
* @param {String} value 判断的值
|
|
297
|
+
* @return {Boolean}
|
|
298
|
+
*/
|
|
299
|
+
isEmail: function(value) {
|
|
300
|
+
return /^[a-zA-Z\-_0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+$/.test(value);
|
|
301
|
+
},
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
*设置SessionStorage的值
|
|
305
|
+
* @param key:要存的键
|
|
306
|
+
* @param value :要存的值
|
|
307
|
+
*/
|
|
308
|
+
setSessionStorage: function(key, value) {
|
|
309
|
+
if (this.isObject(value) || this.isArray(value)) {
|
|
310
|
+
value = this.toJsonStr(value);
|
|
311
|
+
}
|
|
312
|
+
sessionStorage[key] = value;
|
|
313
|
+
},
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
*获取SessionStorage的值
|
|
317
|
+
* @param key:存的键
|
|
318
|
+
*/
|
|
319
|
+
getSessionStorage: function(key) {
|
|
320
|
+
var rs = sessionStorage[key];
|
|
321
|
+
try {
|
|
322
|
+
if (rs != undefined) {
|
|
323
|
+
var obj = this.toJson(rs);
|
|
324
|
+
rs = obj;
|
|
325
|
+
}
|
|
326
|
+
} catch (error) {}
|
|
327
|
+
return rs;
|
|
328
|
+
},
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* 清除SessionStorage的值
|
|
332
|
+
* @param key:存的键
|
|
333
|
+
*/
|
|
334
|
+
removeSessionStorage: function(key) {
|
|
335
|
+
return sessionStorage.removeItem(key);
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
*设置LocalStorage的值
|
|
340
|
+
* @param key:要存的键
|
|
341
|
+
* @param value :要存的值
|
|
342
|
+
*/
|
|
343
|
+
setLocalStorage: function(key, value) {
|
|
344
|
+
if (this.isObject(value) || this.isArray(value)) {
|
|
345
|
+
value = this.toJsonStr(value);
|
|
346
|
+
}
|
|
347
|
+
localStorage[key] = value;
|
|
348
|
+
},
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
*获取LocalStorage的值
|
|
352
|
+
* @param key:存的键
|
|
353
|
+
*/
|
|
354
|
+
getLocalStorage: function(key) {
|
|
355
|
+
var rs = localStorage[key];
|
|
356
|
+
try {
|
|
357
|
+
if (rs != undefined) {
|
|
358
|
+
var obj = this.toJson(rs);
|
|
359
|
+
rs = obj;
|
|
360
|
+
}
|
|
361
|
+
} catch (error) {}
|
|
362
|
+
return rs;
|
|
363
|
+
},
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* 对传入的时间值进行格式化。后台传入前台的时间有两种个是:Sql时间和.Net时间
|
|
367
|
+
* @param {String|Date} sValue 传入的时间字符串
|
|
368
|
+
* @param {dateFormat | bool} dateFormat 日期格式,日期格式:eg:'Y-m-d H:i:s'
|
|
369
|
+
* @return {String} 2014-03-01 这种格式
|
|
370
|
+
* @example
|
|
371
|
+
* 1) Sql时间格式:2015-02-24T00:00:00
|
|
372
|
+
* 2) .Net时间格式:/Date(1410744626000)/
|
|
373
|
+
*/
|
|
374
|
+
getDateTimeStr: function(sValue, dateFormat) {
|
|
375
|
+
if (dateFormat == undefined) {
|
|
376
|
+
dateFormat = 'Y-m-d'; // 默认显示年月日
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
var dt;
|
|
380
|
+
// 1.先解析传入的时间对象,
|
|
381
|
+
if (sValue) {
|
|
382
|
+
if (toString.call(sValue) !== '[object Date]') {
|
|
383
|
+
// 不为Date格式,就转换为DateTime类型
|
|
384
|
+
sValue = sValue + '';
|
|
385
|
+
if (sValue.indexOf('T') > 0) {
|
|
386
|
+
// 1)格式:2015-02-24T00:00:00
|
|
387
|
+
var timestr = sValue.replace('T', ' ').replace(/-/g, '/'); //=> 2015/02/24 00:00:00
|
|
388
|
+
dt = new Date(timestr);
|
|
389
|
+
} else if (sValue.indexOf('Date') >= 0) {
|
|
390
|
+
// 2).Net格式:/Date(1410744626000)/
|
|
391
|
+
//Convert date type that .NET can bind to DateTime
|
|
392
|
+
//var date = new Date(parseInt(sValue.substr(6)));
|
|
393
|
+
var timestr = sValue.toString().replace(/\/Date\((\d+)\)\//gi, '$1'); //
|
|
394
|
+
dt = new Date(Math.abs(timestr));
|
|
395
|
+
} else {
|
|
396
|
+
dt = new Date(sValue);
|
|
397
|
+
}
|
|
398
|
+
} else {
|
|
399
|
+
dt = sValue;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// 2.转换
|
|
404
|
+
// 1)转换成对象 'Y-m-d H:i:s'
|
|
405
|
+
var obj = {}; //返回的对象,包含了 year(年)、month(月)、day(日)
|
|
406
|
+
obj.Y = dt.getFullYear(); //年
|
|
407
|
+
obj.m = dt.getMonth() + 1; //月
|
|
408
|
+
obj.d = dt.getDate(); //日期
|
|
409
|
+
obj.H = dt.getHours();
|
|
410
|
+
obj.i = dt.getMinutes();
|
|
411
|
+
obj.s = dt.getSeconds();
|
|
412
|
+
//2.2单位的月、日都转换成双位
|
|
413
|
+
if (obj.m < 10) {
|
|
414
|
+
obj.m = '0' + obj.m;
|
|
415
|
+
}
|
|
416
|
+
if (obj.d < 10) {
|
|
417
|
+
obj.d = '0' + obj.d;
|
|
418
|
+
}
|
|
419
|
+
if (obj.H < 10) {
|
|
420
|
+
obj.H = '0' + obj.H;
|
|
421
|
+
}
|
|
422
|
+
if (obj.i < 10) {
|
|
423
|
+
obj.i = '0' + obj.i;
|
|
424
|
+
}
|
|
425
|
+
if (obj.s < 10) {
|
|
426
|
+
obj.s = '0' + obj.s;
|
|
427
|
+
}
|
|
428
|
+
// 3.解析
|
|
429
|
+
var rs = dateFormat
|
|
430
|
+
.replace('Y', obj.Y)
|
|
431
|
+
.replace('m', obj.m)
|
|
432
|
+
.replace('d', obj.d)
|
|
433
|
+
.replace('H', obj.H)
|
|
434
|
+
.replace('i', obj.i)
|
|
435
|
+
.replace('s', obj.s);
|
|
436
|
+
|
|
437
|
+
return rs;
|
|
438
|
+
},
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* 把总秒数转换为时分秒
|
|
442
|
+
*/
|
|
443
|
+
getSFM: function(seconds, dateFormat) {
|
|
444
|
+
if (dateFormat == undefined) {
|
|
445
|
+
dateFormat = 'H:i:s'; // 默认格式
|
|
446
|
+
}
|
|
447
|
+
var obj = {};
|
|
448
|
+
obj.H = Number.parseInt(seconds / 3600);
|
|
449
|
+
obj.i = Number.parseInt((seconds - obj.H * 3600) / 60);
|
|
450
|
+
obj.s = Number.parseInt(seconds - obj.H * 3600 - obj.i * 60);
|
|
451
|
+
if (obj.H < 10) {
|
|
452
|
+
obj.H = '0' + obj.H;
|
|
453
|
+
}
|
|
454
|
+
if (obj.i < 10) {
|
|
455
|
+
obj.i = '0' + obj.i;
|
|
456
|
+
}
|
|
457
|
+
if (obj.s < 10) {
|
|
458
|
+
obj.s = '0' + obj.s;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// 3.解析
|
|
462
|
+
var rs = dateFormat
|
|
463
|
+
.replace('H', obj.H)
|
|
464
|
+
.replace('i', obj.i)
|
|
465
|
+
.replace('s', obj.s);
|
|
466
|
+
return rs;
|
|
467
|
+
},
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* 是否同一天
|
|
471
|
+
*/
|
|
472
|
+
isSameDay: function(dt1, dt2) {
|
|
473
|
+
if (dt1.getFullYear() == dt2.getFullYear() && dt1.getMonth() == dt2.getMonth() && dt1.getDate() == dt2.getDate()) {
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
return false;
|
|
477
|
+
},
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* 对象转换为json字符串
|
|
481
|
+
* @param {jsonObj} jsonObj Json对象
|
|
482
|
+
* @return {jsonStr} Json字符串
|
|
483
|
+
*/
|
|
484
|
+
toJsonStr: function(jsonObj) {
|
|
485
|
+
return JSON.stringify(jsonObj);
|
|
486
|
+
},
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* 讲json字符串转换为json对象
|
|
490
|
+
* @param {String} jsonStr Json对象字符串
|
|
491
|
+
* @return {jsonObj} Json对象
|
|
492
|
+
*/
|
|
493
|
+
toJson: function(jsonStr) {
|
|
494
|
+
return JSON.parse(jsonStr);
|
|
495
|
+
},
|
|
496
|
+
|
|
497
|
+
cloneBySerialize: function(obj){
|
|
498
|
+
let b = JSON.parse(JSON.stringify(obj))
|
|
499
|
+
return b
|
|
500
|
+
},
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* 是否含有特殊字符
|
|
504
|
+
* @param {String} value 传入的值
|
|
505
|
+
* @return {Boolean} true 含有特殊符号;false 不含有特殊符号
|
|
506
|
+
*/
|
|
507
|
+
isHaveSpecialChar: function(value) {
|
|
508
|
+
var oldLength = value.length;
|
|
509
|
+
var newLength = value.replace(/[`~!@#$%^&*_+=\\{}:"<>?\[\];',.\/~!@#¥%……&*——+『』:“”《》?【】;‘’,。? \[\]()()]/g, '').length;
|
|
510
|
+
if (newLength < oldLength) {
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
return false;
|
|
514
|
+
},
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* 合并数组内成员的某个对象
|
|
518
|
+
* @param {Array} arr 需要合并的数组
|
|
519
|
+
* @param {String} fieldName 数组成员内的指定字段
|
|
520
|
+
* @param {String} split 分隔符,默认为','
|
|
521
|
+
* @example
|
|
522
|
+
* var arr = [{name:'tom',age:13},{name:'jack',age:13}] => (arr, 'name') => tom,jack
|
|
523
|
+
*/
|
|
524
|
+
joinArray: function(arr, fieldName, split) {
|
|
525
|
+
split = split == undefined ? ',' : split;
|
|
526
|
+
var rs = arr
|
|
527
|
+
.map((item) => {
|
|
528
|
+
return item[fieldName];
|
|
529
|
+
})
|
|
530
|
+
.join(split);
|
|
531
|
+
return rs;
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* http交互模块
|
|
537
|
+
* 包含:ajax
|
|
538
|
+
*/
|
|
539
|
+
ak.http = {
|
|
540
|
+
/**
|
|
541
|
+
* 将`name` - `value`对转换为支持嵌套结构的对象数组
|
|
542
|
+
*
|
|
543
|
+
* var objects = toQueryObjects('hobbies', ['reading', 'cooking', 'swimming']);
|
|
544
|
+
*
|
|
545
|
+
* // objects then equals:
|
|
546
|
+
* [
|
|
547
|
+
* { name: 'hobbies', value: 'reading' },
|
|
548
|
+
* { name: 'hobbies', value: 'cooking' },
|
|
549
|
+
* { name: 'hobbies', value: 'swimming' },
|
|
550
|
+
* ];
|
|
551
|
+
*
|
|
552
|
+
* var objects = toQueryObjects('dateOfBirth', {
|
|
553
|
+
* day: 3,
|
|
554
|
+
* month: 8,
|
|
555
|
+
* year: 1987,
|
|
556
|
+
* extra: {
|
|
557
|
+
* hour: 4
|
|
558
|
+
* minute: 30
|
|
559
|
+
* }
|
|
560
|
+
* }, true); // Recursive
|
|
561
|
+
*
|
|
562
|
+
* // objects then equals:
|
|
563
|
+
* [
|
|
564
|
+
* { name: 'dateOfBirth[day]', value: 3 },
|
|
565
|
+
* { name: 'dateOfBirth[month]', value: 8 },
|
|
566
|
+
* { name: 'dateOfBirth[year]', value: 1987 },
|
|
567
|
+
* { name: 'dateOfBirth[extra][hour]', value: 4 },
|
|
568
|
+
* { name: 'dateOfBirth[extra][minute]', value: 30 },
|
|
569
|
+
* ];
|
|
570
|
+
*
|
|
571
|
+
* @param {String} name
|
|
572
|
+
* @param {object | Array} value
|
|
573
|
+
* @param {boolean} [recursive=false] 是否递归
|
|
574
|
+
* @return {array}
|
|
575
|
+
*/
|
|
576
|
+
toQueryObjects: function(name, value, recursive) {
|
|
577
|
+
var objects = [],
|
|
578
|
+
i,
|
|
579
|
+
ln;
|
|
580
|
+
|
|
581
|
+
if (ak.utils.isArray(value)) {
|
|
582
|
+
for (i = 0, ln = value.length; i < ln; i++) {
|
|
583
|
+
if (recursive) {
|
|
584
|
+
objects = objects.concat(toQueryObjects(name + '[' + i + ']', value[i], true));
|
|
585
|
+
} else {
|
|
586
|
+
objects.push({
|
|
587
|
+
name: name,
|
|
588
|
+
value: value[i]
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
} else if (ak.utils.isObject(value)) {
|
|
593
|
+
for (i in value) {
|
|
594
|
+
if (value.hasOwnProperty(i)) {
|
|
595
|
+
if (recursive) {
|
|
596
|
+
objects = objects.concat(toQueryObjects(name + '[' + i + ']', value[i], true));
|
|
597
|
+
} else {
|
|
598
|
+
objects.push({
|
|
599
|
+
name: name,
|
|
600
|
+
value: value[i]
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
} else {
|
|
606
|
+
objects.push({
|
|
607
|
+
name: name,
|
|
608
|
+
value: value
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
return objects;
|
|
613
|
+
},
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* 把对象转换为查询字符串
|
|
617
|
+
* e.g.:
|
|
618
|
+
* toQueryString({foo: 1, bar: 2}); // returns "foo=1&bar=2"
|
|
619
|
+
* toQueryString({foo: null, bar: 2}); // returns "foo=&bar=2"
|
|
620
|
+
* toQueryString({date: new Date(2011, 0, 1)}); // returns "date=%222011-01-01T00%3A00%3A00%22"
|
|
621
|
+
* @param {Object} object 需要转换的对象
|
|
622
|
+
* @param {Boolean} [recursive=false] 是否递归
|
|
623
|
+
* @return {String} queryString
|
|
624
|
+
*/
|
|
625
|
+
toQueryString: function(object, recursive) {
|
|
626
|
+
var paramObjects = [],
|
|
627
|
+
params = [],
|
|
628
|
+
i,
|
|
629
|
+
j,
|
|
630
|
+
ln,
|
|
631
|
+
paramObject,
|
|
632
|
+
value;
|
|
633
|
+
|
|
634
|
+
for (i in object) {
|
|
635
|
+
if (object.hasOwnProperty(i)) {
|
|
636
|
+
paramObjects = paramObjects.concat(this.toQueryObjects(i, object[i], recursive));
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
for (j = 0, ln = paramObjects.length; j < ln; j++) {
|
|
641
|
+
paramObject = paramObjects[j];
|
|
642
|
+
value = paramObject.value;
|
|
643
|
+
|
|
644
|
+
if (ak.utils.isEmpty(value)) {
|
|
645
|
+
value = '';
|
|
646
|
+
} else if (ak.utils.isDate(value)) {
|
|
647
|
+
value =
|
|
648
|
+
value.getFullYear() +
|
|
649
|
+
'-' +
|
|
650
|
+
Ext.String.leftPad(value.getMonth() + 1, 2, '0') +
|
|
651
|
+
'-' +
|
|
652
|
+
Ext.String.leftPad(value.getDate(), 2, '0') +
|
|
653
|
+
'T' +
|
|
654
|
+
Ext.String.leftPad(value.getHours(), 2, '0') +
|
|
655
|
+
':' +
|
|
656
|
+
Ext.String.leftPad(value.getMinutes(), 2, '0') +
|
|
657
|
+
':' +
|
|
658
|
+
Ext.String.leftPad(value.getSeconds(), 2, '0');
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
params.push(encodeURIComponent(paramObject.name) + '=' + encodeURIComponent(String(value)));
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
return params.join('&');
|
|
665
|
+
},
|
|
666
|
+
/**
|
|
667
|
+
* @private
|
|
668
|
+
*/
|
|
669
|
+
getCookieVal: function(offset) {
|
|
670
|
+
var endstr = document.cookie.indexOf(';', offset);
|
|
671
|
+
if (endstr == -1) {
|
|
672
|
+
endstr = document.cookie.length;
|
|
673
|
+
}
|
|
674
|
+
return unescape(document.cookie.substring(offset, endstr));
|
|
675
|
+
},
|
|
676
|
+
|
|
677
|
+
/**
|
|
678
|
+
* 获取指定key的cookie
|
|
679
|
+
* @param {String} key cookie的key
|
|
680
|
+
*/
|
|
681
|
+
getCookie2: function(name) {
|
|
682
|
+
let cookieValue = ""
|
|
683
|
+
let search = name + "="
|
|
684
|
+
if (document.cookie.length > 0)
|
|
685
|
+
{
|
|
686
|
+
let offset = document.cookie.indexOf (search)
|
|
687
|
+
if (offset != -1)
|
|
688
|
+
{
|
|
689
|
+
offset += search.length
|
|
690
|
+
let end = document.cookie.indexOf (";", offset)
|
|
691
|
+
if (end == -1)
|
|
692
|
+
end = document.cookie.length
|
|
693
|
+
cookieValue = unescape (document.cookie.substring (offset, end))
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
return cookieValue
|
|
697
|
+
},
|
|
698
|
+
getCookie: function(key) {
|
|
699
|
+
var arg = key + '=',
|
|
700
|
+
alen = arg.length,
|
|
701
|
+
clen = document.cookie.length,
|
|
702
|
+
i = 0,
|
|
703
|
+
j = 0;
|
|
704
|
+
|
|
705
|
+
while (i < clen) {
|
|
706
|
+
j = i + alen;
|
|
707
|
+
if (document.cookie.substring(i, j) == arg) {
|
|
708
|
+
return this.getCookieVal(j);
|
|
709
|
+
}
|
|
710
|
+
i = document.cookie.indexOf(' ', i) + 1;
|
|
711
|
+
if (i === 0) {
|
|
712
|
+
break;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
return null;
|
|
716
|
+
},
|
|
717
|
+
|
|
718
|
+
/**
|
|
719
|
+
* 设置cookie
|
|
720
|
+
* @param {String} key cookie的key
|
|
721
|
+
* @param {String} value cookie的value
|
|
722
|
+
*/
|
|
723
|
+
setCookie: function(key, value) {
|
|
724
|
+
var argv = arguments,
|
|
725
|
+
argc = arguments.length,
|
|
726
|
+
expires = argc > 2 ? argv[2] : null,
|
|
727
|
+
path = argc > 3 ? argv[3] : '/',
|
|
728
|
+
domain = argc > 4 ? argv[4] : null,
|
|
729
|
+
secure = argc > 5 ? argv[5] : false;
|
|
730
|
+
|
|
731
|
+
document.cookie =
|
|
732
|
+
key +
|
|
733
|
+
'=' +
|
|
734
|
+
escape(value) +
|
|
735
|
+
(expires === null ? '' : '; expires=' + expires.toGMTString()) +
|
|
736
|
+
(path === null ? '' : '; path=' + path) +
|
|
737
|
+
(domain === null ? '' : '; domain=' + domain) +
|
|
738
|
+
(secure === true ? '; secure' : '');
|
|
739
|
+
},
|
|
740
|
+
getRootPath(url){
|
|
741
|
+
|
|
742
|
+
let rootPath_rtn = ''
|
|
743
|
+
let currentUrl = url ? url : window.location.href
|
|
744
|
+
let index = currentUrl.indexOf('#')
|
|
745
|
+
|
|
746
|
+
if(index >= 0 ){
|
|
747
|
+
let rootPath = currentUrl.substr(0,index)
|
|
748
|
+
if(!rootPath.endWith('/'))
|
|
749
|
+
rootPath_rtn = rootPath + '/'
|
|
750
|
+
else
|
|
751
|
+
rootPath_rtn = rootPath
|
|
752
|
+
}else{
|
|
753
|
+
if(!currentUrl.endWith('/'))
|
|
754
|
+
rootPath_rtn = currentUrl + '/'
|
|
755
|
+
else
|
|
756
|
+
rootPath_rtn = currentUrl
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
if(rootPath_rtn.indexOf('?') > 0 && rootPath_rtn.endWith('/')){
|
|
760
|
+
rootPath_rtn = rootPath_rtn.substr(0,rootPath_rtn.length - 1)
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
return rootPath_rtn
|
|
764
|
+
},
|
|
765
|
+
getRouteUrl(url){
|
|
766
|
+
|
|
767
|
+
let currentUrl = url ? url : window.location.href
|
|
768
|
+
let index = currentUrl.indexOf('#')
|
|
769
|
+
if(index >= 0 ){
|
|
770
|
+
return currentUrl.substr(index+1)
|
|
771
|
+
}else{
|
|
772
|
+
return ''
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
},
|
|
776
|
+
getRoot(url){
|
|
777
|
+
let rootUrl = this.getRootPath(url)
|
|
778
|
+
let index = rootUrl.indexOf('?')
|
|
779
|
+
if(index >= 0)
|
|
780
|
+
return rootUrl.substr(0,index)
|
|
781
|
+
else
|
|
782
|
+
return rootUrl
|
|
783
|
+
},
|
|
784
|
+
getUrlParameters(url){
|
|
785
|
+
let rootUrl = this.getRootPath(url)
|
|
786
|
+
let index = rootUrl.indexOf('?')
|
|
787
|
+
if(index >= 0)
|
|
788
|
+
return rootUrl.substr(index+1)
|
|
789
|
+
else
|
|
790
|
+
return ''
|
|
791
|
+
},
|
|
792
|
+
concatParams(url,param){
|
|
793
|
+
|
|
794
|
+
let rootUrl = this.getRootPath(url)
|
|
795
|
+
let routeUrl = this.getRouteUrl(url)
|
|
796
|
+
|
|
797
|
+
if(rootUrl.includes('?')){
|
|
798
|
+
return rootUrl + '&' + param + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
799
|
+
}else{
|
|
800
|
+
return rootUrl + '?' + param + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
},
|
|
804
|
+
deleteParams(url,ref){
|
|
805
|
+
|
|
806
|
+
let rootUrl = this.getRootPath(url)
|
|
807
|
+
let routeUrl = this.getRouteUrl(url)
|
|
808
|
+
let newParams = ''
|
|
809
|
+
|
|
810
|
+
if(rootUrl.includes('?')){
|
|
811
|
+
|
|
812
|
+
let params = this.getUrlParameters(url)
|
|
813
|
+
let para = params.split('&')
|
|
814
|
+
for (let i = 0; i < para.length; i++) {
|
|
815
|
+
let paired = para[i].split('=')
|
|
816
|
+
if (paired[0] == ref) {
|
|
817
|
+
continue
|
|
818
|
+
}else{
|
|
819
|
+
if(paired.length > 1){
|
|
820
|
+
newParams += paired[0] + '=' + paired[1] + "&"
|
|
821
|
+
}else{
|
|
822
|
+
newParams += paired[0]
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
if(ak.utils.isEmpty(newParams)){
|
|
828
|
+
return this.getRoot(rootUrl) + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
829
|
+
}
|
|
830
|
+
else{
|
|
831
|
+
let remed = newParams.substr(0,newParams.length-1)
|
|
832
|
+
return this.getRoot(rootUrl) + '?' + remed + (ak.utils.isEmpty(routeUrl) ? '': ('#' + routeUrl))
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
}else{
|
|
837
|
+
return url
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
},
|
|
841
|
+
getQueryString(name) {
|
|
842
|
+
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)")
|
|
843
|
+
var r = window.location.search.substr(1).match(reg)
|
|
844
|
+
if(r!=null)return unescape(r[2]); return null
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
};
|
|
848
|
+
|
|
849
|
+
/**
|
|
850
|
+
* 消息模块
|
|
851
|
+
* 包含:确认框、信息提示框
|
|
852
|
+
*/
|
|
853
|
+
ak.msg = {
|
|
854
|
+
/**
|
|
855
|
+
* 提示框
|
|
856
|
+
* msg {string} :信息内容
|
|
857
|
+
*/
|
|
858
|
+
alert: function(msg,callback, classStr="") {
|
|
859
|
+
|
|
860
|
+
this.vue.prototype.$dialog.alert({
|
|
861
|
+
title: '消息',
|
|
862
|
+
message: msg,
|
|
863
|
+
className: classStr,
|
|
864
|
+
closeOnPopstate: true
|
|
865
|
+
}).then(() => {
|
|
866
|
+
if(callback) callback()
|
|
867
|
+
});
|
|
868
|
+
},
|
|
869
|
+
|
|
870
|
+
/**
|
|
871
|
+
* 确认框
|
|
872
|
+
* msg {string} :信息内容
|
|
873
|
+
* callback {function} :点击'确定'时的回调函数。
|
|
874
|
+
*/
|
|
875
|
+
confirm: function(msg, callback,callback2) {
|
|
876
|
+
|
|
877
|
+
this.vue.prototype.$dialog.confirm({
|
|
878
|
+
title: '消息',
|
|
879
|
+
message: msg,
|
|
880
|
+
closeOnPopstate: true
|
|
881
|
+
})
|
|
882
|
+
.then(() => {
|
|
883
|
+
if(callback) callback()
|
|
884
|
+
})
|
|
885
|
+
.catch(() => {
|
|
886
|
+
if(callback2) callback2()
|
|
887
|
+
});
|
|
888
|
+
|
|
889
|
+
},
|
|
890
|
+
|
|
891
|
+
toast: function(msg) {
|
|
892
|
+
|
|
893
|
+
this.vue.prototype.$toast(msg)
|
|
894
|
+
|
|
895
|
+
}
|
|
896
|
+
};
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
/**
|
|
900
|
+
* 原型:字符串格式化
|
|
901
|
+
* @param args 格式化参数值
|
|
902
|
+
*/
|
|
903
|
+
String.prototype.format = function(args) {
|
|
904
|
+
var result = this;
|
|
905
|
+
if (arguments.length < 1) {
|
|
906
|
+
return result;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
var data = arguments; // 如果模板参数是数组
|
|
910
|
+
if (arguments.length == 1 && typeof (args) == "object") {
|
|
911
|
+
// 如果模板参数是对象
|
|
912
|
+
data = args;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
for ( var key in data) {
|
|
916
|
+
var value = data[key];
|
|
917
|
+
if (undefined != value) {
|
|
918
|
+
result = result.replace(new RegExp("\\{" + key + "\\}", "gm"), value);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
return result;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
|
|
925
|
+
String.prototype.endWith=function(str){
|
|
926
|
+
if(str==null||str==""||this.length==0||str.length>this.length)
|
|
927
|
+
return false;
|
|
928
|
+
if(this.substring(this.length-str.length)==str)
|
|
929
|
+
return true;
|
|
930
|
+
else
|
|
931
|
+
return false;
|
|
932
|
+
return true;
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
String.prototype.startWith=function(str){
|
|
936
|
+
if(str==null||str==""||this.length==0||str.length>this.length)
|
|
937
|
+
return false;
|
|
938
|
+
if(this.substr(0,str.length)==str)
|
|
939
|
+
return true;
|
|
940
|
+
else
|
|
941
|
+
return false;
|
|
942
|
+
return true;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
|
|
946
|
+
|
|
947
|
+
|
|
948
|
+
export default ak;
|