|
|
import md5 from "./md5.min";
|
|
|
const HOSTARR = {
|
|
|
'development': 'https://xinwuqu.langye.net/',
|
|
|
'production': 'https://xinwuqu.langye.net/'
|
|
|
};
|
|
|
|
|
|
const HOST = HOSTARR[process.env
|
|
|
.NODE_ENV]; //"https://tiantianxinye.365care.langye.net/";//HOSTARR[process.env.NODE_ENV];//
|
|
|
|
|
|
|
|
|
const formatTime = date => {
|
|
|
const year = date.getFullYear();
|
|
|
const month = date.getMonth() + 1;
|
|
|
const day = date.getDate();
|
|
|
return [year, month, day].map(formatNumber).join('-');
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 其他更多是格式化有如下:
|
|
|
// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合
|
|
|
function timeFormat(dateTime = null, fmt = 'yyyy-mm-dd') {
|
|
|
try {
|
|
|
|
|
|
// 如果为null,则格式化当前时间
|
|
|
if (!dateTime) dateTime = Number(new Date());
|
|
|
// 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式
|
|
|
if (dateTime.toString().length == 10) dateTime *= 1000;
|
|
|
if (dateTime.toString().indexOf("-") > -1) dateTime = dateTime.replace(/-/g, '/')
|
|
|
let date = new Date(dateTime);
|
|
|
|
|
|
let ret;
|
|
|
let opt = {
|
|
|
"y+": date.getFullYear().toString(), // 年
|
|
|
"m+": (date.getMonth() + 1).toString(), // 月
|
|
|
"d+": date.getDate().toString(), // 日
|
|
|
"h+": date.getHours().toString(), // 时
|
|
|
"M+": date.getMinutes().toString(), // 分
|
|
|
"s+": date.getSeconds().toString() // 秒
|
|
|
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
|
|
};
|
|
|
for (let k in opt) {
|
|
|
ret = new RegExp("(" + k + ")").exec(fmt);
|
|
|
if (ret) {
|
|
|
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
|
|
|
};
|
|
|
};
|
|
|
return fmt;
|
|
|
} catch (e) {
|
|
|
console.log(e)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const stateArr = {
|
|
|
"save": "待处理",
|
|
|
"ongoing": "处理中",
|
|
|
"finished": "已处理"
|
|
|
}
|
|
|
const formatTimeAll = 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;
|
|
|
}; // 快捷显示alert
|
|
|
|
|
|
|
|
|
const alert = msg => {
|
|
|
uni.showModal({
|
|
|
title: '',
|
|
|
content: msg,
|
|
|
showCancel: false
|
|
|
});
|
|
|
}; // 订单状态
|
|
|
|
|
|
|
|
|
const orderStatusDic = {
|
|
|
'0': '待确认',
|
|
|
'10': '待派单',
|
|
|
'20': '进行中',
|
|
|
'100': '已完成'
|
|
|
}; // 审核状态
|
|
|
|
|
|
const auditStatusDic = {
|
|
|
'0': '待审核',
|
|
|
'1': '已审核',
|
|
|
'-1': '已拒绝'
|
|
|
}; // 请求封装
|
|
|
|
|
|
const request = options => {
|
|
|
if (!options.customLoading) {
|
|
|
//if(false){
|
|
|
uni.showLoading({
|
|
|
title: '正在加载'
|
|
|
});
|
|
|
} else {
|
|
|
// 当前页面请求数量+1
|
|
|
if (options.bindThis) {
|
|
|
//options.bindThis.loadingCount=options.bindThis.data.loadingCount + 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
options.url = HOST + options.api;
|
|
|
options.header = {
|
|
|
...options.header,
|
|
|
//'Accept': 'application/json',
|
|
|
//'Connection': 'keep-alive'
|
|
|
//'content-type': 'application/json'
|
|
|
}; // 如果已登录,请求中拼openId
|
|
|
|
|
|
var access_token = uni.getStorageSync('userInfo').token;
|
|
|
|
|
|
if (isLogin()) {
|
|
|
options.data = {
|
|
|
...options.data,
|
|
|
'token': access_token
|
|
|
};
|
|
|
} // 如果是POST方法
|
|
|
|
|
|
|
|
|
if (options.method == 'POST' && !isNull(access_token)) {
|
|
|
// 拼时间戳
|
|
|
options.data.ts = new Date().getTime();
|
|
|
}
|
|
|
|
|
|
uni.request({
|
|
|
...options,
|
|
|
success: function(res) {
|
|
|
// if(!options.hideload){
|
|
|
// console.log("options.hideload")
|
|
|
// uni.hideLoading();
|
|
|
// }
|
|
|
uni.hideLoading();
|
|
|
if (res.statusCode != 200) {
|
|
|
if (options.utilFail != undefined) {
|
|
|
if (res.statusCode == 401) {
|
|
|
uni.clearStorageSync();
|
|
|
uni.navigateTo({
|
|
|
url: '/pages/login/login'
|
|
|
});
|
|
|
} else {
|
|
|
options.utilFail('TODO: 特殊处理非200错误(' + res.statusCode + ')');
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
if (!isNull(res.data.errorcode) || res.data.errorcode == 0) {
|
|
|
if (options.utilFail != undefined) {
|
|
|
options.utilFail(res.data.errormsg || '接口发生未知错误');
|
|
|
} else {
|
|
|
options.utilFail(res.data.errormsg);
|
|
|
}
|
|
|
} else {
|
|
|
if (options.utilSuccess != undefined) {
|
|
|
options.utilSuccess(res.data);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
fail: function(res) {
|
|
|
uni.hideLoading();
|
|
|
options.utilFail(res);
|
|
|
},
|
|
|
complete: function(res) {
|
|
|
if (!options.customLoading) {
|
|
|
uni.hideNavigationBarLoading();
|
|
|
|
|
|
} else {
|
|
|
// 当前页面请求数量-1
|
|
|
if (options.bindThis) {
|
|
|
//options.bindThis.setData({
|
|
|
//loadingCount: options.bindThis.data.loadingCount - 1
|
|
|
//});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
}; // 提交formID封装
|
|
|
|
|
|
|
|
|
const uploadFormID = formID => {
|
|
|
var timestamp = Math.floor(new Date().getTime() / 1000);
|
|
|
request({
|
|
|
api: 'WeChat/SaveFormID',
|
|
|
method: 'POST',
|
|
|
data: {
|
|
|
FormIDs: formID
|
|
|
},
|
|
|
utilSuccess: function(res) {
|
|
|
console.log('上传formID成功');
|
|
|
},
|
|
|
utilFail: function(err) {
|
|
|
console.log('上传formID失败');
|
|
|
}
|
|
|
});
|
|
|
}; // 支付
|
|
|
|
|
|
|
|
|
const payOrder = (orderID, orderType, success, fail) => {
|
|
|
uni.request({
|
|
|
url: HOST + 'WxPay/ToPay?openId=' + uni.getStorageSync('userInfo').WeChatOpenID + '&orderId=' +
|
|
|
orderID + '&OrderType=' + orderType,
|
|
|
method: 'GET',
|
|
|
header: {
|
|
|
'content-type': 'application/json'
|
|
|
},
|
|
|
success: function(res) {
|
|
|
// 内容为空, 代表失败
|
|
|
if (res.data == '') {
|
|
|
fail('当前网络状况不好');
|
|
|
return;
|
|
|
} // 去掉转义字符
|
|
|
|
|
|
|
|
|
var pureStr = res.data.replace(/\\/g, '');
|
|
|
res.data = JSON.parse(pureStr);
|
|
|
var index = res.data.package.indexOf('=') + 1;
|
|
|
var prepayId = res.data.package.substring(index); // wxpay
|
|
|
|
|
|
uni.requestPayment({
|
|
|
timeStamp: res.data.timeStamp,
|
|
|
nonceStr: res.data.nonceStr,
|
|
|
package: res.data.package,
|
|
|
signType: res.data.signType,
|
|
|
paySign: res.data.paySign,
|
|
|
success: function(res) {
|
|
|
success(res); // 发送成功通知
|
|
|
|
|
|
request({
|
|
|
api: 'WxPay/PayTemplateMsg',
|
|
|
data: {
|
|
|
prepay_id: prepayId,
|
|
|
orderId: orderID,
|
|
|
isSuccess: 1,
|
|
|
failMsg: '',
|
|
|
xType: orderType
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
fail: function(res) {
|
|
|
fail(res);
|
|
|
var errMsg = res == 'requestPayment:fail cancel' ? '用户取消支付' :
|
|
|
res; // 发送失败通知
|
|
|
|
|
|
request({
|
|
|
api: 'WxPay/PayTemplateMsg',
|
|
|
data: {
|
|
|
prepay_id: prepayId,
|
|
|
orderId: orderID,
|
|
|
isSuccess: 0,
|
|
|
failMsg: errMsg,
|
|
|
xType: orderType
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
fail: function(err) {
|
|
|
fail('当前网络状况不好');
|
|
|
}
|
|
|
});
|
|
|
}; // 判断是否已登录(同时有open-id和PhoneNum, 则认为已登录)
|
|
|
|
|
|
|
|
|
const getRegions = () => {
|
|
|
request({
|
|
|
api: 'api/get-regions',
|
|
|
customLoading: true,
|
|
|
utilSuccess: function(res) {
|
|
|
var r = res[0];
|
|
|
r.latitude = 31.53908730560652; //res.latitude;31.536744,120.40841
|
|
|
r.longitude = 120.41435442003421; // res.longitude;
|
|
|
uni.setStorageSync("region", r);
|
|
|
|
|
|
},
|
|
|
utilFail: function(res) {
|
|
|
console.log(res)
|
|
|
}
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
const scanPay = (orderID, amt, scan, type, success, fail) => {
|
|
|
var access_token = uni.getStorageSync('userInfo').access_token;
|
|
|
console.log("1.支付进入")
|
|
|
var data = {
|
|
|
token: access_token,
|
|
|
order_id: orderID,
|
|
|
money: amt,
|
|
|
auth_code: scan,
|
|
|
type: type
|
|
|
};
|
|
|
console.log("2.参数")
|
|
|
console.log(data)
|
|
|
uni.showLoading({
|
|
|
title: '正在加载',
|
|
|
|
|
|
});
|
|
|
uni.request({
|
|
|
url: HOST + 'manager/scan-pay/' + orderID,
|
|
|
method: 'POST',
|
|
|
data: {
|
|
|
token: access_token,
|
|
|
order_id: orderID,
|
|
|
money: amt,
|
|
|
auth_code: scan,
|
|
|
type: type
|
|
|
},
|
|
|
header: {
|
|
|
'content-type': 'application/json'
|
|
|
},
|
|
|
success: function(res) {
|
|
|
uni.hideLoading();
|
|
|
if (isNull(res.data.errorcode)) {
|
|
|
success(res);
|
|
|
console.log("3.支付成功")
|
|
|
console.log(res)
|
|
|
} else {
|
|
|
alert("支付失败:" + res.data.errormsg);
|
|
|
console.log("4.支付失败")
|
|
|
console.log(res)
|
|
|
}
|
|
|
|
|
|
},
|
|
|
fail: function(err) {
|
|
|
fail('当前网络状况不好');
|
|
|
console.log("4.支付失败")
|
|
|
console.log(res)
|
|
|
}
|
|
|
});
|
|
|
}; // 判断是否已登录(同时有open-id和PhoneNum, 则认为已登录)
|
|
|
|
|
|
const isLogin = () => {
|
|
|
var userInfo = uni.getStorageSync('userInfo');
|
|
|
return !isNull(userInfo.token);
|
|
|
}; // 判断是否为空
|
|
|
|
|
|
|
|
|
const getfile = (id, success, fail) => {
|
|
|
var access_token = uni.getStorageSync('userInfo').access_token;
|
|
|
var url = HOST + 'manager/get-attachment/' + id + '?token=' + access_token;
|
|
|
success(url);
|
|
|
// uni.request({
|
|
|
// url: HOST + 'manager/get-attachment/' + id + '?token=' + access_token,
|
|
|
// method: 'GET',
|
|
|
// header: {
|
|
|
// 'content-type': 'application/json'
|
|
|
// },
|
|
|
// success: function(res) {
|
|
|
// success(res); // 发送成功通知
|
|
|
// },
|
|
|
// fail: function(res) {
|
|
|
// fail(res);
|
|
|
// }
|
|
|
// });
|
|
|
};
|
|
|
|
|
|
const openid_info_key = "openid_info"
|
|
|
const user_info_key = 'user_info_key'
|
|
|
const solgn = "无锡新吴欢迎您";
|
|
|
|
|
|
const shareInfo = (type) => {
|
|
|
|
|
|
return {
|
|
|
title: solgn
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const getOpenidInfo = (cb, refresh) => {
|
|
|
cb = cb || function() {}
|
|
|
refresh = refresh || false
|
|
|
if (!refresh) {
|
|
|
let user_info = uni.getStorageSync(user_info_key)
|
|
|
if (user_info && user_info.openid && user_info.session_key) {
|
|
|
cb(user_info)
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
|
|
|
uni.login({
|
|
|
provider: 'weixin',
|
|
|
success: (res) => {
|
|
|
uni.request({
|
|
|
url: HOST + 'api/member/login-by-code',
|
|
|
method: 'POST',
|
|
|
data: {
|
|
|
code: res.code
|
|
|
},
|
|
|
success: result => {
|
|
|
const user_info1 = result.data.data.user_info
|
|
|
user_info1.openid = user_info1.wechat_openid
|
|
|
uni.setStorageSync(user_info_key, user_info1)
|
|
|
|
|
|
cb(user_info1)
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
const getUserProfile = (cb) => {
|
|
|
cb = cb || function() {}
|
|
|
|
|
|
wx.getUserProfile({
|
|
|
desc: '用于完善会员资料',
|
|
|
success: (res) => {
|
|
|
uni.setStorageSync('user_profile', res.userInfo)
|
|
|
cb(res.userInfo)
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
const getUserInfoCache = () => {
|
|
|
return uni.getStorageSync(user_info_key)
|
|
|
}
|
|
|
|
|
|
|
|
|
//获取订单详情
|
|
|
const getOrderInfo = (id, success, fail) => {
|
|
|
var access_token = uni.getStorageSync('userInfo').access_token;
|
|
|
var url = HOST + 'manager/get-order/' + id + '?token=' + access_token;
|
|
|
uni.request({
|
|
|
url: url,
|
|
|
method: 'GET',
|
|
|
header: {
|
|
|
'content-type': 'application/json'
|
|
|
},
|
|
|
success: function(res) {
|
|
|
res.data.factorjson = JSON.parse(res.data.factors);
|
|
|
success(res); // 发送成功通知
|
|
|
},
|
|
|
fail: function(res) {
|
|
|
fail(res);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
|
|
|
//获取订单详情
|
|
|
const getOrderItemInfo = (id, success, fail) => {
|
|
|
var access_token = uni.getStorageSync('userInfo').access_token;
|
|
|
var url = HOST + 'manager/get-order-item/' + id + '?token=' + access_token;
|
|
|
uni.request({
|
|
|
url: url,
|
|
|
method: 'GET',
|
|
|
header: {
|
|
|
'content-type': 'application/json'
|
|
|
},
|
|
|
success: function(res) {
|
|
|
res.data.factorjson = JSON.parse(res.data.factors);
|
|
|
success(res.data); // 发送成功通知
|
|
|
},
|
|
|
fail: function(res) {
|
|
|
fail(res);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
const isNull = p => {
|
|
|
return p == '' || p == undefined || p == null || p == 'undefined' || p == 'null';
|
|
|
}; // 正则
|
|
|
|
|
|
|
|
|
const phoneRegex = /^1\d{10}$/;
|
|
|
const idCardRegex = /^\d{17}([0-9]|X)$/; // 去掉特殊字符
|
|
|
|
|
|
const filterSpecialChars = str => {
|
|
|
return str.replace(/[^\u4e00-\u9fa5a-zA-Z0-9\w]/g, '');
|
|
|
}; // 生成随机字符串
|
|
|
|
|
|
|
|
|
const randomStr = length => {
|
|
|
var ret = '';
|
|
|
var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
|
|
|
'i', 'j',
|
|
|
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C',
|
|
|
'D', 'E',
|
|
|
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
|
|
'Y', 'Z'
|
|
|
];
|
|
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
|
var randomIndex = Math.round(Math.random() * (arr.length - 1));
|
|
|
ret += arr[randomIndex];
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}; // proType对应的中文描述
|
|
|
|
|
|
|
|
|
const proTypeDic = {}; // 排序字段
|
|
|
|
|
|
const orderByArr = [{
|
|
|
id: '1',
|
|
|
name: '近期销量最高'
|
|
|
}, // { id: '2', name: '产品评价最高' },
|
|
|
{
|
|
|
id: '3',
|
|
|
name: '价格由高到低'
|
|
|
}, {
|
|
|
id: '4',
|
|
|
name: '价格由低到高'
|
|
|
}
|
|
|
]; // 日期天数
|
|
|
|
|
|
const travelDaysArr = [{
|
|
|
id: '1',
|
|
|
name: '2日',
|
|
|
minDay: 2,
|
|
|
maxDay: 2
|
|
|
}, {
|
|
|
id: '2',
|
|
|
name: '3日',
|
|
|
minDay: 3,
|
|
|
maxDay: 3
|
|
|
}, {
|
|
|
id: '3',
|
|
|
name: '4日',
|
|
|
minDay: 4,
|
|
|
maxDay: 4
|
|
|
}, {
|
|
|
id: '4',
|
|
|
name: '5日',
|
|
|
minDay: 5,
|
|
|
maxDay: 5
|
|
|
}, {
|
|
|
id: '5',
|
|
|
name: '6日',
|
|
|
minDay: 6,
|
|
|
maxDay: 6
|
|
|
}, {
|
|
|
id: '6',
|
|
|
name: '7日',
|
|
|
minDay: 7,
|
|
|
maxDay: 7
|
|
|
}, {
|
|
|
id: '7',
|
|
|
name: '8日',
|
|
|
minDay: 8,
|
|
|
maxDay: 8
|
|
|
}, {
|
|
|
id: '8',
|
|
|
name: '9日',
|
|
|
minDay: 9,
|
|
|
maxDay: 9
|
|
|
}, {
|
|
|
id: '9',
|
|
|
name: '10日',
|
|
|
minDay: 10,
|
|
|
maxDay: 10
|
|
|
}, {
|
|
|
id: '10',
|
|
|
name: '10日以上',
|
|
|
minDay: 11,
|
|
|
maxDay: 0
|
|
|
}]; // 中文星期
|
|
|
|
|
|
const weekdayArr = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; // 是否合法的身份证
|
|
|
|
|
|
const isValidCardID = cardID => {
|
|
|
// Step1: 先判断格式
|
|
|
if (!idCardRegex.test(cardID)) return false; // Step2: 校验最后一位
|
|
|
|
|
|
var code = cardID.split(''); //加权因子
|
|
|
|
|
|
var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //校验位
|
|
|
|
|
|
var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
|
|
|
var sum = 0;
|
|
|
var ai = 0;
|
|
|
var wi = 0;
|
|
|
|
|
|
for (var i = 0; i < 17; i++) {
|
|
|
ai = code[i];
|
|
|
wi = factor[i];
|
|
|
sum += ai * wi;
|
|
|
}
|
|
|
|
|
|
var last = parity[sum % 11];
|
|
|
return parity[sum % 11] == code[17];
|
|
|
};
|
|
|
/**
|
|
|
* UTF16和UTF8转换对照表
|
|
|
* U+00000000 – U+0000007F 0xxxxxxx
|
|
|
* U+00000080 – U+000007FF 110xxxxx 10xxxxxx
|
|
|
* U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
|
|
|
* U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
* U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
* U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
*/
|
|
|
|
|
|
|
|
|
var Base64 = {
|
|
|
// 转码表
|
|
|
table: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
|
|
|
'T', 'U',
|
|
|
'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
|
|
'o', 'p',
|
|
|
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
|
|
|
'9', '+',
|
|
|
'/'
|
|
|
],
|
|
|
UTF16ToUTF8: function(str) {
|
|
|
var res = [],
|
|
|
len = str.length;
|
|
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
|
var code = str.charCodeAt(i);
|
|
|
|
|
|
if (code > 0x0000 && code <= 0x007F) {
|
|
|
// 单字节,这里并不考虑0x0000,因为它是空字节
|
|
|
// U+00000000 – U+0000007F 0xxxxxxx
|
|
|
res.push(str.charAt(i));
|
|
|
} else if (code >= 0x0080 && code <= 0x07FF) {
|
|
|
// 双字节
|
|
|
// U+00000080 – U+000007FF 110xxxxx 10xxxxxx
|
|
|
// 110xxxxx
|
|
|
var byte1 = 0xC0 | code >> 6 & 0x1F; // 10xxxxxx
|
|
|
|
|
|
var byte2 = 0x80 | code & 0x3F;
|
|
|
res.push(String.fromCharCode(byte1), String.fromCharCode(byte2));
|
|
|
} else if (code >= 0x0800 && code <= 0xFFFF) {
|
|
|
// 三字节
|
|
|
// U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
|
|
|
// 1110xxxx
|
|
|
var byte1 = 0xE0 | code >> 12 & 0x0F; // 10xxxxxx
|
|
|
|
|
|
var byte2 = 0x80 | code >> 6 & 0x3F; // 10xxxxxx
|
|
|
|
|
|
var byte3 = 0x80 | code & 0x3F;
|
|
|
res.push(String.fromCharCode(byte1), String.fromCharCode(byte2), String.fromCharCode(
|
|
|
byte3));
|
|
|
} else if (code >= 0x00010000 && code <= 0x001FFFFF) { // 四字节
|
|
|
// U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
} else if (code >= 0x00200000 && code <= 0x03FFFFFF) { // 五字节
|
|
|
// U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
} else
|
|
|
/** if (code >= 0x04000000 && code <= 0x7FFFFFFF)*/
|
|
|
{ // 六字节
|
|
|
// U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return res.join('');
|
|
|
},
|
|
|
UTF8ToUTF16: function(str) {
|
|
|
var res = [],
|
|
|
len = str.length;
|
|
|
var i = 0;
|
|
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
|
var code = str.charCodeAt(i); // 对第一个字节进行判断
|
|
|
|
|
|
if ((code >> 7 & 0xFF) == 0x0) {
|
|
|
// 单字节
|
|
|
// 0xxxxxxx
|
|
|
res.push(str.charAt(i));
|
|
|
} else if ((code >> 5 & 0xFF) == 0x6) {
|
|
|
// 双字节
|
|
|
// 110xxxxx 10xxxxxx
|
|
|
var code2 = str.charCodeAt(++i);
|
|
|
var byte1 = (code & 0x1F) << 6;
|
|
|
var byte2 = code2 & 0x3F;
|
|
|
var utf16 = byte1 | byte2;
|
|
|
res.push(String.fromCharCode(utf16));
|
|
|
} else if ((code >> 4 & 0xFF) == 0xE) {
|
|
|
// 三字节
|
|
|
// 1110xxxx 10xxxxxx 10xxxxxx
|
|
|
var code2 = str.charCodeAt(++i);
|
|
|
var code3 = str.charCodeAt(++i);
|
|
|
var byte1 = code << 4 | code2 >> 2 & 0x0F;
|
|
|
var byte2 = (code2 & 0x03) << 6 | code3 & 0x3F;
|
|
|
utf16 = (byte1 & 0x00FF) << 8 | byte2;
|
|
|
res.push(String.fromCharCode(utf16));
|
|
|
} else if ((code >> 3 & 0xFF) == 0x1E) { // 四字节
|
|
|
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
} else if ((code >> 2 & 0xFF) == 0x3E) { // 五字节
|
|
|
// 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
} else
|
|
|
/** if (((code >> 1) & 0xFF) == 0x7E)*/
|
|
|
{ // 六字节
|
|
|
// 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return res.join('');
|
|
|
},
|
|
|
encode: function(str) {
|
|
|
if (!str) {
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
var utf8 = this.UTF16ToUTF8(str); // 转成UTF8
|
|
|
|
|
|
var i = 0; // 遍历索引
|
|
|
|
|
|
var len = utf8.length;
|
|
|
var res = [];
|
|
|
|
|
|
while (i < len) {
|
|
|
var c1 = utf8.charCodeAt(i++) & 0xFF;
|
|
|
res.push(this.table[c1 >> 2]); // 需要补2个=
|
|
|
|
|
|
if (i == len) {
|
|
|
res.push(this.table[(c1 & 0x3) << 4]);
|
|
|
res.push('==');
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
var c2 = utf8.charCodeAt(i++); // 需要补1个=
|
|
|
|
|
|
if (i == len) {
|
|
|
res.push(this.table[(c1 & 0x3) << 4 | c2 >> 4 & 0x0F]);
|
|
|
res.push(this.table[(c2 & 0x0F) << 2]);
|
|
|
res.push('=');
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
var c3 = utf8.charCodeAt(i++);
|
|
|
res.push(this.table[(c1 & 0x3) << 4 | c2 >> 4 & 0x0F]);
|
|
|
res.push(this.table[(c2 & 0x0F) << 2 | (c3 & 0xC0) >> 6]);
|
|
|
res.push(this.table[c3 & 0x3F]);
|
|
|
}
|
|
|
|
|
|
return res.join('');
|
|
|
},
|
|
|
decode: function(str) {
|
|
|
if (!str) {
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
var len = str.length;
|
|
|
var i = 0;
|
|
|
var res = [];
|
|
|
|
|
|
while (i < len) {
|
|
|
var code1 = this.table.indexOf(str.charAt(i++));
|
|
|
var code2 = this.table.indexOf(str.charAt(i++));
|
|
|
var code3 = this.table.indexOf(str.charAt(i++));
|
|
|
var code4 = this.table.indexOf(str.charAt(i++));
|
|
|
var c1 = code1 << 2 | code2 >> 4;
|
|
|
var c2 = (code2 & 0xF) << 4 | code3 >> 2;
|
|
|
var c3 = (code3 & 0x3) << 6 | code4;
|
|
|
res.push(String.fromCharCode(c1));
|
|
|
|
|
|
if (code3 != 64) {
|
|
|
res.push(String.fromCharCode(c2));
|
|
|
}
|
|
|
|
|
|
if (code4 != 64) {
|
|
|
res.push(String.fromCharCode(c3));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return this.UTF8ToUTF16(res.join(''));
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
HOST: HOST,
|
|
|
formatTime: formatTime,
|
|
|
formatTimeAll: formatTimeAll,
|
|
|
formatNumber: formatNumber,
|
|
|
alert: alert,
|
|
|
getfile: getfile,
|
|
|
request: request,
|
|
|
uploadFormID: uploadFormID,
|
|
|
payOrder: payOrder,
|
|
|
scanPay: scanPay,
|
|
|
isLogin: isLogin,
|
|
|
isNull: isNull,
|
|
|
phoneRegex: phoneRegex,
|
|
|
idCardRegex: idCardRegex,
|
|
|
filterSpecialChars: filterSpecialChars,
|
|
|
randomStr: randomStr,
|
|
|
proTypeDic: proTypeDic,
|
|
|
orderByArr: orderByArr,
|
|
|
travelDaysArr: travelDaysArr,
|
|
|
weekdayArr: weekdayArr,
|
|
|
Base64: Base64,
|
|
|
orderStatusDic: orderStatusDic,
|
|
|
auditStatusDic: auditStatusDic,
|
|
|
getOrderInfo: getOrderInfo,
|
|
|
getOrderItemInfo: getOrderItemInfo,
|
|
|
stateArr: stateArr,
|
|
|
getRegions: getRegions,
|
|
|
getOpenidInfo: getOpenidInfo,
|
|
|
getUserProfile: getUserProfile,
|
|
|
getUserInfoCache: getUserInfoCache,
|
|
|
timeFormat: timeFormat,
|
|
|
shareInfo: shareInfo
|
|
|
};
|