公共方法

main
lihao 9 months ago
parent c47c0299c7
commit 4f2e4b37f2

@ -0,0 +1,108 @@
const app = getApp();
const utils = require("utils");
var addressInfo = {
/*--------查询收货地址列表-------*/
queryAddressList: function(succcess, fail) {
var item = {};
item.openId = wx.getStorageSync("openId")
var pointAddress = JSON.stringify(item)
var data = {
"pointAddress": pointAddress,
"method": "point.address.get",
};
var ignores = ["pointAddress"];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
var result = json.data;
succcess(json);
},
function(error) {
fail(error);
}
);
},
/*--------添加收货地址-------*/
addAddress: function(pointAddress, succcess, fail) {
var pointAddress = JSON.stringify(pointAddress)
var data = {
"pointAddress": pointAddress,
"method": "point.address.save",
};
var ignores = ["pointAddress"];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
var result = json.data;
succcess(json);
},
function(error) {
fail(error);
}
);
},
/*--------更新收货地址-------*/
updateAddress: function(pointAddress, succcess, fail) {
var pointAddress = JSON.stringify(pointAddress)
var data = {
"pointAddress": pointAddress,
"method": "point.address.update",
};
var ignores = ["pointAddress"];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
var result = json.data;
succcess(json);
},
function(error) {
fail(error);
}
);
},
/*--------删除收货地址-------*/
deleteAddress: function(pointAddress, succcess, fail) {
var pointAddress = JSON.stringify(pointAddress)
var data = {
"pointAddress": pointAddress,
"method": "point.address.delete",
};
var ignores = ["pointAddress"];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
var result = json.data;
succcess(json);
},
function(error) {
fail(error);
}
);
},
/*--------查询订单收货地址-------*/
queryConfirmOrderAddress: function(succcess, fail) {
var item = {};
item.openId = wx.getStorageSync("openId")
var pointAddress = JSON.stringify(item)
var data = {
"pointAddress": pointAddress,
"method": "get.point.confirm.order.address",
};
var ignores = ["pointAddress"];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
var result = json.data;
succcess(json);
},
function(error) {
fail(error);
}
);
}
}
module.exports = {
addressInfo: addressInfo
}

@ -0,0 +1,26 @@
const duration = 300;
const timingFun = "ease";
const width = 0;
var ani_width = function(duration,timingFunc,width){
if (undefined != duration){
this.duration = duration;
}
if (undefined != timingFun) {
this.timingFun = timingFun;
}
if (undefined != width) {
this.width = width;
}
var animation = wx.createAnimation({
duration: duration,
timingFunction: timingFunc
});
animation.width(width).step();
return animation.export();
}
module.exports = {
ani_width: ani_width
}

@ -0,0 +1,307 @@
var wxRequest = require('../utils/wxRequest');
var app=getApp();
var $ = {
extend: function (flag, p, c) {
var c = c || {};
for (var i in p) {
if (!p.hasOwnProperty(i)) {
continue;
}
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
},
each: function (object, callback, args) {
var name, i = 0,
length = object.length,
isObj = length === undefined || typeof object == 'function';
if (args) {
if (isObj) {
for (name in object) {
if (callback.apply(object[name], args) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.apply(object[i++], args) === false) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if (isObj) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.call(object[i], i, object[i++]) === false) {
break;
}
}
}
}
return object;
}
}
function sha1(x, blen) {
function add32(a, b) {
var lsw = (a & 0xFFFF) + (b & 0xFFFF);
var msw = (a >> 16) + (b >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function AA(a, b, c, d, e) {
b = (b >>> 27) | (b << 5);
var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF) + (e & 0xFFFF);
var msw = (a >> 16) + (b >> 16) + (c >> 16) + (d >> 16) + (e >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function RR(w, j) {
var n = w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16];
return (n >>> 31) | (n << 1);
}
var len = blen * 8;
x[len >> 5] |= 0x80 << (24 - len % 32);
x[((len + 64 >> 9) << 4) + 15] = len;
var w = new Array(80);
var k1 = 0x5A827999;
var k2 = 0x6ED9EBA1;
var k3 = 0x8F1BBCDC;
var k4 = 0xCA62C1D6;
var h0 = 0x67452301;
var h1 = 0xEFCDAB89;
var h2 = 0x98BADCFE;
var h3 = 0x10325476;
var h4 = 0xC3D2E1F0;
for (var i = 0; i < x.length; i += 16) {
var j = 0;
var t;
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
while (j < 16) {
w[j] = x[i + j];
t = AA(e, a, d ^ (b & (c ^ d)), w[j], k1);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 20) {
w[j] = RR(w, j);
t = AA(e, a, d ^ (b & (c ^ d)), w[j], k1);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 40) {
w[j] = RR(w, j);
t = AA(e, a, b ^ c ^ d, w[j], k2);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 60) {
w[j] = RR(w, j);
t = AA(e, a, (b & c) | (d & (b | c)), w[j], k3);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 80) {
w[j] = RR(w, j);
t = AA(e, a, b ^ c ^ d, w[j], k4);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
h0 = add32(h0, a);
h1 = add32(h1, b);
h2 = add32(h2, c);
h3 = add32(h3, d);
h4 = add32(h4, e);
}
return [h0, h1, h2, h3, h4];
}
var encoding = {
strToBe32s: function (str) {
var be = [];
var len = Math.floor(str.length / 4);
var i, j;
for (i = 0, j = 0; i < len; i++ , j += 4) {
be[i] = ((str.charCodeAt(j) & 0xff) << 24) | ((str.charCodeAt(j + 1) & 0xff) << 16) | ((str.charCodeAt(j + 2) & 0xff) << 8) | (str.charCodeAt(j + 3) & 0xff);
}
while (j < str.length) {
be[j >> 2] |= (str.charCodeAt(j) & 0xff) << (24 - (j * 8) % 32);
j++;
}
return be;
},
be32sToHex: function (be) {
var hex = '0123456789ABCDEF';
var str = '';
for (var i = 0; i < be.length * 4; i++) {
str += hex.charAt((be[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex.charAt((be[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
}
return str;
}
};
$.encoding = encoding;
var digests = {
hexSha1Str: function (str) {
return $.encoding.be32sToHex($.digests.sha1Str(str));
},
sha1Str: function (str) {
return sha1($.encoding.strToBe32s(str), str.length);
}
};
$.digests = digests;
var utils = {
inArray: function (needle, array, bool) {
if (typeof needle == "string" || typeof needle == "number") {
var len = array.length;
for (var i = 0; i < len; i++) {
if (needle === array[i]) {
if (bool) {
return i;
}
return true;
}
}
return false;
}
}
};
$.utils = utils;
var cardApi = {
sign: function (params, ignores) {
var timestamp = (new Date()).valueOf();
var openAppKey = app.globalData.memberAppKey;
var openAppSecret = app.globalData.memberAppSecret;
var appSecret = openAppSecret;
var defaults = {
appKey: openAppKey,
v: '1.0',
format: 'json',
locale: 'zh-CN',
client: 'weixin',
timestamp: timestamp
};
var options = $.extend(true, defaults, params);
var paramNames = [];
$.each(options, function (key, value) {
if (!$.utils.inArray(key, ignores, false)) {
paramNames.push(key);
}
});
paramNames = paramNames.sort();
var stringBuilder = [];
stringBuilder.push(appSecret);
$.each(paramNames, function (inx, value) {
stringBuilder.push(value);
stringBuilder.push(options[value]);
});
stringBuilder.push(appSecret);
options.sign = $.digests.hexSha1Str(stringBuilder.join(""));
return options;
},
ajax: function (params, ignores) {
var data = this.sign(params, ignores);
var app = getApp();
var url = app.globalData.memberUrl;
return wxRequest.postRequest(url, data);
},
ajax2: function (params, ignores) {
var data = this.sign(params, ignores);
var app = getApp();
var url = "http://127.0.0.1:8008/openApi/api";
return wxRequest.postRequest(url, data);
},
ajaxApi: function (params, ignores, success, error,urls) {
var data = this.sign(params, ignores);
var app = getApp();
var url="";
if(urls){
url =urls;
}else{
url = app.openApiParam.serverUrl
}
wx.request({
url: url,
method: 'POST',
data: data,
dataType: 'json',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (json) {
if (json.errorToken) {
if (typeof error == 'function') {
error.call(error, json);
}
} else {
if (typeof success == 'function') {
success.call(success, json);
}
}
},
fail: function () {
if (typeof error == 'function') {
var json = {
"errorToken": "@@$-ERROR_TOKEN$-@@",
"code": "0",
"message": "网络好像有问题,无法访问云端服务!",
"solution": "请检查本机网络是否能正常访问互联网",
"subErrors": ""
};
error.call(error, json);
}
}
});
}
}
module.exports = {
cardApi: cardApi
};

@ -0,0 +1,404 @@
var CHAR_TILDE = 126;
var CODE_FNC1 = 102;
var SET_STARTA = 103;
var SET_STARTB = 104;
var SET_STARTC = 105;
var SET_SHIFT = 98;
var SET_CODEA = 101;
var SET_CODEB = 100;
var SET_STOP = 106;
var REPLACE_CODES = {
CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard
}
var CODESET = {
ANY: 1,
AB: 2,
A: 3,
B: 4,
C: 5
};
function getBytes(str) {
var bytes = [];
for (var i = 0; i < str.length; i++) {
bytes.push(str.charCodeAt(i));
}
return bytes;
}
exports.code128 = function (ctx, text, width, height) {
width = parseInt(width);
height = parseInt(height);
var codes = stringToCode128(text);
console.debug('codes', codes)
var g = new Graphics(ctx, width, height);
var barWeight = g.area.width / ((codes.length - 3) * 11 + 35);
var x = g.area.left;
var y = g.area.top;
for (var i = 0; i < codes.length; i++) {
var c = codes[i];
//two bars at a time: 1 black and 1 white
for (var bar = 0; bar < 8; bar += 2) {
var barW = PATTERNS[c][bar] * barWeight;
// var barH = height - y - this.border;
var barH = height - y;
var spcW = PATTERNS[c][bar + 1] * barWeight;
//no need to draw if 0 width
if (barW > 0) {
g.fillFgRect(x, y, barW, barH);
}
x += barW + spcW;
}
}
ctx.draw();
}
function stringToCode128(text) {
var barc = {
currcs: CODESET.C
};
var bytes = getBytes(text);
//decide starting codeset
var index = bytes[0] == CHAR_TILDE ? 1 : 0;
var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
barc.currcs = getBestStartSet(csa1, csa2);
barc.currcs = perhapsCodeC(bytes, barc.currcs);
//if no codeset changes this will end up with bytes.length+3
//start, checksum and stop
var codes = new Array();
switch (barc.currcs) {
case CODESET.A:
codes.push(SET_STARTA);
break;
case CODESET.B:
codes.push(SET_STARTB);
break;
default:
codes.push(SET_STARTC);
break;
}
for (var i = 0; i < bytes.length; i++) {
var b1 = bytes[i]; //get the first of a pair
//should we translate/replace
if (b1 in REPLACE_CODES) {
codes.push(REPLACE_CODES[b1]);
i++ //jump to next
b1 = bytes[i];
}
//get the next in the pair if possible
var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;
codes = codes.concat(codesForChar(b1, b2, barc.currcs));
//code C takes 2 chars each time
if (barc.currcs == CODESET.C) i++;
}
//calculate checksum according to Code 128 standards
var checksum = codes[0];
for (var weight = 1; weight < codes.length; weight++) {
checksum += (weight * codes[weight]);
}
codes.push(checksum % 103);
codes.push(SET_STOP);
//encoding should now be complete
return codes;
function getBestStartSet(csa1, csa2) {
//tries to figure out the best codeset
//to start with to get the most compact code
var vote = 0;
vote += csa1 == CODESET.A ? 1 : 0;
vote += csa1 == CODESET.B ? -1 : 0;
vote += csa2 == CODESET.A ? 1 : 0;
vote += csa2 == CODESET.B ? -1 : 0;
//tie goes to B due to my own predudices
return vote > 0 ? CODESET.A : CODESET.B;
}
function perhapsCodeC(bytes, codeset) {
for (var i = 0; i < bytes.length; i++) {
var b = bytes[i]
if ((b < 48 || b > 57) && b != CHAR_TILDE)
return codeset;
}
if (bytes.length % 2 == 0)
return CODESET.C;
else
return CODESET.A;
}
//chr1 is current byte
//chr2 is the next byte to process. looks ahead.
function codesForChar(chr1, chr2, currcs) {
var result = [];
var shifter = -1;
if (charCompatible(chr1, currcs)) {
if (currcs == CODESET.C) {
if (chr2 == -1) {
shifter = SET_CODEB;
currcs = CODESET.B;
}
else if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
//need to check ahead as well
if (charCompatible(chr2, CODESET.A)) {
shifter = SET_CODEA;
currcs = CODESET.A;
}
else {
shifter = SET_CODEB;
currcs = CODESET.B;
}
}
}
}
else {
//if there is a next char AND that next char is also not compatible
if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
//need to switch code sets
switch (currcs) {
case CODESET.A:
shifter = SET_CODEB;
currcs = CODESET.B;
break;
case CODESET.B:
shifter = SET_CODEA;
currcs = CODESET.A;
break;
}
}
else {
//no need to shift code sets, a temporary SHIFT will suffice
shifter = SET_SHIFT;
}
}
//ok some type of shift is nessecary
if (shifter != -1) {
result.push(shifter);
result.push(codeValue(chr2));
}
else {
if (currcs == CODESET.C) {
//include next as well
result.push(codeValue(chr1, chr2));
}
else {
result.push(codeValue(chr1));
}
}
barc.currcs = currcs;
return result;
}
}
//reduce the ascii code to fit into the Code128 char table
function codeValue(chr1, chr2) {
if (typeof chr2 == "undefined") {
return chr1 >= 32 ? chr1 - 32 : chr1 + 64;
}
else {
return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2));
}
}
function charCompatible(chr, codeset) {
var csa = codeSetAllowedFor(chr);
if (csa == CODESET.ANY) return true;
//if we need to change from current
if (csa == CODESET.AB) return true;
if (csa == CODESET.A && codeset == CODESET.A) return true;
if (csa == CODESET.B && codeset == CODESET.B) return true;
return false;
}
function codeSetAllowedFor(chr) {
if (chr >= 48 && chr <= 57) {
//0-9
return CODESET.ANY;
}
else if (chr >= 32 && chr <= 95) {
//0-9 A-Z
return CODESET.AB;
}
else {
//if non printable
return chr < 32 ? CODESET.A : CODESET.B;
}
}
var Graphics = function (ctx, width, height) {
this.width = width;
this.height = height;
this.quiet = Math.round(this.width / 40);
this.border_size = 0;
this.padding_width = 0;
this.area = {
width: width - this.padding_width * 2 - this.quiet * 2,
height: height - this.border_size * 2,
top: this.border_size - 4,
left: this.padding_width + this.quiet
};
this.ctx = ctx;
this.fg = "#000000";
this.bg = "#ffffff";
// fill background
this.fillBgRect(0, 0, width, height);
// fill center to create border
this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);
}
//use native color
Graphics.prototype._fillRect = function (x, y, width, height, color) {
this.ctx.setFillStyle(color)
this.ctx.fillRect(x, y, width, height)
}
Graphics.prototype.fillFgRect = function (x, y, width, height) {
this._fillRect(x, y, width, height, this.fg);
}
Graphics.prototype.fillBgRect = function (x, y, width, height) {
this._fillRect(x, y, width, height, this.bg);
}
var PATTERNS = [
[2, 1, 2, 2, 2, 2, 0, 0], // 0
[2, 2, 2, 1, 2, 2, 0, 0], // 1
[2, 2, 2, 2, 2, 1, 0, 0], // 2
[1, 2, 1, 2, 2, 3, 0, 0], // 3
[1, 2, 1, 3, 2, 2, 0, 0], // 4
[1, 3, 1, 2, 2, 2, 0, 0], // 5
[1, 2, 2, 2, 1, 3, 0, 0], // 6
[1, 2, 2, 3, 1, 2, 0, 0], // 7
[1, 3, 2, 2, 1, 2, 0, 0], // 8
[2, 2, 1, 2, 1, 3, 0, 0], // 9
[2, 2, 1, 3, 1, 2, 0, 0], // 10
[2, 3, 1, 2, 1, 2, 0, 0], // 11
[1, 1, 2, 2, 3, 2, 0, 0], // 12
[1, 2, 2, 1, 3, 2, 0, 0], // 13
[1, 2, 2, 2, 3, 1, 0, 0], // 14
[1, 1, 3, 2, 2, 2, 0, 0], // 15
[1, 2, 3, 1, 2, 2, 0, 0], // 16
[1, 2, 3, 2, 2, 1, 0, 0], // 17
[2, 2, 3, 2, 1, 1, 0, 0], // 18
[2, 2, 1, 1, 3, 2, 0, 0], // 19
[2, 2, 1, 2, 3, 1, 0, 0], // 20
[2, 1, 3, 2, 1, 2, 0, 0], // 21
[2, 2, 3, 1, 1, 2, 0, 0], // 22
[3, 1, 2, 1, 3, 1, 0, 0], // 23
[3, 1, 1, 2, 2, 2, 0, 0], // 24
[3, 2, 1, 1, 2, 2, 0, 0], // 25
[3, 2, 1, 2, 2, 1, 0, 0], // 26
[3, 1, 2, 2, 1, 2, 0, 0], // 27
[3, 2, 2, 1, 1, 2, 0, 0], // 28
[3, 2, 2, 2, 1, 1, 0, 0], // 29
[2, 1, 2, 1, 2, 3, 0, 0], // 30
[2, 1, 2, 3, 2, 1, 0, 0], // 31
[2, 3, 2, 1, 2, 1, 0, 0], // 32
[1, 1, 1, 3, 2, 3, 0, 0], // 33
[1, 3, 1, 1, 2, 3, 0, 0], // 34
[1, 3, 1, 3, 2, 1, 0, 0], // 35
[1, 1, 2, 3, 1, 3, 0, 0], // 36
[1, 3, 2, 1, 1, 3, 0, 0], // 37
[1, 3, 2, 3, 1, 1, 0, 0], // 38
[2, 1, 1, 3, 1, 3, 0, 0], // 39
[2, 3, 1, 1, 1, 3, 0, 0], // 40
[2, 3, 1, 3, 1, 1, 0, 0], // 41
[1, 1, 2, 1, 3, 3, 0, 0], // 42
[1, 1, 2, 3, 3, 1, 0, 0], // 43
[1, 3, 2, 1, 3, 1, 0, 0], // 44
[1, 1, 3, 1, 2, 3, 0, 0], // 45
[1, 1, 3, 3, 2, 1, 0, 0], // 46
[1, 3, 3, 1, 2, 1, 0, 0], // 47
[3, 1, 3, 1, 2, 1, 0, 0], // 48
[2, 1, 1, 3, 3, 1, 0, 0], // 49
[2, 3, 1, 1, 3, 1, 0, 0], // 50
[2, 1, 3, 1, 1, 3, 0, 0], // 51
[2, 1, 3, 3, 1, 1, 0, 0], // 52
[2, 1, 3, 1, 3, 1, 0, 0], // 53
[3, 1, 1, 1, 2, 3, 0, 0], // 54
[3, 1, 1, 3, 2, 1, 0, 0], // 55
[3, 3, 1, 1, 2, 1, 0, 0], // 56
[3, 1, 2, 1, 1, 3, 0, 0], // 57
[3, 1, 2, 3, 1, 1, 0, 0], // 58
[3, 3, 2, 1, 1, 1, 0, 0], // 59
[3, 1, 4, 1, 1, 1, 0, 0], // 60
[2, 2, 1, 4, 1, 1, 0, 0], // 61
[4, 3, 1, 1, 1, 1, 0, 0], // 62
[1, 1, 1, 2, 2, 4, 0, 0], // 63
[1, 1, 1, 4, 2, 2, 0, 0], // 64
[1, 2, 1, 1, 2, 4, 0, 0], // 65
[1, 2, 1, 4, 2, 1, 0, 0], // 66
[1, 4, 1, 1, 2, 2, 0, 0], // 67
[1, 4, 1, 2, 2, 1, 0, 0], // 68
[1, 1, 2, 2, 1, 4, 0, 0], // 69
[1, 1, 2, 4, 1, 2, 0, 0], // 70
[1, 2, 2, 1, 1, 4, 0, 0], // 71
[1, 2, 2, 4, 1, 1, 0, 0], // 72
[1, 4, 2, 1, 1, 2, 0, 0], // 73
[1, 4, 2, 2, 1, 1, 0, 0], // 74
[2, 4, 1, 2, 1, 1, 0, 0], // 75
[2, 2, 1, 1, 1, 4, 0, 0], // 76
[4, 1, 3, 1, 1, 1, 0, 0], // 77
[2, 4, 1, 1, 1, 2, 0, 0], // 78
[1, 3, 4, 1, 1, 1, 0, 0], // 79
[1, 1, 1, 2, 4, 2, 0, 0], // 80
[1, 2, 1, 1, 4, 2, 0, 0], // 81
[1, 2, 1, 2, 4, 1, 0, 0], // 82
[1, 1, 4, 2, 1, 2, 0, 0], // 83
[1, 2, 4, 1, 1, 2, 0, 0], // 84
[1, 2, 4, 2, 1, 1, 0, 0], // 85
[4, 1, 1, 2, 1, 2, 0, 0], // 86
[4, 2, 1, 1, 1, 2, 0, 0], // 87
[4, 2, 1, 2, 1, 1, 0, 0], // 88
[2, 1, 2, 1, 4, 1, 0, 0], // 89
[2, 1, 4, 1, 2, 1, 0, 0], // 90
[4, 1, 2, 1, 2, 1, 0, 0], // 91
[1, 1, 1, 1, 4, 3, 0, 0], // 92
[1, 1, 1, 3, 4, 1, 0, 0], // 93
[1, 3, 1, 1, 4, 1, 0, 0], // 94
[1, 1, 4, 1, 1, 3, 0, 0], // 95
[1, 1, 4, 3, 1, 1, 0, 0], // 96
[4, 1, 1, 1, 1, 3, 0, 0], // 97
[4, 1, 1, 3, 1, 1, 0, 0], // 98
[1, 1, 3, 1, 4, 1, 0, 0], // 99
[1, 1, 4, 1, 3, 1, 0, 0], // 100
[3, 1, 1, 1, 4, 1, 0, 0], // 101
[4, 1, 1, 1, 3, 1, 0, 0], // 102
[2, 1, 1, 4, 1, 2, 0, 0], // 103
[2, 1, 1, 2, 1, 4, 0, 0], // 104
[2, 1, 1, 2, 3, 2, 0, 0], // 105
[2, 3, 3, 1, 1, 1, 2, 0] // 106
]

@ -0,0 +1,685 @@
const app = getApp();
const utils = require("utils");
/**
* 检测会员信息
*/
var checkMemberInfo = function(params, ignores, succcess, fail) {
app.jsapi.memberApi(app.globalData.appMemberKey, app.globalData.appMemberSecret, app.globalData.serverMemberUrl).ajax(params, ignores,
function(json) {
var result = json.data;
succcess(json);
},
function(error) {
fail(error);
}
);
}
var cardGoodsDetails = function(goods) {
var arr = [];
goods = JSON.parse(goods);
for (var i = 0; i < goods.length; i++) {
var item = goods[i];
var map = {};
map.goodsId = item.productNo; // 商品编码
map.name = item.goodsName; // 商品名称
map.spec = item.specName; // 商品规格
map.quantity = item.count; // 数量
map.price = item.price; // 单价
map.discountMoney = item.discountTotal; // 优惠金额
map.money = item.amountTotal; // 金额
arr.push(map);
}
return JSON.stringify(arr);
}
var cardMoney = function(money) {
return parseInt(parseFloat(money) * 100);
}
/**
* cardInfo 会员卡信息
* prepayment 预支付编码
* amount 刷卡金额(精确到分)
*/
var getCardPayInfo = function(cardInfo, prepayment, amount, passwd) {
var arr = [];
var info = {};
info.prepayment = prepayment;
info.cardNo = cardInfo.cardNo;
info.amount = amount;
info.isNoPwd = 1;
info.passwd = passwd;
arr.push(info);
console.log(info);
return JSON.stringify(arr);
}
/**
*
*/
var getPays = function(money) {
var arr = [];
var pays = {};
pays.payTypeNo = "02";
pays.payType = "会员卡";
pays.money = money;
arr.push(pays);
return JSON.stringify(arr);
}
/**
* 充值方案
*/
var WxRechargeScheme = function(success, fail) {
var params = {
"wid": app.globalData.memberWid,
'method': 'weixin.recharge.scheme'
}
console.log(params);
var ignores = [];
//
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(params, ignores,
function(json) {
var result = json.data;
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 获取手机号
*/
var wx_getPhoneNumber = function(iv, data, success, fail) {
wx.request({
url: app.globalData.serverUrlExtend,
method: "post",
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
"type": "wxdcgetphone",
"iv": iv,
"loginKey": wx.getStorageSync("loginKey"),
"encryptedData": data
},
success: function(res) {
success(res);
},
fail: function(res) {
fail(res);
}
});
}
/**
* 查询优惠券信息
*/
var queryStoreCouponsList = function(params, success, fail) {
params.method = "elec.coupon.query";
params.workerNo = app.workerNo;
params.sourceSign = app.sourceSign;
var ignores = [];
app.jsapi.memberApi(app.globalData.appMemberKey, app.globalData.appMemberSecret, app.globalData.serverMemberUrl).ajax(params, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 查询优惠券信息
*/
var queryGroupCouponsList = function(params, success, fail) {
params.method = "elec.coupon.query";
params.workerNo = app.globalData.workerNo;
params.sourceSign = app.sourceSign;
var ignores = [];
// app.globalData.memberUrl
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret,app.globalData.memberUrl).ajax(params, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 查询会员信息
*/
var wx_cardInfo = function(cardNo, success, fail) {
var params = {
"method": "card.info",
"cardNo": cardNo,
"shopNo": app.globalData.shopNo,
"posNo": app.globalData.posNo,
}
var ignores = [];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(params, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 优惠券名称
*/
var getCouponsName = function(cardType) {
return cardType == "CASH" ? "代金券" : cardType == "DISCOUNT" ? "折扣券" : cardType == "GIFT" ? "兑换券" : "";
}
/**
* 价值
*/
var getCardWorth = function(cardType, reduceCost, discount) {
return cardType == "CASH" ? (reduceCost / 100 + "元") : cardType == "DISCOUNT" ? discount : "";
}
/**
* 价值
*/
var getCardWorthInfo = function(cardType, reduceCost, discount) {
return cardType == "CASH" ? ("¥" + reduceCost) : cardType == "DISCOUNT" ? (discount + "折") : "兑换券";
}
/*--------随机字符串-------*/
function randomString() {
var randomString = "";
for (var i = 1; i <= 5; i++) {
randomString += parseInt(Math.random() * 10);
}
return randomString;
}
/*--------自动生成会员订单号-------*/
function getTradeNo() {
console.log("-----------------");
return app.globalData.shopNo + utils.getFormatTime(new Date(), 2) + this.randomString();
}
/*--------领券中心-------*/
var couponCenter = function couponCenter(couponType, type, success, fail) {
var data = {
'groupNo': app.globalData.groupNo,
'wid': app.globalData.memberWid,
'memberId': wx.getStorageSync("memberId"),
'type': type,
'useFlag': 0,
'method': 'query.coupon.exchange.schemes'
}
if (couponType) {
data.couponType = couponType
}
var ignores = [];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/*--------免费领取优惠券接口-------*/
var exchangeCouponScheme = function(schemeId, success, fail) {
var data = {
'schemeId': schemeId,
'memberId': wx.getStorageSync("memberId"),
'number': 1,
'openId': wx.getStorageSync("openId"),
'shopNo': app.globalData.shopNo,
'posNo': app.globalData.posNo,
'workerNo': app.globalData.workerNo,
'sourceSign': app.globalData.sourceSign,
'method': 'elec.coupon.exchange'
}
var ignores = [];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/*--------发送fromid后台给用户推送消息-------*/
var sendTemPlate = function(type, fromId, couponId, success, fail) {
var data = {};
if (couponId) {
data = {
'openId': wx.getStorageSync('openId'),
'formId': fromId,
'wid': app.globalData.memberWid,
'sendType': type,
'method': 'get.smweixin.formId',
'couponId': couponId,
'memberId': wx.getStorageSync('memberId')
}
} else {
data = {
'openId': wx.getStorageSync('openId'),
'formId': fromId,
'wid': app.globalData.memberWid,
'sendType': type,
'method': 'get.smweixin.formId',
'memberId': wx.getStorageSync('memberId')
}
}
var ignores = [];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/*--------查询积分商品列表-------*/
var pointProduct = function(type, success, fail) {
var data = {
"wid": app.globalData.memberWid,
"method": "query.point.product.list",
"pageType": type
};
var ignores = [];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/*--------查询积分商品详情-------*/
var queryPointProductDetail = function(id, schemeId, success, fail) {
var data = {
"method": "query.point.product.detail",
"productId": id,
"schemeId": schemeId
};
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/*--------查询积分所有商品-------*/
var pointAllTypeProduct = function(success, fail) {
var data = {
"wid": app.globalData.memberWid,
"method": "query.point.product.noPageType",
};
var ignores = [];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 小程序优惠活动弹窗
*/
var judgeUpWindown = function(success, fail,type) {
var data = {
'openId': wx.getStorageSync("openId"),
'wid': app.globalData.memberWid,
'memberId': wx.getStorageSync("memberId"),
'method': 'query.upWindow.coupon.list',
'type': app.temData.type
}
if (type) {
data.type = type
}
// app.globalData.memberUrl
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 小程序弹窗一键领取
*/
var receive = function(schemeId, success, fail) {
var data = {
'cardNo': wx.getStorageSync("cardInfo").cardNo,
'wid': app.globalData.memberWid,
'memberId': wx.getStorageSync("memberId"),
'method': 'elec.promotion.packet.receive',
'schemeId': schemeId,
'sourceSign': "wechat"
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 关闭弹窗
*/
var closeUpWindow = function(schemeId, success, fail) {
var data = {
'cardNo': wx.getStorageSync("cardInfo").cardNo,
'wid': app.globalData.memberWid,
'memberId': wx.getStorageSync("memberId"),
'method': 'elec.promotion.packet.unreceive',
'schemeId': schemeId,
'sourceSign': "wechat"
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 会员分享规则详情
*/
var memberShareRule = function(success, fail) {
var data = {
'shopNo': app.globalData.shopNo,
'posNo': app.globalData.posNo,
'method': 'pro.share.member.info',
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/*
会员活动 大转盘
*/
var memberActivity = function(success, fail) {
var data = {
'groupId': app.globalData.groupId,
'method': 'pro.activity.list',
}
//app.globalData.memberUrl
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl ).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/*
会员活动 大转盘 抽奖
*/
var memberActivityLuckyDraw = function(activityId, success, fail) {
var data = {
'wid': app.globalData.memberWid,
"memberId": wx.getStorageSync("memberId"),
"activityId": activityId,
"shopNo": app.globalData.shopNo,
"postNo": app.globalData.posNo,
"workerNo": app.globalData.workerNo,
"sourceSign": app.sourceSign,
"mobile": wx.getStorageSync("cardInfo").mobile,
"cardNo": wx.getStorageSync("cardInfo").cardNo,
'method': 'member.activity.lucky.draw',
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 会员营销活动记录
*/
var memberActivityRecorde = function(success, fail) {
var data = {
'memberId': wx.getStorageSync("memberId"),
'method': 'member.activity.record',
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 会员营销活动记录
*/
var memberActivityJoinNumber = function(activityId, success, fail) {
var data = {
'memberId': wx.getStorageSync("memberId"),
'method': 'pro.activity.join.number',
'activityId': activityId
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 查询邀请好友活动
*/
var getInvitationFriend = function(success, fail) {
var data = {
'method': 'pro.share.member.info',
"shopNo": app.globalData.shopNo,
"posNo": app.globalData.posNo,
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 邀请好友 好友注册发送邀请人奖品
*/
var sendGift = function (success, fail) {
var data = {
'method': 'pro.activity.share.new',
'activityId': app.temData.activityId,
'wid': app.globalData.memberWid,
'memberId': app.temData.fromMemberId,
'sourceSign': app.sourceSign,
'toMemberId': wx.getStorageSync("memberId"),
"shopNo": app.globalData.shopNo,
"posNo": app.globalData.posNo,
'workerNo': app.globalData.workerNo,
'openId': app.temData.openId,
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function (json) {
success(json);
},
function (error) {
fail(error);
}
);
}
/**
* 查看我邀请的好友人数
*/
var getSendGiftNumber = function (activityId,success, fail) {
var data = {
'method': 'pro.activity.share.number',
'activityId': activityId,
'wid': app.globalData.memberWid,
'memberId': wx.getStorageSync("memberId"),
}
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(data, [],
function (json) {
success(json);
},
function (error) {
fail(error);
}
);
}
/**
* 根据openId查询用户信息
*/
var getMemberInfoByOpenId = function(success, fail) {
var params = {
"method": "small.weixin.member.info.wid1",
"wid": app.globalData.memberWid,
"openId": app.openId,
};
var ignores = ["openId", "nickName", "gender", "avatarUrl", "country", "province", "city"];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(params, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 查询优惠券适用门店数量
*/
var getCouponApplyShopNum = function(couponId,longitude,latitude,success,fail) {
var params = {
'couponId': couponId,
'pageNum': 1,
'pageSize': 1,
'property': "",
'keyword': "",
'longitude': longitude,
'latitude': latitude,
'method': 'elec.coupon.shops.distance'
};
var ignores = ['property', 'keyword'];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(params, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
/**
* 查询优惠券适用门店数量
*/
var getCouponApplyShop = function(couponId,pageNum,pageSize,longitude,latitude,name,value,success,fail) {
var params = {
'couponId': couponId,
'pageNum': pageNum,
'pageSize': pageSize,
'property':name,
'keyword': value,
'longitude': longitude,
'latitude': latitude,
'method': 'elec.coupon.shops.distance'
};
var ignores = ['property', 'keyword'];
app.jsapi.memberApi(app.globalData.memberAppKey, app.globalData.memberAppSecret, app.globalData.memberUrl).ajax(params, ignores,
function(json) {
success(json);
},
function(error) {
fail(error);
}
);
}
module.exports = {
checkMemberInfo: checkMemberInfo,
cardGoodsDetails: cardGoodsDetails,
cardMoney: cardMoney,
getCardPayInfo: getCardPayInfo,
getPays: getPays,
WxRechargeScheme: WxRechargeScheme,
getTradeNo: getTradeNo,
randomString: randomString,
queryGroupCouponsList: queryGroupCouponsList,
getCouponsName: getCouponsName,
getCardWorth: getCardWorth,
getCardWorthInfo: getCardWorthInfo,
wx_getPhoneNumber: wx_getPhoneNumber,
wx_cardInfo: wx_cardInfo,
couponCenter: couponCenter,
exchangeCouponScheme: exchangeCouponScheme,
sendTemPlate: sendTemPlate,
pointProduct: pointProduct,
queryPointProductDetail: queryPointProductDetail,
judgeUpWindown: judgeUpWindown,
receive: receive,
closeUpWindow: closeUpWindow,
pointAllTypeProduct: pointAllTypeProduct,
memberShareRule: memberShareRule,
memberActivity: memberActivity,
memberActivityLuckyDraw: memberActivityLuckyDraw,
memberActivityRecorde: memberActivityRecorde,
memberActivityJoinNumber: memberActivityJoinNumber,
getInvitationFriend: getInvitationFriend,
sendGift: sendGift,
getSendGiftNumber: getSendGiftNumber,
getMemberInfoByOpenId:getMemberInfoByOpenId,
getCouponApplyShop:getCouponApplyShop,
getCouponApplyShopNum:getCouponApplyShopNum
// getMemberExtend: getMemberExtend
}

@ -0,0 +1,116 @@
var cartUtils = {};
var app = {};
var init = function (app,cartUtils){
this.app = app;
this.cartUtils = cartUtils;
}
/**
* 加入购物车
*/
var addToCart = function (goods, num) {
var suiltData = {};
if (goods.suitFlag == 1){
suiltData = processSuitData(this.app,goods, num);
}
var options = {
boxPrice: goods.boxPrice,
uniqueId: goods.uniqueId,
productId: goods.productId,
productNo: goods.productNo,
unitId: goods.unitId,
categoryId: goods.categoryId,
goodsId: goods.goodsId,
goodsName: goods.name,
specId: goods.specId,
specName: goods.specName,
makeCount: undefined == goods.makeCount ? 0 : goods.makeCount,
price: goods.price,
memberPrice: goods.memberPrice,
makeId: undefined == goods.makeId ? "" : goods.makeId,
makeName: undefined == goods.makeName ? "" : goods.makeName,
makePrice: undefined == goods.makePrice ? "" : goods.makePrice,
makeAmount: undefined == goods.makeAmount ? 0 : goods.makeAmount,
num: num,
isSuit: goods.suitFlag == 1 ?true:false,
addAmount: undefined == suiltData.addAmount ? 0 : suiltData.addAmount,
suitDetails: undefined == suiltData.suitDetails ? [] : suiltData.suitDetails
}
// 商品压入购物车
this.cartUtils.putCartMap(options);
};
/**
* 处理套餐商品加入购物车
*/
function processSuitData(app,goods,num){
var suiltData = {};
var suitDetails = [];
goods.suitList.forEach(function (group, ginx) {
// 获取已选中套餐明细
group.detail.forEach(function (item, inx) {
if (item.select) {
var suitItem = {
goodsId: item.id,
name: item.productName,
productId: item.productId,
productNo: item.productNo,
categoryId: item.categoryId,
specId: item.specId,
specName: item.specName,
unitId: item.unitId,
num: item.num,
quantity:item.quantity,
price: item.price,
addPrice: item.addPrice,
memberPrice: item.memberPrice,
makeId: item.makeId,
makeName: item.makeName,
makePrice: item.makePrice,
makeAmount: item.makeAmount,
}
suitDetails.push(suitItem);
}
});
});
suiltData.addAmount = goods.addAmount;
suiltData.suitDetails = suitDetails;
return suiltData;
};
/**
* 从购物车中减去商品数量
*/
var addNumberByCart = function (uniqueId) {
var specMap = this.cartUtils.getSpecMapByCart();
if (undefined != specMap[uniqueId]) {
var specGoods = specMap[uniqueId];
var num = this.app.utils.numAdd(specGoods.num, 1);
this.addToCart(specGoods, num);
}
};
/**
* 从购物车中减去商品数量
*/
var decNumberByCart = function (uniqueId) {
var specMap = this.cartUtils.getSpecMapByCart();
if (undefined != specMap[uniqueId]) {
var specGoods = specMap[uniqueId];
var num = 0;
if (specGoods.num > 0) {
num = this.app.utils.numSub(specGoods.num, 1);
}
this.addToCart(specGoods, num);
}
};
module.exports = {
init: init,
addToCart: addToCart,
addNumberByCart: addNumberByCart,
decNumberByCart: decNumberByCart
}

@ -0,0 +1,95 @@
/**
* 外卖计算餐盒费
*/
var getBoxFee = function(order) {
var boxFee = 0.0;
if (order) {
for (var key in order.dishes) {
var dish = order.dishes[key];
if (!dish.isSuit) { // 非套餐模式计算餐盒费
if (dish.boxPrice) {
boxFee = parseFloat(boxFee + dish.boxPrice * dish.num);
}
} else { // 套餐模式计算餐盒费
console.log(dish);
var specs = dish.specs;
for (var ckey in specs) {
var cValues = specs[ckey];
var suitDetails = cValues.suitDetails;
for (var i = 0; i < suitDetails.length; i++) {
var tDetail = suitDetails[i];
if (tDetail.boxPrice) {
boxFee = parseFloat(boxFee + dish.boxPrice * dish.num);
}
}
}
}
}
}
return boxFee.toFixed(2);
}
/**
* 外卖计算配送费
*/
var getDeliverFee = function(store) {
var deliverFee = 0.0;
if (store) {
if (store.deliverFee) {
deliverFee = store.deliverFee;
}
}
return deliverFee.toFixed(2);
}
/**
* 订单封装增加餐盒费配送费
*/
var getTotal = function(order) {
var total = 0.0;
var memberAmount = 0.0;
for (var key in order.dishes) {
var dish = order.dishes[key];
total = total + dish.amount;
console.log("订单总金额:", dish);
memberAmount = memberAmount + dish.memberAmount;
}
console.log("订单总金额:", total);
if (order.busMode == 1) { // 外带
total = total + parseFloat(order.boxFee);
memberAmount = memberAmount + parseFloat(order.boxFee);
} else if (order.busMode == 2) { // 外卖
total = total + parseFloat(order.boxFee) + parseFloat(order.distributionFee);
memberAmount = memberAmount + parseFloat(order.boxFee) + parseFloat(order.distributionFee);
}
console.log("订单总金额:", total);
order.totalCash = parseFloat(total).toFixed(2);
order.totalMemberCash = parseFloat(memberAmount).toFixed(2);
}
/**
* 规则
*/
var getDefaultOrderTicket = function() {
var orderTicket = {};
orderTicket.sumCount = 0;
orderTicket.sumMoney = 0;
orderTicket.storeName = "";
orderTicket.storeId = "";
orderTicket.storeNo = "";
orderTicket.people = 1;
orderTicket.ext2 = "";
orderTicket.discount = 0;
orderTicket.openId = wx.getStorageSync("openId");
orderTicket.orderList = [];
return orderTicket;
}
module.exports = {
getBoxFee: getBoxFee,
getDeliverFee: getDeliverFee,
getTotal: getTotal,
getDefaultOrderTicket: getDefaultOrderTicket
}

@ -0,0 +1,556 @@
// /***
// * 购物车js
// * 使用storage 存放购物车商品信息
// */
// const app = getApp();
// const utils = require("utils");
// var digits = 2; // 小数位数
// var storeKey = "store";
// var cartKey = "cartKey";
// var loadedDishKey = "currentLoadedDishs";
// var tableKey = "tableKey";
// /* 获取当前操作门店 */
// var getStore = function() {
// return wx.getStorageSync(storeKey);
// };
// /* 压入当前操作门店 */
// var setStore = function(options) {
// wx.setStorageSync(storeKey, options);
// };
// /* 获取当前桌号 */
// var getTable = function() {
// return wx.getStorageSync(storeKey);
// };
// /* 压入当前桌号 */
// var setTable = function(options) {
// wx.setStorageSync(tableKey, options);
// };
// /* 获取对应门店购物车数据 */
// var getStoreCartMap = function(options) {
// var storeId = getStore().id;
// var cartMap = getCartMap();
// if (null != cartMap && undefined != cartMap && cartMap != "") {
// return cartMap[storeId];
// } else {
// cartMap = {};
// setStoreCartMap(cartMap);
// return cartMap;
// }
// };
// /* 压入对应门店购物车数据 */
// var setStoreCartMap = function(option) {
// var storeId = getStore().id;
// var storeCartMap = option.storeCartMap;
// var cartMap = getCartMap();
// if (cartMap == null || cartMap == undefined || cartMap == "") {
// cartMap = new Object();
// }
// cartMap[storeId] = storeCartMap;
// setCartMap(cartMap);
// return true;
// };
// /* 压入购物车数据 并返回当前购物车数据*/
// var setCartMap = function(cartMap) {
// wx.setStorageSync(cartKey, cartMap);
// return getCartMap();
// };
// /* 获取购物车数据 */
// var getCartMap = function() {
// var cartMap = wx.getStorageSync(cartKey);
// if (null == cartMap || undefined == cartMap || cartMap == "") {
// cartMap = {};
// }
// return cartMap;
// };
// /* 压入购物车门店数据 */
// var putCartMap = function(options) {
// var store = getStore();
// var storeId = store.id;
// var boxPrice = options.boxPrice;
// var uniqueId = options.uniqueId; // 规格商品Id+做法Id
// var productId = options.productId;
// var productNo = options.productNo;
// var goodsId = options.goodsId; // 商品Id
// var goodsName = options.goodsName;
// var unitId = options.unitId;
// var categoryId = options.categoryId;
// var price = options.price;
// var memberPrice = options.memberPrice;
// var num = options.num;
// var specId = options.specId == undefined ? '' : options.specId; // 规格Id
// var specName = options.specName == undefined ? '' : options.specName; // 规格名称
// var makeId = options.makeId == undefined ? '' : options.makeId;
// var makeName = options.makeName == undefined ? '' : options.makeName;
// var makePrice = options.makePrice == undefined ? '' : options.makePrice;
// var makeAmount = options.makeAmount == undefined ? 0 : options.makeAmount;
// var addAmount = options.addAmount == undefined ? 0 : options.addAmount; // 套餐加价
// var isSuit = options.isSuit; // true 套餐商品、非套餐商品
// var suitDetails = options.suitDetails;
// var cartMap = getCartMap();
// if (cartMap != null) {
// var storeCartMap = this.getStoreCartMap({
// storeId: storeId
// });
// if (utils.isBlank(storeCartMap)) {
// storeCartMap = new Object();
// storeCartMap.totalCash = 0;
// storeCartMap.totalNum = 0;
// storeCartMap.categories = {};
// storeCartMap.createTime = (new Date()).valueOf();
// }
// var dishes = storeCartMap.dishes;
// if (utils.isBlank(dishes)) {
// dishes = new Object();
// }
// var dishObject = dishes[productId];
// if (utils.isNotBlank(dishObject)) {
// var specs = dishObject.specs;
// var specObject = {};
// if (num <= 0) {
// specObject = undefined;
// } else {
// specObject = specs[uniqueId];
// if (utils.isNotBlank(specObject)) {
// specObject.num = num;
// } else {
// specObject = new Object();
// specObject.categoryId = categoryId;
// specObject.productId = productId;
// specObject.productNo = productNo;
// specObject.unitId = unitId;
// specObject.goodsId = goodsId;
// specObject.name = goodsName;
// specObject.specId = specId;
// specObject.specName = specName;
// // specObject.makeCount = makeCount;
// specObject.num = num;
// specObject.price = price;
// specObject.memberPrice = memberPrice;
// //做法信息
// specObject.makeId = makeId;
// specObject.makeName = makeName;
// specObject.makePrice = makePrice;
// specObject.makeAmount = makeAmount;
// specObject.suitDetails = suitDetails;
// specObject.isSuit = isSuit;
// specObject.uniqueId = uniqueId;
// specObject.addAmount = addAmount;
// }
// }
// specs[uniqueId] = specObject;
// dishObject.specs = specs;
// } else {
// // 购物车中不存在此菜品 新增dish和下属spec
// var amount = utils.numMulti(num, price);
// var memberAmount = utils.numMulti(num, memberPrice);
// dishObject = new Object();
// dishObject.name = goodsName;
// dishObject.isSuit = isSuit;
// dishObject.addAmount = addAmount;
// dishObject.totalPrice = amount;
// dishObject.totalMemberPrice = memberAmount;
// dishObject.totalMakeAmount = makeAmount;
// dishObject.amount = utils.numAdd(utils.numAdd(dishObject.totalPrice, dishObject.totalMakeAmount), addAmount);
// var specs = new Object();
// var specObject = new Object();
// specObject.categoryId = categoryId;
// specObject.productId = productId;
// specObject.productNo = productNo;
// specObject.unitId = unitId;
// specObject.goodsId = goodsId;
// specObject.name = goodsName;
// specObject.specId = specId;
// specObject.specName = specName;
// // specObject.makeCount = makeCount;
// specObject.num = num;
// specObject.price = Number(price).toFixed(2);
// specObject.memberPrice = Number(memberPrice).toFixed(2);
// specObject.makeId = makeId;
// specObject.makeName = makeName;
// specObject.makePrice = makePrice;
// specObject.makeAmount = makeAmount;
// specObject.suitDetails = suitDetails;
// specObject.isSuit = isSuit;
// specObject.uniqueId = uniqueId;
// specObject.addAmount = addAmount;
// specObject.totalPrice = amount;
// specObject.totalMemberPrice = memberAmount;
// specObject.totalMakeAmount = makeAmount;
// /* 消费金额 = 商品消费金额 + 商品做法金额 + 套餐明细加价金额 */
// specObject.amount = utils.numAdd(utils.numAdd(specObject.totalPrice, specObject.totalMakeAmount), addAmount);
// specObject.memberAmount = utils.numAdd(utils.numAdd(specObject.totalMemberPrice, specObject.totalMakeAmount), addAmount);
// specs[uniqueId] = specObject;
// dishObject.specs = specs;
// }
// /* 商品数量变动结束 重新计算dishObject金额数量 */
// dishObject.num = 0;
// dishObject.totalPrice = 0;
// dishObject.totalMemberPrice = 0;
// dishObject.totalMakeAmount = 0;
// dishObject.amount = 0;
// dishObject.memberAmount = 0;
// var dishAddAmount = 0;
// var specs = dishObject.specs;
// for (var key in specs) {
// var spec = specs[key];
// if (null != spec && undefined != spec) {
// var suitAddAmount = 0.00; /* 套餐明细加价汇总 */
// var suitMakeAmount = 0.00; /* 套餐明细做法汇总 */
// var totalMakeAmount = 0.00; /* spec做法最终 */
// console.log("is suit:" + spec.isSuit);
// if (spec.isSuit) {
// var suits = spec.suitDetails; /* 套餐明细 */
// if (undefined != suits && suits.length > 0) {
// suits.forEach(function(suitItem, inx) {
// suitAddAmount = utils.numAdd(suitAddAmount, suitItem.addPrice);
// suitMakeAmount = utils.numAdd(suitMakeAmount, utils.numMulti(suitItem.quantity, suitItem.makeAmount));
// });
// }
// totalMakeAmount = utils.numMulti(spec.num, suitMakeAmount);
// } else {
// totalMakeAmount = utils.numMulti(spec.num, spec.makeAmount);
// }
// //
// var amount = utils.numMulti(spec.num, spec.price);
// var memberAmount = utils.numMulti(spec.num, spec.memberPrice);
// // 商品加价金额
// spec.addAmount = utils.numMulti(spec.num, suitAddAmount);
// dishAddAmount = utils.numAdd(dishAddAmount, spec.addAmount);
// // spec.makeAmount = makeAmount;
// spec.totalMakeAmount = totalMakeAmount;
// spec.totalPrice = amount;
// spec.totalMemberPrice = memberAmount;
// //商品总金额 = 商品金额 + 商品加价总额 + 商品做法总额
// spec.amount = utils.numAdd(utils.numAdd(amount, spec.addAmount), totalMakeAmount);
// spec.memberAmount = utils.numAdd(utils.numAdd(memberAmount, spec.addAmount), totalMakeAmount);
// specs[key] = spec;
// dishObject.boxPrice = boxPrice;
// dishObject.num += spec.num;
// dishObject.totalPrice = utils.numAdd(dishObject.totalPrice, spec.totalPrice);
// dishObject.totalMemberPrice = utils.numAdd(dishObject.totalMemberPrice, spec.totalMemberPrice);
// dishObject.totalMakeAmount = utils.numAdd(dishObject.totalMakeAmount, spec.totalMakeAmount);
// dishObject.amount = utils.numAdd(dishObject.amount, spec.amount);
// dishObject.memberAmount = utils.numAdd(dishObject.memberAmount, spec.memberAmount);
// }
// }
// //
// dishObject.specs = specs;
// dishObject.addAmount = dishAddAmount;
// /* dishObject数量非法 设置为undefined */
// if (dishObject.num <= 0) {
// dishObject = undefined;
// }
// dishes[productId] = dishObject;
// storeCartMap.dishes = dishes;
// /*dishObj 变动结束 重新计算storeCartMap金额数量*/
// storeCartMap.totalNum = 0;
// storeCartMap.totalCash = 0;
// storeCartMap.totalMemberCash = 0;
// storeCartMap.totalMakeAmount = 0;
// for (var key in dishes) {
// var dish = dishes[key];
// if (null != dish && undefined != dish) {
// var cash = utils.numAdd(utils.numAdd(dish.totalPrice, dish.totalMakeAmount), dish.addAmount);
// var memberCash = utils.numAdd(utils.numAdd(dish.totalMemberPrice, dish.totalMakeAmount), dish.addAmount);
// storeCartMap.totalNum += dish.num;
// storeCartMap.totalCash = utils.numAdd(storeCartMap.totalCash, cash);
// storeCartMap.totalMemberCash = utils.numAdd(storeCartMap.totalMemberCash, memberCash);
// storeCartMap.totalMakeAmount = utils.numAdd(storeCartMap.totalMakeAmount, dish.totalMakeAmount);
// }
// }
// if (storeCartMap.totalNum <= 0) {
// storeCartMap = undefined;
// }
// cartMap[storeId] = storeCartMap;
// this.setStoreCartMap({
// storeId: storeId,
// storeCartMap: storeCartMap
// });
// } else {
// var amount = utils.numMulti(num, price);
// var memberAmount = utils.numMulti(num, memberPrice);
// cartMap = new Object();
// storeCartMap = new Object();
// storeCartMap.totalNum = num;
// storeCartMap.totalMakeAmount = makeAmount;
// storeCartMap.totalCash = utils.numAdd(utils.numAdd(amount, makeAmount), addAmount);
// storeCartMap.totalMemberCash = utils.numAdd(utils.numAdd(memberAmount, makeAmount), addAmount);
// /*-------菜品-------*/
// var dishes = new Object();
// var dishObject = new Object();
// dishObject.boxPrice = boxPrice;
// dishObject.name = goodsName;
// dishObject.num = num;
// dishObject.memberPrice = utils.Number(memberPrice).toFixed(2);
// dishObject.isSuit = isSuit;
// dishObject.addAmount = addAmount;
// dishObject.totalPrice = amount;
// dishObject.totalMemberPrice = memberAmount;
// dishObject.totalMakeAmount = makeAmount;
// dishObject.amount = utils.numAdd(utils.numAdd(dishObject.totalPrice, dishObject.totalMakeAmount), addAmount);
// dishObject.memberAmount = utils.numAdd(utils.numAdd(dishObject.totalMemberPrice, dishObject.totalMakeAmount), addAmount);
// /*-------菜品规格-------*/
// var specs = new Object();
// var specObject = new Object();
// specObject.categoryId = categoryId;
// specObject.productId = productId;
// specObject.productNo = productNo;
// specObject.unitId = unitId;
// specObject.goodsId = goodsId;
// specObject.name = goodsName;
// specObject.specId = specId;
// specObject.specName = specName;
// // specObject.makeCount = makeCount;
// specObject.num = num;
// specObject.price = Number(price).toFixed(2);
// specObject.memberPrice = Number(memberPrice).toFixed(2);
// //做法信息
// specObject.makeId = makeId;
// specObject.makeName = makeName;
// specObject.makePrice = makePrice;
// specObject.makeAmount = makeAmount;
// specObject.suitDetails = suitDetails;
// specObject.isSuit = isSuit;
// specObject.uniqueId = uniqueId;
// specObject.addAmount = addAmount;
// specObject.totalPrice = amount;
// specObject.totalMemberPrice = memberAmount;
// specObject.totalMakeAmount = makeAmount;
// specObject.amount = utils.numAdd(utils.numAdd(specObject.totalPrice, specObject.totalMakeAmount), addAmount);
// specObject.memberAmount = utils.numAdd(utils.numAdd(specObject.totalMemberPrice, specObject.totalMakeAmount), addAmount);
// specs[uniqueId] = specObject;
// dishObject.specs = specs;
// dishes[productId] = dishObject;
// storeCartMap.dishes = dishes;
// cartMap[storeId] = storeCartMap;
// this.setstoreCartMap({
// storeId: storeId,
// storeCartMap: storeCartMap
// });
// }
// return cartMap;
// };
// var editCartMap = function() {
// };
// var addCardMap = function() {
// };
// /* 清除指定门店购物车 */
// var clearStoreCartMap = function(option) {
// var storeId = this.getStore().id;
// var cartMap = this.getCartMap();
// if (cartMap != null) {
// cartMap[storeId] = undefined;
// }
// return this.setCartMap(cartMap);
// };
// /* 从购物车获取已购买商品map */
// var getSpecMapByCart = function() {
// var specMap = {};
// var cartStoreMap = this.getStoreCartMap(this.getStore().id);
// if (null != cartStoreMap && undefined != cartStoreMap) {
// var dishes = cartStoreMap.dishes;
// if (utils.isNotBlank(dishes)) {
// for (var productId in dishes) {
// var dishObj = dishes[productId];
// var goodsName = dishObj.name;
// var specName = dishObj.specName;
// var specs = dishObj.specs;
// if (utils.isNotBlank(specs)) {
// for (var uniqueId in specs) {
// specs[uniqueId].name = goodsName;
// // 为了保证唯一 key=规格商品Id + 做法字符串
// specMap[uniqueId] = specs[uniqueId];
// }
// }
// }
// }
// }
// return specMap;
// };
// /* 从购物车获取已购买商品map */
// var getDishMapByCart = function() {
// var dishMap = {};
// var cartStoreMap = this.getStoreCartMap(this.getStore().id);
// if (null != cartStoreMap && undefined != cartStoreMap) {
// var dishes = cartStoreMap.dishes;
// if (utils.isNotBlank(dishes)) {
// for (var key in dishes) {
// var dishObj = dishes[key];
// var goodsName = dishObj.name;
// var specName = dishObj.specName;
// var num = 0;
// // 计算商品数量和金额合计
// var specs = dishObj.specs;
// if (utils.isNotBlank(specs)) {
// for (var jkey in specs) {
// var specObj = specs[jkey];
// num = utils.numAdd(num, specObj.num);
// }
// }
// dishObj.num = num;
// dishMap[key] = dishObj;
// }
// }
// }
// return dishMap;
// };
// /* 从购物车获取已购买商品list */
// var getDishListByCart = function() {
// var dishList = [];
// var cartStoreMap = this.getStoreCartMap(this.getStore().id);
// if (null != cartStoreMap && undefined != cartStoreMap) {
// var dishes = cartStoreMap.dishes;
// if (null != dishes && undefined != dishes) {
// for (var key in dishes) {
// var dishObj = dishes[key];
// var goodsName = dishObj.name;
// var specName = dishObj.specName;
// var specs = dishObj.specs;
// if (null != specs && undefined != specs) {
// for (var jkey in specs) {
// if (undefined != specName && specName != '') {
// specs[jkey].name = "(" + specName + ") " + goodsName;
// } else {
// specs[jkey].name = goodsName;
// }
// dishList.push(specs[jkey]);
// }
// }
// }
// }
// }
// return dishList;
// };
// /* 获取门店菜单点菜统计 */
// var getCartTotal = function() {
// var storeId = getStore().id;
// var storeCartMap = this.getStoreCartMap(storeId);
// // console.log(storeCartMap);
// var data = {};
// var totalNum = 0;
// var totalCash = 0.00;
// var totalMemberCash = 0.00;
// if (utils.isNotBlank(storeCartMap)) {
// totalNum = storeCartMap.totalNum;
// totalCash = storeCartMap.totalCash;
// totalMemberCash = storeCartMap.totalMemberCash;
// }
// data.totalNum = totalNum;
// data.totalCash = Number(totalCash).toFixed(digits);
// data.totalMemberCash = Number(totalMemberCash).toFixed(digits);
// return data;
// };
// /* 清除购物车 */
// var clearStoreCartMap = function(option) {
// app.takeMethod = "";
// app.table = {};
// var storeId = getStore().id;
// var cartMap = this.getCartMap();
// if (cartMap != null) {
// cartMap[storeId] = undefined;
// }
// return this.setCartMap(cartMap);
// };
// /**
// * 营业模式
// */
// var getStoreBusMode = function(index) {
// var map;
// if (index == 0) {
// map = {
// name: "堂食",
// sign: "0",
// icon: "icon-tangshi-1"
// }
// }
// if (index == 1) {
// map = {
// name: "外带",
// sign: "1",
// icon: "icon-waidai"
// }
// }
// if (index == 2) {
// map = {
// name: "外卖",
// sign: "2",
// icon: "icon-yunshuzhongwuliu-xianxing"
// }
// }
// return map;
// };
// /**输出函数 */
// module.exports = {
// setStore: setStore,
// getStore: getStore,
// setCartMap: setCartMap,
// getCartMap: getCartMap,
// setStoreCartMap: setStoreCartMap,
// getStoreCartMap: getStoreCartMap,
// putCartMap: putCartMap,
// getSpecMapByCart: getSpecMapByCart,
// getDishMapByCart: getDishMapByCart,
// getCartTotal: getCartTotal,
// getDishListByCart: getDishListByCart,
// clearStoreCartMap: clearStoreCartMap,
// getStoreBusMode: getStoreBusMode,
// }

@ -0,0 +1,883 @@
/**
* DES加密/解密
* @Copyright Copyright (c) 2006
* @author Guapo
* @see DESCore
*/
/*
* encrypt the string to string made up of hex
* return the encrypted string
*/
function strEnc(data, firstKey, secondKey, thirdKey) {
var leng = data.length;
var encData = "";
var firstKeyBt, secondKeyBt, thirdKeyBt, firstLength, secondLength, thirdLength;
if (firstKey != null && firstKey != "") {
firstKeyBt = getKeyBytes(firstKey);
firstLength = firstKeyBt.length;
}
if (secondKey != null && secondKey != "") {
secondKeyBt = getKeyBytes(secondKey);
secondLength = secondKeyBt.length;
}
if (thirdKey != null && thirdKey != "") {
thirdKeyBt = getKeyBytes(thirdKey);
thirdLength = thirdKeyBt.length;
}
if (leng > 0) {
if (leng < 4) {
var bt = strToBt(data);
var encByte;
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != "") {
var tempBt;
var x, y, z;
tempBt = bt;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
for (y = 0; y < secondLength; y++) {
tempBt = enc(tempBt, secondKeyBt[y]);
}
for (z = 0; z < thirdLength; z++) {
tempBt = enc(tempBt, thirdKeyBt[z]);
}
encByte = tempBt;
} else {
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "") {
var tempBt;
var x, y;
tempBt = bt;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
for (y = 0; y < secondLength; y++) {
tempBt = enc(tempBt, secondKeyBt[y]);
}
encByte = tempBt;
} else {
if (firstKey != null && firstKey != "") {
var tempBt;
var x = 0;
tempBt = bt;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
encByte = tempBt;
}
}
}
encData = bt64ToHex(encByte);
} else {
var iterator = parseInt(leng / 4);
var remainder = leng % 4;
var i = 0;
for (i = 0; i < iterator; i++) {
var tempData = data.substring(i * 4 + 0, i * 4 + 4);
var tempByte = strToBt(tempData);
var encByte;
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != "") {
var tempBt;
var x, y, z;
tempBt = tempByte;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
for (y = 0; y < secondLength; y++) {
tempBt = enc(tempBt, secondKeyBt[y]);
}
for (z = 0; z < thirdLength; z++) {
tempBt = enc(tempBt, thirdKeyBt[z]);
}
encByte = tempBt;
} else {
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "") {
var tempBt;
var x, y;
tempBt = tempByte;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
for (y = 0; y < secondLength; y++) {
tempBt = enc(tempBt, secondKeyBt[y]);
}
encByte = tempBt;
} else {
if (firstKey != null && firstKey != "") {
var tempBt;
var x;
tempBt = tempByte;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
encByte = tempBt;
}
}
}
encData += bt64ToHex(encByte);
}
if (remainder > 0) {
var remainderData = data.substring(iterator * 4 + 0, leng);
var tempByte = strToBt(remainderData);
var encByte;
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != "") {
var tempBt;
var x, y, z;
tempBt = tempByte;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
for (y = 0; y < secondLength; y++) {
tempBt = enc(tempBt, secondKeyBt[y]);
}
for (z = 0; z < thirdLength; z++) {
tempBt = enc(tempBt, thirdKeyBt[z]);
}
encByte = tempBt;
} else {
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "") {
var tempBt;
var x, y;
tempBt = tempByte;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
for (y = 0; y < secondLength; y++) {
tempBt = enc(tempBt, secondKeyBt[y]);
}
encByte = tempBt;
} else {
if (firstKey != null && firstKey != "") {
var tempBt;
var x;
tempBt = tempByte;
for (x = 0; x < firstLength; x++) {
tempBt = enc(tempBt, firstKeyBt[x]);
}
encByte = tempBt;
}
}
}
encData += bt64ToHex(encByte);
}
}
}
return encData;
}
/*
* decrypt the encrypted string to the original string
*
* return the original string
*/
function strDec(data, firstKey, secondKey, thirdKey) {
var leng = data.length;
var decStr = "";
var firstKeyBt, secondKeyBt, thirdKeyBt, firstLength, secondLength, thirdLength;
if (firstKey != null && firstKey != "") {
firstKeyBt = getKeyBytes(firstKey);
firstLength = firstKeyBt.length;
}
if (secondKey != null && secondKey != "") {
secondKeyBt = getKeyBytes(secondKey);
secondLength = secondKeyBt.length;
}
if (thirdKey != null && thirdKey != "") {
thirdKeyBt = getKeyBytes(thirdKey);
thirdLength = thirdKeyBt.length;
}
var iterator = parseInt(leng / 16);
var i = 0;
for (i = 0; i < iterator; i++) {
var tempData = data.substring(i * 16 + 0, i * 16 + 16);
var strByte = hexToBt64(tempData);
var intByte = new Array(64);
var j = 0;
for (j = 0; j < 64; j++) {
intByte[j] = parseInt(strByte.substring(j, j + 1));
}
var decByte;
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != "") {
var tempBt;
var x, y, z;
tempBt = intByte;
for (x = thirdLength - 1; x >= 0; x--) {
tempBt = dec(tempBt, thirdKeyBt[x]);
}
for (y = secondLength - 1; y >= 0; y--) {
tempBt = dec(tempBt, secondKeyBt[y]);
}
for (z = firstLength - 1; z >= 0; z--) {
tempBt = dec(tempBt, firstKeyBt[z]);
}
decByte = tempBt;
} else {
if (firstKey != null && firstKey != "" && secondKey != null && secondKey != "") {
var tempBt;
var x, y, z;
tempBt = intByte;
for (x = secondLength - 1; x >= 0; x--) {
tempBt = dec(tempBt, secondKeyBt[x]);
}
for (y = firstLength - 1; y >= 0; y--) {
tempBt = dec(tempBt, firstKeyBt[y]);
}
decByte = tempBt;
} else {
if (firstKey != null && firstKey != "") {
var tempBt;
var x, y, z;
tempBt = intByte;
for (x = firstLength - 1; x >= 0; x--) {
tempBt = dec(tempBt, firstKeyBt[x]);
}
decByte = tempBt;
}
}
}
decStr += byteToString(decByte);
}
return decStr;
}
/*
* chang the string into the bit array
*
* return bit array(it's length % 64 = 0)
*/
function getKeyBytes(key) {
var keyBytes = new Array();
var leng = key.length;
var iterator = parseInt(leng / 4);
var remainder = leng % 4;
var i = 0;
for (i = 0; i < iterator; i++) {
keyBytes[i] = strToBt(key.substring(i * 4 + 0, i * 4 + 4));
}
if (remainder > 0) {
keyBytes[i] = strToBt(key.substring(i * 4 + 0, leng));
}
return keyBytes;
}
/*
* chang the string(it's length <= 4) into the bit array
*
* return bit array(it's length = 64)
*/
function strToBt(str) {
var leng = str.length;
var bt = new Array(64);
if (leng < 4) {
var i = 0, j = 0, p = 0, q = 0;
for (i = 0; i < leng; i++) {
var k = str.charCodeAt(i);
for (j = 0; j < 16; j++) {
var pow = 1, m = 0;
for (m = 15; m > j; m--) {
pow *= 2;
}
bt[16 * i + j] = parseInt(k / pow) % 2;
}
}
for (p = leng; p < 4; p++) {
var k = 0;
for (q = 0; q < 16; q++) {
var pow = 1, m = 0;
for (m = 15; m > q; m--) {
pow *= 2;
}
bt[16 * p + q] = parseInt(k / pow) % 2;
}
}
} else {
for (i = 0; i < 4; i++) {
var k = str.charCodeAt(i);
for (j = 0; j < 16; j++) {
var pow = 1;
for (m = 15; m > j; m--) {
pow *= 2;
}
bt[16 * i + j] = parseInt(k / pow) % 2;
}
}
}
return bt;
}
/*
* chang the bit(it's length = 4) into the hex
*
* return hex
*/
function bt4ToHex(binary) {
var hex;
switch (binary) {
case "0000": hex = "0"; break;
case "0001": hex = "1"; break;
case "0010": hex = "2"; break;
case "0011": hex = "3"; break;
case "0100": hex = "4"; break;
case "0101": hex = "5"; break;
case "0110": hex = "6"; break;
case "0111": hex = "7"; break;
case "1000": hex = "8"; break;
case "1001": hex = "9"; break;
case "1010": hex = "A"; break;
case "1011": hex = "B"; break;
case "1100": hex = "C"; break;
case "1101": hex = "D"; break;
case "1110": hex = "E"; break;
case "1111": hex = "F"; break;
}
return hex;
}
/*
* chang the hex into the bit(it's length = 4)
*
* return the bit(it's length = 4)
*/
function hexToBt4(hex) {
var binary;
switch (hex) {
case "0": binary = "0000"; break;
case "1": binary = "0001"; break;
case "2": binary = "0010"; break;
case "3": binary = "0011"; break;
case "4": binary = "0100"; break;
case "5": binary = "0101"; break;
case "6": binary = "0110"; break;
case "7": binary = "0111"; break;
case "8": binary = "1000"; break;
case "9": binary = "1001"; break;
case "A": binary = "1010"; break;
case "B": binary = "1011"; break;
case "C": binary = "1100"; break;
case "D": binary = "1101"; break;
case "E": binary = "1110"; break;
case "F": binary = "1111"; break;
}
return binary;
}
/*
* chang the bit(it's length = 64) into the string
*
* return string
*/
function byteToString(byteData) {
var str = "";
for (var i = 0; i < 4; i++) {
var count = 0;
for (var j = 0; j < 16; j++) {
var pow = 1;
for (var m = 15; m > j; m--) {
pow *= 2;
}
count += byteData[16 * i + j] * pow;
}
if (count != 0) {
str += String.fromCharCode(count);
}
}
return str;
}
function bt64ToHex(byteData) {
var hex = "";
for (var i = 0; i < 16; i++) {
var bt = "";
for (var j = 0; j < 4; j++) {
bt += byteData[i * 4 + j];
}
hex += bt4ToHex(bt);
}
return hex;
}
function hexToBt64(hex) {
var binary = "";
for (var i = 0; i < 16; i++) {
binary += hexToBt4(hex.substring(i, i + 1));
}
return binary;
}
/*
* the 64 bit des core arithmetic
*/
function enc(dataByte, keyByte) {
var keys = generateKeys(keyByte);
var ipByte = initPermute(dataByte);
var ipLeft = new Array(32);
var ipRight = new Array(32);
var tempLeft = new Array(32);
var i = 0, j = 0, k = 0, m = 0, n = 0;
for (k = 0; k < 32; k++) {
ipLeft[k] = ipByte[k];
ipRight[k] = ipByte[32 + k];
}
for (i = 0; i < 16; i++) {
for (j = 0; j < 32; j++) {
tempLeft[j] = ipLeft[j];
ipLeft[j] = ipRight[j];
}
var key = new Array(48);
for (m = 0; m < 48; m++) {
key[m] = keys[i][m];
}
var tempRight = xor(pPermute(sBoxPermute(xor(expandPermute(ipRight), key))), tempLeft);
for (n = 0; n < 32; n++) {
ipRight[n] = tempRight[n];
}
}
var finalData = new Array(64);
for (i = 0; i < 32; i++) {
finalData[i] = ipRight[i];
finalData[32 + i] = ipLeft[i];
}
return finallyPermute(finalData);
}
function dec(dataByte, keyByte) {
var keys = generateKeys(keyByte);
var ipByte = initPermute(dataByte);
var ipLeft = new Array(32);
var ipRight = new Array(32);
var tempLeft = new Array(32);
var i = 0, j = 0, k = 0, m = 0, n = 0;
for (k = 0; k < 32; k++) {
ipLeft[k] = ipByte[k];
ipRight[k] = ipByte[32 + k];
}
for (i = 15; i >= 0; i--) {
for (j = 0; j < 32; j++) {
tempLeft[j] = ipLeft[j];
ipLeft[j] = ipRight[j];
}
var key = new Array(48);
for (m = 0; m < 48; m++) {
key[m] = keys[i][m];
}
var tempRight = xor(pPermute(sBoxPermute(xor(expandPermute(ipRight), key))), tempLeft);
for (n = 0; n < 32; n++) {
ipRight[n] = tempRight[n];
}
}
var finalData = new Array(64);
for (i = 0; i < 32; i++) {
finalData[i] = ipRight[i];
finalData[32 + i] = ipLeft[i];
}
return finallyPermute(finalData);
}
function initPermute(originalData) {
var ipByte = new Array(64);
for (var i = 0, m = 1, n = 0; i < 4; i++ , m += 2, n += 2) {
for (var j = 7, k = 0; j >= 0; j-- , k++) {
ipByte[i * 8 + k] = originalData[j * 8 + m];
ipByte[i * 8 + k + 32] = originalData[j * 8 + n];
}
}
return ipByte;
}
function expandPermute(rightData) {
var epByte = new Array(48);
for (var i = 0; i < 8; i++) {
if (i == 0) {
epByte[i * 6 + 0] = rightData[31];
} else {
epByte[i * 6 + 0] = rightData[i * 4 - 1];
}
epByte[i * 6 + 1] = rightData[i * 4 + 0];
epByte[i * 6 + 2] = rightData[i * 4 + 1];
epByte[i * 6 + 3] = rightData[i * 4 + 2];
epByte[i * 6 + 4] = rightData[i * 4 + 3];
if (i == 7) {
epByte[i * 6 + 5] = rightData[0];
} else {
epByte[i * 6 + 5] = rightData[i * 4 + 4];
}
}
return epByte;
}
function xor(byteOne, byteTwo) {
var xorByte = new Array(byteOne.length);
for (var i = 0; i < byteOne.length; i++) {
xorByte[i] = byteOne[i] ^ byteTwo[i];
}
return xorByte;
}
function sBoxPermute(expandByte) {
var sBoxByte = new Array(32);
var binary = "";
var s1 = [
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
[0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
[4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
[15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]];
/* Table - s2 */
var s2 = [
[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
[3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
[0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
[13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]];
/* Table - s3 */
var s3 = [
[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
[13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
[13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
[1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]];
/* Table - s4 */
var s4 = [
[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
[13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
[10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
[3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]];
/* Table - s5 */
var s5 = [
[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
[14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
[4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
[11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]];
/* Table - s6 */
var s6 = [
[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
[10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
[9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
[4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]];
/* Table - s7 */
var s7 = [
[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
[13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
[1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
[6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]];
/* Table - s8 */
var s8 = [
[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
[1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
[7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
[2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]];
for (var m = 0; m < 8; m++) {
var i = 0, j = 0;
i = expandByte[m * 6 + 0] * 2 + expandByte[m * 6 + 5];
j = expandByte[m * 6 + 1] * 2 * 2 * 2
+ expandByte[m * 6 + 2] * 2 * 2
+ expandByte[m * 6 + 3] * 2
+ expandByte[m * 6 + 4];
switch (m) {
case 0:
binary = getBoxBinary(s1[i][j]);
break;
case 1:
binary = getBoxBinary(s2[i][j]);
break;
case 2:
binary = getBoxBinary(s3[i][j]);
break;
case 3:
binary = getBoxBinary(s4[i][j]);
break;
case 4:
binary = getBoxBinary(s5[i][j]);
break;
case 5:
binary = getBoxBinary(s6[i][j]);
break;
case 6:
binary = getBoxBinary(s7[i][j]);
break;
case 7:
binary = getBoxBinary(s8[i][j]);
break;
}
sBoxByte[m * 4 + 0] = parseInt(binary.substring(0, 1));
sBoxByte[m * 4 + 1] = parseInt(binary.substring(1, 2));
sBoxByte[m * 4 + 2] = parseInt(binary.substring(2, 3));
sBoxByte[m * 4 + 3] = parseInt(binary.substring(3, 4));
}
return sBoxByte;
}
function pPermute(sBoxByte) {
var pBoxPermute = new Array(32);
pBoxPermute[0] = sBoxByte[15];
pBoxPermute[1] = sBoxByte[6];
pBoxPermute[2] = sBoxByte[19];
pBoxPermute[3] = sBoxByte[20];
pBoxPermute[4] = sBoxByte[28];
pBoxPermute[5] = sBoxByte[11];
pBoxPermute[6] = sBoxByte[27];
pBoxPermute[7] = sBoxByte[16];
pBoxPermute[8] = sBoxByte[0];
pBoxPermute[9] = sBoxByte[14];
pBoxPermute[10] = sBoxByte[22];
pBoxPermute[11] = sBoxByte[25];
pBoxPermute[12] = sBoxByte[4];
pBoxPermute[13] = sBoxByte[17];
pBoxPermute[14] = sBoxByte[30];
pBoxPermute[15] = sBoxByte[9];
pBoxPermute[16] = sBoxByte[1];
pBoxPermute[17] = sBoxByte[7];
pBoxPermute[18] = sBoxByte[23];
pBoxPermute[19] = sBoxByte[13];
pBoxPermute[20] = sBoxByte[31];
pBoxPermute[21] = sBoxByte[26];
pBoxPermute[22] = sBoxByte[2];
pBoxPermute[23] = sBoxByte[8];
pBoxPermute[24] = sBoxByte[18];
pBoxPermute[25] = sBoxByte[12];
pBoxPermute[26] = sBoxByte[29];
pBoxPermute[27] = sBoxByte[5];
pBoxPermute[28] = sBoxByte[21];
pBoxPermute[29] = sBoxByte[10];
pBoxPermute[30] = sBoxByte[3];
pBoxPermute[31] = sBoxByte[24];
return pBoxPermute;
}
function finallyPermute(endByte) {
var fpByte = new Array(64);
fpByte[0] = endByte[39];
fpByte[1] = endByte[7];
fpByte[2] = endByte[47];
fpByte[3] = endByte[15];
fpByte[4] = endByte[55];
fpByte[5] = endByte[23];
fpByte[6] = endByte[63];
fpByte[7] = endByte[31];
fpByte[8] = endByte[38];
fpByte[9] = endByte[6];
fpByte[10] = endByte[46];
fpByte[11] = endByte[14];
fpByte[12] = endByte[54];
fpByte[13] = endByte[22];
fpByte[14] = endByte[62];
fpByte[15] = endByte[30];
fpByte[16] = endByte[37];
fpByte[17] = endByte[5];
fpByte[18] = endByte[45];
fpByte[19] = endByte[13];
fpByte[20] = endByte[53];
fpByte[21] = endByte[21];
fpByte[22] = endByte[61];
fpByte[23] = endByte[29];
fpByte[24] = endByte[36];
fpByte[25] = endByte[4];
fpByte[26] = endByte[44];
fpByte[27] = endByte[12];
fpByte[28] = endByte[52];
fpByte[29] = endByte[20];
fpByte[30] = endByte[60];
fpByte[31] = endByte[28];
fpByte[32] = endByte[35];
fpByte[33] = endByte[3];
fpByte[34] = endByte[43];
fpByte[35] = endByte[11];
fpByte[36] = endByte[51];
fpByte[37] = endByte[19];
fpByte[38] = endByte[59];
fpByte[39] = endByte[27];
fpByte[40] = endByte[34];
fpByte[41] = endByte[2];
fpByte[42] = endByte[42];
fpByte[43] = endByte[10];
fpByte[44] = endByte[50];
fpByte[45] = endByte[18];
fpByte[46] = endByte[58];
fpByte[47] = endByte[26];
fpByte[48] = endByte[33];
fpByte[49] = endByte[1];
fpByte[50] = endByte[41];
fpByte[51] = endByte[9];
fpByte[52] = endByte[49];
fpByte[53] = endByte[17];
fpByte[54] = endByte[57];
fpByte[55] = endByte[25];
fpByte[56] = endByte[32];
fpByte[57] = endByte[0];
fpByte[58] = endByte[40];
fpByte[59] = endByte[8];
fpByte[60] = endByte[48];
fpByte[61] = endByte[16];
fpByte[62] = endByte[56];
fpByte[63] = endByte[24];
return fpByte;
}
function getBoxBinary(i) {
var binary = "";
switch (i) {
case 0: binary = "0000"; break;
case 1: binary = "0001"; break;
case 2: binary = "0010"; break;
case 3: binary = "0011"; break;
case 4: binary = "0100"; break;
case 5: binary = "0101"; break;
case 6: binary = "0110"; break;
case 7: binary = "0111"; break;
case 8: binary = "1000"; break;
case 9: binary = "1001"; break;
case 10: binary = "1010"; break;
case 11: binary = "1011"; break;
case 12: binary = "1100"; break;
case 13: binary = "1101"; break;
case 14: binary = "1110"; break;
case 15: binary = "1111"; break;
}
return binary;
}
/*
* generate 16 keys for xor
*
*/
function generateKeys(keyByte) {
var key = new Array(56);
var keys = new Array();
keys[0] = new Array();
keys[1] = new Array();
keys[2] = new Array();
keys[3] = new Array();
keys[4] = new Array();
keys[5] = new Array();
keys[6] = new Array();
keys[7] = new Array();
keys[8] = new Array();
keys[9] = new Array();
keys[10] = new Array();
keys[11] = new Array();
keys[12] = new Array();
keys[13] = new Array();
keys[14] = new Array();
keys[15] = new Array();
var loop = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];
for (var i = 0; i < 7; i++) {
for (var j = 0, k = 7; j < 8; j++ , k--) {
key[i * 8 + j] = keyByte[8 * k + i];
}
}
var i = 0;
for (i = 0; i < 16; i++) {
var tempLeft = 0;
var tempRight = 0;
for (j = 0; j < loop[i]; j++) {
tempLeft = key[0];
tempRight = key[28];
for (k = 0; k < 27; k++) {
key[k] = key[k + 1];
key[28 + k] = key[29 + k];
}
key[27] = tempLeft;
key[55] = tempRight;
}
var tempKey = new Array(48);
tempKey[0] = key[13];
tempKey[1] = key[16];
tempKey[2] = key[10];
tempKey[3] = key[23];
tempKey[4] = key[0];
tempKey[5] = key[4];
tempKey[6] = key[2];
tempKey[7] = key[27];
tempKey[8] = key[14];
tempKey[9] = key[5];
tempKey[10] = key[20];
tempKey[11] = key[9];
tempKey[12] = key[22];
tempKey[13] = key[18];
tempKey[14] = key[11];
tempKey[15] = key[3];
tempKey[16] = key[25];
tempKey[17] = key[7];
tempKey[18] = key[15];
tempKey[19] = key[6];
tempKey[20] = key[26];
tempKey[21] = key[19];
tempKey[22] = key[12];
tempKey[23] = key[1];
tempKey[24] = key[40];
tempKey[25] = key[51];
tempKey[26] = key[30];
tempKey[27] = key[36];
tempKey[28] = key[46];
tempKey[29] = key[54];
tempKey[30] = key[29];
tempKey[31] = key[39];
tempKey[32] = key[50];
tempKey[33] = key[44];
tempKey[34] = key[32];
tempKey[35] = key[47];
tempKey[36] = key[43];
tempKey[37] = key[48];
tempKey[38] = key[38];
tempKey[39] = key[55];
tempKey[40] = key[33];
tempKey[41] = key[52];
tempKey[42] = key[45];
tempKey[43] = key[41];
tempKey[44] = key[49];
tempKey[45] = key[35];
tempKey[46] = key[28];
tempKey[47] = key[31];
var m = 0;
switch (i) {
case 0: for (m = 0; m < 48; m++) { keys[0][m] = tempKey[m]; } break;
case 1: for (m = 0; m < 48; m++) { keys[1][m] = tempKey[m]; } break;
case 2: for (m = 0; m < 48; m++) { keys[2][m] = tempKey[m]; } break;
case 3: for (m = 0; m < 48; m++) { keys[3][m] = tempKey[m]; } break;
case 4: for (m = 0; m < 48; m++) { keys[4][m] = tempKey[m]; } break;
case 5: for (m = 0; m < 48; m++) { keys[5][m] = tempKey[m]; } break;
case 6: for (m = 0; m < 48; m++) { keys[6][m] = tempKey[m]; } break;
case 7: for (m = 0; m < 48; m++) { keys[7][m] = tempKey[m]; } break;
case 8: for (m = 0; m < 48; m++) { keys[8][m] = tempKey[m]; } break;
case 9: for (m = 0; m < 48; m++) { keys[9][m] = tempKey[m]; } break;
case 10: for (m = 0; m < 48; m++) { keys[10][m] = tempKey[m]; } break;
case 11: for (m = 0; m < 48; m++) { keys[11][m] = tempKey[m]; } break;
case 12: for (m = 0; m < 48; m++) { keys[12][m] = tempKey[m]; } break;
case 13: for (m = 0; m < 48; m++) { keys[13][m] = tempKey[m]; } break;
case 14: for (m = 0; m < 48; m++) { keys[14][m] = tempKey[m]; } break;
case 15: for (m = 0; m < 48; m++) { keys[15][m] = tempKey[m]; } break;
}
}
return keys;
}
function encryptString(encStr) {
return strEnc(encStr, '$QBOSSY$', '$QBOSSY$', '$QBOSSY$')
}
function decryptString(decStr) {
return strDec(decStr, '$QBOSSY$', '$QBOSSY$', '$QBOSSY$');
}
module.exports = {
encryptString: encryptString,
decryptString: decryptString
}

@ -0,0 +1,221 @@
//Paul Tero, July 2001
//http://www.tero.co.uk/des/
//
//Optimised for performance with large blocks by Michael Hayworth, November 2001
//http://www.netdealing.com
//
//THIS SOFTWARE IS PROVIDED "AS IS" AND
//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
//ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
//OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
//HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
//SUCH DAMAGE.
//des
//this takes the key, the message, and whether to encrypt or decrypt
var des = function des(key, message, encrypt, mode, iv, padding) {
//declaring this locally speeds things up a bit
var spfunction1 = new Array(0x1010400, 0, 0x10000, 0x1010404, 0x1010004, 0x10404, 0x4, 0x10000, 0x400, 0x1010400, 0x1010404, 0x400, 0x1000404, 0x1010004, 0x1000000, 0x4, 0x404, 0x1000400, 0x1000400, 0x10400, 0x10400, 0x1010000, 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004, 0x10004, 0, 0x404, 0x10404, 0x1000000, 0x10000, 0x1010404, 0x4, 0x1010000, 0x1010400, 0x1000000, 0x1000000, 0x400, 0x1010004, 0x10000, 0x10400, 0x1000004, 0x400, 0x4, 0x1000404, 0x10404, 0x1010404, 0x10004, 0x1010000, 0x1000404, 0x1000004, 0x404, 0x10404, 0x1010400, 0x404, 0x1000400, 0x1000400, 0, 0x10004, 0x10400, 0, 0x1010004);
var spfunction2 = new Array(-0x7fef7fe0, -0x7fff8000, 0x8000, 0x108020, 0x100000, 0x20, -0x7fefffe0, -0x7fff7fe0, -0x7fffffe0, -0x7fef7fe0, -0x7fef8000, -0x80000000, -0x7fff8000, 0x100000, 0x20, -0x7fefffe0, 0x108000, 0x100020, -0x7fff7fe0, 0, -0x80000000, 0x8000, 0x108020, -0x7ff00000, 0x100020, -0x7fffffe0, 0, 0x108000, 0x8020, -0x7fef8000, -0x7ff00000, 0x8020, 0, 0x108020, -0x7fefffe0, 0x100000, -0x7fff7fe0, -0x7ff00000, -0x7fef8000, 0x8000, -0x7ff00000, -0x7fff8000, 0x20, -0x7fef7fe0, 0x108020, 0x20, 0x8000, -0x80000000, 0x8020, -0x7fef8000, 0x100000, -0x7fffffe0, 0x100020, -0x7fff7fe0, -0x7fffffe0, 0x100020, 0x108000, 0, -0x7fff8000, 0x8020, -0x80000000, -0x7fefffe0, -0x7fef7fe0, 0x108000);
var spfunction3 = new Array(0x208, 0x8020200, 0, 0x8020008, 0x8000200, 0, 0x20208, 0x8000200, 0x20008, 0x8000008, 0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 0x208, 0x8000000, 0x8, 0x8020200, 0x200, 0x20200, 0x8020000, 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000, 0x8000208, 0x8, 0x8020208, 0x200, 0x8000000, 0x8020200, 0x8000000, 0x20008, 0x208, 0x20000, 0x8020200, 0x8000200, 0, 0x200, 0x20008, 0x8020208, 0x8000200, 0x8000008, 0x200, 0, 0x8020008, 0x8000208, 0x20000, 0x8000000, 0x8020208, 0x8, 0x20208, 0x20200, 0x8000008, 0x8020000, 0x8000208, 0x208, 0x8020000, 0x20208, 0x8, 0x8020008, 0x20200);
var spfunction4 = new Array(0x802001, 0x2081, 0x2081, 0x80, 0x802080, 0x800081, 0x800001, 0x2001, 0, 0x802000, 0x802000, 0x802081, 0x81, 0, 0x800080, 0x800001, 0x1, 0x2000, 0x800000, 0x802001, 0x80, 0x800000, 0x2001, 0x2080, 0x800081, 0x1, 0x2080, 0x800080, 0x2000, 0x802080, 0x802081, 0x81, 0x800080, 0x800001, 0x802000, 0x802081, 0x81, 0, 0, 0x802000, 0x2080, 0x800080, 0x800081, 0x1, 0x802001, 0x2081, 0x2081, 0x80, 0x802081, 0x81, 0x1, 0x2000, 0x800001, 0x2001, 0x802080, 0x800081, 0x2001, 0x2080, 0x800000, 0x802001, 0x80, 0x800000, 0x2000, 0x802080);
var spfunction5 = new Array(0x100, 0x2080100, 0x2080000, 0x42000100, 0x80000, 0x100, 0x40000000, 0x2080000, 0x40080100, 0x80000, 0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000, 0x2000000, 0x40080000, 0x40080000, 0, 0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, 0, 0x42000000, 0x2080100, 0x2000000, 0x42000000, 0x80100, 0x80000, 0x42000100, 0x100, 0x2000000, 0x40000000, 0x2080000, 0x42000100, 0x40080100, 0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 0x100, 0x2000000, 0x42080000, 0x42080100, 0x80100, 0x42000000, 0x42080100, 0x2080000, 0, 0x40080000, 0x42000000, 0x80100, 0x2000100, 0x40000100, 0x80000, 0, 0x40080000, 0x2080100, 0x40000100);
var spfunction6 = new Array(0x20000010, 0x20400000, 0x4000, 0x20404010, 0x20400000, 0x10, 0x20404010, 0x400000, 0x20004000, 0x404010, 0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 0x4010, 0, 0x400010, 0x20004010, 0x4000, 0x404000, 0x20004010, 0x10, 0x20400010, 0x20400010, 0, 0x404010, 0x20404000, 0x4010, 0x404000, 0x20404000, 0x20000000, 0x20004000, 0x10, 0x20400010, 0x404000, 0x20404010, 0x400000, 0x4010, 0x20000010, 0x400000, 0x20004000, 0x20000000, 0x4010, 0x20000010, 0x20404010, 0x404000, 0x20400000, 0x404010, 0x20404000, 0, 0x20400010, 0x10, 0x4000, 0x20400000, 0x404010, 0x4000, 0x400010, 0x20004010, 0, 0x20404000, 0x20000000, 0x400010, 0x20004010);
var spfunction7 = new Array(0x200000, 0x4200002, 0x4000802, 0, 0x800, 0x4000802, 0x200802, 0x4200800, 0x4200802, 0x200000, 0, 0x4000002, 0x2, 0x4000000, 0x4200002, 0x802, 0x4000800, 0x200802, 0x200002, 0x4000800, 0x4000002, 0x4200000, 0x4200800, 0x200002, 0x4200000, 0x800, 0x802, 0x4200802, 0x200800, 0x2, 0x4000000, 0x200800, 0x4000000, 0x200800, 0x200000, 0x4000802, 0x4000802, 0x4200002, 0x4200002, 0x2, 0x200002, 0x4000000, 0x4000800, 0x200000, 0x4200800, 0x802, 0x200802, 0x4200800, 0x802, 0x4000002, 0x4200802, 0x4200000, 0x200800, 0, 0x2, 0x4200802, 0, 0x200802, 0x4200000, 0x800, 0x4000002, 0x4000800, 0x800, 0x200002);
var spfunction8 = new Array(0x10001040, 0x1000, 0x40000, 0x10041040, 0x10000000, 0x10001040, 0x40, 0x10000000, 0x40040, 0x10040000, 0x10041040, 0x41000, 0x10041000, 0x41040, 0x1000, 0x40, 0x10040000, 0x10000040, 0x10001000, 0x1040, 0x41000, 0x40040, 0x10040040, 0x10041000, 0x1040, 0, 0, 0x10040040, 0x10000040, 0x10001000, 0x41040, 0x40000, 0x41040, 0x40000, 0x10041000, 0x1000, 0x40, 0x10040040, 0x1000, 0x41040, 0x10001000, 0x40, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x40000, 0x10001040, 0, 0x10041040, 0x40040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0, 0x10041040, 0x41000, 0x41000, 0x1040, 0x1040, 0x40040, 0x10000000, 0x10041000);
//create the 16 or 48 subkeys we will need
var keys = des_createKeys(key);
var m = 0, i, j, temp, temp2, right1, right2, left, right, looping;
var cbcleft, cbcleft2, cbcright, cbcright2
var endloop, loopinc;
var len = message.length;
var chunk = 0;
//set up the loops for single and triple des
var iterations = keys.length == 32 ? 3 : 9; //single or triple des
if (iterations == 3) { looping = encrypt ? new Array(0, 32, 2) : new Array(30, -2, -2); }
else { looping = encrypt ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array(94, 62, -2, 32, 64, 2, 30, -2, -2); }
//pad the message depending on the padding parameter
if (padding == 2) message += " "; //pad the message with spaces
else if (padding == 1) { temp = 8 - (len % 8); message += String.fromCharCode(temp, temp, temp, temp, temp, temp, temp, temp); if (temp == 8) len += 8; } //PKCS7 padding
else if (!padding) message += "\0\0\0\0\0\0\0\0"; //pad the message out with null bytes
//store the result here
var result = "";
var tempresult = "";
if (mode == 1) { //CBC mode
cbcleft = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++);
cbcright = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++);
m = 0;
}
//loop through each 64 bit chunk of the message
while (m < len) {
left = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++);
right = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++);
//for Cipher Block Chaining mode, xor the message with the previous result
if (mode == 1) { if (encrypt) { left ^= cbcleft; right ^= cbcright; } else { cbcleft2 = cbcleft; cbcright2 = cbcright; cbcleft = left; cbcright = right; } }
//first each 64 but chunk of the message must be permuted according to IP
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4);
temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16);
temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2);
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8);
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
left = ((left << 1) | (left >>> 31));
right = ((right << 1) | (right >>> 31));
//do this either 1 or 3 times for each chunk of the message
for (j = 0; j < iterations; j += 3) {
endloop = looping[j + 1];
loopinc = looping[j + 2];
//now go through and perform the encryption or decryption
for (i = looping[j]; i != endloop; i += loopinc) { //for efficiency
right1 = right ^ keys[i];
right2 = ((right >>> 4) | (right << 28)) ^ keys[i + 1];
//the result is attained by passing these bytes through the S selection functions
temp = left;
left = right;
right = temp ^ (spfunction2[(right1 >>> 24) & 0x3f] | spfunction4[(right1 >>> 16) & 0x3f]
| spfunction6[(right1 >>> 8) & 0x3f] | spfunction8[right1 & 0x3f]
| spfunction1[(right2 >>> 24) & 0x3f] | spfunction3[(right2 >>> 16) & 0x3f]
| spfunction5[(right2 >>> 8) & 0x3f] | spfunction7[right2 & 0x3f]);
}
temp = left; left = right; right = temp; //unreverse left and right
} //for either 1 or 3 iterations
//move then each one bit to the right
left = ((left >>> 1) | (left << 31));
right = ((right >>> 1) | (right << 31));
//now perform IP-1, which is IP in the opposite direction
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8);
temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2);
temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16);
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4);
//for Cipher Block Chaining mode, xor the message with the previous result
if (mode == 1) { if (encrypt) { cbcleft = left; cbcright = right; } else { left ^= cbcleft2; right ^= cbcright2; } }
tempresult += String.fromCharCode((left >>> 24), ((left >>> 16) & 0xff), ((left >>> 8) & 0xff), (left & 0xff), (right >>> 24), ((right >>> 16) & 0xff), ((right >>> 8) & 0xff), (right & 0xff));
chunk += 8;
if (chunk == 512) { result += tempresult; tempresult = ""; chunk = 0; }
} //for every 8 characters, or 64 bits in the message
//return the result as an array
return result + tempresult;
} //end of des
//des_createKeys
//this takes as input a 64 bit key (even though only 56 bits are used)
//as an array of 2 integers, and returns 16 48 bit keys
function des_createKeys(key) {
//declaring this locally speeds things up a bit
var pc2bytes0 = new Array(0, 0x4, 0x20000000, 0x20000004, 0x10000, 0x10004, 0x20010000, 0x20010004, 0x200, 0x204, 0x20000200, 0x20000204, 0x10200, 0x10204, 0x20010200, 0x20010204);
var pc2bytes1 = new Array(0, 0x1, 0x100000, 0x100001, 0x4000000, 0x4000001, 0x4100000, 0x4100001, 0x100, 0x101, 0x100100, 0x100101, 0x4000100, 0x4000101, 0x4100100, 0x4100101);
var pc2bytes2 = new Array(0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808, 0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808);
var pc2bytes3 = new Array(0, 0x200000, 0x8000000, 0x8200000, 0x2000, 0x202000, 0x8002000, 0x8202000, 0x20000, 0x220000, 0x8020000, 0x8220000, 0x22000, 0x222000, 0x8022000, 0x8222000);
var pc2bytes4 = new Array(0, 0x40000, 0x10, 0x40010, 0, 0x40000, 0x10, 0x40010, 0x1000, 0x41000, 0x1010, 0x41010, 0x1000, 0x41000, 0x1010, 0x41010);
var pc2bytes5 = new Array(0, 0x400, 0x20, 0x420, 0, 0x400, 0x20, 0x420, 0x2000000, 0x2000400, 0x2000020, 0x2000420, 0x2000000, 0x2000400, 0x2000020, 0x2000420);
var pc2bytes6 = new Array(0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002, 0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002);
var pc2bytes7 = new Array(0, 0x10000, 0x800, 0x10800, 0x20000000, 0x20010000, 0x20000800, 0x20010800, 0x20000, 0x30000, 0x20800, 0x30800, 0x20020000, 0x20030000, 0x20020800, 0x20030800);
var pc2bytes8 = new Array(0, 0x40000, 0, 0x40000, 0x2, 0x40002, 0x2, 0x40002, 0x2000000, 0x2040000, 0x2000000, 0x2040000, 0x2000002, 0x2040002, 0x2000002, 0x2040002);
var pc2bytes9 = new Array(0, 0x10000000, 0x8, 0x10000008, 0, 0x10000000, 0x8, 0x10000008, 0x400, 0x10000400, 0x408, 0x10000408, 0x400, 0x10000400, 0x408, 0x10000408);
var pc2bytes10 = new Array(0, 0x20, 0, 0x20, 0x100000, 0x100020, 0x100000, 0x100020, 0x2000, 0x2020, 0x2000, 0x2020, 0x102000, 0x102020, 0x102000, 0x102020);
var pc2bytes11 = new Array(0, 0x1000000, 0x200, 0x1000200, 0x200000, 0x1200000, 0x200200, 0x1200200, 0x4000000, 0x5000000, 0x4000200, 0x5000200, 0x4200000, 0x5200000, 0x4200200, 0x5200200);
var pc2bytes12 = new Array(0, 0x1000, 0x8000000, 0x8001000, 0x80000, 0x81000, 0x8080000, 0x8081000, 0x10, 0x1010, 0x8000010, 0x8001010, 0x80010, 0x81010, 0x8080010, 0x8081010);
var pc2bytes13 = new Array(0, 0x4, 0x100, 0x104, 0, 0x4, 0x100, 0x104, 0x1, 0x5, 0x101, 0x105, 0x1, 0x5, 0x101, 0x105);
//how many iterations (1 for des, 3 for triple des)
var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys
//stores the return keys
var keys = new Array(32 * iterations);
//now define the left shifts which need to be done
var shifts = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0);
//other variables
var lefttemp, righttemp, m = 0, n = 0, temp;
for (var j = 0; j < iterations; j++) { //either 1 or 3 iterations
var left = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++);
var right = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++);
var temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4);
temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16);
temp = ((left >>> 2) ^ right) & 0x33333333; right ^= temp; left ^= (temp << 2);
temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16);
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8);
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
//the right side needs to be shifted and to get the last four bits of the left side
temp = (left << 8) | ((right >>> 20) & 0x000000f0);
//left needs to be put upside down
left = (right << 24) | ((right << 8) & 0xff0000) | ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0);
right = temp;
//now go through and perform these shifts on the left and right keys
for (var i = 0; i < shifts.length; i++) {
//shift the keys either one or two bits to the left
if (shifts[i]) { left = (left << 2) | (left >>> 26); right = (right << 2) | (right >>> 26); }
else { left = (left << 1) | (left >>> 27); right = (right << 1) | (right >>> 27); }
left &= -0xf; right &= -0xf;
//now apply PC-2, in such a way that E is easier when encrypting or decrypting
//this conversion will look like PC-2 except only the last 6 bits of each byte are used
//rather than 48 consecutive bits and the order of lines will be according to
//how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7
lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf]
| pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf]
| pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf]
| pc2bytes6[(left >>> 4) & 0xf];
righttemp = pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf]
| pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf]
| pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf]
| pc2bytes13[(right >>> 4) & 0xf];
temp = ((righttemp >>> 16) ^ lefttemp) & 0x0000ffff;
keys[n++] = lefttemp ^ temp; keys[n++] = righttemp ^ (temp << 16);
}
} //for each iterations
//return the keys we've created
return keys;
} //end of des_createKeys
////////////////////////////////////////////////////////////
function stringToHexForDES(inputS) {
var s = des('$AZKOSS$', suffix8Blank(inputS), 1, 0);
var r = "";
var hexes = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");
for (var i = 0; i < s.length; i++) { r += hexes[s.charCodeAt(i) >> 4] + hexes[s.charCodeAt(i) & 0xf]; }
return r;
}
function hexToStringForDES(h) {
var r = "";
for (var i = (h.substr(0, 2) == "0x") ? 2 : 0; i < h.length; i += 2) { r += String.fromCharCode(parseInt(h.substr(i, 2), 16)); }
return r;
}
function suffix8Blank(str) {
for (var i = 0; i < 8; i++) {
str += " ";
}
return str;
}
module.exports.stringToHexForDES = stringToHexForDES;
module.exports.hexToStringForDES = hexToStringForDES;

@ -0,0 +1,30 @@
var log = wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : null
module.exports = {
debug() {
if (!log) return
log.debug.apply(log, arguments)
},
info() {
if (!log) return
log.info.apply(log, arguments)
},
warn() {
if (!log) return
log.warn.apply(log, arguments)
},
error() {
if (!log) return
log.error.apply(log, arguments)
},
setFilterMsg(msg) { // 从基础库2.7.3开始支持
if (!log || !log.setFilterMsg) return
if (typeof msg !== 'string') return
log.setFilterMsg(msg)
},
addFilterMsg(msg) { // 从基础库2.8.1开始支持
if (!log || !log.addFilterMsg) return
if (typeof msg !== 'string') return
log.addFilterMsg(msg)
}
}

@ -0,0 +1,211 @@
// const app = getApp();
// const mqUtils = require('./mqttSubstribe.js');
/*********************** */
/**
* 校验用户session信息是否有效
*/
const checkLogin = function(userInfo) {
if (userInfo) {
wx.setStorageSync("userInfo", userInfo);
}
console.log(userInfo);
return;
var that = this;
wx.checkSession({
success: function(res) {
console.log("检测session", res);
var openId = wx.getStorageSync("openId");
var userId = wx.getStorageSync("userId");
var loginKey = wx.getStorageSync("loginKey");
if (app.utils.isBlank(openId) || app.utils.isBlank(userId) || app.utils.isBlank(loginKey)) {
that.login();
} else {
that.checkLoginKey(userId, loginKey);
}
},
fail: function(res) {
that.login();
}
});
};
/**
* 校验loginKey是否有效
* 1调用服务器接口校验loginkey是否有效
* 1登录有效 重置mqtt订阅topic并连接mqtt
* 0无效 重新登录 获取loginkey
*
*/
const checkLoginKey = function(userId, loginKey) {
var that = this;
wx.request({
url: app.globalData.serverUrlExtend,
method: "POST",
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
"type": "wxdcechecksession",
"userId": userId,
"loginKey": loginKey
},
success: function(res) {
var result = res.data;
console.log(">>>>checkLoginKey :" + result);
if (result.status == 0) {
that.login();
} else {
// // 刷新mqtt订阅topic
// mqUtils.reaportConnect();
console.log("登录校验通过");
}
},
fail: function(res) {
console.log("校验loginKey是否有效: ");
}
});
};
/**
* 登录
* 1调用微信登录
* 1调用服务器接口 获取sessionkey和登录态 放入缓存有缓存时间
* 1调用微信获取用户信息并调用服务器接口解密用户信息
*/
const login = function() {
var that = this;
wx.login({
success: function(loginResult) {
var code = loginResult.code;
// that.getMemberSession(code);
// 调用服务器接口解密数据并根据unionId获取/创建user
wx.request({
url: app.globalData.serverUrlExtend,
method: "POST",
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
"type": "wxdcjscode2session",
"code": code,
"appid": app.globalData.appid,
"secret": app.globalData.secret
},
success: function(res) {
console.log("session", res);
var result = res.data;
if (result.status == 1) {
app.openId = result.data.openId;
app.loginKey = result.data.loginKey;
app.wc.put("openId", result.data.openId, app.validTime);
app.wc.put("loginKey", result.data.loginKey, app.validTime);
// 获取用户信息
that.decodeUserData();
} else {
app.msg.showMsg("提示", "请求session_key失败");
}
},
fail: function(res) {
app.msg.showMsg("提示", "获取/创建user信息失败");
}
});
}
});
};
/**
* 获取运维存储用户信息
*/
const decodeUserData = function() {
var that = this;
wx.getUserInfo({
withCredentials: true,
success: function(res) {
var nickName = res.userInfo.nickName;
var encryptedData = res.encryptedData;
var iv = res.iv;
// 调用服务器接口解密数据并根据unionId获取/创建user
// 发起登录请求
wx.request({
url: app.globalData.serverUrlExtend,
method: "POST",
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
"type": "wxdcgetuser",
"tenantId": app.tenantId,
"wid": app.wid,
"openId": app.openId,
"loginKey": wx.getStorageSync("loginKey"),
"encryptedData": encryptedData,
"iv": iv,
"nickName": nickName,
"sex": 1
},
success: function(res) {
var result = res.data;
if (result.status == 1) {
wx.setStorageSync("userId", result.data.user.id);
wx.setStorageSync("vipMobile", result.data.user.vipMobile);
wx.setStorageSync("unionid", result.data.user.unionid);
app.userId = result.data.user.id;
app.globalData.appKey = result.data.appKey;
app.globalData.appSecret = result.data.appSecret;
app.vipMobile = result.data.user.vipMobile;
app.unionid = result.data.user.unionid;
// 刷新mqtt订阅topic
// app.topic = app.baseTopic + "/" + app.wid + "/" + app.userId;
// 重新连接mqtt
// mqUtils.reaportConnect();
}
},
fail: function(res) {
app.msg.showMsg("提示", "解析user信息失败");
}
});
},
fail: function(res) {
app.msg.showMsg("提示", "获取user信息失败");
}
});
};
/**
* 获取会员session
*/
const getMemberSession = function(code) {
var params = {
'appid': app.globalData.appid,
'secret': app.globalData.secret,
'code': code,
'method': 'weixin.small.jscode2session'
}
var ignores = [];
app.jsapi.memberApi(app.globalData.appMemberKey, app.globalData.appMemberSecret, app.globalData.serverMemberUrl).ajax(params, ignores,
function(json) {
console.log(json);
},
function(error) {
}
);
}
module.exports = {
checkLogin: checkLogin,
login: login,
decodeUserData: decodeUserData,
checkLoginKey: checkLoginKey,
getMemberSession: getMemberSession
}

@ -0,0 +1,214 @@
var rotateLeft = function (lValue, iShiftBits) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
var addUnsigned = function (lX, lY) {
var lX4, lY4, lX8, lY8, lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
if (lX4 | lY4) {
if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
} else {
return (lResult ^ lX8 ^ lY8);
}
}
var F = function (x, y, z) {
return (x & y) | ((~x) & z);
}
var G = function (x, y, z) {
return (x & z) | (y & (~z));
}
var H = function (x, y, z) {
return (x ^ y ^ z);
}
var I = function (x, y, z) {
return (y ^ (x | (~z)));
}
var FF = function (a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var GG = function (a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var HH = function (a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var II = function (a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var convertToWordArray = function (string) {
var lWordCount;
var lMessageLength = string.length;
var lNumberOfWordsTempOne = lMessageLength + 8;
var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64;
var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16;
var lWordArray = Array(lNumberOfWords - 1);
var lBytePosition = 0;
var lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
return lWordArray;
};
var wordToHex = function (lValue) {
var WordToHexValue = "",
WordToHexValueTemp = "",
lByte, lCount;
for (lCount = 0; lCount <= 3; lCount++) {
lByte = (lValue >>> (lCount * 8)) & 255;
WordToHexValueTemp = "0" + lByte.toString(16);
WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2);
}
return WordToHexValue;
};
var uTF8Encode = function (string) {
string = string.replace(/\x0d\x0a/g, "\x0a");
var output = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
output += String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
output += String.fromCharCode((c >> 6) | 192);
output += String.fromCharCode((c & 63) | 128);
} else {
output += String.fromCharCode((c >> 12) | 224);
output += String.fromCharCode(((c >> 6) & 63) | 128);
output += String.fromCharCode((c & 63) | 128);
}
}
return output;
};
function md5(string) {
var x = Array();
var k, AA, BB, CC, DD, a, b, c, d;
var S11 = 7,
S12 = 12,
S13 = 17,
S14 = 22;
var S21 = 5,
S22 = 9,
S23 = 14,
S24 = 20;
var S31 = 4,
S32 = 11,
S33 = 16,
S34 = 23;
var S41 = 6,
S42 = 10,
S43 = 15,
S44 = 21;
string = uTF8Encode(string);
x = convertToWordArray(string);
a = 0x67452301;
b = 0xEFCDAB89;
c = 0x98BADCFE;
d = 0x10325476;
for (k = 0; k < x.length; k += 16) {
AA = a;
BB = b;
CC = c;
DD = d;
a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
a = addUnsigned(a, AA);
b = addUnsigned(b, BB);
c = addUnsigned(c, CC);
d = addUnsigned(d, DD);
}
var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
return tempValue.toLowerCase();
}
module.exports.md5 = md5

@ -0,0 +1,38 @@
var app = getApp();
var mqUtils = require('mqttSubstribe.js');
var timerHolder = null;
var startMonitor = function(currentPage, type) {
var that = this;
var time = 35000;
app.page = currentPage;
// 获取c li
var client = app.client;
if (client && type == 0) { //
console.log("重新订阅主题");
mqUtils.doSubscribe();
}
// 线连接一次
// mqUtils.doConnect(page);
if (!timerHolder) {
timerHolder = setInterval(function() {
var client = app.client;
if (!client || !client.isConnected()) {
console.log(client);
console.log("mqtt----------检测连接")
mqUtils.doConnect();
} else {
console.log(" mqttMonitor 已连接....");
}
}, 1500);
}
}
// 取消订阅主题
var startCancel = function() {
mqUtils.unsubscribe();
}
module.exports = {
startMonitor: startMonitor,
startCancel: startCancel,
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,141 @@
var app = getApp();
const Paho = require('./paho-mqtt.js');
var mqttApi = {
/*---- 获取连接 ----*/
connect: function (cb) {
var that = this;
var client = app.mqttParam.client;
if (client && client.isConnected()) {
return;
}
var userInfo = wx.getStorageSync("userInfo");
var randomString = "";
for (var i = 1; i <= 5; i++) {
randomString += parseInt(Math.random() * 10);
}
var clientId = "swxclientId-member-" + app.globalData.tenantId + "-" + app.globalData.shopNo + "-" + app.globalData.posNo + randomString;
client = new Paho.Client(app.mqttParam.wsServer, 0, clientId);
client.connect({
useSSL: false,
cleanSession: false,
keepAliveInterval: 2,
onSuccess: function () {
app.mqttParam.client = client;
client.onMessageArrived = function (msg) {
console.log("----------订阅消息", msg);
var title = msg.destinationName;
if (title.indexOf('pay') > -1) {
if (typeof app.globalFunction.scanPayCodeCallBack === 'function') {
app.globalFunction.scanPayCodeCallBack(msg.payloadString);
}
} else if (title.indexOf('couponconsume') > -1) {
app.globalFunction.consumeCouponCallBack(msg.payloadString);
}
}
client.onConnectionLost = function (responseObject) {
if (typeof app.globalFunction.onConnectionLost === 'function') {
return app.globalData.onConnectionLost(responseObject)
}
if (responseObject.errorCode !== 0) {
}
}
if (typeof cb === 'function') {
cb();
}
}
});
},
/*----订阅 ----*/
subscribe: function (filter, subscribeOptions) {
var that = this;
var client = app.mqttParam.client;
if (client && client.isConnected()) {
client.subscribe(filter, {
qos: 2
});
console.log("mqtt订阅成功")
} else {
that.connect(function () {
client = app.mqttParam.client;
if (client && client.isConnected()) {
client.subscribe(filter, {
qos: 2
});
console.log("mqtt订阅成功")
}
})
}
},
/*----废弃订阅 ----*/
unsubscribe: function (filter, subscribeOptions) {
var client = app.mqttParam.client;
if (client && client.isConnected()) {
client.unsubscribe(filter);
}
},
/*----发布消息----*/
publish: function (topic, message, qos = 0, retained = false) {
// 发布
var that = this;
var client = app.mqttParam.client;
if (client && client.isConnected()) {
var message = new Paho.Message(message);
message.destinationName = topic;
message.qos = qos;
message.retained = retained;
return client.send(message);
} else {
that.connect(function () {
client = app.mqttParam.client;
if (client && client.isConnected()) {
var message = new Paho.Message(message);
message.destinationName = topic;
message.qos = qos;
message.retained = retained;
return client.send(message);
return;
}
});
wx.showToast({
title: '发送失败',
icon: 'success',
duration: 2000
});
}
},
setOnMessageArrived: function (onMessageArrived) {
if (typeof onMessageArrived === 'function') {
onMessageArrived();
}
},
startReconnect: function () {
// 重连机制
var that = this;
var interval = app.interval;
clearInterval(interval);
interval = setInterval(function () {
var client = app.mqttParam.client;
if (client != null) {
that.connect();
}
}, 10000);
},
setOnConnectionLost: function (onConnectionLost) {
if (typeof onConnectionLost === 'function') {
onConnectionLost();
}
}
}
module.exports = {
api: mqttApi
}

@ -0,0 +1,156 @@
const app = getApp()
const mqtt = require("mqtt.js")
/**
*
*/
var mqttClient = function() {
app.client = mqtt.connect('wxs://iotv2.ffcygl.com/mqtt', {
// 心跳请求单位s
keepalive: 30,
clientId: app.openId,
protocolId: 'MQTT',
protocolVersion: 4,
username: 'admin',
password: 'admin',
reconnectPeriod: 5000,
});
app.client.on('message', function(topic, message, packet) {
console.log(message.toString());
if (app.that) app.that.onMessage(topic, JSON.parse(message.toString()));
});
app.client.on('connect', function(err) {
console.log("监听连接状态", err);
});
app.client.on('close', function(res) {
// console.log("监听连接关闭");
if (!app.client._activeEndFlag) {
// 重新建立连接
app.client.reconnect()
}
});
app.client.on('error', function(err) {
console.log("连接失败", err);
});
}
/**
* mqtt 重新连接
*/
var mqttConnect = function() {
if (app.client == null) {
mqttClient();
}
app.client.reconnect()
}
/**
* mqtt 断开连接
*/
var mqttClose = function() {
if (app.client == null) {
mqttClient();
}
app.client.end(true, function(err) {
console.log("断开连接", err);
});
}
/**
* 订阅主题
*/
var mqttSubscribe = function(top, page) {
if (app.client == null) {
mqttClient();
}
if (top == 1 && app.appTop1) {
mqttunSubscribe(app.appTop1);
}
if (top == 2 && app.appTop2) {
mqttunSubscribe(app.appTop2);
}
console.log("开始订阅信息" + top, mqttTop(top));
app.client.subscribe(mqttTop(top), function(err) {
console.log("订阅主题" + mqttTop(top), err);
})
}
/**
* 订阅主题
*/
var mqttSubscribe1 = function(top) {
app.client.subscribe(top, function(err) {
console.log("订阅主题", err);
})
}
/**
* 取消订阅
*/
var mqttunSubscribe = function(top) {
app.client.unsubscribe(top, function(err) {
console.log("取消订阅", err,top);
});
}
/**
* 发布订阅
*/
var mqttPubish = function(top) {
if (app.client == null) {
mqttClient();
}
app.client.publish(top, "hello");
}
/**
* 接收消息
*/
var mqttOn = function(that) {
if (app.client == null) {
mqttClient();
}
app.that = that;
}
/**
* 订单主题
*/
var mqttTop = function(type) {
var store = wx.getStorageSync("store");
var tenantId = app.globalData.tenantId;
var storeId = store.storeId;
if (type == 1) { // 接单主题
return app.appTop1 = app.baseTopic + "/" + app.openId;
}
if (type == 2) { // 售罄主题
return app.appTop2 = app.baseTopic2 + "/" + tenantId + "/" + storeId;
}
if (type == 3) {
return app.getPayCode();
}
if (type == 4) {
return app.getCouponConsumeCode(app.globalData.oldCode);
}
if (type == 5) {
return app.appTop3 = app.baseTopic3+ "/" + tenantId + "/" + storeId;
}
if(type==6) { //骑手接单
var orderNo=app.globalData.orderNo;
return app.baseTopic4 + "/" + tenantId + "/" + orderNo;
}
}
module.exports = {
mqttunSubscribe: mqttunSubscribe,
mqttSubscribe: mqttSubscribe,
mqttPubish: mqttPubish,
mqttOn: mqttOn,
mqttTop: mqttTop
}

@ -0,0 +1,257 @@
const app = getApp();
const {
Client,
Message
} = require('paho-mqtt.js')
var page = app.page;
// 初始化订阅信息
var init = function() {
if (undefined == app.wid || app.wid.length == 0) {
console.error("mqtt wid 值等于undefined或者长度等于0");
return false;
}
if (undefined == app.userId || app.userId.length == 0) {
console.error("mqtt userId 值等于undefined或者长度等于0 ");
return false;
}
var store = wx.getStorageSync("store");
app.topic = [];
var tenantId = store.tenantId;
var storeId = store.id;
var topic1 = app.baseTopic + "/" + app.wid + "/" + app.userId;
app.topic.push(topic1);
var topic2 = app.baseTopic2 + "/" + tenantId + "/" + storeId;
app.topic.push(topic2);
return true;
};
var randomString = function(len) {
len = len || 32;
var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
var maxPos = $chars.length;
var pwd = '';
for (let i = 0; i < len; i++) {
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
};
// 订阅
var subscribe = function(filter, subscribeOptions) {
var client = app.client;
if (client && client.isConnected()) {
for (var i = 0; i < filter.length; i++) {
var topic = filter[i];
client.subscribe(topic, subscribeOptions);
}
return;
}
};
// 发布
var publish = function(topic, message, qos = 2, retained = false) {
var client = app.client;
if (client && client.isConnected()) {
var message = new Message(message);
message.destinationName = topic;
message.qos = qos;
message.retained = retained;
console.log("发布成功");
return client.send(message);
}
console.log("发布失败");
};
var setOnMessageArrived = function(onMessageArrived) {
if (typeof onMessageArrived === 'function') {
this.data.onMessageArrived = onMessageArrived
}
};
var setOnConnectionLost = function(onConnectionLost) {
if (typeof onConnectionLost === 'function') {
this.data.onConnectionLost = onConnectionLost
}
};
var doSubscribe = function() {
this.subscribe(app.topic, {
qos: 2
})
};
var doPublish = function() {
var topic = app.topic[1];
var content = {
"type": 1, //(1售罄2开卖)
"isAll": false,
"productIds": "644721258512125952", //,逗号分隔
"date": "2018-08-16 00:00:00",
"storeId": ""
}
this.publish(topic, JSON.stringify(content), 1, false)
};
/**
* 链接
*/
var doConnect = function() {
var that = this;
if (app.client && app.client.isConnected()) {
// 取消连接
// app.client.disconnect();
console.log("mqtt 已处于连接中");
return;
}
var initFlag = that.init();
if (initFlag) {
var client = app.client;
if (!client) {
client = new Client('wss://iotv2.ffcygl.com/mqtt', app.openId);
}
client.connect({
useSSL: true,
cleanSession: true,
keepAliveInterval: 30,
onSuccess: function() {
app.client = client;
console.log("mqtt 连接成功 ++++++++++ 发布订阅消息");
// console.log(app.topic);
// 订阅消息
that.doSubscribe();
// 接收到消息
client.onMessageArrived = function(msg) {
console.log("++++++++++++++++++++++++++ mqtt 消息通知");
var result = JSON.parse(msg.payloadString);
var topic = msg.topic;
var reg = RegExp(/wxdc\/sell/);
if (topic.match(reg)) {
if (app.page) {
app.page.doHandleMqttMessage(result);
}
} else {
console.log("订单")
that.doSomeThing(result);
}
};
// 链接丢失
client.onConnectionLost = function(responseObject) {
console.error("mqtt 链接丢失");
console.log(responseObject);
};
// setInterval(function() {
// that.doPublish();
// }, 5000);
}
});
} else {
console.error("mqtt 检测到userId或者wid异常 暂不连接");
}
};
var reaportConnect = function() {
if (null != app.client && app.client && app.client.isConnected()) {
//this.doSubscribe();
} else {
app.client = null;
this.doConnect();
}
}
/**
* 取消订阅主题
*/
var unsubscribe = function() {
console.log("============取消订阅主题");
console.log(app.topic);
var client = app.client;
if (!client) {
// 取消连接
return;
}
// 取消订阅
if (client && client.isConnected()) {
var topic1 = app.topic[1];
client.unsubscribe(topic1, 2);
// 重新发布订阅消息
var initFlag = this.init();
var topic2 = app.topic[1];
// console.log("重新发布订阅消息============" + JSON.stringify(topic));
client.subscribe(topic2, {
qos: 2
});
}
}
/**
* 收到通知后业务处理
*/
var doSomeThing = function(result) {
console.log("----------", result);
// 如果当前是在订单详情页面 重新加载订单数据
var pages = getCurrentPages()
var currentPage = pages[pages.length - 1]
var url = currentPage.route
if (url.indexOf("detail/detail") > -1) {
currentPage.loadOrderInfo();
return;
}
if (undefined != result) {
var orderNo = result.orderNo;
orderNo = orderNo.substring(orderNo.length - 6, orderNo.length);
var msg = "";
switch (result.type) {
case 3:
msg = "抱歉,商家取消了订单 订单尾号:" + orderNo;
break;
case 4:
msg = "商家已接单啦 取餐码:" + result.takeNo;
break;
case 5:
msg = "商家已退单 订单尾号:" + orderNo;
break;
case 6:
msg = "抱歉,商家拒绝了您的退款请求 订单尾号:" + orderNo;
break;
default:
}
wx.showModal({
title: "提示",
content: msg,
showCancel: false,
success: function(res) {
if (res.confirm) {
app.page.doCancelOrder();
}
}
});
}
}
module.exports = {
init: init,
randomString: randomString,
subscribe: subscribe,
unsubscribe: unsubscribe,
publish: publish,
setOnMessageArrived: setOnMessageArrived,
setOnConnectionLost: setOnConnectionLost,
doSubscribe: doSubscribe,
doPublish: doPublish,
doConnect: doConnect,
reaportConnect: reaportConnect,
doSomeThing: doSomeThing
}

@ -0,0 +1,12 @@
const showMsg = function(title, msg) {
wx.showModal({
title: title,
content: msg,
showCancel: false,
});
}
module.exports = {
showMsg: showMsg
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,375 @@
var $ = {
extend: function(flag, p, c) {
var c = c || {};
for (var i in p) {
if (!p.hasOwnProperty(i)) {
continue;
}
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
},
each: function(object, callback, args) {
var name, i = 0,
length = object.length,
isObj = length === undefined || typeof object == 'function';
if (args) {
if (isObj) {
for (name in object) {
if (callback.apply(object[name], args) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.apply(object[i++], args) === false) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if (isObj) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.call(object[i], i, object[i++]) === false) {
break;
}
}
}
}
return object;
}
}
function sha1(x, blen) {
function add32(a, b) {
var lsw = (a & 0xFFFF) + (b & 0xFFFF);
var msw = (a >> 16) + (b >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function AA(a, b, c, d, e) {
b = (b >>> 27) | (b << 5);
var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF) + (e & 0xFFFF);
var msw = (a >> 16) + (b >> 16) + (c >> 16) + (d >> 16) + (e >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function RR(w, j) {
var n = w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16];
return (n >>> 31) | (n << 1);
}
var len = blen * 8;
x[len >> 5] |= 0x80 << (24 - len % 32);
x[((len + 64 >> 9) << 4) + 15] = len;
var w = new Array(80);
var k1 = 0x5A827999;
var k2 = 0x6ED9EBA1;
var k3 = 0x8F1BBCDC;
var k4 = 0xCA62C1D6;
var h0 = 0x67452301;
var h1 = 0xEFCDAB89;
var h2 = 0x98BADCFE;
var h3 = 0x10325476;
var h4 = 0xC3D2E1F0;
for (var i = 0; i < x.length; i += 16) {
var j = 0;
var t;
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
while (j < 16) {
w[j] = x[i + j];
t = AA(e, a, d ^ (b & (c ^ d)), w[j], k1);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 20) {
w[j] = RR(w, j);
t = AA(e, a, d ^ (b & (c ^ d)), w[j], k1);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 40) {
w[j] = RR(w, j);
t = AA(e, a, b ^ c ^ d, w[j], k2);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 60) {
w[j] = RR(w, j);
t = AA(e, a, (b & c) | (d & (b | c)), w[j], k3);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
while (j < 80) {
w[j] = RR(w, j);
t = AA(e, a, b ^ c ^ d, w[j], k4);
e = d;
d = c;
c = (b >>> 2) | (b << 30);
b = a;
a = t;
j++;
}
h0 = add32(h0, a);
h1 = add32(h1, b);
h2 = add32(h2, c);
h3 = add32(h3, d);
h4 = add32(h4, e);
}
return [h0, h1, h2, h3, h4];
}
var encoding = {
strToBe32s: function(str) {
var be = [];
var len = Math.floor(str.length / 4);
var i, j;
for (i = 0, j = 0; i < len; i++, j += 4) {
be[i] = ((str.charCodeAt(j) & 0xff) << 24) | ((str.charCodeAt(j + 1) & 0xff) << 16) | ((str.charCodeAt(j + 2) & 0xff) << 8) | (str.charCodeAt(j + 3) & 0xff);
}
while (j < str.length) {
be[j >> 2] |= (str.charCodeAt(j) & 0xff) << (24 - (j * 8) % 32);
j++;
}
return be;
},
be32sToHex: function(be) {
var hex = '0123456789ABCDEF';
var str = '';
for (var i = 0; i < be.length * 4; i++) {
str += hex.charAt((be[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex.charAt((be[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
}
return str;
}
};
$.encoding = encoding;
var digests = {
hexSha1Str: function(str) {
return $.encoding.be32sToHex($.digests.sha1Str(str));
},
sha1Str: function(str) {
return sha1($.encoding.strToBe32s(str), str.length);
}
};
$.digests = digests;
var utils = {
inArray: function(needle, array, bool) {
if (typeof needle == "string" || typeof needle == "number") {
var len = array.length;
for (var i = 0; i < len; i++) {
if (needle === array[i]) {
if (bool) {
return i;
}
return true;
}
}
return false;
}
}
};
$.utils = utils;
var api = function(openAppKey, openAppSecret, url) {
return {
test1: function() {
console.log("test1");
},
sign: function(params, ignores) {
var timestamp = (new Date()).valueOf();
var appSecret = openAppSecret;
var defaults = {
appKey: openAppKey,
v: '1.0',
format: 'json',
locale: 'zh-CN',
client: 'weixin',
timestamp: timestamp
};
var options = $.extend(true, defaults, params);
var paramNames = [];
$.each(options, function(key, value) {
if (!$.utils.inArray(key, ignores, false)) {
paramNames.push(key);
}
});
paramNames = paramNames.sort();
var stringBuilder = [];
stringBuilder.push(appSecret);
$.each(paramNames, function(inx, value) {
stringBuilder.push(value);
stringBuilder.push(options[value]);
});
stringBuilder.push(appSecret);
options.sign = $.digests.hexSha1Str(stringBuilder.join(""));
return options;
},
ajax: function(params, ignores, success, error) {
var data = this.sign(params, ignores);
wx.request({
url: url,
method: 'POST',
data: data,
dataType: 'json',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function(json) {
if (json.errorToken) {
if (typeof error == 'function') {
error.call(error, json);
}
} else {
if (typeof success == 'function') {
success.call(success, json);
}
}
},
fail: function() {
if (typeof error == 'function') {
var json = {
"errorToken": "@@$-ERROR_TOKEN$-@@",
"code": "0",
"message": "网络好像有问题,无法访问云端服务!",
"solution": "请检查本机网络是否能正常访问互联网",
"subErrors": ""
};
error.call(error, json);
}
}
});
}
}
}
/**
* 会员授权
*/
var memberApi = function (openAppKey, openAppSecret, url) {
return {
test1: function () {
console.log("test1");
},
sign: function (params, ignores) {
var timestamp = (new Date()).valueOf();
var appSecret = openAppSecret;
var defaults = {
appKey: openAppKey,
v: '1.0',
format: 'json',
locale: 'zh-CN',
client: 'web',
timestamp: timestamp
};
var options = $.extend(true, defaults, params);
var paramNames = [];
$.each(options, function (key, value) {
if (!$.utils.inArray(key, ignores, false)) {
paramNames.push(key);
}
});
paramNames = paramNames.sort();
var stringBuilder = [];
stringBuilder.push(appSecret);
$.each(paramNames, function (inx, value) {
stringBuilder.push(value);
stringBuilder.push(options[value]);
});
stringBuilder.push(appSecret);
options.sign = $.digests.hexSha1Str(stringBuilder.join(""));
return options;
},
ajax: function (params, ignores, success, error) {
var data = this.sign(params, ignores);
wx.request({
url: url,
method: 'POST',
data: data,
dataType: 'json',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (json) {
if (json.errorToken) {
if (typeof error == 'function') {
error.call(error, json);
}
} else {
if (typeof success == 'function') {
success.call(success, json);
}
}
},
fail: function () {
if (typeof error == 'function') {
var json = {
"errorToken": "@@$-ERROR_TOKEN$-@@",
"code": "0",
"message": "网络好像有问题,无法访问云端服务!",
"solution": "请检查本机网络是否能正常访问互联网",
"subErrors": ""
};
error.call(error, json);
}
}
});
}
}
}
module.exports = {
api: api,
memberApi: memberApi
};

File diff suppressed because it is too large Load Diff

@ -0,0 +1,135 @@
var jsapi = require('api.js');
var util = require('util.js');
var app = getApp();
var pointInfo = {
/*--------随机字符串-------*/
randomString: function() {
var randomString = "";
for (var i = 1; i <= 5; i++) {
randomString += parseInt(Math.random() * 10);
}
return randomString;
},
/*--------自动生成订单号-------*/
generateTradeNo: function() {
return util.formatTimeV(new Date(), 'yyMMddhhmmss') + app.globalData.shopNo + this.randomString();
},
/*--------查询积分商品列表-------*/
queryPointProductList: function(type) {
var data = {
"wid": app.globalData.memberWid,
"method": "query.point.product.list",
"pageType": type
};
return jsapi.cardApi.ajax(data, []);
},
/*--------查询积分商品详情-------*/
queryPointProductDetail: function (id, schemeId) {
var data = {
"method": "query.point.product.detail",
"productId": id,
"schemeId": schemeId
};
return jsapi.cardApi.ajax(data, []);
},
/*--------创建积分商城订单-------*/
createPointProductOrder: function (payAmount, payPoint, schemeId, payType, addressList, num, imageUrl, remark) {
var data = {
"method": "weixin.point.product.order.create",
"wid": app.globalData.memberWid,
"cardNo": wx.getStorageSync("cardNo"),
"mobile": wx.getStorageSync("cardInfo").mobile,
"openid": wx.getStorageSync("openId"),
"outTradeNo": this.generateTradeNo(),
"payAmount": payAmount,
"payPoint": payPoint,
"createTime": util.formatTimeV(new Date(), 'yyyy-MM-dd hh:mm:ss'),
"schemeId": schemeId,
"payType": payType,
"num": num,
"imageUrl": imageUrl,
"groupNo": app.globalData.groupNo,
"remark":remark
};
var ignores = ["mobile", "payType", "remark", "imageUrl"];
if (addressList){
if (addressList.receiveMobile){
ignores.push("receiveMobile");
data.receiveMobile = addressList.receiveMobile
}
if (addressList.receiveAddress) {
ignores.push("receiveAddress");
data.receiveAddress = addressList.receiveAddress
}
if (addressList.receiveDoor) {
ignores.push("receiveDoor");
data.receiveDoor = addressList.receiveDoor
}
if (addressList.receiveName) {
ignores.push("receiveName");
data.receiveName = addressList.receiveName
}
}
return jsapi.cardApi.ajax(data, ignores);
},
/*--------拉取微信预支付参数-------*/
pullOrderParam: function (outTradeNo, payAmount, type, schemeId, point, num) {
var data = {
"method": "weixin.unifiedorder.point",
"wid": app.globalData.memberWid,
"outTradeNo": outTradeNo,
"openid": wx.getStorageSync("openId"),
"spbillCreateIp": "127.0.0.1",
"type": type,
"groupNo": app.globalData.groupNo,
"sourceSign": "wechat",
"posNo": app.globalData.posNo,
"shopNo": app.globalData.shopNo,
"cardNo": wx.getStorageSync("cardNo"),
"workerNo": app.globalData.workerNo,
"memberId": wx.getStorageSync("memberId"),
"schemeId": schemeId,
"body": "积分商城下单"
};
var ignores = ["body", "payType"];
return jsapi.cardApi.ajax(data, ignores);
},
/*--------查询订单-------*/
queryPointOrder: function(orderNo) {
var data = {
"method": "query.point.product.order",
"wid": app.globalData.memberWid,
"orderNo": orderNo
};
var ignores = [];
return jsapi.cardApi.ajax(data, ignores);
},
/*--------查询积分商城订单列表-------*/
queryPointOrderList: function (pageSize, pageNum) {
var data = {
"method": "query.point.product.order.list",
"cardNo": wx.getStorageSync("cardNo"),
"pageSize": pageSize,
"pageNum": pageNum
};
var ignores = [];
return jsapi.cardApi.ajax(data, ignores);
},
/*--------查询积分商城订单详情-------*/
queryPointOrderDetail: function (orderNo) {
var data = {
"method": "query.point.product.order.detail",
"orderNo": orderNo
};
var ignores = [];
return jsapi.cardApi.ajax(data, ignores);
}
}
module.exports = {
pointInfo: pointInfo
}

@ -0,0 +1,876 @@
var ERROR_CONF = {
KEY_ERR: 311,
KEY_ERR_MSG: 'key格式错误',
PARAM_ERR: 310,
PARAM_ERR_MSG: '请求参数信息有误',
SYSTEM_ERR: 600,
SYSTEM_ERR_MSG: '系统错误',
WX_ERR_CODE: 1000,
WX_OK_CODE: 200
};
var BASE_URL = 'https://apis.map.qq.com/ws/';
var URL_SEARCH = BASE_URL + 'place/v1/search';
var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion';
var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/';
var URL_CITY_LIST = BASE_URL + 'district/v1/list';
var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren';
var URL_DISTANCE = BASE_URL + 'distance/v1/';
var URL_DIRECTION = BASE_URL + 'direction/v1/';
var MODE = {
driving: 'driving',
transit: 'transit'
};
var EARTH_RADIUS = 6378136.49;
var Utils = {
safeAdd(x, y) {
var lsw = (x & 0xffff) + (y & 0xffff);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xffff)
},
bitRotateLeft(num, cnt) {
return (num << cnt) | (num >>> (32 - cnt))
},
md5cmn(q, a, b, x, s, t) {
return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b)
},
md5ff(a, b, c, d, x, s, t) {
return this.md5cmn((b & c) | (~b & d), a, b, x, s, t)
},
md5gg(a, b, c, d, x, s, t) {
return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t)
},
md5hh(a, b, c, d, x, s, t) {
return this.md5cmn(b ^ c ^ d, a, b, x, s, t)
},
md5ii(a, b, c, d, x, s, t) {
return this.md5cmn(c ^ (b | ~d), a, b, x, s, t)
},
binlMD5(x, len) {
x[len >> 5] |= 0x80 << (len % 32);
x[((len + 64) >>> 9 << 4) + 14] = len;
var i;
var olda;
var oldb;
var oldc;
var oldd;
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
for (i = 0; i < x.length; i += 16) {
olda = a;
oldb = b;
oldc = c;
oldd = d;
a = this.md5ff(a, b, c, d, x[i], 7, -680876936);
d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586);
c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819);
b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897);
d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983);
a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063);
b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101);
c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510);
d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713);
b = this.md5gg(b, c, d, a, x[i], 20, -373897302);
a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691);
d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083);
c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335);
b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848);
a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438);
d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961);
b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784);
c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558);
d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556);
a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632);
b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174);
d = this.md5hh(d, a, b, c, x[i], 11, -358537222);
c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979);
b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189);
a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487);
d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835);
c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520);
b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651);
a = this.md5ii(a, b, c, d, x[i], 6, -198630844);
d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055);
a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523);
b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744);
c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070);
d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259);
b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551);
a = this.safeAdd(a, olda);
b = this.safeAdd(b, oldb);
c = this.safeAdd(c, oldc);
d = this.safeAdd(d, oldd)
}
return [a, b, c, d]
},
binl2rstr(input) {
var i;
var output = '';
var length32 = input.length * 32;
for (i = 0; i < length32; i += 8) {
output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff)
}
return output
},
rstr2binl(input) {
var i;
var output = [];
output[(input.length >> 2) - 1] = undefined;
for (i = 0; i < output.length; i += 1) {
output[i] = 0
}
var length8 = input.length * 8;
for (i = 0; i < length8; i += 8) {
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32)
}
return output
},
rstrMD5(s) {
return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8))
},
rstrHMACMD5(key, data) {
var i;
var bkey = this.rstr2binl(key);
var ipad = [];
var opad = [];
var hash;
ipad[15] = opad[15] = undefined;
if (bkey.length > 16) {
bkey = this.binlMD5(bkey, key.length * 8)
}
for (i = 0; i < 16; i += 1) {
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5c5c5c5c
}
hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8);
return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128))
},
rstr2hex(input) {
var hexTab = '0123456789abcdef';
var output = '';
var x;
var i;
for (i = 0; i < input.length; i += 1) {
x = input.charCodeAt(i);
output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)
}
return output
},
str2rstrUTF8(input) {
return unescape(encodeURIComponent(input))
},
rawMD5(s) {
return this.rstrMD5(this.str2rstrUTF8(s))
},
hexMD5(s) {
return this.rstr2hex(this.rawMD5(s))
},
rawHMACMD5(k, d) {
return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d))
},
hexHMACMD5(k, d) {
return this.rstr2hex(this.rawHMACMD5(k, d))
},
md5(string, key, raw) {
if (!key) {
if (!raw) {
return this.hexMD5(string)
}
return this.rawMD5(string)
}
if (!raw) {
return this.hexHMACMD5(key, string)
}
return this.rawHMACMD5(key, string)
},
getSig(requestParam, sk, feature, mode) {
var sig = null;
var requestArr = [];
Object.keys(requestParam).sort().forEach(function (key) {
requestArr.push(key + '=' + requestParam[key])
});
if (feature == 'search') {
sig = '/ws/place/v1/search?' + requestArr.join('&') + sk
}
if (feature == 'suggest') {
sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk
}
if (feature == 'reverseGeocoder') {
sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk
}
if (feature == 'geocoder') {
sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk
}
if (feature == 'getCityList') {
sig = '/ws/district/v1/list?' + requestArr.join('&') + sk
}
if (feature == 'getDistrictByCityId') {
sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk
}
if (feature == 'calculateDistance') {
sig = '/ws/distance/v1/?' + requestArr.join('&') + sk
}
if (feature == 'direction') {
sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk
}
sig = this.md5(sig);
return sig
},
location2query(data) {
if (typeof data == 'string') {
return data
}
var query = '';
for (var i = 0; i < data.length; i++) {
var d = data[i];
if (!!query) {
query += ';'
}
if (d.location) {
query = query + d.location.lat + ',' + d.location.lng
}
if (d.latitude && d.longitude) {
query = query + d.latitude + ',' + d.longitude
}
}
return query
},
rad(d) {
return d * Math.PI / 180.0
},
getEndLocation(location) {
var to = location.split(';');
var endLocation = [];
for (var i = 0; i < to.length; i++) {
endLocation.push({
lat: parseFloat(to[i].split(',')[0]),
lng: parseFloat(to[i].split(',')[1])
})
}
return endLocation
},
getDistance(latFrom, lngFrom, latTo, lngTo) {
var radLatFrom = this.rad(latFrom);
var radLatTo = this.rad(latTo);
var a = radLatFrom - radLatTo;
var b = this.rad(lngFrom) - this.rad(lngTo);
var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2)));
distance = distance * EARTH_RADIUS;
distance = Math.round(distance * 10000) / 10000;
return parseFloat(distance.toFixed(0))
},
getWXLocation(success, fail, complete) {
wx.getLocation({
type: 'gcj02',
success: success,
fail: fail,
complete: complete
})
},
getLocationParam(location) {
if (typeof location == 'string') {
var locationArr = location.split(',');
if (locationArr.length === 2) {
location = {
latitude: location.split(',')[0],
longitude: location.split(',')[1]
}
} else {
location = {}
}
}
return location
},
polyfillParam(param) {
param.success = param.success || function () {};
param.fail = param.fail || function () {};
param.complete = param.complete || function () {}
},
checkParamKeyEmpty(param, key) {
if (!param[key]) {
var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key + '参数格式有误');
param.fail(errconf);
param.complete(errconf);
return true
}
return false
},
checkKeyword(param) {
return !this.checkParamKeyEmpty(param, 'keyword')
},
checkLocation(param) {
var location = this.getLocationParam(param.location);
if (!location || !location.latitude || !location.longitude) {
var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误');
param.fail(errconf);
param.complete(errconf);
return false
}
return true
},
buildErrorConfig(errCode, errMsg) {
return {
status: errCode,
message: errMsg
}
},
handleData(param, data, feature) {
if (feature == 'search') {
var searchResult = data.data;
var searchSimplify = [];
for (var i = 0; i < searchResult.length; i++) {
searchSimplify.push({
id: searchResult[i].id || null,
title: searchResult[i].title || null,
latitude: searchResult[i].location && searchResult[i].location.lat || null,
longitude: searchResult[i].location && searchResult[i].location.lng || null,
address: searchResult[i].address || null,
category: searchResult[i].category || null,
tel: searchResult[i].tel || null,
adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null,
city: searchResult[i].ad_info && searchResult[i].ad_info.city || null,
district: searchResult[i].ad_info && searchResult[i].ad_info.district || null,
province: searchResult[i].ad_info && searchResult[i].ad_info.province || null
})
}
param.success(data, {
searchResult: searchResult,
searchSimplify: searchSimplify
})
} else if (feature == 'suggest') {
var suggestResult = data.data;
var suggestSimplify = [];
for (var i = 0; i < suggestResult.length; i++) {
suggestSimplify.push({
adcode: suggestResult[i].adcode || null,
address: suggestResult[i].address || null,
category: suggestResult[i].category || null,
city: suggestResult[i].city || null,
district: suggestResult[i].district || null,
id: suggestResult[i].id || null,
latitude: suggestResult[i].location && suggestResult[i].location.lat || null,
longitude: suggestResult[i].location && suggestResult[i].location.lng || null,
province: suggestResult[i].province || null,
title: suggestResult[i].title || null,
type: suggestResult[i].type || null
})
}
param.success(data, {
suggestResult: suggestResult,
suggestSimplify: suggestSimplify
})
} else if (feature == 'reverseGeocoder') {
var reverseGeocoderResult = data.result;
var reverseGeocoderSimplify = {
address: reverseGeocoderResult.address || null,
latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null,
longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null,
adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null,
city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null,
district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null,
nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null,
province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null,
street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null,
street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null,
recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null,
rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null
};
if (reverseGeocoderResult.pois) {
var pois = reverseGeocoderResult.pois;
var poisSimplify = [];
for (var i = 0; i < pois.length; i++) {
poisSimplify.push({
id: pois[i].id || null,
title: pois[i].title || null,
latitude: pois[i].location && pois[i].location.lat || null,
longitude: pois[i].location && pois[i].location.lng || null,
address: pois[i].address || null,
category: pois[i].category || null,
adcode: pois[i].ad_info && pois[i].ad_info.adcode || null,
city: pois[i].ad_info && pois[i].ad_info.city || null,
district: pois[i].ad_info && pois[i].ad_info.district || null,
province: pois[i].ad_info && pois[i].ad_info.province || null
})
}
param.success(data, {
reverseGeocoderResult: reverseGeocoderResult,
reverseGeocoderSimplify: reverseGeocoderSimplify,
pois: pois,
poisSimplify: poisSimplify
})
} else {
param.success(data, {
reverseGeocoderResult: reverseGeocoderResult,
reverseGeocoderSimplify: reverseGeocoderSimplify
})
}
} else if (feature == 'geocoder') {
var geocoderResult = data.result;
var geocoderSimplify = {
title: geocoderResult.title || null,
latitude: geocoderResult.location && geocoderResult.location.lat || null,
longitude: geocoderResult.location && geocoderResult.location.lng || null,
adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null,
province: geocoderResult.address_components && geocoderResult.address_components.province || null,
city: geocoderResult.address_components && geocoderResult.address_components.city || null,
district: geocoderResult.address_components && geocoderResult.address_components.district || null,
street: geocoderResult.address_components && geocoderResult.address_components.street || null,
street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null,
level: geocoderResult.level || null
};
param.success(data, {
geocoderResult: geocoderResult,
geocoderSimplify: geocoderSimplify
})
} else if (feature == 'getCityList') {
var provinceResult = data.result[0];
var cityResult = data.result[1];
var districtResult = data.result[2];
param.success(data, {
provinceResult: provinceResult,
cityResult: cityResult,
districtResult: districtResult
})
} else if (feature == 'getDistrictByCityId') {
var districtByCity = data.result[0];
param.success(data, districtByCity)
} else if (feature == 'calculateDistance') {
var calculateDistanceResult = data.result.elements;
var distance = [];
for (var i = 0; i < calculateDistanceResult.length; i++) {
distance.push(calculateDistanceResult[i].distance)
}
param.success(data, {
calculateDistanceResult: calculateDistanceResult,
distance: distance
})
} else if (feature == 'direction') {
var direction = data.result.routes;
param.success(data, direction)
} else {
param.success(data)
}
},
buildWxRequestConfig(param, options, feature) {
var that = this;
options.header = {
"content-type": "application/json"
};
options.method = 'GET';
options.success = function (res) {
var data = res.data;
if (data.status === 0) {
that.handleData(param, data, feature)
} else {
param.fail(data)
}
};
options.fail = function (res) {
res.statusCode = ERROR_CONF.WX_ERR_CODE;
param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg))
};
options.complete = function (res) {
var statusCode = +res.statusCode;
switch (statusCode) {
case ERROR_CONF.WX_ERR_CODE: {
param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
break
}
case ERROR_CONF.WX_OK_CODE: {
var data = res.data;
if (data.status === 0) {
param.complete(data)
} else {
param.complete(that.buildErrorConfig(data.status, data.message))
}
break
}
default: {
param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG))
}
}
};
return options
},
locationProcess(param, locationsuccess, locationfail, locationcomplete) {
var that = this;
locationfail = locationfail || function (res) {
res.statusCode = ERROR_CONF.WX_ERR_CODE;
param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg))
};
locationcomplete = locationcomplete || function (res) {
if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg))
}
};
if (!param.location) {
that.getWXLocation(locationsuccess, locationfail, locationcomplete)
} else if (that.checkLocation(param)) {
var location = Utils.getLocationParam(param.location);
locationsuccess(location)
}
}
};
class QQMapWX {
constructor(options) {
if (!options.key) {
throw Error('key值不能为空')
}
this.key = options.key
};
search(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
if (!Utils.checkKeyword(options)) {
return
}
var requestParam = {
keyword: options.keyword,
orderby: options.orderby || '_distance',
page_size: options.page_size || 10,
page_index: options.page_index || 1,
output: 'json',
key: that.key
};
if (options.address_format) {
requestParam.address_format = options.address_format
}
if (options.filter) {
requestParam.filter = options.filter
}
var distance = options.distance || "1000";
var auto_extend = options.auto_extend || 1;
var region = null;
var rectangle = null;
if (options.region) {
region = options.region
}
if (options.rectangle) {
rectangle = options.rectangle
}
var locationsuccess = function (result) {
if (region && !rectangle) {
requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")";
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'search')
}
} else if (rectangle && !region) {
requestParam.boundary = "rectangle(" + rectangle + ")";
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'search')
}
} else {
requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")";
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'search')
}
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_SEARCH,
data: requestParam
}, 'search'))
};
Utils.locationProcess(options, locationsuccess)
};
getSuggestion(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
if (!Utils.checkKeyword(options)) {
return
}
var requestParam = {
keyword: options.keyword,
region: options.region || '全国',
region_fix: options.region_fix || 0,
policy: options.policy || 0,
page_size: options.page_size || 10,
page_index: options.page_index || 1,
get_subpois: options.get_subpois || 0,
output: 'json',
key: that.key
};
if (options.address_format) {
requestParam.address_format = options.address_format
}
if (options.filter) {
requestParam.filter = options.filter
}
if (options.location) {
var locationsuccess = function (result) {
requestParam.location = result.latitude + ',' + result.longitude;
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest')
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_SUGGESTION,
data: requestParam
}, "suggest"))
};
Utils.locationProcess(options, locationsuccess)
} else {
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest')
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_SUGGESTION,
data: requestParam
}, "suggest"))
}
};
reverseGeocoder(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
var requestParam = {
coord_type: options.coord_type || 5,
get_poi: options.get_poi || 0,
output: 'json',
key: that.key
};
if (options.poi_options) {
requestParam.poi_options = options.poi_options
}
var locationsuccess = function (result) {
requestParam.location = result.latitude + ',' + result.longitude;
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder')
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_GET_GEOCODER,
data: requestParam
}, 'reverseGeocoder'))
};
Utils.locationProcess(options, locationsuccess)
};
geocoder(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
if (Utils.checkParamKeyEmpty(options, 'address')) {
return
}
var requestParam = {
address: options.address,
output: 'json',
key: that.key
};
if (options.region) {
requestParam.region = options.region
}
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder')
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_GET_GEOCODER,
data: requestParam
}, 'geocoder'))
};
getCityList(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
var requestParam = {
output: 'json',
key: that.key
};
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList')
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_CITY_LIST,
data: requestParam
}, 'getCityList'))
};
getDistrictByCityId(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
if (Utils.checkParamKeyEmpty(options, 'id')) {
return
}
var requestParam = {
id: options.id || '',
output: 'json',
key: that.key
};
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId')
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_AREA_LIST,
data: requestParam
}, 'getDistrictByCityId'))
};
calculateDistance(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
if (Utils.checkParamKeyEmpty(options, 'to')) {
return
}
var requestParam = {
mode: options.mode || 'walking',
to: Utils.location2query(options.to),
output: 'json',
key: that.key
};
if (options.from) {
options.location = options.from
}
if (requestParam.mode == 'straight') {
var locationsuccess = function (result) {
var locationTo = Utils.getEndLocation(requestParam.to);
var data = {
message: "query ok",
result: {
elements: []
},
status: 0
};
for (var i = 0; i < locationTo.length; i++) {
data.result.elements.push({
distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng),
duration: 0,
from: {
lat: result.latitude,
lng: result.longitude
},
to: {
lat: locationTo[i].lat,
lng: locationTo[i].lng
}
})
}
var calculateResult = data.result.elements;
var distanceResult = [];
for (var i = 0; i < calculateResult.length; i++) {
distanceResult.push(calculateResult[i].distance)
}
return options.success(data, {
calculateResult: calculateResult,
distanceResult: distanceResult
})
};
Utils.locationProcess(options, locationsuccess)
} else {
var locationsuccess = function (result) {
requestParam.from = result.latitude + ',' + result.longitude;
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance')
}
wx.request(Utils.buildWxRequestConfig(options, {
url: URL_DISTANCE,
data: requestParam
}, 'calculateDistance'))
};
Utils.locationProcess(options, locationsuccess)
}
};
direction(options) {
var that = this;
options = options || {};
Utils.polyfillParam(options);
if (Utils.checkParamKeyEmpty(options, 'to')) {
return
}
var requestParam = {
output: 'json',
key: that.key
};
if (typeof options.to == 'string') {
requestParam.to = options.to
} else {
requestParam.to = options.to.latitude + ',' + options.to.longitude
}
var SET_URL_DIRECTION = null;
options.mode = options.mode || MODE.driving;
SET_URL_DIRECTION = URL_DIRECTION + options.mode;
if (options.from) {
options.location = options.from
}
if (options.mode == MODE.driving) {
if (options.from_poi) {
requestParam.from_poi = options.from_poi
}
if (options.heading) {
requestParam.heading = options.heading
}
if (options.speed) {
requestParam.speed = options.speed
}
if (options.accuracy) {
requestParam.accuracy = options.accuracy
}
if (options.road_type) {
requestParam.road_type = options.road_type
}
if (options.to_poi) {
requestParam.to_poi = options.to_poi
}
if (options.from_track) {
requestParam.from_track = options.from_track
}
if (options.waypoints) {
requestParam.waypoints = options.waypoints
}
if (options.policy) {
requestParam.policy = options.policy
}
if (options.plate_number) {
requestParam.plate_number = options.plate_number
}
}
if (options.mode == MODE.transit) {
if (options.departure_time) {
requestParam.departure_time = options.departure_time
}
if (options.policy) {
requestParam.policy = options.policy
}
}
var locationsuccess = function (result) {
requestParam.from = result.latitude + ',' + result.longitude;
if (options.sig) {
requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction', options.mode)
}
wx.request(Utils.buildWxRequestConfig(options, {
url: SET_URL_DIRECTION,
data: requestParam
}, 'direction'))
};
Utils.locationProcess(options, locationsuccess)
}
};
module.exports = QQMapWX;

@ -0,0 +1,778 @@
var QR = (function () {
// alignment pattern
var adelta = [
0, 11, 15, 19, 23, 27, 31, // force 1 pat
16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
];
// version block
var vpat = [
0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d,
0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9,
0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75,
0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64,
0x541, 0xc69
];
// final format bits with mask: level << 3 | mask
var fmtword = [
0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976, //L
0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, //M
0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed, //Q
0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b //H
];
// 4 per version: number of blocks 1,2; data width; ecc width
var eccblocks = [
1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,
1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,
1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,
1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,
1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,
2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,
2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,
2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,
2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,
2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,
4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,
2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,
4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,
3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,
5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,
5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,
1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,
5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,
3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,
3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,
4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,
2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,
4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,
6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,
8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,
10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,
8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,
3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,
7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,
5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,
13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,
17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,
17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,
13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,
12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,
6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,
17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,
20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,
19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30
];
// Galois field log table
var glog = [
0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
];
// Galios field exponent table
var gexp = [
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00
];
// Working buffers:
// data input and ecc append, image working buffer, fixed part of image, run lengths for badness
var strinbuf=[], eccbuf=[], qrframe=[], framask=[], rlens=[];
// Control values - width is based on version, last 4 are from table.
var version, width, neccblk1, neccblk2, datablkw, eccblkwid;
var ecclevel = 2;
// set bit to indicate cell in qrframe is immutable. symmetric around diagonal
function setmask(x, y)
{
var bt;
if (x > y) {
bt = x;
x = y;
y = bt;
}
// y*y = 1+3+5...
bt = y;
bt *= y;
bt += y;
bt >>= 1;
bt += x;
framask[bt] = 1;
}
// enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)
function putalign(x, y)
{
var j;
qrframe[x + width * y] = 1;
for (j = -2; j < 2; j++) {
qrframe[(x + j) + width * (y - 2)] = 1;
qrframe[(x - 2) + width * (y + j + 1)] = 1;
qrframe[(x + 2) + width * (y + j)] = 1;
qrframe[(x + j + 1) + width * (y + 2)] = 1;
}
for (j = 0; j < 2; j++) {
setmask(x - 1, y + j);
setmask(x + 1, y - j);
setmask(x - j, y - 1);
setmask(x + j, y + 1);
}
}
//========================================================================
// Reed Solomon error correction
// exponentiation mod N
function modnn(x)
{
while (x >= 255) {
x -= 255;
x = (x >> 8) + (x & 255);
}
return x;
}
var genpoly = [];
// Calculate and append ECC data to data block. Block is in strinbuf, indexes to buffers given.
function appendrs(data, dlen, ecbuf, eclen)
{
var i, j, fb;
for (i = 0; i < eclen; i++)
strinbuf[ecbuf + i] = 0;
for (i = 0; i < dlen; i++) {
fb = glog[strinbuf[data + i] ^ strinbuf[ecbuf]];
if (fb != 255) /* fb term is non-zero */
for (j = 1; j < eclen; j++)
strinbuf[ecbuf + j - 1] = strinbuf[ecbuf + j] ^ gexp[modnn(fb + genpoly[eclen - j])];
else
for( j = ecbuf ; j < ecbuf + eclen; j++ )
strinbuf[j] = strinbuf[j + 1];
strinbuf[ ecbuf + eclen - 1] = fb == 255 ? 0 : gexp[modnn(fb + genpoly[0])];
}
}
//========================================================================
// Frame data insert following the path rules
// check mask - since symmetrical use half.
function ismasked(x, y)
{
var bt;
if (x > y) {
bt = x;
x = y;
y = bt;
}
bt = y;
bt += y * y;
bt >>= 1;
bt += x;
return framask[bt];
}
//========================================================================
// Apply the selected mask out of the 8.
function applymask(m)
{
var x, y, r3x, r3y;
switch (m) {
case 0:
for (y = 0; y < width; y++)
for (x = 0; x < width; x++)
if (!((x + y) & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
break;
case 1:
for (y = 0; y < width; y++)
for (x = 0; x < width; x++)
if (!(y & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
break;
case 2:
for (y = 0; y < width; y++)
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!r3x && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
break;
case 3:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = r3y, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!r3x && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
case 4:
for (y = 0; y < width; y++)
for (r3x = 0, r3y = ((y >> 1) & 1), x = 0; x < width; x++, r3x++) {
if (r3x == 3) {
r3x = 0;
r3y = !r3y;
}
if (!r3y && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
break;
case 5:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!((x & y & 1) + !(!r3x | !r3y)) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
case 6:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!(((x & y & 1) + (r3x && (r3x == r3y))) & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
case 7:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!(((r3x && (r3x == r3y)) + ((x + y) & 1)) & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
}
return;
}
// Badness coefficients.
var N1 = 3, N2 = 3, N3 = 40, N4 = 10;
// Using the table of the length of each run, calculate the amount of bad image
// - long runs or those that look like finders; called twice, once each for X and Y
function badruns(length)
{
var i;
var runsbad = 0;
for (i = 0; i <= length; i++)
if (rlens[i] >= 5)
runsbad += N1 + rlens[i] - 5;
// BwBBBwB as in finder
for (i = 3; i < length - 1; i += 2)
if (rlens[i - 2] == rlens[i + 2]
&& rlens[i + 2] == rlens[i - 1]
&& rlens[i - 1] == rlens[i + 1]
&& rlens[i - 1] * 3 == rlens[i]
// white around the black pattern? Not part of spec
&& (rlens[i - 3] == 0 // beginning
|| i + 3 > length // end
|| rlens[i - 3] * 3 >= rlens[i] * 4 || rlens[i + 3] * 3 >= rlens[i] * 4)
)
runsbad += N3;
return runsbad;
}
// Calculate how bad the masked image is - blocks, imbalance, runs, or finders.
function badcheck()
{
var x, y, h, b, b1;
var thisbad = 0;
var bw = 0;
// blocks of same color.
for (y = 0; y < width - 1; y++)
for (x = 0; x < width - 1; x++)
if ((qrframe[x + width * y] && qrframe[(x + 1) + width * y]
&& qrframe[x + width * (y + 1)] && qrframe[(x + 1) + width * (y + 1)]) // all black
|| !(qrframe[x + width * y] || qrframe[(x + 1) + width * y]
|| qrframe[x + width * (y + 1)] || qrframe[(x + 1) + width * (y + 1)])) // all white
thisbad += N2;
// X runs
for (y = 0; y < width; y++) {
rlens[0] = 0;
for (h = b = x = 0; x < width; x++) {
if ((b1 = qrframe[x + width * y]) == b)
rlens[h]++;
else
rlens[++h] = 1;
b = b1;
bw += b ? 1 : -1;
}
thisbad += badruns(h);
}
// black/white imbalance
if (bw < 0)
bw = -bw;
var big = bw;
var count = 0;
big += big << 2;
big <<= 1;
while (big > width * width)
big -= width * width, count++;
thisbad += count * N4;
// Y runs
for (x = 0; x < width; x++) {
rlens[0] = 0;
for (h = b = y = 0; y < width; y++) {
if ((b1 = qrframe[x + width * y]) == b)
rlens[h]++;
else
rlens[++h] = 1;
b = b1;
}
thisbad += badruns(h);
}
return thisbad;
}
function genframe(instring)
{
var x, y, k, t, v, i, j, m;
// find the smallest version that fits the string
t = instring.length;
version = 0;
do {
version++;
k = (ecclevel - 1) * 4 + (version - 1) * 16;
neccblk1 = eccblocks[k++];
neccblk2 = eccblocks[k++];
datablkw = eccblocks[k++];
eccblkwid = eccblocks[k];
k = datablkw * (neccblk1 + neccblk2) + neccblk2 - 3 + (version <= 9);
if (t <= k)
break;
} while (version < 40);
// FIXME - insure that it fits insted of being truncated
width = 17 + 4 * version;
// allocate, clear and setup data structures
v = datablkw + (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
for( t = 0; t < v; t++ )
eccbuf[t] = 0;
strinbuf = instring.slice(0);
for( t = 0; t < width * width; t++ )
qrframe[t] = 0;
for( t = 0 ; t < (width * (width + 1) + 1) / 2; t++)
framask[t] = 0;
// insert finders - black to frame, white to mask
for (t = 0; t < 3; t++) {
k = 0;
y = 0;
if (t == 1)
k = (width - 7);
if (t == 2)
y = (width - 7);
qrframe[(y + 3) + width * (k + 3)] = 1;
for (x = 0; x < 6; x++) {
qrframe[(y + x) + width * k] = 1;
qrframe[y + width * (k + x + 1)] = 1;
qrframe[(y + 6) + width * (k + x)] = 1;
qrframe[(y + x + 1) + width * (k + 6)] = 1;
}
for (x = 1; x < 5; x++) {
setmask(y + x, k + 1);
setmask(y + 1, k + x + 1);
setmask(y + 5, k + x);
setmask(y + x + 1, k + 5);
}
for (x = 2; x < 4; x++) {
qrframe[(y + x) + width * (k + 2)] = 1;
qrframe[(y + 2) + width * (k + x + 1)] = 1;
qrframe[(y + 4) + width * (k + x)] = 1;
qrframe[(y + x + 1) + width * (k + 4)] = 1;
}
}
// alignment blocks
if (version > 1) {
t = adelta[version];
y = width - 7;
for (;;) {
x = width - 7;
while (x > t - 3) {
putalign(x, y);
if (x < t)
break;
x -= t;
}
if (y <= t + 9)
break;
y -= t;
putalign(6, y);
putalign(y, 6);
}
}
// single black
qrframe[8 + width * (width - 8)] = 1;
// timing gap - mask only
for (y = 0; y < 7; y++) {
setmask(7, y);
setmask(width - 8, y);
setmask(7, y + width - 7);
}
for (x = 0; x < 8; x++) {
setmask(x, 7);
setmask(x + width - 8, 7);
setmask(x, width - 8);
}
// reserve mask-format area
for (x = 0; x < 9; x++)
setmask(x, 8);
for (x = 0; x < 8; x++) {
setmask(x + width - 8, 8);
setmask(8, x);
}
for (y = 0; y < 7; y++)
setmask(8, y + width - 7);
// timing row/col
for (x = 0; x < width - 14; x++)
if (x & 1) {
setmask(8 + x, 6);
setmask(6, 8 + x);
}
else {
qrframe[(8 + x) + width * 6] = 1;
qrframe[6 + width * (8 + x)] = 1;
}
// version block
if (version > 6) {
t = vpat[version - 7];
k = 17;
for (x = 0; x < 6; x++)
for (y = 0; y < 3; y++, k--)
if (1 & (k > 11 ? version >> (k - 12) : t >> k)) {
qrframe[(5 - x) + width * (2 - y + width - 11)] = 1;
qrframe[(2 - y + width - 11) + width * (5 - x)] = 1;
}
else {
setmask(5 - x, 2 - y + width - 11);
setmask(2 - y + width - 11, 5 - x);
}
}
// sync mask bits - only set above for white spaces, so add in black bits
for (y = 0; y < width; y++)
for (x = 0; x <= y; x++)
if (qrframe[x + width * y])
setmask(x, y);
// convert string to bitstream
// 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)
v = strinbuf.length;
// string to array
for( i = 0 ; i < v; i++ )
eccbuf[i] = strinbuf.charCodeAt(i);
strinbuf = eccbuf.slice(0);
// calculate max string length
x = datablkw * (neccblk1 + neccblk2) + neccblk2;
if (v >= x - 2) {
v = x - 2;
if (version > 9)
v--;
}
// shift and repack to insert length prefix
i = v;
if (version > 9) {
strinbuf[i + 2] = 0;
strinbuf[i + 3] = 0;
while (i--) {
t = strinbuf[i];
strinbuf[i + 3] |= 255 & (t << 4);
strinbuf[i + 2] = t >> 4;
}
strinbuf[2] |= 255 & (v << 4);
strinbuf[1] = v >> 4;
strinbuf[0] = 0x40 | (v >> 12);
}
else {
strinbuf[i + 1] = 0;
strinbuf[i + 2] = 0;
while (i--) {
t = strinbuf[i];
strinbuf[i + 2] |= 255 & (t << 4);
strinbuf[i + 1] = t >> 4;
}
strinbuf[1] |= 255 & (v << 4);
strinbuf[0] = 0x40 | (v >> 4);
}
// fill to end with pad pattern
i = v + 3 - (version < 10);
while (i < x) {
strinbuf[i++] = 0xec;
// buffer has room if (i == x) break;
strinbuf[i++] = 0x11;
}
// calculate and append ECC
// calculate generator polynomial
genpoly[0] = 1;
for (i = 0; i < eccblkwid; i++) {
genpoly[i + 1] = 1;
for (j = i; j > 0; j--)
genpoly[j] = genpoly[j]
? genpoly[j - 1] ^ gexp[modnn(glog[genpoly[j]] + i)] : genpoly[j - 1];
genpoly[0] = gexp[modnn(glog[genpoly[0]] + i)];
}
for (i = 0; i <= eccblkwid; i++)
genpoly[i] = glog[genpoly[i]]; // use logs for genpoly[] to save calc step
// append ecc to data buffer
k = x;
y = 0;
for (i = 0; i < neccblk1; i++) {
appendrs(y, datablkw, k, eccblkwid);
y += datablkw;
k += eccblkwid;
}
for (i = 0; i < neccblk2; i++) {
appendrs(y, datablkw + 1, k, eccblkwid);
y += datablkw + 1;
k += eccblkwid;
}
// interleave blocks
y = 0;
for (i = 0; i < datablkw; i++) {
for (j = 0; j < neccblk1; j++)
eccbuf[y++] = strinbuf[i + j * datablkw];
for (j = 0; j < neccblk2; j++)
eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
}
for (j = 0; j < neccblk2; j++)
eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
for (i = 0; i < eccblkwid; i++)
for (j = 0; j < neccblk1 + neccblk2; j++)
eccbuf[y++] = strinbuf[x + i + j * eccblkwid];
strinbuf = eccbuf;
// pack bits into frame avoiding masked area.
x = y = width - 1;
k = v = 1; // up, minus
/* inteleaved data and ecc codes */
m = (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
for (i = 0; i < m; i++) {
t = strinbuf[i];
for (j = 0; j < 8; j++, t <<= 1) {
if (0x80 & t)
qrframe[x + width * y] = 1;
do { // find next fill position
if (v)
x--;
else {
x++;
if (k) {
if (y != 0)
y--;
else {
x -= 2;
k = !k;
if (x == 6) {
x--;
y = 9;
}
}
}
else {
if (y != width - 1)
y++;
else {
x -= 2;
k = !k;
if (x == 6) {
x--;
y -= 8;
}
}
}
}
v = !v;
} while (ismasked(x, y));
}
}
// save pre-mask copy of frame
strinbuf = qrframe.slice(0);
t = 0; // best
y = 30000; // demerit
// for instead of while since in original arduino code
// if an early mask was "good enough" it wouldn't try for a better one
// since they get more complex and take longer.
for (k = 0; k < 8; k++) {
applymask(k); // returns black-white imbalance
x = badcheck();
if (x < y) { // current mask better than previous best?
y = x;
t = k;
}
if (t == 7)
break; // don't increment i to a void redoing mask
qrframe = strinbuf.slice(0); // reset for next pass
}
if (t != k) // redo best mask - none good enough, last wasn't t
applymask(t);
// add in final mask/ecclevel bytes
y = fmtword[t + ((ecclevel - 1) << 3)];
// low byte
for (k = 0; k < 8; k++, y >>= 1)
if (y & 1) {
qrframe[(width - 1 - k) + width * 8] = 1;
if (k < 6)
qrframe[8 + width * k] = 1;
else
qrframe[8 + width * (k + 1)] = 1;
}
// high byte
for (k = 0; k < 7; k++, y >>= 1)
if (y & 1) {
qrframe[8 + width * (width - 7 + k)] = 1;
if (k)
qrframe[(6 - k) + width * 8] = 1;
else
qrframe[7 + width * 8] = 1;
}
// return image
return qrframe;
}
var _canvas = null,
_size = null;
var api = {
get ecclevel () {
return ecclevel;
},
set ecclevel (val) {
ecclevel = val;
},
get size () {
return _size;
},
set size (val) {
_size = val
},
get canvas () {
return _canvas;
},
set canvas (el) {
_canvas = el;
},
getFrame: function (string) {
return genframe(string);
},
draw: function (string, canvas, size, ecc) {
ecclevel = ecc || ecclevel;
canvas = canvas || _canvas;
if (!canvas) {
console.warn('No canvas provided to draw QR code in!')
return;
}
size = size || _size || Math.min(canvas.width, canvas.height);
var frame = genframe(string),
ctx = canvas.ctx,
px = Math.round(size / (width + 8));
var roundedSize = px * (width + 8),
offset = Math.floor((size - roundedSize) / 2);
size = roundedSize;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.setFillStyle('#000000');
for (var i = 0; i < width; i++) {
for (var j = 0; j < width; j++) {
if (frame[j * width + i]) {
ctx.fillRect(px * (4 + i) + offset, px * (4 + j) + offset, px, px);
}
}
}
ctx.draw();
}
}
module.exports = {
api: api
}
})()

@ -0,0 +1,91 @@
const formatTime = date => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
const formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
function formatTimeV(date, fmt) {
var o = {
"M+": date.getMonth() + 1, // 月份
"d+": date.getDate(), // 日
"h+": date.getHours(), // 小时
"m+": date.getMinutes(), // 分
"s+": date.getSeconds(), // 秒
"q+": Math.floor((date.getMonth() + 3) / 3), // 季度
"S": date.getMilliseconds()
// 毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
function setNavTitle4Color(title, color,bgColor) {
var bc = '#000000';
if (bgColor){
bc = bgColor;
}
wx.setNavigationBarColor({
frontColor: bc,
backgroundColor: color,
})
wx.setNavigationBarTitle({
title: title
})
}
function showFailureMsg(error) {
var title = "系统繁忙!!!";
if (error.errMessage) {
title = error.errMessage
} else
if (error.message) {
title = error.message
}
wx.showToast({
title: title,
icon: "none"
})
}
function showSuccessMsg(msg) {
var title = "操作成功";
if (msg){
title = msg;
}
wx.showToast({
title: title
})
}
function showWaring(msg) {
var title = "警告";
if (msg) {
title = msg;
}
wx.showToast({
title: title,
icon: "none"
})
}
module.exports = {
formatTime: formatTime,
formatTimeV: formatTimeV,
setNavTitle4Color: setNavTitle4Color,
showFailureMsg: showFailureMsg,
showSuccessMsg: showSuccessMsg,
showWaring: showWaring
}

@ -0,0 +1,438 @@
const formatTime = date => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
const formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
/**
* 获取今天星期
*/
function getWeeker() {
var a = ["日", "一", "二", "三", "四", "五", "六"];
var week = new Date().getDay();
return "星期" + a[week];
}
/**
* 比较两个日期的大小
*/
function compareDate(d1, d2) {
var date = new Date(d1);
var tempDate = new Date(d2);
return date.getTime() > tempDate.getTime();
}
/***
* data 时间
*
* sign 标识0,1,2
* 0yyyy/MM/dd HH:mm:ss:ms
* 1yyyy-MM-dd HH:mm:ss:ms(default)
* 2yyyyMMddHHmmss
* 3yyyy-MM-dd
*/
function getFormatTime(date, sign) {
if (undefined == sign || null == sign || sign == "" || sign > 5) {
sign = 0;
}
var year = date.getFullYear()
var month = date.getMonth() + 1
var day = date.getDate()
var hour = date.getHours()
var minute = date.getMinutes()
var second = date.getSeconds()
var milliseconds = date.getMilliseconds()
var value = "";
switch (sign) {
case 0:
value = [hour, minute].map(formatNumber).join(':');
break;
case 1:
value = [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':');
break;
case 2:
value = [year, month, day].map(formatNumber).join('') + [hour, minute, second].map(formatNumber).join('');
break;
case 3:
value = [year, month, day].map(formatNumber).join('-');
break;
case 4:
value = [year, month].map(formatNumber).join('-') + "-01";
break;
case 5:
value = [hour, minute, second].map(formatNumber).join(':');
break;
}
return value;
}
// 对象转string
const parseToString = function(options) {
var content = "";
var keys = Object.keys(options);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var value = "";
if (undefined != options[key]) {
value = options[key].toString();
}
if (content.length > 0) {
content += "&" + encodeURI(key, "utf-8") + "=" + encodeURI(value, "utf-8");
} else {
content += encodeURI(key, "utf-8") + "=" + encodeURI(value, "utf-8");
}
}
return content;
}
/**校验不为空 */
const isNotBlank = function(value) {
if (null != value && undefined != value && JSON.stringify(value) != "") {
return true;
} else {
return false;
}
};
/**校验为空 */
const isBlank = function(value) {
if (null == value || undefined == value || value == "" || JSON.stringify(value) == "") {
return true;
} else {
return false;
}
};
// 替换全部
function replaceAll(source, oldStr, newStr) {
while (source.indexOf(oldStr) >= 0) {
source = source.replace(oldStr, newStr);
}
return source;
}
/**
* 加法运算避免数据相加小数点后产生多位数和计算精度损失
*
* @param num1加数1 |
* num2加数2
*/
var numAdd = function(num1, num2, decimal) {
var baseNum, baseNum1, baseNum2;
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
var value = (num1 * baseNum + num2 * baseNum) / baseNum
if (undefined == decimal || null == decimal || "" == decimal) {
return value;
} else {
if (isNaN(decimal)) {
decimal = 2
}
return value.toFixed(2);
}
};
/**
* 减法运算避免数据相减小数点后产生多位数和计算精度损失
*
* @param num1被减数 |
* num2减数
*/
var numSub = function(num1, num2, decimal) {
var baseNum, baseNum1, baseNum2;
var precision; /*** 精度***/
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
var value = Number(((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision));
if (undefined == decimal || null == decimal || "" == decimal) {
return value;
} else {
if (isNaN(decimal)) {
decimal = 2
}
return value.toFixed(2);
}
};
/**
* 乘法运算避免数据相乘小数点后产生多位数和计算精度损失
*
* @param num1被乘数 |
* num2乘数
*/
var numMulti = function(num1, num2, decimal) {
var baseNum = 0;
try {
baseNum += num1.toString().split(".")[1].length;
} catch (e) {}
try {
baseNum += num2.toString().split(".")[1].length;
} catch (e) {}
var value = Number(num1.toString().replace(".", "")) *
Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
if (undefined == decimal || null == decimal || "" == decimal) {
return value;
} else {
if (isNaN(decimal)) {
decimal = 2
}
return value.toFixed(2);
}
};
/**
* 除法运算避免数据相除小数点后产生多位数和计算精度损失
*
* @param num1被除数 |
* num2除数
*/
var numDiv = function(num1, num2, decimal) {
var baseNum1 = 0,
baseNum2 = 0;
var baseNum3, baseNum4;
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
baseNum3 = Number(num1.toString().replace(".", ""));
baseNum4 = Number(num2.toString().replace(".", ""));
var value = (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
if (undefined == decimal || null == decimal || "" == decimal) {
return value;
} else {
if (isNaN(decimal)) {
decimal = 2
}
return value.toFixed(2);
}
};
// 仿js each循环
var each = function(object, callback, args) {
var name, i = 0,
length = object.length,
isObj = length === undefined || typeof object == 'function';
if (args) {
if (isObj) {
for (name in object) {
if (callback.apply(object[name], args) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.apply(object[i++], args) === false) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if (isObj) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.call(object[i], i, object[i++]) === false) {
break;
}
}
}
}
return object;
};
// 显示繁忙提示
var showBusy = text => wx.showToast({
title: text,
icon: 'loading',
duration: 10000
})
// 显示成功提示
var showSuccess = text => wx.showToast({
title: text,
icon: 'success'
})
function alertErrorMsg(title, content) {
wx.showModal({
title: title,
content: content,
showCancel: false
});
}
// 显示失败提示
var showModel = (title, content) => {
wx.hideToast();
wx.showModal({
title,
content: JSON.stringify(content),
showCancel: false
})
}
// 根据下标删除对应的元素
Array.prototype.remove = function(dx) {
if (isNaN(dx) || dx > this.length) {
return false;
}
for (var i = 0, n = 0; i < this.length; i++) {
if (this[i] != this[dx]) {
this[n++] = this[i]
}
}
this.length -= 1
}
//
var deviceInfo = function() {
var model = "iPhone X";
var result = false;
wx.getSystemInfo({
success: function(res) {
console.log(res);
if (res.errMsg == "getSystemInfo:ok") {
console.log(model.indexOf(res.model));
if (res.model.indexOf(model) != -1) {
result = true;
}
wx.setStorageSync("model", result);
}
},
});
}
var getZero = function(num) {
return parseFloat(num).toFixed(0);
}
var getOne = function(num) {
return parseFloat(num).toFixed(1);
}
var getTwo = function(num) {
return parseFloat(num).toFixed(2);
}
var isOpen = function(dateTime, time) {
var result = false;
if (!time) {
return true;
}
var tempTimes = time.split(",");
for (var item of tempTimes) {
var temps = item.split("-");
var startTime = temps[0].split(":");
var time1 = startTime[0] * 3600 + startTime[1] * 60 + startTime[2];
var endTime = temps[1].split(":");
var time2 = endTime[0] * 3600 + endTime[1] * 60 + endTime[2];
var nowTime = dateTime.split(":");
var time3 = nowTime[0] * 3600 + nowTime[1] * 60 + nowTime[2];
if (time1 < time3 && time3 < time2) {
result = true;
break;
}
}
return result;
}
var getDistance = function(lat1, lng1, lat2, lng2) {
lat1 = lat1 || 0;
lng1 = lng1 || 0;
lat2 = lat2 || 0;
lng2 = lng2 || 0;
var rad1 = lat1 * Math.PI / 180.0;
var rad2 = lat2 * Math.PI / 180.0;
var a = rad1 - rad2;
var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
var r = 6378137;
var distance = r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) * Math.cos(rad2) * Math.pow(Math.sin(b / 2), 2)));
// if (distance > 1000){
distance = Math.round(distance / 1000);
// }
return distance;
}
module.exports = {
getWeeker: getWeeker,
compareDate: compareDate,
each: each,
numAdd: numAdd,
numSub: numSub,
numMulti: numMulti,
numDiv: numDiv,
formatTime: formatTime,
replaceAll: replaceAll,
parseToString: parseToString,
isBlank: isBlank,
isNotBlank: isNotBlank,
formatNumber: formatNumber,
showBusy: showBusy,
showSuccess: showSuccess,
showModel: showModel,
alertErrorMsg: alertErrorMsg,
deviceInfo: deviceInfo,
getFormatTime: getFormatTime,
getZero: getZero,
getOne: getOne,
getTwo: getTwo,
isOpen: isOpen,
getDistance: getDistance
}

@ -0,0 +1,49 @@
var postfix = '_deadtime';
/**存储数据 并指定有效时间 */
function put(k, v, t) {
// console.log(k);
wx.setStorageSync(k, v)
var seconds = parseInt(t);
if (seconds > 0) {
var timestamp = Date.parse(new Date());
timestamp = timestamp / 1000 + seconds;
// console.log(timestamp);
wx.setStorageSync(k + postfix, timestamp + "")
} else {
wx.removeStorageSync(k + postfix)
}
}
/**获取数据 1:校验是否在有效期 2:true 返回指定keyvalue 否则返回 def*/
function get(k, def) {
var deadtime = parseInt(wx.getStorageSync(k + postfix))
if (deadtime) {
if (parseInt(deadtime) < Date.parse(new Date()) / 1000) {
if (def) { return def; } else { return; }
}
}
var res = wx.getStorageSync(k);
if (res) {
return res;
} else {
return def;
}
}
/**删除指定key 以及指定key有效时间缓存 */
function remove(k) {
wx.removeStorageSync(k);
wx.removeStorageSync(k + postfix);
}
/**清空缓存 */
function clear() {
wx.clearStorageSync();
}
module.exports = {
put: put,
get: get,
remove: remove,
clear: clear,
}

@ -0,0 +1,308 @@
/**
* html2Json 改造来自: https://github.com/Jxck/html2json
*
*
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/
var __placeImgeUrlHttps = "https";
var __emojisReg = '';
var __emojisBaseSrc = '';
var __emojis = {};
var wxDiscode = require('./wxDiscode.js');
var HTMLParser = require('./htmlparser.js');
// Empty Elements - HTML 5
var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr");
// Block Elements - HTML 5
var block = makeMap("br,a,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video");
// Inline Elements - HTML 5
var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");
// Elements that you can, intentionally, leave open
// (and which close themselves)
var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
// Attributes that have their values filled in disabled="disabled"
var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected");
// Special Elements (can contain anything)
var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block");
function makeMap(str) {
var obj = {}, items = str.split(",");
for (var i = 0; i < items.length; i++)
obj[items[i]] = true;
return obj;
}
function q(v) {
return '"' + v + '"';
}
function removeDOCTYPE(html) {
return html
.replace(/<\?xml.*\?>\n/, '')
.replace(/<.*!doctype.*\>\n/, '')
.replace(/<.*!DOCTYPE.*\>\n/, '');
}
function trimHtml(html) {
return html
.replace(/\r?\n+/g, '')
.replace(/<!--.*?-->/ig, '')
.replace(/\/\*.*?\*\//ig, '')
.replace(/[ ]+</ig, '<')
}
function html2json(html, bindName) {
//处理字符串
html = removeDOCTYPE(html);
html = trimHtml(html);
html = wxDiscode.strDiscode(html);
//生成node节点
var bufArray = [];
var results = {
node: bindName,
nodes: [],
images:[],
imageUrls:[]
};
var index = 0;
HTMLParser(html, {
start: function (tag, attrs, unary) {
//debug(tag, attrs, unary);
// node for this element
var node = {
node: 'element',
tag: tag,
};
if (bufArray.length === 0) {
node.index = index.toString()
index += 1
} else {
var parent = bufArray[0];
if (parent.nodes === undefined) {
parent.nodes = [];
}
node.index = parent.index + '.' + parent.nodes.length
}
if (block[tag]) {
node.tagType = "block";
} else if (inline[tag]) {
node.tagType = "inline";
} else if (closeSelf[tag]) {
node.tagType = "closeSelf";
}
if (attrs.length !== 0) {
node.attr = attrs.reduce(function (pre, attr) {
var name = attr.name;
var value = attr.value;
if (name == 'class') {
console.dir(value);
// value = value.join("")
node.classStr = value;
}
// has multi attibutes
// make it array of attribute
if (name == 'style') {
console.dir(value);
// value = value.join("")
node.styleStr = value;
}
if (name == 'click') {
console.dir(value);
console.error(" click ")
node.clickStr = value;
}
if (value.match(/ /)) {
value = value.split(' ');
}
// if attr already exists
// merge it
if (pre[name]) {
if (Array.isArray(pre[name])) {
// already array, push to last
pre[name].push(value);
} else {
// single value, make it array
pre[name] = [pre[name], value];
}
} else {
// not exist, put it
pre[name] = value;
}
return pre;
}, {});
}
//对img添加额外数据
if (node.tag === 'img') {
node.imgIndex = results.images.length;
var imgUrl = node.attr.src;
if (imgUrl[0] == '') {
imgUrl.splice(0, 1);
}
imgUrl = wxDiscode.urlToHttpUrl(imgUrl, __placeImgeUrlHttps);
node.attr.src = imgUrl;
node.from = bindName;
results.images.push(node);
results.imageUrls.push(imgUrl);
}
// 处理font标签样式属性
if (node.tag === 'font') {
var fontSize = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', '-webkit-xxx-large'];
var styleAttrs = {
'color': 'color',
'face': 'font-family',
'size': 'font-size'
};
if (!node.attr.style) node.attr.style = [];
if (!node.styleStr) node.styleStr = '';
for (var key in styleAttrs) {
if (node.attr[key]) {
var value = key === 'size' ? fontSize[node.attr[key]-1] : node.attr[key];
node.attr.style.push(styleAttrs[key]);
node.attr.style.push(value);
node.styleStr += styleAttrs[key] + ': ' + value + ';';
}
}
}
//临时记录source资源
if(node.tag === 'source'){
results.source = node.attr.src;
}
if (unary) {
// if this tag doesn't have end tag
// like <img src="hoge.png"/>
// add to parents
var parent = bufArray[0] || results;
if (parent.nodes === undefined) {
parent.nodes = [];
}
parent.nodes.push(node);
} else {
bufArray.unshift(node);
}
},
end: function (tag) {
//debug(tag);
// merge into parent tag
var node = bufArray.shift();
if (node.tag !== tag) console.error('invalid state: mismatch end tag');
//当有缓存source资源时于于video补上src资源
if(node.tag === 'video' && results.source){
node.attr.src = results.source;
delete results.source;
}
if (bufArray.length === 0) {
results.nodes.push(node);
} else {
var parent = bufArray[0];
if (parent.nodes === undefined) {
parent.nodes = [];
}
parent.nodes.push(node);
}
},
chars: function (text) {
//debug(text);
var node = {
node: 'text',
text: text,
textArray:transEmojiStr(text)
};
if (bufArray.length === 0) {
node.index = index.toString()
index += 1
results.nodes.push(node);
} else {
var parent = bufArray[0];
if (parent.nodes === undefined) {
parent.nodes = [];
}
node.index = parent.index + '.' + parent.nodes.length
parent.nodes.push(node);
}
},
comment: function (text) {
//debug(text);
// var node = {
// node: 'comment',
// text: text,
// };
// var parent = bufArray[0];
// if (parent.nodes === undefined) {
// parent.nodes = [];
// }
// parent.nodes.push(node);
},
});
return results;
};
function transEmojiStr(str){
// var eReg = new RegExp("["+__reg+' '+"]");
// str = str.replace(/\[([^\[\]]+)\]/g,':$1:')
var emojiObjs = [];
//如果正则表达式为空
if(__emojisReg.length == 0 || !__emojis){
var emojiObj = {}
emojiObj.node = "text";
emojiObj.text = str;
array = [emojiObj];
return array;
}
//这个地方需要调整
str = str.replace(/\[([^\[\]]+)\]/g,':$1:')
var eReg = new RegExp("[:]");
var array = str.split(eReg);
for(var i = 0; i < array.length; i++){
var ele = array[i];
var emojiObj = {};
if(__emojis[ele]){
emojiObj.node = "element";
emojiObj.tag = "emoji";
emojiObj.text = __emojis[ele];
emojiObj.baseSrc= __emojisBaseSrc;
}else{
emojiObj.node = "text";
emojiObj.text = ele;
}
emojiObjs.push(emojiObj);
}
return emojiObjs;
}
function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){
__emojisReg = reg;
__emojisBaseSrc=baseSrc;
__emojis=emojis;
}
module.exports = {
html2json: html2json,
emojisInit:emojisInit
};

@ -0,0 +1,192 @@
/**
*
* htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
*
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/
// Regular Expressions for parsing tags and attributes
var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/,
attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
// Empty Elements - HTML 5
var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr");
// Block Elements - HTML 5
var block = makeMap("a,address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video");
// Inline Elements - HTML 5
var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");
// Elements that you can, intentionally, leave open
// (and which close themselves)
var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
// Attributes that have their values filled in disabled="disabled"
var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected");
// Special Elements (can contain anything)
var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block");
function HTMLParser(html, handler) {
var index, chars, match, stack = [], last = html;
stack.last = function () {
return this[this.length - 1];
};
while (html) {
chars = true;
// Make sure we're not in a script or style element
if (!stack.last() || !special[stack.last()]) {
// Comment
if (html.indexOf("<!--") == 0) {
index = html.indexOf("-->");
if (index >= 0) {
if (handler.comment)
handler.comment(html.substring(4, index));
html = html.substring(index + 3);
chars = false;
}
// end tag
} else if (html.indexOf("</") == 0) {
match = html.match(endTag);
if (match) {
html = html.substring(match[0].length);
match[0].replace(endTag, parseEndTag);
chars = false;
}
// start tag
} else if (html.indexOf("<") == 0) {
match = html.match(startTag);
if (match) {
html = html.substring(match[0].length);
match[0].replace(startTag, parseStartTag);
chars = false;
}
}
if (chars) {
index = html.indexOf("<");
var text = ''
while (index === 0) {
text += "<";
html = html.substring(1);
index = html.indexOf("<");
}
text += index < 0 ? html : html.substring(0, index);
html = index < 0 ? "" : html.substring(index);
if (handler.chars)
handler.chars(text);
}
} else {
html = html.replace(new RegExp("([\\s\\S]*?)<\/" + stack.last() + "[^>]*>"), function (all, text) {
text = text.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, "$1$2");
if (handler.chars)
handler.chars(text);
return "";
});
parseEndTag("", stack.last());
}
if (html == last)
throw "Parse Error: " + html;
last = html;
}
// Clean up any remaining tags
parseEndTag();
function parseStartTag(tag, tagName, rest, unary) {
tagName = tagName.toLowerCase();
if (block[tagName]) {
while (stack.last() && inline[stack.last()]) {
parseEndTag("", stack.last());
}
}
if (closeSelf[tagName] && stack.last() == tagName) {
parseEndTag("", tagName);
}
unary = empty[tagName] || !!unary;
if (!unary)
stack.push(tagName);
if (handler.start) {
var attrs = [];
rest.replace(attr, function (match, name) {
var value = arguments[2] ? arguments[2] :
arguments[3] ? arguments[3] :
arguments[4] ? arguments[4] :
fillAttrs[name] ? name : "";
attrs.push({
name: name,
value: value,
escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //"
});
});
if (handler.start) {
handler.start(tagName, attrs, unary);
}
}
}
function parseEndTag(tag, tagName) {
// If no tag name is provided, clean shop
if (!tagName)
var pos = 0;
// Find the closest opened tag of the same type
else {
tagName = tagName.toLowerCase();
for (var pos = stack.length - 1; pos >= 0; pos--)
if (stack[pos] == tagName)
break;
}
if (pos >= 0) {
// Close all the open elements, up the stack
for (var i = stack.length - 1; i >= pos; i--)
if (handler.end)
handler.end(stack[i]);
// Remove the open elements from the stack
stack.length = pos;
}
}
};
function makeMap(str) {
var obj = {}, items = str.split(",");
for (var i = 0; i < items.length; i++)
obj[items[i]] = true;
return obj;
}
module.exports = HTMLParser;

File diff suppressed because it is too large Load Diff

@ -0,0 +1,207 @@
// HTML 支持的数学符号
function strNumDiscode(str){
str = str.replace(/&forall;/g, '∀');
str = str.replace(/&part;/g, '∂');
str = str.replace(/&exists;/g, '∃');
str = str.replace(/&empty;/g, '∅');
str = str.replace(/&nabla;/g, '∇');
str = str.replace(/&isin;/g, '∈');
str = str.replace(/&notin;/g, '∉');
str = str.replace(/&ni;/g, '∋');
str = str.replace(/&prod;/g, '∏');
str = str.replace(/&sum;/g, '∑');
str = str.replace(/&minus;/g, '');
str = str.replace(/&lowast;/g, '');
str = str.replace(/&radic;/g, '√');
str = str.replace(/&prop;/g, '∝');
str = str.replace(/&infin;/g, '∞');
str = str.replace(/&ang;/g, '∠');
str = str.replace(/&and;/g, '∧');
str = str.replace(/&or;/g, '');
str = str.replace(/&cap;/g, '∩');
str = str.replace(/&cap;/g, '');
str = str.replace(/&int;/g, '∫');
str = str.replace(/&there4;/g, '∴');
str = str.replace(/&sim;/g, '');
str = str.replace(/&cong;/g, '≅');
str = str.replace(/&asymp;/g, '≈');
str = str.replace(/&ne;/g, '≠');
str = str.replace(/&le;/g, '≤');
str = str.replace(/&ge;/g, '≥');
str = str.replace(/&sub;/g, '⊂');
str = str.replace(/&sup;/g, '⊃');
str = str.replace(/&nsub;/g, '⊄');
str = str.replace(/&sube;/g, '⊆');
str = str.replace(/&supe;/g, '⊇');
str = str.replace(/&oplus;/g, '⊕');
str = str.replace(/&otimes;/g, '⊗');
str = str.replace(/&perp;/g, '⊥');
str = str.replace(/&sdot;/g, '⋅');
return str;
}
//HTML 支持的希腊字母
function strGreeceDiscode(str){
str = str.replace(/&Alpha;/g, 'Α');
str = str.replace(/&Beta;/g, 'Β');
str = str.replace(/&Gamma;/g, 'Γ');
str = str.replace(/&Delta;/g, 'Δ');
str = str.replace(/&Epsilon;/g, 'Ε');
str = str.replace(/&Zeta;/g, 'Ζ');
str = str.replace(/&Eta;/g, 'Η');
str = str.replace(/&Theta;/g, 'Θ');
str = str.replace(/&Iota;/g, 'Ι');
str = str.replace(/&Kappa;/g, 'Κ');
str = str.replace(/&Lambda;/g, 'Λ');
str = str.replace(/&Mu;/g, 'Μ');
str = str.replace(/&Nu;/g, 'Ν');
str = str.replace(/&Xi;/g, 'Ν');
str = str.replace(/&Omicron;/g, 'Ο');
str = str.replace(/&Pi;/g, 'Π');
str = str.replace(/&Rho;/g, 'Ρ');
str = str.replace(/&Sigma;/g, 'Σ');
str = str.replace(/&Tau;/g, 'Τ');
str = str.replace(/&Upsilon;/g, 'Υ');
str = str.replace(/&Phi;/g, 'Φ');
str = str.replace(/&Chi;/g, 'Χ');
str = str.replace(/&Psi;/g, 'Ψ');
str = str.replace(/&Omega;/g, 'Ω');
str = str.replace(/&alpha;/g, 'α');
str = str.replace(/&beta;/g, 'β');
str = str.replace(/&gamma;/g, 'γ');
str = str.replace(/&delta;/g, 'δ');
str = str.replace(/&epsilon;/g, 'ε');
str = str.replace(/&zeta;/g, 'ζ');
str = str.replace(/&eta;/g, 'η');
str = str.replace(/&theta;/g, 'θ');
str = str.replace(/&iota;/g, 'ι');
str = str.replace(/&kappa;/g, 'κ');
str = str.replace(/&lambda;/g, 'λ');
str = str.replace(/&mu;/g, 'μ');
str = str.replace(/&nu;/g, 'ν');
str = str.replace(/&xi;/g, 'ξ');
str = str.replace(/&omicron;/g, 'ο');
str = str.replace(/&pi;/g, 'π');
str = str.replace(/&rho;/g, 'ρ');
str = str.replace(/&sigmaf;/g, 'ς');
str = str.replace(/&sigma;/g, 'σ');
str = str.replace(/&tau;/g, 'τ');
str = str.replace(/&upsilon;/g, 'υ');
str = str.replace(/&phi;/g, 'φ');
str = str.replace(/&chi;/g, 'χ');
str = str.replace(/&psi;/g, 'ψ');
str = str.replace(/&omega;/g, 'ω');
str = str.replace(/&thetasym;/g, 'ϑ');
str = str.replace(/&upsih;/g, 'ϒ');
str = str.replace(/&piv;/g, 'ϖ');
str = str.replace(/&middot;/g, '·');
return str;
}
//
function strcharacterDiscode(str){
// 加入常用解析
str = str.replace(/&nbsp;/g, ' ');
str = str.replace(/&quot;/g, "'");
str = str.replace(/&amp;/g, '&');
// str = str.replace(/&lt;/g, '');
// str = str.replace(/&gt;/g, '');
str = str.replace(/&lt;/g, '<');
str = str.replace(/&gt;/g, '>');
str = str.replace(/&#8226;/g, '•');
return str;
}
// HTML 支持的其他实体
function strOtherDiscode(str){
str = str.replace(/&OElig;/g, 'Œ');
str = str.replace(/&oelig;/g, 'œ');
str = str.replace(/&Scaron;/g, 'Š');
str = str.replace(/&scaron;/g, 'š');
str = str.replace(/&Yuml;/g, 'Ÿ');
str = str.replace(/&fnof;/g, 'ƒ');
str = str.replace(/&circ;/g, 'ˆ');
str = str.replace(/&tilde;/g, '˜');
str = str.replace(/&ensp;/g, '');
str = str.replace(/&emsp;/g, '');
str = str.replace(/&thinsp;/g, '');
str = str.replace(/&zwnj;/g, '');
str = str.replace(/&zwj;/g, '');
str = str.replace(/&lrm;/g, '');
str = str.replace(/&rlm;/g, '');
str = str.replace(/&ndash;/g, '');
str = str.replace(/&mdash;/g, '—');
str = str.replace(/&lsquo;/g, '');
str = str.replace(/&rsquo;/g, '');
str = str.replace(/&sbquo;/g, '');
str = str.replace(/&ldquo;/g, '“');
str = str.replace(/&rdquo;/g, '”');
str = str.replace(/&bdquo;/g, '„');
str = str.replace(/&dagger;/g, '†');
str = str.replace(/&Dagger;/g, '‡');
str = str.replace(/&bull;/g, '•');
str = str.replace(/&hellip;/g, '…');
str = str.replace(/&permil;/g, '‰');
str = str.replace(/&prime;/g, '');
str = str.replace(/&Prime;/g, '″');
str = str.replace(/&lsaquo;/g, '');
str = str.replace(/&rsaquo;/g, '');
str = str.replace(/&oline;/g, '‾');
str = str.replace(/&euro;/g, '€');
str = str.replace(/&trade;/g, '™');
str = str.replace(/&larr;/g, '←');
str = str.replace(/&uarr;/g, '↑');
str = str.replace(/&rarr;/g, '→');
str = str.replace(/&darr;/g, '↓');
str = str.replace(/&harr;/g, '↔');
str = str.replace(/&crarr;/g, '↵');
str = str.replace(/&lceil;/g, '⌈');
str = str.replace(/&rceil;/g, '⌉');
str = str.replace(/&lfloor;/g, '⌊');
str = str.replace(/&rfloor;/g, '⌋');
str = str.replace(/&loz;/g, '◊');
str = str.replace(/&spades;/g, '♠');
str = str.replace(/&clubs;/g, '♣');
str = str.replace(/&hearts;/g, '♥');
str = str.replace(/&diams;/g, '♦');
str = str.replace(/&#39;/g, '\'');
return str;
}
function strMoreDiscode(str){
str = str.replace(/\r\n/g,"");
str = str.replace(/\n/g,"");
str = str.replace(/code/g,"wxxxcode-style");
return str;
}
function strDiscode(str){
str = strNumDiscode(str);
str = strGreeceDiscode(str);
str = strcharacterDiscode(str);
str = strOtherDiscode(str);
str = strMoreDiscode(str);
return str;
}
function urlToHttpUrl(url,rep){
var patt1 = new RegExp("^//");
var result = patt1.test(url);
if(result){
url = rep+":"+url;
}
return url;
}
module.exports = {
strDiscode:strDiscode,
urlToHttpUrl:urlToHttpUrl
}

@ -0,0 +1,159 @@
/**
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/
/**
* utils函数引入
**/
import showdown from './showdown.js';
import HtmlToJson from './html2json.js';
/**
* 配置及公有属性
**/
var realWindowWidth = 0;
var realWindowHeight = 0;
wx.getSystemInfo({
success: function (res) {
realWindowWidth = res.windowWidth
realWindowHeight = res.windowHeight
}
})
/**
* 主函数入口区
**/
function wxParse(bindName = 'wxParseData', type='html', data='<div class="color:red;">数据不能为空</div>', target,imagePadding) {
var that = target;
var transData = {};//存放转化后的数据
if (type == 'html') {
transData = HtmlToJson.html2json(data, bindName);
// console.log(JSON.stringify(transData, ' ', ' '));
} else if (type == 'md' || type == 'markdown') {
var converter = new showdown.Converter();
var html = converter.makeHtml(data);
transData = HtmlToJson.html2json(html, bindName);
// console.log(JSON.stringify(transData, ' ', ' '));
}
transData.view = {};
transData.view.imagePadding = 0;
if(typeof(imagePadding) != 'undefined'){
transData.view.imagePadding = imagePadding
}
var bindData = {};
bindData[bindName] = transData;
that.setData(bindData)
that.wxParseImgLoad = wxParseImgLoad;
that.wxParseImgTap = wxParseImgTap;
}
// 图片点击事件
function wxParseImgTap(e) {
var that = this;
var nowImgUrl = e.target.dataset.src;
var tagFrom = e.target.dataset.from;
if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) {
wx.previewImage({
current: nowImgUrl, // 当前显示图片的http链接
urls: that.data[tagFrom].imageUrls // 需要预览的图片http链接列表
})
}
}
/**
* 图片视觉宽高计算函数区
**/
function wxParseImgLoad(e) {
var that = this;
var tagFrom = e.target.dataset.from;
var idx = e.target.dataset.idx;
if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) {
calMoreImageInfo(e, idx, that, tagFrom)
}
}
// 假循环获取计算图片视觉最佳宽高
function calMoreImageInfo(e, idx, that, bindName) {
var temData = that.data[bindName];
if (!temData || temData.images.length == 0) {
return;
}
var temImages = temData.images;
//因为无法获取view宽度 需要自定义padding进行计算稍后处理
var recal = wxAutoImageCal(e.detail.width, e.detail.height,that,bindName);
// temImages[idx].width = recal.imageWidth;
// temImages[idx].height = recal.imageheight;
// temData.images = temImages;
// var bindData = {};
// bindData[bindName] = temData;
// that.setData(bindData);
var index = temImages[idx].index
var key = `${bindName}`
for (var i of index.split('.')) key+=`.nodes[${i}]`
var keyW = key + '.width'
var keyH = key + '.height'
that.setData({
[keyW]: recal.imageWidth,
[keyH]: recal.imageheight,
})
}
// 计算视觉优先的图片宽高
function wxAutoImageCal(originalWidth, originalHeight,that,bindName) {
//获取图片的原始长宽
var windowWidth = 0, windowHeight = 0;
var autoWidth = 0, autoHeight = 0;
var results = {};
var padding = that.data[bindName].view.imagePadding;
windowWidth = realWindowWidth-2*padding;
windowHeight = realWindowHeight;
//判断按照那种方式进行缩放
// console.log("windowWidth" + windowWidth);
if (originalWidth > windowWidth) {//在图片width大于手机屏幕width时候
autoWidth = windowWidth;
// console.log("autoWidth" + autoWidth);
autoHeight = (autoWidth * originalHeight) / originalWidth;
// console.log("autoHeight" + autoHeight);
results.imageWidth = autoWidth;
results.imageheight = autoHeight;
} else {//否则展示原来的数据
results.imageWidth = originalWidth;
results.imageheight = originalHeight;
}
return results;
}
function wxParseTemArray(temArrayName,bindNameReg,total,that){
var array = [];
var temData = that.data;
var obj = null;
for(var i = 0; i < total; i++){
var simArr = temData[bindNameReg+i].nodes;
array.push(simArr);
}
temArrayName = temArrayName || 'wxParseTemArray';
obj = JSON.parse('{"'+ temArrayName +'":""}');
obj[temArrayName] = array;
that.setData(obj);
}
/**
* 配置emojis
*
*/
function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){
HtmlToJson.emojisInit(reg,baseSrc,emojis);
}
module.exports = {
wxParse: wxParse,
wxParseTemArray:wxParseTemArray,
emojisInit:emojisInit
}

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

@ -0,0 +1,968 @@
<!--**
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/-->
<!--基础元素-->
<template name="wxParseVideo">
<!--增加video标签支持并循环添加-->
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<video class="{{item.classStr}} wxParse-{{item.tag}}-video" src="{{item.attr.src}}"></video>
</view>
</template>
<template name="wxParseImg">
<image class="{{item.classStr}} wxParse-{{item.tag}}" data-from="{{item.from}}" data-src="{{item.attr.src}}" data-idx="{{item.imgIndex}}" src="{{item.attr.src}}" mode="aspectFit" bindload="wxParseImgLoad" bindtap="wxParseImgTap" mode="widthFix"
/>
<!-- style="width:{{item.width}}px;" -->
</template>
<template name="WxEmojiView">
<view class="WxEmojiView wxParse-inline" style="{{item.styleStr}}">
<block wx:for="{{item.textArray}}" wx:key="">
<block class="{{item.text == '\\n' ? 'wxParse-hide':''}}" wx:if="{{item.node == 'text'}}">{{item.text}}</block>
<block wx:elif="{{item.node == 'element'}}">
<image class="wxEmoji" src="{{item.baseSrc}}{{item.text}}" />
</block>
</block>
</view>
</template>
<template name="WxParseBr">
<text>\n</text>
</template>
<!--入口模版-->
<template name="wxParse">
<block wx:for="{{wxParseData}}" wx:key="">
<template is="wxParse0" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse0">
<!--<template is="wxParse1" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse1" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse1" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse1" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'table'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse1" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse1" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse1" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse1">
<!--<template is="wxParse2" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse2" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse2" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse2" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse2" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse2" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse2">
<!--<template is="wxParse3" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse3" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse3" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse3" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse3" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse3" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse3">
<!--<template is="wxParse4" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse4" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse4" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse4" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse4" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse4" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse4">
<!--<template is="wxParse5" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse5" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse5" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse5" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse5" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse5" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse5">
<!--<template is="wxParse6" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse6" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse6" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse6" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse6" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse6" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse6">
<!--<template is="wxParse7" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse7" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse7" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse7" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse7" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse7" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse7">
<!--<template is="wxParse8" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse8" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse8" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse8" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse8" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse8" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse8">
<!--<template is="wxParse9" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse9" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse9" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse9" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse9" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse9" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse9">
<!--<template is="wxParse10" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse10" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse10" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse10" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse10" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse10" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse10">
<!--<template is="wxParse11" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse11" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse11" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse11" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse11" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse11" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>
<!--循环模版-->
<template name="wxParse11">
<!--<template is="wxParse12" data="{{item}}" />-->
<!--判断是否是标签节点-->
<block wx:if="{{item.node == 'element'}}">
<block wx:if="{{item.tag == 'button'}}">
<button type="default" size="mini">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse12" data="{{item}}" />
</block>
</button>
</block>
<!--li类型-->
<block wx:elif="{{item.tag == 'li'}}">
<view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
<view class="{{item.classStr}} wxParse-li-inner">
<view class="{{item.classStr}} wxParse-li-text">
<view class="{{item.classStr}} wxParse-li-circle"></view>
</view>
<view class="{{item.classStr}} wxParse-li-text">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse12" data="{{item}}" />
</block>
</view>
</view>
</view>
</block>
<!--video类型-->
<block wx:elif="{{item.tag == 'video'}}">
<template is="wxParseVideo" data="{{item}}" />
</block>
<!--img类型-->
<block wx:elif="{{item.tag == 'img'}}">
<template is="wxParseImg" data="{{item}}" />
</block>
<!--a类型-->
<block wx:elif="{{item.tag == 'a'}}">
<view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse12" data="{{item}}" />
</block>
</view>
</block>
<block wx:elif="{{item.tag == 'br'}}">
<template is="WxParseBr"></template>
</block>
<!--其他块级标签-->
<block wx:elif="{{item.tagType == 'block'}}">
<view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse12" data="{{item}}" />
</block>
</view>
</block>
<!--内联标签-->
<view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
<block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
<template is="wxParse12" data="{{item}}" />
</block>
</view>
</block>
<!--判断是否是文本节点-->
<block wx:elif="{{item.node == 'text'}}">
<!--如果是,直接进行-->
<template is="WxEmojiView" data="{{item}}" />
</block>
</template>

@ -0,0 +1,206 @@
/**
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/
.wxParse{
margin: 0 5px;
font-family: Helvetica,sans-serif;
font-size: 28rpx;
color: #666;
line-height: 1.8;
}
view{
/* word-break:break-all; overflow:auto; */
}
.wxParse-inline{
display: inline;
margin: 0;
padding: 0;
}
/*//标题 */
.wxParse-div{margin: 0;padding: 0;}
.wxParse-h1{ font-size:2em; margin: .67em 0 }
.wxParse-h2{ font-size:1.5em; margin: .75em 0 }
.wxParse-h3{ font-size:1.17em; margin: .83em 0 }
.wxParse-h4{ margin: 1.12em 0}
.wxParse-h5 { font-size:.83em; margin: 1.5em 0 }
.wxParse-h6{ font-size:.75em; margin: 1.67em 0 }
.wxParse-h1 {
font-size: 18px;
font-weight: 400;
margin-bottom: .9em;
}
.wxParse-h2 {
font-size: 16px;
font-weight: 400;
margin-bottom: .34em;
}
.wxParse-h3 {
font-weight: 400;
font-size: 15px;
margin-bottom: .34em;
}
.wxParse-h4 {
font-weight: 400;
font-size: 14px;
margin-bottom: .24em;
}
.wxParse-h5 {
font-weight: 400;
font-size: 13px;
margin-bottom: .14em;
}
.wxParse-h6 {
font-weight: 400;
font-size: 12px;
margin-bottom: .04em;
}
.wxParse-h1, .wxParse-h2, .wxParse-h3, .wxParse-h4, .wxParse-h5, .wxParse-h6, .wxParse-b, .wxParse-strong { font-weight: bolder }
.wxParse-i,.wxParse-cite,.wxParse-em,.wxParse-var,.wxParse-address{font-style:italic}
.wxParse-pre,.wxParse-tt,.wxParse-code,.wxParse-kbd,.wxParse-samp{font-family:monospace}
.wxParse-pre{white-space:pre}
.wxParse-big{font-size:1.17em}
.wxParse-small,.wxParse-sub,.wxParse-sup{font-size:.83em}
.wxParse-sub{vertical-align:sub}
.wxParse-sup{vertical-align:super}
.wxParse-s,.wxParse-strike,.wxParse-del{text-decoration:line-through}
/*wxparse-自定义个性化的css样式*/
/*增加video的css样式*/
.wxParse-strong,.wxParse-s{display: inline}
.wxParse-a{
color: deepskyblue;
word-break:break-all;
overflow:auto;
}
.wxParse-video{
text-align: center;
margin: 10px 0;
}
.wxParse-video-video{
width:100%;
}
.wxParse-img{
/*background-color: #efefef;*/
overflow: hidden;
}
.wxParse-blockquote {
margin: 0;
padding:10px 0 10px 5px;
font-family:Courier, Calibri,"宋体";
background:#f5f5f5;
border-left: 3px solid #dbdbdb;
}
.wxParse-code,.wxParse-wxxxcode-style{
display: inline;
background:#f5f5f5;
}
.wxParse-ul{
margin: 20rpx 10rpx;
}
.wxParse-li,.wxParse-li-inner{
display: flex;
align-items: baseline;
margin: 10rpx 0;
}
.wxParse-li-text{
align-items: center;
line-height: 20px;
}
.wxParse-li-circle{
display: inline-flex;
width: 5px;
height: 5px;
background-color: #333;
margin-right: 5px;
}
.wxParse-li-square{
display: inline-flex;
width: 10rpx;
height: 10rpx;
background-color: #333;
margin-right: 5px;
}
.wxParse-li-ring{
display: inline-flex;
width: 10rpx;
height: 10rpx;
border: 2rpx solid #333;
border-radius: 50%;
background-color: #fff;
margin-right: 5px;
}
/*.wxParse-table{
width: 100%;
height: 400px;
}
.wxParse-thead,.wxParse-tfoot,.wxParse-tr{
display: flex;
flex-direction: row;
}
.wxParse-th,.wxParse-td{
display: flex;
width: 580px;
overflow: auto;
}*/
.wxParse-u {
text-decoration: underline;
}
.wxParse-hide{
display: none;
}
.WxEmojiView{
align-items: center;
}
.wxEmoji{
width: 16px;
height:16px;
}
.wxParse-tr{
display: flex;
border-right:1px solid #e0e0e0;
border-bottom:1px solid #e0e0e0;
border-top:1px solid #e0e0e0;
}
.wxParse-th,
.wxParse-td{
flex:1;
padding:5px;
font-size:28rpx;
border-left:1px solid #e0e0e0;
word-break: break-all;
}
.wxParse-td:last{
border-top:1px solid #e0e0e0;
}
.wxParse-th{
background:#f0f0f0;
border-top:1px solid #e0e0e0;
}
.wxParse-del{
display: inline;
}
.wxParse-figure {
overflow: hidden;
}

@ -0,0 +1,62 @@
var Promise = require('../plugins/es6-promise.js')
function wxPromisify(fn) {
return function (obj = {}) {
return new Promise((resolve, reject) => {
obj.success = function (res) {
//成功
resolve(res)
}
obj.fail = function (res) {
//失败
reject(res)
}
fn(obj)
})
}
}
//无论promise对象最后状态如何都会执行
Promise.prototype.finally = function (callback) {
let P = this.constructor;
return this.then(
value => P.resolve(callback()).then(() => value),
reason => P.resolve(callback()).then(() => { throw reason })
);
};
/**
* 微信请求get方法
* url
* data 以对象的格式传入
*/
function getRequest(url, data) {
var getRequest = wxPromisify(wx.request)
return getRequest({
url: url,
method: 'GET',
data: data,
header: {
'Content-Type': 'application/json'
}
})
}
/**
* 微信请求post方法封装
* url
* data 以对象的格式传入
*/
function postRequest(url, data) {
var postRequest = wxPromisify(wx.request)
return postRequest({
url: url,
method: 'POST',
data: data,
header: {
"content-type": "application/x-www-form-urlencoded"
},
})
}
module.exports = {
postRequest: postRequest,
getRequest: getRequest
}

@ -0,0 +1,23 @@
var barcode = require('./barcode');
var qrcode = require('./qrcode');
function convert_length(length) {
return Math.round(wx.getSystemInfoSync().windowWidth * length / 750);
}
function barc(id, code, width, height) {
barcode.code128(wx.createCanvasContext(id), code, convert_length(width), convert_length(height))
}
function qrc(id, code, width, height) {
qrcode.api.draw(code, {
ctx: wx.createCanvasContext(id),
width: convert_length(width),
height: convert_length(height)
})
}
module.exports = {
barcode: barc,
qrcode: qrc
}
Loading…
Cancel
Save