efront 3.21.0 → 3.21.3
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/apps/pivot/main.js +25 -2
- package/coms/basic/BigNumber.js +184 -0
- package/coms/basic/BigNumber_test.js +51 -0
- package/coms/basic/JSAM.js +2 -2
- package/coms/basic/cookie.js +22 -0
- package/coms/basic/cross_.js +31 -16
- package/coms/basic/submit_.js +19 -0
- package/coms/basic/valid.js +21 -0
- package/coms/frame/payment.html +34 -0
- package/coms/frame/payment.js +50 -0
- package/coms/frame/payment.less +35 -0
- package/coms/zimoli/chooseFile.js +16 -3
- package/coms/zimoli/cross.js +2 -2
- package/coms/zimoli/data.js +1 -1
- package/coms/zimoli/input.js +43 -5
- package/coms/zimoli/model.js +13 -4
- package/coms/zimoli/render.js +2 -2
- package/coms/zimoli/select.js +5 -0
- package/coms/zimoli/selectList.js +9 -11
- package/coms/zimoli/zimoli.js +1 -1
- package/docs/compare.md +85 -82
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/readme.md +1 -1
- package/coms/zimoli/BigNumber.js +0 -216
package/apps/pivot/main.js
CHANGED
|
@@ -1,20 +1,43 @@
|
|
|
1
1
|
data.loadConfig("api.yml");
|
|
2
2
|
user.loginPath = '/auth/login';
|
|
3
|
+
var login_queue = [], reject_queue = [];
|
|
3
4
|
cross.addReform(async function ({ status, url, headers }, reform, reject) {
|
|
4
5
|
if (status === 401) {
|
|
6
|
+
var xhr = this;
|
|
7
|
+
var abort = xhr.abort;
|
|
8
|
+
xhr.abort = function () {
|
|
9
|
+
removeFromList(login_queue, reform);
|
|
10
|
+
removeFromList(reject_queue, reject);
|
|
11
|
+
if (!login_queue.length) remove(reject_queue.splice(0, 1)[0]);
|
|
12
|
+
abort.call(this);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
if (login_queue.length) {
|
|
16
|
+
login_queue.push(reform);
|
|
17
|
+
reject_queue.push(reject);
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
5
20
|
var base = data.getInstance("base").base;
|
|
6
21
|
var { protocol, host } = parseURL(url);
|
|
7
22
|
var base1 = protocol + "//" + host + "/";
|
|
8
23
|
if (base !== base1) {
|
|
9
24
|
data.setSource(base1, null);
|
|
10
25
|
}
|
|
26
|
+
login_queue.push(reform);
|
|
11
27
|
var page = await popup("/auth/login", base1);
|
|
28
|
+
if (!login_queue.length) return;
|
|
29
|
+
reject_queue.push(page, reject);
|
|
12
30
|
care(page, "login", function (info) {
|
|
13
31
|
data.setSource(base1, info);
|
|
14
32
|
headers.authorization = info;
|
|
15
|
-
|
|
33
|
+
login_queue.splice(0, login_queue.length).forEach(q => q());
|
|
34
|
+
reject_queue.splice(0, reject_queue.length);
|
|
35
|
+
});
|
|
36
|
+
on("remove")(page, function () {
|
|
37
|
+
login_queue.splice(0, login_queue.length);
|
|
38
|
+
if (reject_queue[0] === this) reject_queue.shift();
|
|
39
|
+
reject_queue.splice(0, reject_queue.length).forEach(r => r());
|
|
16
40
|
});
|
|
17
|
-
on("remove")(page, reject);
|
|
18
41
|
return false;
|
|
19
42
|
}
|
|
20
43
|
})
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
var trim = function (a) {
|
|
2
|
+
return String(a).replace(/[\s\,]/g, '').replace(/^\+/, '').replace(/[mni]$/i, '');
|
|
3
|
+
};
|
|
4
|
+
var prepare = function (a) {
|
|
5
|
+
a = trim(a);
|
|
6
|
+
var neg = /^\-/.test(a);
|
|
7
|
+
if (neg) a = a.slice(1);
|
|
8
|
+
var [s1, s2 = ''] = a.split('.');
|
|
9
|
+
s2 = s2.replace(/0+$/, '');
|
|
10
|
+
return [neg, s1, s2];
|
|
11
|
+
};
|
|
12
|
+
var repeat = String.prototype.repeat || function (n) {
|
|
13
|
+
return new Array(n + 1).join(this);
|
|
14
|
+
};
|
|
15
|
+
var repeat0 = function (n) {
|
|
16
|
+
return repeat.call('0', n);
|
|
17
|
+
};
|
|
18
|
+
var split = function (s, n) {
|
|
19
|
+
var r = [];
|
|
20
|
+
var end = s.length;
|
|
21
|
+
while (end > n) {
|
|
22
|
+
r.push(s.slice(end - n, end));
|
|
23
|
+
end -= n;
|
|
24
|
+
}
|
|
25
|
+
r.push(s.slice(0, end));
|
|
26
|
+
return r;
|
|
27
|
+
};
|
|
28
|
+
var fixme = function (neg, res, nl) {
|
|
29
|
+
if (nl > 0) res = res.slice(0, res.length - nl) + "." + res.slice(res.length - nl).replace(/0+$/, '');
|
|
30
|
+
res = res.replace(/^0+(?!\.)/, '');
|
|
31
|
+
if (/^\./.test(res)) res = '0' + res;
|
|
32
|
+
if (neg) res = '-' + res;
|
|
33
|
+
return res.replace(/\.$/, '');
|
|
34
|
+
};
|
|
35
|
+
var fixde = function (numstr, fractionDigits, compare) {
|
|
36
|
+
var [neg, s1, s2] = prepare(numstr);
|
|
37
|
+
var frag = +s2.charAt(fractionDigits) > compare;
|
|
38
|
+
if (!frag && compare === 0) {
|
|
39
|
+
frag = s2.length > fractionDigits;
|
|
40
|
+
}
|
|
41
|
+
if (s2.length < fractionDigits) {
|
|
42
|
+
s2 += repeat0(fractionDigits - s2.length);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
s2 = s2.slice(0, fractionDigits);
|
|
46
|
+
}
|
|
47
|
+
var res = s1 + s2;
|
|
48
|
+
if (frag) {
|
|
49
|
+
res = BigNumber.add(res, 1);
|
|
50
|
+
}
|
|
51
|
+
if (fractionDigits > 0) res = res.slice(0, res.length - fractionDigits) + '.' + res.slice(res.length - fractionDigits);
|
|
52
|
+
if (/^\./.test(res)) res = "0" + res;
|
|
53
|
+
if (neg) res = '-' + res;
|
|
54
|
+
return res;
|
|
55
|
+
};
|
|
56
|
+
class BigNumber {
|
|
57
|
+
constructor(value) {
|
|
58
|
+
if (!this || this.constructor !== BigNumber) {
|
|
59
|
+
return new BigNumber(value);
|
|
60
|
+
}
|
|
61
|
+
this.value = value;
|
|
62
|
+
}
|
|
63
|
+
toString() {
|
|
64
|
+
return this.value;
|
|
65
|
+
};
|
|
66
|
+
add(bignumber) {
|
|
67
|
+
return new BigNumber(BigNumber.add(this.value, bignumber));
|
|
68
|
+
};
|
|
69
|
+
static round(numstr) {
|
|
70
|
+
return fixde(numstr, 0, 4);
|
|
71
|
+
}
|
|
72
|
+
static ceil(numstr) {
|
|
73
|
+
return fixde(numstr, 0, 0);
|
|
74
|
+
}
|
|
75
|
+
static floor(numstr) {
|
|
76
|
+
return fixde(numstr, 0, 9);
|
|
77
|
+
}
|
|
78
|
+
static fix(numstr, fractionDigits) {
|
|
79
|
+
fractionDigits = +fractionDigits || 0;
|
|
80
|
+
if (fractionDigits < 0 || fractionDigits > 100) {
|
|
81
|
+
throw new Error("小数位数只能是0和100之间的数字");
|
|
82
|
+
}
|
|
83
|
+
return fixde(numstr, fractionDigits, 4);
|
|
84
|
+
}
|
|
85
|
+
static add(numstr1, numstr2) {
|
|
86
|
+
var [neg1, s11, s12] = prepare(numstr1)
|
|
87
|
+
var [neg2, s21, s22] = prepare(numstr2)
|
|
88
|
+
var nl = 0;
|
|
89
|
+
if (s12.length < s22.length) {
|
|
90
|
+
nl = s22.length;
|
|
91
|
+
s12 += repeat0(nl - s12.length);
|
|
92
|
+
}
|
|
93
|
+
else if (s22.length < s12.length) {
|
|
94
|
+
nl = s12.length;
|
|
95
|
+
s22 += repeat0(nl - s22.length);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
nl = s12.length;
|
|
99
|
+
}
|
|
100
|
+
if (s11.length < s21.length) {
|
|
101
|
+
s11 = repeat0(s21.length - s11.length) + s11;
|
|
102
|
+
}
|
|
103
|
+
else if (s11.length > s21.length) {
|
|
104
|
+
s21 = repeat0(s11.length - s21.length) + s21;
|
|
105
|
+
}
|
|
106
|
+
numstr1 = s11 + s12;
|
|
107
|
+
numstr2 = s21 + s22;
|
|
108
|
+
var flag = 1;
|
|
109
|
+
if (neg1 ^ neg2) {
|
|
110
|
+
if (numstr1 > numstr2) {
|
|
111
|
+
neg = neg1;
|
|
112
|
+
}
|
|
113
|
+
else if (numstr1 < numstr2) {
|
|
114
|
+
neg = neg2;
|
|
115
|
+
[numstr1, numstr2] = [numstr2, numstr1];
|
|
116
|
+
}
|
|
117
|
+
flag = 0;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
var neg = neg1 && neg2;
|
|
121
|
+
}
|
|
122
|
+
var res = [];
|
|
123
|
+
var end = (numstr1.length / 15 | 0) * 15;
|
|
124
|
+
var rest = 0;
|
|
125
|
+
while (end >= 0) {
|
|
126
|
+
var s1 = numstr1.slice(end, end + 15);
|
|
127
|
+
var s2 = numstr2.slice(end, end + 15);
|
|
128
|
+
var s = +s1 + (flag ? +s2 : -s2) + rest;
|
|
129
|
+
if (s < 0) {
|
|
130
|
+
s = +("1" + repeat0(s1.length)) + s;
|
|
131
|
+
rest = -1;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
rest = 0;
|
|
135
|
+
}
|
|
136
|
+
s = s.toFixed(0);
|
|
137
|
+
if (s.length > s1.length) {
|
|
138
|
+
rest = 1;
|
|
139
|
+
res.push(s.slice(1))
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (s.length < s1.length) s = repeat0(s1.length - s.length) + s;
|
|
143
|
+
res.push(s);
|
|
144
|
+
}
|
|
145
|
+
end -= 15;
|
|
146
|
+
}
|
|
147
|
+
if (rest) res.push(rest);
|
|
148
|
+
res = res.reverse().join('');
|
|
149
|
+
return fixme(neg, res, nl);
|
|
150
|
+
}
|
|
151
|
+
static prd(numstr1, numstr2) {
|
|
152
|
+
var [neg1, s11, s12] = prepare(numstr1);
|
|
153
|
+
var [neg2, s21, s22] = prepare(numstr2);
|
|
154
|
+
var d = s12.length + s22.length;
|
|
155
|
+
numstr1 = s11 + s12;
|
|
156
|
+
numstr2 = s21 + s22;
|
|
157
|
+
if (numstr1.length < numstr2.length) [numstr1, numstr2] = [numstr2, numstr1];
|
|
158
|
+
var ns1 = split(numstr1, 7);
|
|
159
|
+
var ns2 = split(numstr2, 7);
|
|
160
|
+
var res = [];
|
|
161
|
+
var i = 0;
|
|
162
|
+
for (var cx = 0, dx = ns1.length; cx < dx; cx++) {
|
|
163
|
+
var s1 = ns1[cx];
|
|
164
|
+
for (var cy = 0, dy = ns2.length; cy < dy; cy++) {
|
|
165
|
+
var s2 = ns2[cy];
|
|
166
|
+
var i = cx + cy;
|
|
167
|
+
var rest = +res[i] || 0;
|
|
168
|
+
var s = s1 * s2 + rest;
|
|
169
|
+
s = String(s);
|
|
170
|
+
if (s.length > 7) {
|
|
171
|
+
rest = +s.slice(0, s.length - 7);
|
|
172
|
+
res[i] = s.slice(s.length - 7);
|
|
173
|
+
res[i + 1] = (+res[i + 1] || 0) + rest;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
if (s.length < 7) s = repeat0(7 - s.length) + s;
|
|
177
|
+
res[i] = s;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
res = res.reverse().join('');
|
|
182
|
+
return fixme(neg1 ^ neg2, res, d);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var testAdd = function (a, b, s) {
|
|
2
|
+
assert(BigNumber.add(a, b), s, `${a} + ${b}`);
|
|
3
|
+
};
|
|
4
|
+
var testPrd = function (a, b, s) {
|
|
5
|
+
assert(BigNumber.prd(a, b), s, `${a} * ${b}`);
|
|
6
|
+
};
|
|
7
|
+
testAdd(0x1fffffffffffff, 1, '9007199254740992');
|
|
8
|
+
testAdd(0x1fffffffffffff, 2, '9007199254740993');
|
|
9
|
+
testAdd(0x1fffffffffffff, 3, '9007199254740994');
|
|
10
|
+
testAdd(0x1fffffffffffff, 3, '9007199254740994');
|
|
11
|
+
testAdd("900719925474099.2", 0.1, '900719925474099.3');
|
|
12
|
+
testAdd("900719925474099.2", 0.1, '900719925474099.3');
|
|
13
|
+
testAdd("900719925474099.3", -0.2, '900719925474099.1');
|
|
14
|
+
testAdd("900719925474099.39007199254740992", "-900719925474099.39007199254740992", '0');
|
|
15
|
+
testAdd("900719925474099.39007199254740992", 0.2, '900719925474099.59007199254740992');
|
|
16
|
+
testAdd("900719925474099.39007199254740992", "-900719925474099.39007", '0.00000199254740992');
|
|
17
|
+
testAdd("90071992547409939007.199254740992", 0.2, '90071992547409939007.399254740992');
|
|
18
|
+
testAdd("-90071992547409939007.199254740992", 0.2, '-90071992547409939006.999254740992');
|
|
19
|
+
var getrandomint = function () {
|
|
20
|
+
var n = BigInt(Math.random() * new Date | 0) * BigInt(Math.random() * new Date | 0) * BigInt(Math.random() * new Date | 0);
|
|
21
|
+
return n;
|
|
22
|
+
}
|
|
23
|
+
testPrd(1, 2, '2');
|
|
24
|
+
testPrd(1, 0.2, '0.2');
|
|
25
|
+
testPrd("9007199254740992.1", 0.1, '900719925474099.21');
|
|
26
|
+
testPrd("9007199254740992.1", 0.01, '90071992547409.921');
|
|
27
|
+
for (var cx = 0, dx = 1000; cx < dx; cx++) {
|
|
28
|
+
var n1 = getrandomint();
|
|
29
|
+
var n2 = getrandomint();
|
|
30
|
+
var s = String(n1 + n2);
|
|
31
|
+
testAdd(n1, n2, s);
|
|
32
|
+
testPrd(n1, n2, String(n1 * n2));
|
|
33
|
+
}
|
|
34
|
+
assert(BigNumber.fix(2, 2), '2.00');
|
|
35
|
+
assert(BigNumber.fix(2.234, 6), '2.234000');
|
|
36
|
+
assert(BigNumber.fix(2.235, 6), '2.235000');
|
|
37
|
+
assert(BigNumber.fix(2.235, 2), '2.24');
|
|
38
|
+
assert(BigNumber.fix(2.234, 2), '2.23');
|
|
39
|
+
assert(BigNumber.fix(2.2351, 2), '2.24');
|
|
40
|
+
assert(BigNumber.fix(2.2349, 2), '2.23');
|
|
41
|
+
assert(BigNumber.round(2.2349), '2');
|
|
42
|
+
assert(BigNumber.round(2.4999), '2');
|
|
43
|
+
assert(BigNumber.round(2.5000), '3');
|
|
44
|
+
assert(BigNumber.round(2.5100), '3');
|
|
45
|
+
assert(BigNumber.ceil(2.5100), '3');
|
|
46
|
+
assert(BigNumber.ceil(2.000), '2');
|
|
47
|
+
assert(BigNumber.floor(2.000), '2');
|
|
48
|
+
assert(BigNumber.floor(2.999), '2');
|
|
49
|
+
assert(BigNumber.ceil(2.001), '3');
|
|
50
|
+
assert(BigNumber.ceil(2.999), '3');
|
|
51
|
+
assert(BigNumber.fix("9007199254740992.234", 6), '9007199254740992.234000');
|
package/coms/basic/JSAM.js
CHANGED
|
@@ -291,9 +291,9 @@ function parse(string, preload) {
|
|
|
291
291
|
module.exports = {
|
|
292
292
|
stringify,
|
|
293
293
|
parse(data, preload) {
|
|
294
|
-
if (
|
|
294
|
+
if (/^\s*[^\{\[\s]|^\s*(?:\[\s*\]|\{\s*\}|)\s*$/.test(data)) return parse(data, preload);
|
|
295
295
|
if (/^\s*\{[\d\,\:\s]*\}\s*,/.test(data)) return parse(data, preload);
|
|
296
296
|
if (/^\s*\[[\d\,\:\s]*\]\s*,/.test(data)) return parse(data, preload);
|
|
297
|
-
return JSON.parse(data
|
|
297
|
+
return JSON.parse(data);
|
|
298
298
|
}
|
|
299
299
|
};
|
package/coms/basic/cookie.js
CHANGED
|
@@ -100,9 +100,31 @@ function getDomainPath(url) {
|
|
|
100
100
|
return host;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
function linkCookie(from, to) {
|
|
104
|
+
from = getDomainPath(from).replace(/\/$/, '');
|
|
105
|
+
to = getDomainPath(to).replace(/\/$/, '');
|
|
106
|
+
if (cookiesMap[from]) {
|
|
107
|
+
cookiesMap[to] = cookiesMap[from];
|
|
108
|
+
}
|
|
109
|
+
cookiesMap[to] = cookiesMap[from] = extend({}, cookiesMap[to], cookiesMap[from]);
|
|
110
|
+
return to;
|
|
111
|
+
}
|
|
112
|
+
function copyCookie(from, to) {
|
|
113
|
+
from = getDomainPath(from).replace(/\/$,'/, '');
|
|
114
|
+
to = getDomainPath(to).replace(/\/$/, '');
|
|
115
|
+
if (from in cookiesMap) {
|
|
116
|
+
cookiesMap[to] = JSON.parse(JSON.stringify(cookiesMap[from]));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
delete cookiesMap[to];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
103
123
|
return {
|
|
104
124
|
cookiesMap,
|
|
105
125
|
addCookie,
|
|
106
126
|
getCookies,
|
|
107
127
|
delCookies,
|
|
128
|
+
linkCookie,
|
|
129
|
+
copyCookie
|
|
108
130
|
}
|
package/coms/basic/cross_.js
CHANGED
|
@@ -58,6 +58,18 @@ function toResponse() {
|
|
|
58
58
|
if (this.responseType === 'json') return JSON.stringify(this.response);
|
|
59
59
|
return this.response;
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* @this {XMLHttpRequest}
|
|
63
|
+
*/
|
|
64
|
+
var XMLHttpRequest_abort = function () {
|
|
65
|
+
removeFromList(requests, this);
|
|
66
|
+
delete this.abort;
|
|
67
|
+
if (isFunction(this.abort)) this.abort(this);
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* @param { () => XMLHttpRequest } jsonp
|
|
71
|
+
* @this { () => XMLHttpRequest }
|
|
72
|
+
*/
|
|
61
73
|
function cross_(jsonp, digest = noop, method, url, headers) {
|
|
62
74
|
var originDomain = getDomainPath(url);
|
|
63
75
|
if (!originDomain) throw new Error("路径格式错误!");
|
|
@@ -75,6 +87,8 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
75
87
|
}
|
|
76
88
|
var loaded, errored;
|
|
77
89
|
var onload = function (data) {
|
|
90
|
+
if (!~requests.indexOf(_xhr)) return;
|
|
91
|
+
removeFromList(requests, _xhr);
|
|
78
92
|
if (xhr.decoder) {
|
|
79
93
|
data = xhr.decoder(data);
|
|
80
94
|
}
|
|
@@ -83,18 +97,21 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
83
97
|
digest();
|
|
84
98
|
};
|
|
85
99
|
var onerror1 = function (e) {
|
|
100
|
+
if (!~requests.indexOf(_xhr)) return;
|
|
101
|
+
removeFromList(requests, _xhr);
|
|
86
102
|
errored = e || "未知错误!";
|
|
87
103
|
flush();
|
|
88
104
|
digest();
|
|
89
105
|
};
|
|
90
106
|
var onerror = async function (e) {
|
|
91
107
|
if (e.type === 'error') {
|
|
92
|
-
removeFromList(requests, e.target);
|
|
93
108
|
e = { response: "无法访问服务器", toString: toResponse };
|
|
94
109
|
}
|
|
95
110
|
for (var r of reforms) {
|
|
96
|
-
var r = await reform(r, { method, url, status: xhr.status, headers: _headers }, fire, onerror1, e);
|
|
97
|
-
if (r === false)
|
|
111
|
+
var r = await reform.call(xhr, r, { method, url, status: xhr.status, headers: _headers }, fire, onerror1, e);
|
|
112
|
+
if (r === false) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
98
115
|
}
|
|
99
116
|
onerror1(e);
|
|
100
117
|
};
|
|
@@ -129,11 +146,10 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
129
146
|
var nocross = notCross(url, isencrypt);
|
|
130
147
|
if (nocross) isencrypt = false;
|
|
131
148
|
var callback = async function () {
|
|
132
|
-
removeFromList(requests, xhr);
|
|
133
|
-
var exposeHeaders = !nocross && xhr.getResponseHeader("access-control-expose-headers");
|
|
134
|
-
var exposeMap = {};
|
|
135
|
-
if (exposeHeaders) exposeHeaders.split(",").forEach(h => exposeMap[h.toLowerCase()] = true);
|
|
136
149
|
if (xhr.getResponseHeader) {
|
|
150
|
+
var exposeHeaders = (!nocross || !location_href) && xhr.getResponseHeader("access-control-expose-headers");
|
|
151
|
+
var exposeMap = {};
|
|
152
|
+
if (exposeHeaders) exposeHeaders.split(",").forEach(h => exposeMap[h.toLowerCase()] = true);
|
|
137
153
|
var exposekey = nocross ? "set-cookie" : "efront-cookie";
|
|
138
154
|
if (exposeMap[exposekey]) {
|
|
139
155
|
var cookie = xhr.getResponseHeader(exposekey);
|
|
@@ -158,6 +174,7 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
158
174
|
xhr = {
|
|
159
175
|
status: xhr.status,
|
|
160
176
|
response: encode62.safedecode(xhr.response || xhr.responseText, xhr.encrypt),
|
|
177
|
+
getResponseHeader: xhr.getResponseHeader && xhr.getResponseHeader.bind(xhr)
|
|
161
178
|
};
|
|
162
179
|
xhr.responseText = xhr.response;
|
|
163
180
|
}
|
|
@@ -246,7 +263,9 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
246
263
|
}
|
|
247
264
|
};
|
|
248
265
|
var fire = async function () {
|
|
266
|
+
if (!~requests.indexOf(xhr)) return;
|
|
249
267
|
var code = await xhr.encrypt;
|
|
268
|
+
if (!~requests.indexOf(xhr)) return;
|
|
250
269
|
xhr.encrypt = code;
|
|
251
270
|
var isform = /^f/i.test(method);
|
|
252
271
|
if (isform) {
|
|
@@ -283,7 +302,7 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
283
302
|
xhr.open(method, getCrossUrl(url, _headers, isencrypt && code));
|
|
284
303
|
}
|
|
285
304
|
if (is_gb2312) xhr.overrideMimeType("text/plain; charset=gb2312");
|
|
286
|
-
delete realHeaders.Cookie;
|
|
305
|
+
if (location_href) delete realHeaders.Cookie;
|
|
287
306
|
Object.keys(realHeaders).forEach(key => setRequestHeader.call(xhr, key, realHeaders[key]));
|
|
288
307
|
if (!isEmpty(datas)) send.call(xhr, !isencrypt ? datas : encode62.safeencode(datas, code));
|
|
289
308
|
else send.call(xhr);
|
|
@@ -319,11 +338,7 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
319
338
|
onerrors.push(oh);
|
|
320
339
|
flush();
|
|
321
340
|
};
|
|
322
|
-
|
|
323
|
-
xhr.abort = function () {
|
|
324
|
-
removeFromList(requests, this);
|
|
325
|
-
if (isFunction(abort)) abort.call(this);
|
|
326
|
-
};
|
|
341
|
+
xhr.abort = XMLHttpRequest_abort;
|
|
327
342
|
xhr.delCookies = function () {
|
|
328
343
|
delCookies(originDomain);
|
|
329
344
|
xhr.nocookie = true;
|
|
@@ -333,6 +348,7 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
333
348
|
return getCookies(originDomain);
|
|
334
349
|
};
|
|
335
350
|
requests.push(xhr);
|
|
351
|
+
var _xhr = xhr;
|
|
336
352
|
return xhr;
|
|
337
353
|
}
|
|
338
354
|
function addDirect(a) {
|
|
@@ -359,7 +375,7 @@ var requests = [];
|
|
|
359
375
|
var reforms = [];
|
|
360
376
|
function reform(r, info, fire, cancel, e) {
|
|
361
377
|
var fired = false;
|
|
362
|
-
return r(info, function () {
|
|
378
|
+
return r.call(this, info, function () {
|
|
363
379
|
if (fired) return;
|
|
364
380
|
fired = true;
|
|
365
381
|
fire();
|
|
@@ -386,8 +402,7 @@ cross_.bind = function () {
|
|
|
386
402
|
extend(cross_, {
|
|
387
403
|
requests,
|
|
388
404
|
abortAll() {
|
|
389
|
-
var
|
|
390
|
-
for (var r of rs) r.abort();
|
|
405
|
+
for (var r of requests) r.abort();
|
|
391
406
|
},
|
|
392
407
|
setHost,
|
|
393
408
|
addReform,
|
package/coms/basic/submit_.js
CHANGED
|
@@ -21,6 +21,25 @@ function submit(fields, data) {
|
|
|
21
21
|
}
|
|
22
22
|
else {
|
|
23
23
|
params[f.key] = data[f.key];
|
|
24
|
+
var tmp = /\:(\d+)?(?:\.(\d+))?$/.exec(f.type);
|
|
25
|
+
if (tmp) var [, , fixed] = tmp;
|
|
26
|
+
else if (/^(money|price)$/i.test(f.type)) fixed = 2;
|
|
27
|
+
fixed = +fixed;
|
|
28
|
+
if (fixed) {
|
|
29
|
+
var v = params[f.key];
|
|
30
|
+
if (v) {
|
|
31
|
+
var d = v.replace(/^[^\.]*\.?/, '').length;
|
|
32
|
+
if (d === v.length - 1) v = "0" + v;
|
|
33
|
+
if (d > 0 && d < fixed) {
|
|
34
|
+
v = v + new Array(fixed + 1 - d).join("0");
|
|
35
|
+
}
|
|
36
|
+
else if (d === 0) {
|
|
37
|
+
v = v.replace(/\.$/, '') + '.' + new Array(fixed + 1).join("0");
|
|
38
|
+
}
|
|
39
|
+
params[f.key] = v;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
24
43
|
}
|
|
25
44
|
}
|
|
26
45
|
if (checks.length + select.length + inputs.length) {
|
package/coms/basic/valid.js
CHANGED
|
@@ -6,6 +6,27 @@ function valid(field, data) {
|
|
|
6
6
|
}
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
9
|
+
var tmp;
|
|
10
|
+
if (tmp = /\:(\d+)(?:\.(\d+))?$/.exec(field.type)) {
|
|
11
|
+
var [, a, b] = tmp;
|
|
12
|
+
var value = data[field.key];
|
|
13
|
+
a = +a;
|
|
14
|
+
b = +b;
|
|
15
|
+
if (a) {
|
|
16
|
+
if (!b) {
|
|
17
|
+
if (value.length > a) return `不能超过${a}个字符`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
if (value.replace(/\.[\s\S]*$/, '').length > a) return `整数部分不能超过${a}位`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (b) {
|
|
24
|
+
var digits = value.replace(/^[^\.]+\./, '');
|
|
25
|
+
if (digits.length > b) {
|
|
26
|
+
return `小数部分不能超过${b}位`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
9
30
|
if (field.valid instanceof Function) {
|
|
10
31
|
var e = field.valid(data[field.key]);
|
|
11
32
|
if (e) return e;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<div class="head">
|
|
2
|
+
扫码支付
|
|
3
|
+
<close @click="closeView()"></close>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="body">
|
|
6
|
+
<item>
|
|
7
|
+
<label>原始价格:</label>
|
|
8
|
+
<span v-model="(+price).toFixed(2)"></span>元
|
|
9
|
+
</item>
|
|
10
|
+
<item>
|
|
11
|
+
<label>支付渠道:</label>
|
|
12
|
+
<select ng-model="paytype">
|
|
13
|
+
<option disabled value="0">请选择</option>
|
|
14
|
+
<option v-repeat="(o,i) in paytypes" icon_=o.icon value_="i+1" -html="o.name"></option>
|
|
15
|
+
<!-- <option icon="/page/weixin.ico" value="2">微信</option> -->
|
|
16
|
+
</select>
|
|
17
|
+
</item>
|
|
18
|
+
<item>
|
|
19
|
+
<label>渠道费:</label>
|
|
20
|
+
<span b-bind="waycost"></span>元
|
|
21
|
+
</item>
|
|
22
|
+
<item ng-if="+paytype">
|
|
23
|
+
<label>应支付:</label>
|
|
24
|
+
<span style="color: red;">
|
|
25
|
+
<span v-model=finalpay></span>元
|
|
26
|
+
</span>
|
|
27
|
+
</item>
|
|
28
|
+
<item ng-if="+paytype">
|
|
29
|
+
<iframe _src="paysite" allowtransparency="true" scrolling="no">
|
|
30
|
+
</iframe>
|
|
31
|
+
</item>
|
|
32
|
+
<item>
|
|
33
|
+
</item>
|
|
34
|
+
</div>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var paytype = data.getInstance("paytype");
|
|
2
|
+
function main(paytypes, price) {
|
|
3
|
+
var page = view();
|
|
4
|
+
page.innerHTML = payment;
|
|
5
|
+
renderWithDefaults(page, {
|
|
6
|
+
get paytype() {
|
|
7
|
+
return paytype.value;
|
|
8
|
+
},
|
|
9
|
+
set paytype(value) {
|
|
10
|
+
data.patchInstance("paytype", { value }, true);
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
get waycost() {
|
|
14
|
+
var pay = this.paytypes[this.paytype - 1];
|
|
15
|
+
if (!pay) return 0;
|
|
16
|
+
var cost = pay.cost;
|
|
17
|
+
if (isFunction(cost)) cost = cost.call(pay, price);
|
|
18
|
+
return BigNumber.fix(cost, 2);
|
|
19
|
+
},
|
|
20
|
+
get paysite() {
|
|
21
|
+
var pay = this.paytypes[this.paytype - 1];
|
|
22
|
+
if (!pay) return 'about:blank';
|
|
23
|
+
var url = pay.url;
|
|
24
|
+
if (isFunction(url)) url = url.call(pay, this.finalpay);
|
|
25
|
+
else if (url) url += this.finalpay;
|
|
26
|
+
return url;
|
|
27
|
+
},
|
|
28
|
+
get finalpay() {
|
|
29
|
+
return BigNumber.fix(BigNumber.add(this.price, this.waycost), 2);
|
|
30
|
+
},
|
|
31
|
+
paytypes,
|
|
32
|
+
price,
|
|
33
|
+
closeView() {
|
|
34
|
+
remove(page);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
drag.on(page.firstChild, page);
|
|
38
|
+
resize.on(page);
|
|
39
|
+
data.bindInstance("paytype", function (type) {
|
|
40
|
+
console.log(type)
|
|
41
|
+
});
|
|
42
|
+
var frame = page.querySelector("iframe");
|
|
43
|
+
on("mounted")(frame, function () {
|
|
44
|
+
frame.contentWindow.onmessage = function (e) {
|
|
45
|
+
var id = e.data;
|
|
46
|
+
cast(page, 'payment', id);
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
return page;
|
|
50
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
& {
|
|
2
|
+
border: 1px solid #000;
|
|
3
|
+
position: absolute;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
label {
|
|
7
|
+
display: inline-block;
|
|
8
|
+
padding: 0 16px 0 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
>.head {
|
|
12
|
+
-webkit-app-region: no-drag;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.body {
|
|
16
|
+
item {
|
|
17
|
+
display: block;
|
|
18
|
+
padding: 0 16px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
iframe {
|
|
22
|
+
width: 256px;
|
|
23
|
+
height: 256px;
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
border: none;
|
|
26
|
+
display: block;
|
|
27
|
+
margin: 20px auto;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
money {
|
|
31
|
+
display: block;
|
|
32
|
+
text-align: center;
|
|
33
|
+
color: red;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
function chooseFile(accept, multiple, extra) {
|
|
2
2
|
var form = document.createElement("form");
|
|
3
|
-
form.innerHTML = `<input ${extra ? extra + " " : ''}type='file'${accept ? ` accept="${accept}"` : ''}${multiple ? ' multiple' : ''} />`;
|
|
3
|
+
form.innerHTML = `<input tabindex=0 ${extra ? extra + " " : ''}type='file'${accept ? ` accept="${accept}"` : ''}${multiple ? ' multiple' : ''} />`;
|
|
4
4
|
var [input] = form.children;
|
|
5
|
-
var result = new Promise(function (ok) {
|
|
5
|
+
var result = new Promise(function (ok, oh) {
|
|
6
6
|
if (/msie\s+[2-9]/i.test(navigator.userAgent)) return alert("无法在当前浏览器操作!");
|
|
7
|
+
input.onfocus = function () {
|
|
8
|
+
// focus 事件比change事件早40-80毫秒
|
|
9
|
+
if (opened && document.hasFocus()) {
|
|
10
|
+
remove(input);
|
|
11
|
+
setTimeout(oh, 210);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
7
14
|
on("change")(input, function () {
|
|
8
15
|
if (!this.files) {
|
|
9
16
|
var value = this.value;
|
|
@@ -27,8 +34,14 @@ function chooseFile(accept, multiple, extra) {
|
|
|
27
34
|
}
|
|
28
35
|
});
|
|
29
36
|
});
|
|
30
|
-
|
|
37
|
+
var opened = false;
|
|
38
|
+
input.tabIndex = 0;
|
|
39
|
+
css(input, 'opacity:0;pointer-events:none;position:absolute;position:fixed;top:-200px;left:0;')
|
|
40
|
+
appendChild(document.body, input);
|
|
41
|
+
requestAnimationFrame(function () {
|
|
42
|
+
input.focus();
|
|
31
43
|
input.click();
|
|
44
|
+
opened = true;
|
|
32
45
|
});
|
|
33
46
|
return result;
|
|
34
47
|
}
|
package/coms/zimoli/cross.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var { cookiesMap, saveCookie } = cookie;
|
|
2
2
|
var saveCookie = lazy(function () {
|
|
3
|
-
sessionStorage.setItem(cookieItemsInSessionStorageKey,
|
|
3
|
+
sessionStorage.setItem(cookieItemsInSessionStorageKey, JSAM.stringify(cookiesMap));
|
|
4
4
|
}, 20);
|
|
5
5
|
var { efrontURI, cross_host = efrontURI } = this;
|
|
6
6
|
var location_href = parseURL(location.href);
|
|
@@ -11,7 +11,7 @@ var cookieItemsInSessionStorageKey = "--zimoli-coms-cross";
|
|
|
11
11
|
var cookiesData = sessionStorage.getItem(cookieItemsInSessionStorageKey);
|
|
12
12
|
if (cookiesData) {
|
|
13
13
|
try {
|
|
14
|
-
extend(cookiesMap,
|
|
14
|
+
extend(cookiesMap, JSAM.parse(cookiesData));
|
|
15
15
|
} catch (e) {
|
|
16
16
|
console.warn("加载cookie出错!");
|
|
17
17
|
}
|