Browse Source

基础文件提交

master
W夏日 2 years ago
commit
681d63db52
  1. 238
      api.js
  2. 31
      api.tpl.js
  3. 392
      app.js
  4. 31
      app.json
  5. 353
      app.wxss
  6. 93
      area-picker/area-picker.js
  7. 26
      area-picker/area-picker.wxml
  8. 66
      area-picker/area-picker.wxss
  9. 12
      commons/copyright/copyright.wxml
  10. 18
      commons/float-icon/float-icon.wxml
  11. 34
      commons/get-coupon/get-coupon.wxml
  12. 5698
      lib/city.js
  13. 7
      lib/vant/common/color.d.ts
  14. 7
      lib/vant/common/color.js
  15. 3
      lib/vant/common/component.d.ts
  16. 48
      lib/vant/common/component.js
  17. 1
      lib/vant/common/index.wxss
  18. 1
      lib/vant/common/style/clearfix.wxss
  19. 1
      lib/vant/common/style/ellipsis.wxss
  20. 1
      lib/vant/common/style/hairline.wxss
  21. 0
      lib/vant/common/style/mixins/clearfix.wxss
  22. 0
      lib/vant/common/style/mixins/ellipsis.wxss
  23. 0
      lib/vant/common/style/mixins/hairline.wxss
  24. 0
      lib/vant/common/style/theme.wxss
  25. 0
      lib/vant/common/style/var.wxss
  26. 8
      lib/vant/common/utils.d.ts
  27. 32
      lib/vant/common/utils.js
  28. 1
      lib/vant/icon/index.d.ts
  29. 39
      lib/vant/icon/index.js
  30. 6
      lib/vant/icon/index.json
  31. 18
      lib/vant/icon/index.wxml
  32. 1
      lib/vant/icon/index.wxss
  33. 1
      lib/vant/info/index.d.ts
  34. 8
      lib/vant/info/index.js
  35. 3
      lib/vant/info/index.json
  36. 7
      lib/vant/info/index.wxml
  37. 1
      lib/vant/info/index.wxss
  38. 1
      lib/vant/mixins/basic.d.ts
  39. 22
      lib/vant/mixins/basic.js
  40. 1
      lib/vant/mixins/button.d.ts
  41. 18
      lib/vant/mixins/button.js
  42. 1
      lib/vant/mixins/link.d.ts
  43. 17
      lib/vant/mixins/link.js
  44. 1
      lib/vant/mixins/observer/behavior.d.ts
  45. 14
      lib/vant/mixins/observer/behavior.js
  46. 1
      lib/vant/mixins/observer/index.d.ts
  47. 19
      lib/vant/mixins/observer/index.js
  48. 1
      lib/vant/mixins/open-type.d.ts
  49. 25
      lib/vant/mixins/open-type.js
  50. 1
      lib/vant/mixins/touch.d.ts
  51. 27
      lib/vant/mixins/touch.js
  52. 1
      lib/vant/mixins/transition.d.ts
  53. 120
      lib/vant/mixins/transition.js
  54. 1
      lib/vant/overlay/index.d.ts
  55. 22
      lib/vant/overlay/index.js
  56. 6
      lib/vant/overlay/index.json
  57. 8
      lib/vant/overlay/index.wxml
  58. 1
      lib/vant/overlay/index.wxss
  59. 1
      lib/vant/popup/index.d.ts
  60. 80
      lib/vant/popup/index.js
  61. 7
      lib/vant/popup/index.json
  62. 24
      lib/vant/popup/index.wxml
  63. 1
      lib/vant/popup/index.wxss
  64. 1
      lib/vant/transition/index.d.ts
  65. 13
      lib/vant/transition/index.js
  66. 3
      lib/vant/transition/index.json
  67. 8
      lib/vant/transition/index.wxml
  68. 1
      lib/vant/transition/index.wxss
  69. 5
      lib/vant/wxs/array.wxs
  70. 38
      lib/vant/wxs/bem.wxs
  71. 54
      lib/vant/wxs/memoize.wxs
  72. 13
      lib/vant/wxs/object.wxs
  73. 7
      lib/vant/wxs/utils.wxs
  74. 127
      pages/merchant-login/merchant-login.js
  75. 6
      pages/merchant-login/merchant-login.json
  76. 2
      pages/merchant-login/merchant-login.wxml
  77. 4
      pages/merchant-login/merchant-login.wxss
  78. 55
      project.config.json
  79. 9
      project.private.config.json
  80. 7
      sitemap.json
  81. 4
      tpl/image.wxml
  82. 4
      tpl/netError/netError.wxml
  83. 82
      tpl/timeUtil.wxs
  84. 16
      utils.js
  85. 406
      utils/CurvePainter.js
  86. 113
      utils/checkinUtil.js
  87. 4
      utils/city.js
  88. 1
      utils/countryList.js
  89. 78
      utils/date.js
  90. 135
      utils/lib/crypto1/base64.js
  91. 281
      utils/lib/crypto1/crypto.js
  92. 1
      utils/lib/es6-promise.min.js
  93. 278
      utils/native.js
  94. 419
      utils/parseArea/address-parse.js
  95. 806
      utils/parseArea/area-list.js
  96. 94
      utils/parseArea/foramtProvince.js
  97. 13477
      utils/parseArea/zipCode.js
  98. 40
      utils/util.js
  99. 82
      utils/utils.js
  100. 292
      wxParse/html2json.js

238
api.js

@ -0,0 +1,238 @@
var _api_root = 'https://hsyg.yguixi.cn/api/';
// var _api_root = 'http://localhost:443/api/';
var api = {
default: {
img_server: 'http://39.106.212.32:2020',
submitFormId:_api_root + 'member/submitFormId',
store: _api_root + 'default/store',
index: _api_root + 'applet/index',
indexList: _api_root + 'applet/indexList',
bannerList: _api_root + 'applet/bannerList',
goods_list: _api_root + 'pms/product/queryProductList1',
//VIP产品列表
vip_list: _api_root + 'pms/vip/product',
bzj_list: _api_root + 'pms/bzj/product',
category_list: _api_root + 'pms/category/list',
goods_shop: _api_root + 'pms/product/queryAllProductBySupplyId',
// cat_list: _api_root + 'pms/getProductCategoryDto',
time_list: _api_root + 'pms/goods/timeList',
date_list: _api_root + 'pms/goods/dateList',
five_day_order_count: _api_root + 'pms/five_day',
future_count: _api_root + 'pms/future_count',
cat_list: _api_root + 'pms/listWithChildren',
workerTechList: _api_root + 'pms/workerTechList',
goods: _api_root + 'pms/product/queryProductDetail',
groupOrderList: _api_root + 'pms/groupOrderList',
district: 'https://www.91weiyi.xyz/addons/zjhj_mall/core/web/index.php?store_id=21&r=api/default/district',
goods_attr_info: _api_root + "home/attr/list",
upload_image: _api_root + "aliyun/oss/upload",
comment_list: _api_root + "order/comment_list",
article_list: _api_root + "member/article_list",
article_detail: _api_root + "member/article_detail",
video_list: _api_root + "default/video-list",
goods_qrcode: _api_root + "default/goods-qrcode",
coupon_list: _api_root + "member/coupon/alllist",
topic_list: _api_root + "home/subjectList",
topic: _api_root + "home/subjectDetail",
video_list: _api_root + "member/video_list",
},
cart: {
list: _api_root + 'cart/list',
add_cart: _api_root + 'cart/addCart',
delete: _api_root + 'cart/delete',
add_favorite: _api_root + 'cart/add_favorite',
update_quantity: _api_root + 'cart/update/quantity',
},
passport: {
login: _api_root + 'applet/master_login_by_weixin',
quick_login: _api_root + 'applet/master_quick_login',
on_login: _api_root + 'passport/on-login',
},
order: {
orderVip: _api_root + 'order/generateVipOrder',
orderBzj: _api_root + 'order/generateBzjOrder',
submit_preview: _api_root + 'order/submitPreview',
submit: _api_root + 'order/generateOrder',
pay_data: _api_root + 'pay/prepay',
masterPayPrepay: _api_root + 'pay/masterPayPrepay',
masterPlantformPayPrepay: _api_root + 'pay/masterPlantformPayPrepay',
exportOrder: _api_root + 'order/exportOrder',
changeAddress: _api_root + 'member/change-address',
pay_vip: _api_root + 'pay/vipPayPrepay',
earnest_money_prepay: _api_root + 'pay/earnestMoneyPrepay',
orderStatic: _api_root + 'order/orderStatic',
orderStaticJingjia: _api_root + 'order/orderStaticJingjia',
orderStaticQingyun: _api_root + 'order/orderStaticQingyun',
my_worker_order_total: _api_root + 'order/my_worker_order_total',
//师傅订单统计数据
daily_worker_order_total: _api_root + 'order/daily_worker_order_total',
addProductForOrder: _api_root + 'order/addProductForOrder',
updateOrderQuantity: _api_root + 'order/updateQuantityForOrder',
updateOrderItemPrice: _api_root + 'order/updatePriceForOrder',
updateQingyunOrder: _api_root + 'order/updateQingyunOrder',
updateQingyunName: _api_root + 'order/updateQingyunName',
sendMessage: _api_root + 'member/sendMessage',
deleteOrderItem: _api_root + 'order/deleteOrderItem',
confirmOrder: _api_root + 'order/confirmOrder',
supply_order_list: _api_root + 'order/supply_order_list',
worker_order_list: _api_root + 'order/worker_order_list',
worker_order_list_count: _api_root + 'order/worker_order_list_count',
//工人订单列表
my_worker_order_list: _api_root + 'order/my_worker_order',
unprice_order_list: _api_root + 'order/unprice_order_list',
export_order_list: _api_root + 'order/export_order_list',
send_worker_order: _api_root + 'order/update/get_worker_order',
set_order_price: _api_root + 'order/update/set_order_price',
chongzhi: _api_root + 'pay/chongzhi',
tixian: _api_root + 'pay/tixian',
getMasterQR: _api_root + 'oms/getMasterQR',
getOrderQR: _api_root + 'oms/getOrderQR',
search: _api_root + 'oms/search',
list: _api_root + 'order/list',
admin_list: _api_root + 'order/admin_list',
undo_admin_list: _api_root + 'order/undo_admin_list',
get_my_order: _api_root + 'order/update/get_my_order',
deliver: _api_root + 'order/update/delivery',
updateTime: _api_root + 'order/update/updateTime',
updateWorkerState: _api_root + 'order/update/updateWorkerState',
revoke: _api_root + 'order/cancelOrder',
//师傅取消订单
cancelWorkerOrder: _api_root + 'order/cancelWorkerOrder',
//导入人取消订单
cancelInputOrder: _api_root + 'order/cancelInputOrder',
updateServiceDate: _api_root + 'order/updateServiceDate',
markWorkerOrder: _api_root + 'order/markWorkerOrder',
markConnectOrder: _api_root + 'order/markConnectOrder',
confirm: _api_root + 'order/querenOrder',
testcomment: _api_root + 'order/commentOrder',
updateMember: _api_root + 'member/updateMember',
count_data: _api_root + 'order/count-data',
detail: _api_root + 'order/detail',
getWayBillInfo: _api_root + 'order/getWayBillInfo',
refund_preview: _api_root + 'order/refund-preview',
refund: _api_root + 'pay/refund',
refund_detail: _api_root + 'order/refund-detail',
comment_preview: _api_root + 'order/comment-preview',
comment: _api_root + 'order/comment',
express_detail: _api_root + 'order/express-detail',
clerk: _api_root + "order/clerk",
clerk_detail: _api_root + 'order/clerk-detail',
get_qrcode: _api_root + 'order/get-qrcode',
},
user: {
feedback: _api_root + 'member/feedback',
applyInput: _api_root + 'member/apply_input',
area_list: _api_root + 'member/area_list',
get_brokerage: _api_root + 'member/brokerage/getBrokerage',
get_blance: _api_root + 'member/blance/getBlance',
get_chongzhi: _api_root + 'member/blance/getCongzhi',
get_chongzhilog: _api_root + 'member/blance/getWorkerCongzhi',
getWorkerInput: _api_root + 'member/blance/getWorkerInput',
supply_worker_list: _api_root + 'member/worker_list',
get_fans: _api_root + 'applet/list',
address_list: _api_root + 'address/list',
address_detail: _api_root + 'address/detail',
address_save: _api_root + 'address/save',
address_set_default: _api_root + 'address/address-set-default',
address_delete: _api_root + 'address/delete',
save_form_id: _api_root + "collection/save-form-id",
favorite_add: _api_root + "ums/collect/create",
favorite_remove: _api_root + "collection/favorite-remove",
favorite_list: _api_root + "ums/collect/list",
index: _api_root + "applet/user",
wechat_district: _api_root + "user/wechat-district",
add_wechat_address: _api_root + "user/add-wechat-address",
topic_favorite: _api_root + "collection/topic-favorite",
topic_favorite_list: _api_root + "collection/topic-listCollect",
},
share: {
joinWork: _api_root + 'member/createWorker',
//申请成为区域管理员
join: _api_root + 'member/createBusiness',
create_admin: _api_root + 'member/createAdmin',
check: _api_root + 'share/check',
get_info: _api_root + 'share/get-info',
get_price: _api_root + 'share/get-price',
apply: _api_root + 'share/apply',
cash_detail: _api_root + 'share/cash-detail',
get_qrcode: _api_root + 'share/get-qrcode',
shop_share: _api_root + 'share/shop-share',
bind_parent: _api_root + 'share/bind-parent',
get_team: _api_root + 'share/get-team',
get_order: _api_root + 'share/get-order',
},
coupon: {
alllist: _api_root + 'member/coupon/alllist',
index: _api_root + 'member/coupon/list',
share_send: _api_root + 'coupon/share-send',
receive: _api_root + 'member/coupon/add',
},
red: {
index: _api_root + 'redPacket/list',
receive: _api_root + 'redPacket/accept',
},
};
module.exports = api;

31
api.tpl.js

@ -0,0 +1,31 @@
var _api_root = '{$_api_root}';
var api = {
index: _api_root + 'default/index',
default: {
store: _api_root + 'default/store',
index: _api_root + 'default/index',
},
cart: {
list: _api_root + 'cart/list',
},
passport: {
login: _api_root + 'passport/login',
on_login: _api_root + 'passport/on-login',
},
order: {
list: _api_root + 'order/list',
},
user: {
index: _api_root + "user/index",
},
share: {
},
coupon: {
},
};
module.exports = api;

392
app.js

@ -0,0 +1,392 @@
//app.js
var util = require('./utils/utils.js');
var api = require('./api.js');
App({
is_on_launch: true,
onLaunch: function () {
console.log(wx.getSystemInfoSync());
// this.getStoreData();
this.getCatList();
var access_token = wx.getStorageSync("access_token");
console.log('token:' + access_token);
wx.setStorageSync('token', "");
this.autoUpdate();
wx.login({
success: function (res) {
if (res.code) {
var code = res.code;
console.log("7777777")
console.log(res)
getApp().loginrequest({
url: api.passport.quick_login,
method: "post",
data: {
code: code
},
success: function (res) {
console.log("quickLoginSuccessful")
console.log(res)
wx.hideLoading();
if (res.code == 200) {
const tokenStr = res.data.tokenHead + res.data.token
wx.setStorageSync('loginToken', tokenStr)
wx.setStorageSync('token', res.data.token);
wx.setStorageSync("access_token", res.data.userId);
wx.setStorageSync("user_info", {
avatar_url: res.data.img,
nickname: res.data.username,
avatar_url: res.data.icon,
// parent: res.data.parent,
id: res.data.id
});
wx.setStorageSync("my_info", {
supplyId: res.data.myInfo.supplyId,
supplyState: res.data.myInfo.supplyState,
myMoney: res.data.myInfo.myMoney,
brokerage: res.data.myInfo.brokerage,
brokerageTixian: res.data.myInfo.brokerageTixian,
moneyTotal: res.data.myInfo.moneyTotal,
buyTotal: res.data.myInfo.buyTotal,
icon: res.data.myInfo.icon,
nickname: res.data.myInfo.nickname,
memberLevelId: res.data.myInfo.memberLevelId,
id: res.data.myInfo.id,
city: res.data.myInfo.city,
gender: res.data.myInfo.gender,
job: res.data.myInfo.job,
phone: res.data.myInfo.phone,
birthday: res.data.myInfo.birthday,
// parent: res.data.parent,
});
// if (wx.reLaunch) {
// wx.reLaunch({
// url: '/pages/index/index'
// })
// } else {
// this.location('/pages/index/index');
// }
} else {
wx.setStorageSync('token', '');
wx.setStorageSync("access_token", '');
}
}
});
}
}
});
// if (access_token) {
// if (wx.reLaunch) {
// wx.reLaunch({
// url: '/pages/index/index'
// })
// } else {
// this.location('/pages/index/index');
// }
// } else {
// wx.reLaunch({
// url: '/pages/allow/allow'
// })
// }
// if (!access_token)
// this.login();
},
//获取小程序更新机制的兼容,由于更新的功能基础库要1.9.90以上版本才支持,所以此处要做低版本的兼容处理
autoUpdate: function () {
let _this = this
// 获取小程序更新机制的兼容,由于更新的功能基础库要1.9.90以上版本才支持,所以此处要做低版本的兼容处理
if (wx.canIUse('getUpdateManager')) {
// wx.getUpdateManager接口,可以获知是否有新版本的小程序、新版本是否下载好以及应用新版本的能力,会返回一个UpdateManager实例
const updateManager = wx.getUpdateManager()
// 检查小程序是否有新版本发布,onCheckForUpdate:当小程序向后台请求完新版本信息,会通知这个版本告知检查结果
updateManager.onCheckForUpdate(function (res) {
// 请求完新版本信息的回调
if (res.hasUpdate) {
// 检测到新版本,需要更新,给出提示
wx.showModal({
title: '更新提示',
content: '检测到新版本,是否下载新版本并重启小程序',
success: function (res) {
if (res.confirm) {
// 用户确定更新小程序,小程序下载和更新静默进行
_this.downLoadAndUpdate(updateManager)
} else if (res.cancel) {
// 若用户点击了取消按钮,二次弹窗,强制更新,如果用户选择取消后不需要进行任何操作,则以下内容可忽略
wx.showModal({
title: '提示',
content: '本次版本更新涉及到新功能的添加,旧版本将无法正常使用',
showCancel: false, // 隐藏取消按钮
confirmText: '确认更新', // 只保留更新按钮
success: function (res) {
if (res.confirm) {
// 下载新版本,重启应用
_this.downLoadAndUpdate(updateManager)
}
}
})
}
}
})
}
})
} else {
// 在最新版本客户端上体验小程序
wx.showModal({
title: '提示',
content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试',
})
}
},
// 下载小程序最新版本并重启
downLoadAndUpdate: function (updateManager) {
wx.showLoading()
// 静默下载更新小程序新版本,onUpdateReady:当新版本下载完成回调
updateManager.onUpdateReady(function () {
wx.hideLoading()
// applyUpdate:强制当前小程序应用上新版本并重启
updateManager.applyUpdate()
})
// onUpdateFailed:当新版本下载失败回调
updateManager.onUpdateFailed(function () {
// 下载新版本失败
wx.showModal({
title: '已有新版本',
content: '新版本已经上线了,请删除当前小程序,重新搜索打开',
})
})
}
,
getCatList: function () {
this.request({
url: api.default.cat_list,
data: {
limit: 15
},
success: function (res) {
if (res.code == 200) {
var cat_list = res.data || [];
wx.setStorageSync("cat_list", cat_list);
}
}
});
},
login: function () {
var pages = getCurrentPages();
var page = pages[(pages.length - 1)];
wx.login({
success: function (res) {
if (res.code) {
var code = res.code;
getApp().request({
url: api.passport.quick_login,
method: "post",
data: {
code: code
},
success: function (res) {
console.log("quickLoginSuccessful")
console.log(res)
wx.hideLoading();
if (res.code == 200) {
const tokenStr = res.data.tokenHead+res.data.token
wx.setStorageSync('loginToken', tokenStr)
wx.setStorageSync('token', res.data.token);
wx.setStorageSync("access_token", res.data.userId);
wx.setStorageSync("user_info", {
avatar_url: res.data.img,
nickname: res.data.username,
avatar_url: res.data.icon,
// parent: res.data.parent,
id: res.data.id
});
wx.setStorageSync("my_info", {
supplyId: res.data.myInfo.supplyId,
supplyState: res.data.myInfo.supplyState,
myMoney: res.data.myInfo.myMoney,
icon: res.data.myInfo.icon,
nickname: res.data.myInfo.nickname,
// parent: res.data.parent,
});
var parent_id = wx.getStorageSync("parent_id");
var p = getCurrentPages();
// var parent_id = 0;
if (p[0].options.user_id != undefined) {
parent_id = p[0].options.user_id;
}
else if (p[0].options.scene != undefined) {
parent_id = p[0].options.scene;
}
console.log('parentid:' + parent_id, p[0].options.scene, p[0].options.user_id);
if (page == undefined) {
return;
}
wx.redirectTo({
url: "/" + page.route + "?" + util.objectToUrlParams(page.options),
fail: function () {
wx.switchTab({
url: "/" + page.route,
});
},
});
} else {
// wx.reLaunch({
// url: '/pages/allow/allow'
// })
// wx.showToast({
// title: res.msg
// });
}
}
});
}
}
});
},
request: function (object) {
var access_token = wx.getStorageSync("access_token");
console.log('token:' + access_token);
if (access_token) {
if (!object.data)
object.data = {};
// object.data.access_token = access_token;
}
wx.request({
url: object.url,
header: object.header || {
'content-type': 'application/x-www-form-urlencoded',
'Authorization':wx.getStorageSync('loginToken') // 让每个请求携带自定义token 请根据实际情况自行修改
},
data: object.data || {},
method: object.method || "GET",
dataType: object.dataType || "json",
success: function (res) {
if (res.data.code == -1) {
getApp().login();
} else {
if (object.success)
object.success(res.data);
}
},
fail: function (res) {
var app = getApp();
if (app.is_on_launch) {
app.is_on_launch = false;
wx.showModal({
title: "网络请求出错",
content: res.errMsg,
showCancel: false,
success: function (res) {
if (res.confirm) {
if (object.fail)
object.fail(res);
}
}
});
} else {
wx.showToast({
title: res.errMsg,
image: "/images/icon-warning.png",
});
if (object.fail)
object.fail(res);
}
},
complete: function (res) {
if (object.complete)
object.complete(res);
}
});
},
loginrequest: function (object) {
var access_token = wx.getStorageSync("access_token");
console.log('token:' + access_token);
if (access_token) {
if (!object.data)
object.data = {};
// object.data.access_token = access_token;
}
wx.request({
url: object.url,
header: object.header || {
'content-type': 'application/x-www-form-urlencoded'
},
data: object.data || {},
method: object.method || "GET",
dataType: object.dataType || "json",
success: function (res) {
if (res.data.code == -1) {
getApp().login();
} else {
if (object.success)
object.success(res.data);
}
},
fail: function (res) {
var app = getApp();
if (app.is_on_launch) {
app.is_on_launch = false;
wx.showModal({
title: "网络请求出错",
content: res.errMsg,
showCancel: false,
success: function (res) {
if (res.confirm) {
if (object.fail)
object.fail(res);
}
}
});
} else {
wx.showToast({
title: res.errMsg,
image: "/images/icon-warning.png",
});
if (object.fail)
object.fail(res);
}
},
complete: function (res) {
if (object.complete)
object.complete(res);
}
});
},
saveFormId: function (form_id) {
this.request({
url: api.user.save_form_id,
data: {
form_id: form_id,
}
});
},
});

31
app.json

@ -0,0 +1,31 @@
{
"pages": [
"pages/merchant-login/merchant-login"
],
"requiredPrivateInfos": [
"chooseAddress"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "排队支付",
"navigationBarTextStyle": "black",
"backgroundColor": "#fff"
},
"debug": false,
"sitemapLocation": "sitemap.json",
"usingComponents": {
"van-popup": "lib/vant/popup/index"
},
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序定位"
}
},
"plugins": {
"chooseLocation": {
"version": "1.0.9",
"provider": "wx76a9a06e5b4e693e"
}
}
}

353
app.wxss

@ -0,0 +1,353 @@
/**app.wxss**/
@import "/area-picker/area-picker.wxss";
page {
height: 100%;
font-size: 24rpx;
color: #555;
background: #f7f7f7;
overflow-x: hidden;
}
page,
block,
view,
scroll-view,
swiper,
movable-view,
icon,
text,
progress,
button,
checkbox,
form,
input,
label,
picker,
picker-view,
radio,
slider,
switch,
textarea,
navigator,
audio,
image,
video,
map,
canvas,
contact-button {
box-sizing: border-box;
}
button{
font-size: 11pt;
font-family: inherit;
}
.flex {
display: -webkit-box;
display: -webkit-flex;
display: flex;
}
.flex-row {
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-orient: horizontal;
-webkit-flex-direction: row;
flex-direction: row;
}
.flex-col{
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-orient: vertical;
-webkit-flex-direction: column;
flex-direction: column;
}
.flex-grow-0{
min-width: 0;
-webkit-box-flex: 0;
-webkit-flex-grow: 0;
-ms-flex-positive: 0;
flex-grow: 0;
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.my-order-bg-style{
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
border-radius: 20rpx;
background: #fff;
margin-bottom:30rpx;
}
.flex-grow-1{
min-width: 0;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
-ms-flex-positive: 1;
flex-grow: 1;
-webkit-flex-shrink: 1;
-ms-flex-negative: 1;
flex-shrink: 1;
}
.flex-x-center{
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
}
.flex-y-center{
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
-ms-grid-row-align: center;
align-items: center;
}
.flex-y-bottom{
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-align: end;
-webkit-align-items: flex-end;
-ms-flex-align: end;
-ms-grid-row-align: flex-end;
align-items: flex-end;
}
.spinner {
margin: 0 auto;
width: 100rpx;
height: 50rpx;
text-align: center;
font-size: 10rpx;
}
.spinner > view {
background-color: #8c949a;
height: 100%;
width: 10rpx;
display: inline-block;
margin: 0 2rpx;
animation: sk-stretchdelay 1.2s infinite ease-in-out;
}
.spinner .rect2 {
animation-delay: -1.1s;
}
.spinner .rect3 {
animation-delay: -1.0s;
}
.spinner .rect4 {
animation-delay: -0.9s;
}
.spinner .rect5 {
animation-delay: -0.8s;
}
@keyframes sk-stretchdelay {
0%, 40%, 100% {
transform: scaleY(0.4);
-webkit-transform: scaleY(0.4);
} 20% {
transform: scaleY(1.0);
-webkit-transform: scaleY(1.0);
}
}
.copy-text-btn{
line-height: normal;
height: auto;
display: inline-block;
font-size: 9pt;
color: #888;
border: 1rpx solid #ddd;
border-radius: 5rpx;
padding: 6rpx 12rpx;
background-color: #fff !important;
box-shadow: none;
}
.no-data-tip{
padding: 150rpx 0;
text-align: center;
color: #888;
}
.no-data-tip .no-data-icon{
width: 160rpx;
height: 160rpx;
font-size: 0;
border-radius: 9999rpx;
background: rgba(0,0,0,.1);
margin-left: auto;
margin-right: auto;
margin-bottom: 32rpx;
}
.bg-white{
background-color: #fff;
}
.mb-20{
margin-bottom: 1rpx;
}
.mb-10{
margin-bottom: 10rpx;
}
button[plain]{
border: none;
color: inherit;
}
.nowrap{
white-space: nowrap;
}
.fs-0{
font-size: 0;
}
.get-coupon{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,.75);
z-index: 999;
}
.get-coupon .get-coupon-box{
position: relative;
width: 100%;
}
.get-coupon .get-coupon-bg{
width: 100%;
position: absolute;
left: 0;
top:-210rpx;
z-index: -1;
}
.get-coupon .coupon-list{
height: 330rpx;
width: 550rpx;
margin: 0 auto;
}
.get-coupon .coupon-item{
width: 520rpx;
height: 264rpx;
margin-bottom: 20rpx;
position: relative;
color: #fff;
padding: 0 40rpx;
}
.get-coupon .coupon-item image{
position: absolute;
z-index: -1;
left: 0;
top:0;
width: 100%;
}
.get-coupon .coupon-item:last-child{
margin-bottom: 0;
}
.get-coupon .use-now{
display: block;
text-align: center;
height: 60rpx;
line-height: 60rpx;
color: #ff4544;
background: #fff;
border-radius: 6rpx;
margin: 15rpx 0;
font-size: 9pt;
}
.fs-sm{
font-size: 9pt;
}
.p-10{
padding: 10rpx 10rpx;
}
.px-24{
padding-left: 24rpx;
padding-right: 24rpx;
}
.float-icon{
position: fixed;
z-index: 20;
right: 50rpx;
bottom: 50rpx;
}
.bar-bottom~.float-icon{
bottom: 150rpx;
}
.float-icon .float-icon-btn{
display: block;
padding: 0;
margin: 0;
border: none;
background: none;
}
.float-icon .float-icon-btn:after{
display: none;
}
.float-icon .float-icon-btn:active{
opacity: .75;
}
.float-icon .float-icon-btn image{
width: 100rpx;
height: 100rpx;
display: block;
}
.w-100{
width: 100%;
}
.h-100{
height: 100%;
}
.wh-100{
width: 100%;
height: 100%;
}

93
area-picker/area-picker.js

@ -0,0 +1,93 @@
var area_picker = {
page: null,
data: null,
old_value: [0, 0, 0],
result: [null, null, null],
init: function (args) {
var picker = this;
picker.page = args.page;
picker.data = args.data;
picker.page.showAreaPicker = function () {
picker.page.setData({
area_picker_show: true,
});
};
picker.page.hideAreaPicker = function () {
picker.page.setData({
area_picker_show: false,
});
};
var city_list = picker.data[0].list || [];
var district_list = [];
if (city_list.length > 0)
district_list = city_list[0].list || [];
picker.page.setData({
area_picker_province_list: picker.data,
area_picker_city_list: city_list,
area_picker_district_list: district_list,
});
picker.result[0] = picker.data[0] || null;
if (picker.data[0].list) {
picker.result[1] = picker.data[0].list[0];
if (picker.data[0].list[0].list)
picker.result[2] = picker.data[0].list[0].list[0];
}
picker.page.areaPickerChange = function (e) {
var province_index = e.detail.value[0];
var city_index = e.detail.value[1];
var district_index = e.detail.value[2];
if (e.detail.value[0] != picker.old_value[0]) {//省份改变
city_index = 0;
district_index = 0;
city_list = picker.data[province_index].list;
district_list = city_list[0].list;
picker.page.setData({
area_picker_city_list: [],
area_picker_district_list: [],
});
setTimeout(function () {
picker.page.setData({
area_picker_city_list: city_list,
area_picker_district_list: district_list,
});
}, 0);
}
if (e.detail.value[1] != picker.old_value[1]) {//城市改变
district_index = 0;
district_list = picker.data[province_index].list[city_index].list;
picker.page.setData({
area_picker_district_list: [],
});
setTimeout(function () {
picker.page.setData({
area_picker_district_list: district_list,
});
}, 0);
}
if (e.detail.value[2] != picker.old_value[2]) {//区改变
}
picker.old_value = [province_index, city_index, district_index];
picker.result[0] = picker.data[province_index];
picker.result[1] = picker.data[province_index].list[city_index];
picker.result[2] = picker.data[province_index].list[city_index].list[district_index];
};
picker.page.areaPickerConfirm = function () {
picker.page.hideAreaPicker();
// console.log(1);
// console.log(picker.page);
// console.log(typeof picker.page.onAreaPickerConfirm);
if (picker.page.onAreaPickerConfirm)
picker.page.onAreaPickerConfirm(picker.result);
};
return this;
},
};
module.exports = area_picker;

26
area-picker/area-picker.wxml

@ -0,0 +1,26 @@
<view class="area-picker {{area_picker_show?'active':''}}">
<view class="area-picker-bg" bindtap="hideAreaPicker">
<scroll-view></scroll-view>
</view>
<view class="area-picker-body">
<scroll-view>
<view class="area-picker-top">
<text class="area-picker-cancel" bindtap="hideAreaPicker">取消</text>
<text class="area-picker-confirm" bindtap="areaPickerConfirm">确认</text>
</view>
<view class="area-picker-row">
<picker-view indicator-style="height: 120rpx" style="width: 100%; height: 500rpx;" bindchange="areaPickerChange">
<picker-view-column>
<view wx:for="{{area_picker_province_list}}" wx:key="index" style="line-height: 100rpx;text-align: center">{{item.name}}</view>
</picker-view-column>
<picker-view-column>
<view wx:for="{{area_picker_city_list}}" wx:key="index" style="line-height: 100rpx;text-align: center">{{item.name}}</view>
</picker-view-column>
<picker-view-column>
<view wx:for="{{area_picker_district_list}}" wx:key="index" style="line-height: 100rpx;text-align: center">{{item.name}}</view>
</picker-view-column>
</picker-view>
</view>
</scroll-view>
</view>
</view>

66
area-picker/area-picker.wxss

@ -0,0 +1,66 @@
.area-picker{
position: fixed;
z-index: 10000;
left: 0;
top:0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
transform: translateY(100%);
transition: 250ms opacity;
opacity: 0;
background: rgba(0,0,0,.3);
}
.area-picker.active{
transform: translateY(0);
opacity: 1;
}
.area-picker .area-picker-bg{
flex-grow: 1;
position: relative;
}
.area-picker .area-picker-bg > scroll-view{
left: 0;
top:0;
height: 100%;
width: 100%;
position: absolute;
}
.area-picker .area-picker-body{
flex-grow: 0;
height: 600rpx;
background: #fff;
transform: translateY(100%);
transition: 250ms transform;
position: relative;
}
.area-picker.active .area-picker-body{
transform: translateY(0);
}
.area-picker .area-picker-body > scroll-view{
left: 0;
top:0;
height: 100%;
width: 100%;
position: absolute;
}
.area-picker .area-picker-cancel,
.area-picker .area-picker-confirm {
display: inline-block;
padding: 24rpx;
color: #888;
}
.area-picker .area-picker-confirm{
float: right;
color: #00aa00;
}
.area-picker .area-picker-row{
width: 100%;
height: 500rpx;
}

12
commons/copyright/copyright.wxml

@ -0,0 +1,12 @@
<block wx:if="{{store.copyright||store.copyright_pic_url}}">
<view class="flex-y-center flex-x-center flex-col" style="padding: 20rpx">
<view wx:if="{{store.copyright_pic_url}}">
<navigator url="{{store.copyright_url}}">
<image src="{{store.copyright_pic_url}}" style="height: 60rpx;width: 240rpx" mode="aspectFit"></image>
</navigator>
</view>
<view wx:if="{{store.copyright}}" style="color: rgba(0,0,0,.3);font-size: 9pt;">
<navigator url="{{store.copyright_url}}">{{store.copyright}}</navigator>
</view>
</view>
</block>

18
commons/float-icon/float-icon.wxml

@ -0,0 +1,18 @@
<!--
<movable-area style="height: {{y*2}}rpx;width: {{x*2}}rpx;position:fixed;top:0;left:0;pointer-events:none">
=======
<movable-area style="height: {{y}}px;width: {{x}}px;position:fixed;top:0;left:0;pointer-events:none">
>>>>>>> Stashed changes
<movable-view direction="all" class="float-icon" style='width:100rpx;height:100rpx;pointer-events:all;' x='{{x-60}}' y='{{y-60}}'>
<button open-type="contact" class="float-icon-btn" style='width:100%;height:100%;'>
<image src="/images/icon-service.png" style='width:100%;height:100%;'></image>
</button>
</movable-view>
</movable-area>
-->
<view direction="all" class="float-icon">
<button open-type="contact" class="float-icon-btn">
<image src="/images/icon-service.png"></image>
</button>
</view>

34
commons/get-coupon/get-coupon.wxml

@ -0,0 +1,34 @@
<block wx:if="{{get_coupon_list&&get_coupon_list.length>0}}">
<view class="get-coupon flex-y-center flex-x-center">
<view class="get-coupon-box" style="overflow: visible">
<image mode="widthFix" class="get-coupon-bg" src="/images/img-get-coupon-bg.png"></image>
<view class="flex-x-center mb-20">
<image src="{{get_coupon_list[0].type==2?'/images/icon-receive-coupon.png':'/images/img-get-coupon-title.png'}}"
style="width: 226rpx;height: 51rpx"></image>
</view>
<scroll-view class="coupon-list" scroll-y="true">
<view wx:for="{{get_coupon_list}}" class="coupon-item flex-y-center">
<image mode="widthFix" src="/images/img-get-coupon-item-bg.png"
style="width: 100%;height: 100%"></image>
<view style="width: 100%">
<view class="flex-row flex-y-center">
<view class="flex-grow-1 flex-row flex-y-bottom">
<view style="line-height: 1">¥</view>
<view style="font-size: 23pt;line-height: .85">{{item.sub_price}}</view>
</view>
<view class="flex-grow-0" style="font-size: 9pt;line-height: 32rpx;">
满{{item.min_price}}元可用
</view>
</view>
<navigator bindtap="hideGetCoupon" class="use-now" data-url="/pages/list/list">立即使用</navigator>
<view style="font-size: 9pt">{{item.desc}}</view>
</view>
</view>
</scroll-view>
<view class='flex-x-center'>
<image src='/images/icon-close3.png' style='width:100rpx;height:100rpx;'
bindtap='closeCouponBox'></image>
</view>
</view>
</view>
</block>

5698
lib/city.js
File diff suppressed because it is too large
View File

7
lib/vant/common/color.d.ts

@ -0,0 +1,7 @@
export declare const RED = "#ee0a24";
export declare const BLUE = "#1989fa";
export declare const WHITE = "#fff";
export declare const GREEN = "#07c160";
export declare const ORANGE = "#ff976a";
export declare const GRAY = "#323233";
export declare const GRAY_DARK = "#969799";

7
lib/vant/common/color.js

@ -0,0 +1,7 @@
export const RED = '#ee0a24';
export const BLUE = '#1989fa';
export const WHITE = '#fff';
export const GREEN = '#07c160';
export const ORANGE = '#ff976a';
export const GRAY = '#323233';
export const GRAY_DARK = '#969799';

3
lib/vant/common/component.d.ts

@ -0,0 +1,3 @@
import { VantComponentOptions, CombinedComponentInstance } from '../definitions/index';
declare function VantComponent<Data, Props, Methods>(vantOptions?: VantComponentOptions<Data, Props, Methods, CombinedComponentInstance<Data, Props, Methods>>): void;
export { VantComponent };

48
lib/vant/common/component.js

@ -0,0 +1,48 @@
import { basic } from '../mixins/basic';
import { observe } from '../mixins/observer/index';
function mapKeys(source, target, map) {
Object.keys(map).forEach(key => {
if (source[key]) {
target[map[key]] = source[key];
}
});
}
function VantComponent(vantOptions = {}) {
const options = {};
mapKeys(vantOptions, options, {
data: 'data',
props: 'properties',
mixins: 'behaviors',
methods: 'methods',
beforeCreate: 'created',
created: 'attached',
mounted: 'ready',
relations: 'relations',
destroyed: 'detached',
classes: 'externalClasses'
});
const { relation } = vantOptions;
if (relation) {
options.relations = Object.assign(options.relations || {}, {
[`../${relation.name}/index`]: relation
});
}
// add default externalClasses
options.externalClasses = options.externalClasses || [];
options.externalClasses.push('custom-class');
// add default behaviors
options.behaviors = options.behaviors || [];
options.behaviors.push(basic);
// map field to form-field behavior
if (vantOptions.field) {
options.behaviors.push('wx://form-field');
}
// add default options
options.options = {
multipleSlots: true,
addGlobalClass: true
};
observe(vantOptions, options);
Component(options);
}
export { VantComponent };

1
lib/vant/common/index.wxss

@ -0,0 +1 @@
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}

1
lib/vant/common/style/clearfix.wxss

@ -0,0 +1 @@
.van-clearfix:after{display:table;clear:both;content:""}

1
lib/vant/common/style/ellipsis.wxss

@ -0,0 +1 @@
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}

1
lib/vant/common/style/hairline.wxss

@ -0,0 +1 @@
.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}

0
lib/vant/common/style/mixins/clearfix.wxss

0
lib/vant/common/style/mixins/ellipsis.wxss

0
lib/vant/common/style/mixins/hairline.wxss

0
lib/vant/common/style/theme.wxss

0
lib/vant/common/style/var.wxss

8
lib/vant/common/utils.d.ts

@ -0,0 +1,8 @@
/// <reference types="miniprogram-api-typings" />
export declare function isDef(value: any): boolean;
export declare function isObj(x: any): boolean;
export declare function isNumber(value: any): boolean;
export declare function range(num: number, min: number, max: number): number;
export declare function nextTick(fn: Function): void;
export declare function getSystemInfoSync(): WechatMiniprogram.GetSystemInfoSuccessCallbackResult;
export declare function addUnit(value?: string | number): string | undefined;

32
lib/vant/common/utils.js

@ -0,0 +1,32 @@
export function isDef(value) {
return value !== undefined && value !== null;
}
export function isObj(x) {
const type = typeof x;
return x !== null && (type === 'object' || type === 'function');
}
export function isNumber(value) {
return /^\d+(\.\d+)?$/.test(value);
}
export function range(num, min, max) {
return Math.min(Math.max(num, min), max);
}
export function nextTick(fn) {
setTimeout(() => {
fn();
}, 1000 / 30);
}
let systemInfo = null;
export function getSystemInfoSync() {
if (systemInfo == null) {
systemInfo = wx.getSystemInfoSync();
}
return systemInfo;
}
export function addUnit(value) {
if (!isDef(value)) {
return undefined;
}
value = String(value);
return isNumber(value) ? `${value}px` : value;
}

1
lib/vant/icon/index.d.ts

@ -0,0 +1 @@
export {};

39
lib/vant/icon/index.js

@ -0,0 +1,39 @@
import { VantComponent } from '../common/component';
import { addUnit } from '../common/utils';
VantComponent({
props: {
dot: Boolean,
info: null,
size: {
type: null,
observer: 'setSizeWithUnit'
},
color: String,
customStyle: String,
classPrefix: {
type: String,
value: 'van-icon'
},
name: {
type: String,
observer(val) {
this.setData({
isImageName: val.indexOf('/') !== -1
});
}
}
},
data: {
sizeWithUnit: null,
},
methods: {
onClick() {
this.$emit('click');
},
setSizeWithUnit(size) {
this.setData({
sizeWithUnit: addUnit(size)
});
}
}
});

6
lib/vant/icon/index.json

@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"van-info": "../info/index"
}
}

18
lib/vant/icon/index.wxml

@ -0,0 +1,18 @@
<view
class="custom-class {{ classPrefix }} {{ isImageName ? 'van-icon--image' : classPrefix + '-' + name }}"
style="{{ color ? 'color: ' + color + ';' : '' }}{{ size ? 'font-size: ' + sizeWithUnit + ';' : '' }}{{ customStyle }}"
bind:tap="onClick"
>
<van-info
wx:if="{{ info !== null || dot }}"
dot="{{ dot }}"
info="{{ info }}"
custom-class="van-icon__info"
/>
<image
wx:if="{{ isImageName }}"
src="{{ name }}"
mode="aspectFit"
class="van-icon__image"
/>
</view>

1
lib/vant/icon/index.wxss
File diff suppressed because it is too large
View File

1
lib/vant/info/index.d.ts

@ -0,0 +1 @@
export {};

8
lib/vant/info/index.js

@ -0,0 +1,8 @@
import { VantComponent } from '../common/component';
VantComponent({
props: {
dot: Boolean,
info: null,
customStyle: String
}
});

3
lib/vant/info/index.json

@ -0,0 +1,3 @@
{
"component": true
}

7
lib/vant/info/index.wxml

@ -0,0 +1,7 @@
<wxs src="../wxs/utils.wxs" module="utils" />
<view
wx:if="{{ info !== null && info !== '' || dot }}"
class="custom-class van-info {{ utils.bem('info', { dot }) }}"
style="{{ customStyle }}"
>{{ dot ? '' : info }}</view>

1
lib/vant/info/index.wxss

@ -0,0 +1 @@
@import '../common/index.wxss';.van-info{position:absolute;top:0;right:0;box-sizing:border-box;white-space:nowrap;text-align:center;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%;min-width:16px;min-width:var(--info-size,16px);padding:0 3px;padding:var(--info-padding,0 3px);color:#fff;color:var(--info-color,#fff);font-weight:500;font-weight:var(--info-font-weight,500);font-size:12px;font-size:var(--info-font-size,12px);font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--info-font-family,PingFang SC,Helvetica Neue,Arial,sans-serif);line-height:14px;line-height:calc(var(--info-size, 16px) - var(--info-border-width, 1px)*2);background-color:#ee0a24;background-color:var(--info-background-color,#ee0a24);border:1px solid #fff;border:var(--info-border-width,1px) solid var(--white,#fff);border-radius:16px;border-radius:var(--info-size,16px)}.van-info--dot{min-width:0;border-radius:100%;width:8px;width:var(--info-dot-size,8px);height:8px;height:var(--info-dot-size,8px);background-color:#ee0a24;background-color:var(--info-dot-color,#ee0a24)}

1
lib/vant/mixins/basic.d.ts

@ -0,0 +1 @@
export declare const basic: string;

22
lib/vant/mixins/basic.js

@ -0,0 +1,22 @@
export const basic = Behavior({
methods: {
$emit(...args) {
this.triggerEvent(...args);
},
getRect(selector, all) {
return new Promise(resolve => {
wx.createSelectorQuery()
.in(this)[all ? 'selectAll' : 'select'](selector)
.boundingClientRect(rect => {
if (all && Array.isArray(rect) && rect.length) {
resolve(rect);
}
if (!all && rect) {
resolve(rect);
}
})
.exec();
});
}
}
});

1
lib/vant/mixins/button.d.ts

@ -0,0 +1 @@
export declare const button: string;

18
lib/vant/mixins/button.js

@ -0,0 +1,18 @@
export const button = Behavior({
externalClasses: ['hover-class'],
properties: {
id: String,
lang: {
type: String,
value: 'en'
},
businessId: Number,
sessionFrom: String,
sendMessageTitle: String,
sendMessagePath: String,
sendMessageImg: String,
showMessageCard: Boolean,
appParameter: String,
ariaLabel: String
}
});

1
lib/vant/mixins/link.d.ts

@ -0,0 +1 @@
export declare const link: string;

17
lib/vant/mixins/link.js

@ -0,0 +1,17 @@
export const link = Behavior({
properties: {
url: String,
linkType: {
type: String,
value: 'navigateTo'
}
},
methods: {
jumpLink(urlKey = 'url') {
const url = this.data[urlKey];
if (url) {
wx[this.data.linkType]({ url });
}
}
}
});

1
lib/vant/mixins/observer/behavior.d.ts

@ -0,0 +1 @@
export declare const behavior: string;

14
lib/vant/mixins/observer/behavior.js

@ -0,0 +1,14 @@
export const behavior = Behavior({
methods: {
set(data, callback) {
return new Promise(resolve => {
this.setData(data, () => {
if (callback && typeof callback === 'function') {
callback.call(this);
}
resolve();
});
});
}
}
});

1
lib/vant/mixins/observer/index.d.ts

@ -0,0 +1 @@
export declare function observe(vantOptions: any, options: any): void;

19
lib/vant/mixins/observer/index.js

@ -0,0 +1,19 @@
import { behavior } from './behavior';
export function observe(vantOptions, options) {
const { watch } = vantOptions;
options.behaviors.push(behavior);
if (watch) {
const props = options.properties || {};
Object.keys(watch).forEach(key => {
if (key in props) {
let prop = props[key];
if (prop === null || !('type' in prop)) {
prop = { type: prop };
}
prop.observer = watch[key];
props[key] = prop;
}
});
options.properties = props;
}
}

1
lib/vant/mixins/open-type.d.ts

@ -0,0 +1 @@
export declare const openType: string;

25
lib/vant/mixins/open-type.js

@ -0,0 +1,25 @@
export const openType = Behavior({
properties: {
openType: String
},
methods: {
bindGetUserInfo(event) {
this.$emit('getuserinfo', event.detail);
},
bindContact(event) {
this.$emit('contact', event.detail);
},
bindGetPhoneNumber(event) {
this.$emit('getphonenumber', event.detail);
},
bindError(event) {
this.$emit('error', event.detail);
},
bindLaunchApp(event) {
this.$emit('launchapp', event.detail);
},
bindOpenSetting(event) {
this.$emit('opensetting', event.detail);
},
}
});

1
lib/vant/mixins/touch.d.ts

@ -0,0 +1 @@
export declare const touch: string;

27
lib/vant/mixins/touch.js

@ -0,0 +1,27 @@
export const touch = Behavior({
methods: {
touchStart(event) {
const touch = event.touches[0];
this.direction = '';
this.deltaX = 0;
this.deltaY = 0;
this.offsetX = 0;
this.offsetY = 0;
this.startX = touch.clientX;
this.startY = touch.clientY;
},
touchMove(event) {
const touch = event.touches[0];
this.deltaX = touch.clientX - this.startX;
this.deltaY = touch.clientY - this.startY;
this.offsetX = Math.abs(this.deltaX);
this.offsetY = Math.abs(this.deltaY);
this.direction =
this.offsetX > this.offsetY
? 'horizontal'
: this.offsetX < this.offsetY
? 'vertical'
: '';
}
}
});

1
lib/vant/mixins/transition.d.ts

@ -0,0 +1 @@
export declare const transition: (showDefaultValue: boolean) => any;

120
lib/vant/mixins/transition.js

@ -0,0 +1,120 @@
import { isObj } from '../common/utils';
const getClassNames = (name) => ({
enter: `van-${name}-enter van-${name}-enter-active enter-class enter-active-class`,
'enter-to': `van-${name}-enter-to van-${name}-enter-active enter-to-class enter-active-class`,
leave: `van-${name}-leave van-${name}-leave-active leave-class leave-active-class`,
'leave-to': `van-${name}-leave-to van-${name}-leave-active leave-to-class leave-active-class`
});
const nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 30));
export const transition = function (showDefaultValue) {
return Behavior({
properties: {
customStyle: String,
// @ts-ignore
show: {
type: Boolean,
value: showDefaultValue,
observer: 'observeShow'
},
// @ts-ignore
duration: {
type: null,
value: 300,
observer: 'observeDuration'
},
name: {
type: String,
value: 'fade'
}
},
data: {
type: '',
inited: false,
display: false
},
attached() {
if (this.data.show) {
this.enter();
}
},
methods: {
observeShow(value) {
value ? this.enter() : this.leave();
},
enter() {
const { duration, name } = this.data;
const classNames = getClassNames(name);
const currentDuration = isObj(duration) ? duration.enter : duration;
this.status = 'enter';
this.$emit('before-enter');
Promise.resolve()
.then(nextTick)
.then(() => {
this.checkStatus('enter');
this.$emit('enter');
this.setData({
inited: true,
display: true,
classes: classNames.enter,
currentDuration
});
})
.then(nextTick)
.then(() => {
this.checkStatus('enter');
this.transitionEnded = false;
this.setData({
classes: classNames['enter-to']
});
})
.catch(() => { });
},
leave() {
if (!this.data.display) {
return;
}
const { duration, name } = this.data;
const classNames = getClassNames(name);
const currentDuration = isObj(duration) ? duration.leave : duration;
this.status = 'leave';
this.$emit('before-leave');
Promise.resolve()
.then(nextTick)
.then(() => {
this.checkStatus('leave');
this.$emit('leave');
this.setData({
classes: classNames.leave,
currentDuration
});
})
.then(nextTick)
.then(() => {
this.checkStatus('leave');
this.transitionEnded = false;
setTimeout(() => this.onTransitionEnd(), currentDuration);
this.setData({
classes: classNames['leave-to']
});
})
.catch(() => { });
},
checkStatus(status) {
if (status !== this.status) {
throw new Error(`incongruent status: ${status}`);
}
},
onTransitionEnd() {
if (this.transitionEnded) {
return;
}
this.transitionEnded = true;
this.$emit(`after-${this.status}`);
const { show, display } = this.data;
if (!show && display) {
this.setData({ display: false });
}
}
}
});
};

1
lib/vant/overlay/index.d.ts

@ -0,0 +1 @@
export {};

22
lib/vant/overlay/index.js

@ -0,0 +1,22 @@
import { VantComponent } from '../common/component';
VantComponent({
props: {
show: Boolean,
customStyle: String,
duration: {
type: null,
value: 300
},
zIndex: {
type: Number,
value: 1
}
},
methods: {
onClick() {
this.$emit('click');
},
// for prevent touchmove
noop() { }
}
});

6
lib/vant/overlay/index.json

@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"van-transition": "../transition/index"
}
}

8
lib/vant/overlay/index.wxml

@ -0,0 +1,8 @@
<van-transition
show="{{ show }}"
custom-class="van-overlay"
custom-style="z-index: {{ zIndex }}; {{ customStyle }}"
duration="{{ duration }}"
bind:tap="onClick"
catch:touchmove="noop"
/>

1
lib/vant/overlay/index.wxss

@ -0,0 +1 @@
@import '../common/index.wxss';.van-overlay{position:fixed;top:0;left:0;bottom:0;width:100%;height:100%;background-color:rgba(0,0,0,.7);background-color:var(--overlay-background-color,rgba(0,0,0,.7))}

1
lib/vant/popup/index.d.ts

@ -0,0 +1 @@
export {};

80
lib/vant/popup/index.js

@ -0,0 +1,80 @@
import { VantComponent } from '../common/component';
import { transition } from '../mixins/transition';
VantComponent({
classes: [
'enter-class',
'enter-active-class',
'enter-to-class',
'leave-class',
'leave-active-class',
'leave-to-class'
],
mixins: [transition(false)],
props: {
round: Boolean,
closeable: Boolean,
customStyle: String,
overlayStyle: String,
transition: {
type: String,
observer: 'observeClass'
},
zIndex: {
type: Number,
value: 100
},
overlay: {
type: Boolean,
value: true
},
closeIcon: {
type: String,
value: 'cross'
},
closeIconPosition: {
type: String,
value: 'top-right'
},
closeOnClickOverlay: {
type: Boolean,
value: true
},
position: {
type: String,
value: 'center',
observer: 'observeClass'
},
safeAreaInsetBottom: {
type: Boolean,
value: true
},
safeAreaInsetTop: {
type: Boolean,
value: false
}
},
created() {
this.observeClass();
},
methods: {
onClickCloseIcon() {
this.$emit('close');
},
onClickOverlay() {
this.$emit('click-overlay');
if (this.data.closeOnClickOverlay) {
this.$emit('close');
}
},
observeClass() {
const { transition, position } = this.data;
const updateData = {
name: transition || position
};
if (transition === 'none') {
updateData.duration = 0;
}
this.setData(updateData);
}
}
});

7
lib/vant/popup/index.json

@ -0,0 +1,7 @@
{
"component": true,
"usingComponents": {
"van-icon": "../icon/index",
"van-overlay": "../overlay/index"
}
}

24
lib/vant/popup/index.wxml

@ -0,0 +1,24 @@
<wxs src="../wxs/utils.wxs" module="utils" />
<van-overlay
wx:if="{{ overlay }}"
show="{{ show }}"
z-index="{{ zIndex }}"
custom-style="{{ overlayStyle }}"
duration="{{ duration }}"
bind:click="onClickOverlay"
/>
<view
wx:if="{{ inited }}"
class="custom-class {{ classes }} {{ utils.bem('popup', [position, { round, safe: safeAreaInsetBottom, safeTop: safeAreaInsetTop }]) }}"
style="z-index: {{ zIndex }}; -webkit-transition-duration:{{ currentDuration }}ms; transition-duration:{{ currentDuration }}ms; {{ display ? '' : 'display: none;' }};{{ customStyle }}"
bind:transitionend="onTransitionEnd"
>
<slot />
<van-icon
wx:if="{{ closeable }}"
name="{{ closeIcon }}"
class="van-popup__close-icon van-popup__close-icon--{{ closeIconPosition }}"
bind:tap="onClickCloseIcon"
/>
</view>

1
lib/vant/popup/index.wxss

@ -0,0 +1 @@
@import '../common/index.wxss';.van-popup{position:fixed;box-sizing:border-box;max-height:100%;overflow-y:auto;transition-timing-function:ease;-webkit-animation:ease both;animation:ease both;-webkit-overflow-scrolling:touch;background-color:#fff;background-color:var(--popup-background-color,#fff)}.van-popup--center{top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.van-popup--center.van-popup--round{border-radius:20px;border-radius:var(--popup-round-border-radius,20px)}.van-popup--top{top:0;left:0;width:100%}.van-popup--top.van-popup--round{border-radius:0 0 20px 20px;border-radius:0 0 var(--popup-round-border-radius,20px) var(--popup-round-border-radius,20px)}.van-popup--right{top:50%;right:0;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.van-popup--right.van-popup--round{border-radius:20px 0 0 20px;border-radius:var(--popup-round-border-radius,20px) 0 0 var(--popup-round-border-radius,20px)}.van-popup--bottom{bottom:0;left:0;width:100%}.van-popup--bottom.van-popup--round{border-radius:20px 20px 0 0;border-radius:var(--popup-round-border-radius,20px) var(--popup-round-border-radius,20px) 0 0}.van-popup--left{top:50%;left:0;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.van-popup--left.van-popup--round{border-radius:0 20px 20px 0;border-radius:0 var(--popup-round-border-radius,20px) var(--popup-round-border-radius,20px) 0}.van-popup--bottom.van-popup--safe{padding-bottom:env(safe-area-inset-bottom)}.van-popup--safeTop{padding-top:env(safe-area-inset-top)}.van-popup__close-icon{position:absolute;z-index:1;z-index:var(--popup-close-icon-z-index,1);color:#969799;color:var(--popup-close-icon-color,#969799);font-size:18px;font-size:var(--popup-close-icon-size,18px)}.van-popup__close-icon--top-left{top:16px;top:var(--popup-close-icon-margin,16px);left:16px;left:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--top-right{top:16px;top:var(--popup-close-icon-margin,16px);right:16px;right:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--bottom-left{bottom:16px;bottom:var(--popup-close-icon-margin,16px);left:16px;left:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--bottom-right{right:16px;right:var(--popup-close-icon-margin,16px);bottom:16px;bottom:var(--popup-close-icon-margin,16px)}.van-popup__close-icon:active{opacity:.6}.van-scale-enter-active,.van-scale-leave-active{transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.van-scale-enter,.van-scale-leave-to{-webkit-transform:translate3d(-50%,-50%,0) scale(.7);transform:translate3d(-50%,-50%,0) scale(.7);opacity:0}.van-fade-enter-active,.van-fade-leave-active{transition-property:opacity}.van-fade-enter,.van-fade-leave-to{opacity:0}.van-center-enter-active,.van-center-leave-active{transition-property:opacity}.van-center-enter,.van-center-leave-to{opacity:0}.van-bottom-enter-active,.van-bottom-leave-active,.van-left-enter-active,.van-left-leave-active,.van-right-enter-active,.van-right-leave-active,.van-top-enter-active,.van-top-leave-active{transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}.van-bottom-enter,.van-bottom-leave-to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.van-top-enter,.van-top-leave-to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.van-left-enter,.van-left-leave-to{-webkit-transform:translate3d(-100%,-50%,0);transform:translate3d(-100%,-50%,0)}.van-right-enter,.van-right-leave-to{-webkit-transform:translate3d(100%,-50%,0);transform:translate3d(100%,-50%,0)}

1
lib/vant/transition/index.d.ts

@ -0,0 +1 @@
export {};

13
lib/vant/transition/index.js

@ -0,0 +1,13 @@
import { VantComponent } from '../common/component';
import { transition } from '../mixins/transition';
VantComponent({
classes: [
'enter-class',
'enter-active-class',
'enter-to-class',
'leave-class',
'leave-active-class',
'leave-to-class'
],
mixins: [transition(true)]
});

3
lib/vant/transition/index.json

@ -0,0 +1,3 @@
{
"component": true
}

8
lib/vant/transition/index.wxml

@ -0,0 +1,8 @@
<view
wx:if="{{ inited }}"
class="van-transition custom-class {{ classes }}"
style="-webkit-transition-duration:{{ currentDuration }}ms; transition-duration:{{ currentDuration }}ms; {{ display ? '' : 'display: none;' }} {{ customStyle }}"
bind:transitionend="onTransitionEnd"
>
<slot />
</view>

1
lib/vant/transition/index.wxss

@ -0,0 +1 @@
@import '../common/index.wxss';.van-transition{transition-timing-function:ease}.van-fade-enter-active,.van-fade-leave-active{transition-property:opacity}.van-fade-enter,.van-fade-leave-to{opacity:0}.van-fade-down-enter-active,.van-fade-down-leave-active,.van-fade-left-enter-active,.van-fade-left-leave-active,.van-fade-right-enter-active,.van-fade-right-leave-active,.van-fade-up-enter-active,.van-fade-up-leave-active{transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.van-fade-up-enter,.van-fade-up-leave-to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}.van-fade-down-enter,.van-fade-down-leave-to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);opacity:0}.van-fade-left-enter,.van-fade-left-leave-to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);opacity:0}.van-fade-right-enter,.van-fade-right-leave-to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);opacity:0}.van-slide-down-enter-active,.van-slide-down-leave-active,.van-slide-left-enter-active,.van-slide-left-leave-active,.van-slide-right-enter-active,.van-slide-right-leave-active,.van-slide-up-enter-active,.van-slide-up-leave-active{transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}.van-slide-up-enter,.van-slide-up-leave-to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.van-slide-down-enter,.van-slide-down-leave-to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.van-slide-left-enter,.van-slide-left-leave-to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.van-slide-right-enter,.van-slide-right-leave-to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}

5
lib/vant/wxs/array.wxs

@ -0,0 +1,5 @@
function isArray(array) {
return array && array.constructor === 'Array';
}
module.exports.isArray = isArray;

38
lib/vant/wxs/bem.wxs

@ -0,0 +1,38 @@
var array = require('./array.wxs');
var object = require('./object.wxs');
var PREFIX = 'van-';
function join(name, mods) {
name = PREFIX + name;
mods = mods.map(function(mod) {
return name + '--' + mod;
});
mods.unshift(name);
return mods.join(' ');
}
function traversing(mods, conf) {
if (!conf) {
return;
}
if (typeof conf === 'string' || typeof conf === 'number') {
mods.push(conf);
} else if (array.isArray(conf)) {
conf.forEach(function(item) {
traversing(mods, item);
});
} else if (typeof conf === 'object') {
object.keys(conf).forEach(function(key) {
conf[key] && mods.push(key);
});
}
}
function bem(name, conf) {
var mods = [];
traversing(mods, conf);
return join(name, mods);
}
module.exports.bem = bem;

54
lib/vant/wxs/memoize.wxs

@ -0,0 +1,54 @@
/**
* Simple memoize
* wxs doesn't support fn.apply, so this memoize only support up to 2 args
*/
function isPrimitive(value) {
var type = typeof value;
return (
type === 'boolean' ||
type === 'number' ||
type === 'string' ||
type === 'undefined' ||
value === null
);
}
// mock simple fn.call in wxs
function call(fn, args) {
if (args.length === 2) {
return fn(args[0], args[1]);
}
if (args.length === 1) {
return fn(args[0]);
}
return fn();
}
function serializer(args) {
if (args.length === 1 && isPrimitive(args[0])) {
return args[0];
}
var obj = {};
for (var i = 0; i < args.length; i++) {
obj['key' + i] = args[i];
}
return JSON.stringify(obj);
}
function memoize(fn) {
var cache = {};
return function() {
var key = serializer(arguments);
if (cache[key] === undefined) {
cache[key] = call(fn, arguments);
}
return cache[key];
};
}
module.exports.memoize = memoize;

13
lib/vant/wxs/object.wxs

@ -0,0 +1,13 @@
/* eslint-disable */
var REGEXP = getRegExp('{|}|"', 'g');
function keys(obj) {
return JSON.stringify(obj)
.replace(REGEXP, '')
.split(',')
.map(function(item) {
return item.split(':')[0];
});
}
module.exports.keys = keys;

7
lib/vant/wxs/utils.wxs

@ -0,0 +1,7 @@
var bem = require('./bem.wxs').bem;
var memoize = require('./memoize.wxs').memoize;
module.exports = {
bem: memoize(bem),
memoize: memoize
};

127
pages/merchant-login/merchant-login.js

@ -0,0 +1,127 @@
// pages/pregnant-mother/pregnant-mother.js
Page({
/**
* 页面的初始数据
*/
data: {
background: ['demo-text-1', 'demo-text-2', 'demo-text-3'],
indicatorDots: true,
vertical: false,
autoplay: true,
interval: 2000,
duration: 500,
nvabarData: {
title: '', //导航栏 中间的标题
keyWord: '',
search: true
},
height: ''
},
changeIndicatorDots() {
this.setData({
indicatorDots: !this.data.indicatorDots
})
},
changeAutoplay() {
this.setData({
autoplay: !this.data.autoplay
})
},
intervalChange(e) {
this.setData({
interval: e.detail.value
})
},
durationChange(e) {
this.setData({
duration: e.detail.value
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
// 清除搜索框 调用子组件的清空函数
this.selectComponent('#bar').clearInput();
// 每个机型的尺寸不一致
// 在app.js中获取到的 statusBarHeight 用于控制头部的高度
this.setData({
// height: app.globalData.height,
})
this.setData({
'nvabarData.inputValue': ''
})
if (typeof this.getTabBar === 'function' &&
this.getTabBar()) {
this.getTabBar().setData({
selected: 1
})
}
},
search: function(e) {
this.getTask(e.detail);
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

6
pages/merchant-login/merchant-login.json

@ -0,0 +1,6 @@
{
"navigationBarTitleText": "商户登录",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#F52F3E",
"navigationBarTextStyle": "white"
}

2
pages/merchant-login/merchant-login.wxml

@ -0,0 +1,2 @@
<view class="page-bg">
</view>

4
pages/merchant-login/merchant-login.wxss

@ -0,0 +1,4 @@
page{
background: #f7f7f7;
}

55
project.config.json

@ -0,0 +1,55 @@
{
"description": "项目配置文件",
"packOptions": {
"ignore": [],
"include": []
},
"setting": {
"urlCheck": false,
"es6": true,
"enhance": true,
"postcss": true,
"preloadBackgroundData": false,
"minified": true,
"newFeature": false,
"coverView": true,
"nodeModules": false,
"autoAudits": false,
"showShadowRootInWxmlPanel": true,
"scopeDataCheck": false,
"uglifyFileName": false,
"checkInvalidKey": true,
"checkSiteMap": true,
"uploadWithSourceMap": true,
"compileHotReLoad": false,
"lazyloadPlaceholderEnable": false,
"useMultiFrameRuntime": true,
"useApiHook": true,
"useApiHostProcess": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"useIsolateContext": false,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true,
"disableUseStrict": false,
"minifyWXML": true,
"showES6CompileOption": false,
"useCompilerPlugins": false,
"ignoreUploadUnusedFiles": true,
"condition": false
},
"compileType": "miniprogram",
"libVersion": "2.25.3",
"appid": "wx1fd0ad2d16dce86a",
"projectname": "hsyg-applet-master",
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
},
"condition": {}
}

9
project.private.config.json

@ -0,0 +1,9 @@
{
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
"projectname": "muyin-client",
"setting": {
"compileHotReLoad": true,
"bigPackageSizeSupport": false,
"preloadBackgroundData": true
}
}

7
sitemap.json

@ -0,0 +1,7 @@
{
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
"rules": [{
"action": "allow",
"page": "*"
}]
}

4
tpl/image.wxml

@ -0,0 +1,4 @@
<!-- 所有图片组件 -->
<template name="image">
<image class="{{style}}" src="{{src}}" mode="{{mode||'scaleToFill'}}" bindtap="{{bindtap||''}}" id="{{id||''}}"></image>
</template>

4
tpl/netError/netError.wxml

@ -0,0 +1,4 @@
<import src="../image.wxml"/>
<view class="applet-netError-view">
<template is="image" data="{{src:'/images/netError.png',style:'applet-netError-view-image',bindtap:'onPullDownRefresh'}}"></template>
</view>

82
tpl/timeUtil.wxs

@ -0,0 +1,82 @@
var formatNumber = function(n){
n = n.toString()
return n[1] ? n : '0' + n
}
var regYear = getRegExp("(y+)", "i");
var orderStatus = function(status){
// 0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
if(status==5){
return '取消待审';
}else if(status==0){
return '待上门';
}else if(status==1){
return '待揽收';
}else if(status==2){
return '待支付';
}else if(status==3){
return '待评价';
}else if(status==4){
return '已取消';
}
else if (status == 8) {
return '已完成';
}
}
var redPacketStatus = function(status){
// // 1随机红包 2等额红包
if(status==1){
return '随机红包';
}else if(status==2){
return '等额红包';
}
}
var dateFormat = function(timestamp,format){
if (!format) {
format = "yyyy-MM-dd hh:mm:ss";
}
if(timestamp == undefined|| timestamp ==null){
return "";
}
timestamp = parseInt(timestamp);
var realDate = getDate(timestamp);
function timeFormat(num) {
return num < 10 ? '0' + num : num;
}
var date = [
["M+", timeFormat(realDate.getMonth() + 1)],
["d+", timeFormat(realDate.getDate())],
["h+", timeFormat(realDate.getHours())],
["m+", timeFormat(realDate.getMinutes())],
["s+", timeFormat(realDate.getSeconds())],
["q+", Math.floor((realDate.getMonth() + 3) / 3)],
["S+", realDate.getMilliseconds()],
];
var reg1 = regYear.exec(format);
// console.log(reg1[0]);
if (reg1) {
format = format.replace(reg1[1], (realDate.getFullYear() + '').substring(4 - reg1[1].length));
}
for (var i=0;i<date.length;i++) {
var k = date[i][0];
var v = date[i][1];
var reg2 = getRegExp("(" + k + ")").exec(format);
if (reg2) {
format = format.replace(reg2[1], reg2[1].length == 1
? v : ("00" + v).substring(("" + v).length));
}
}
return format;
}
module.exports = {
dateFormat: dateFormat,
orderStatus:orderStatus,
redPacketStatus:redPacketStatus
};

16
utils.js

@ -0,0 +1,16 @@
var utils = {
scene_decode: function (scene) {
var _str = scene + "";
var _str_list = _str.split(",");
var res = {};
for (var i in _str_list) {
var _tmp_str = _str_list[i];
var _tmp_str_list = _tmp_str.split(":");
if (_tmp_str_list.length > 0&&_tmp_str_list[0]) {
res[_tmp_str_list[0]] = _tmp_str_list[1] || null;
}
}
return res;
}
};
module.exports = utils;

406
utils/CurvePainter.js

@ -0,0 +1,406 @@
const utils = require('./util');
const STYLE_DEFAULT = {
TEXT_ALIGN: 'center',
COLOR: '#000000',
LIGHT_COLOR: '#fff',
FONT_SIZE: 24,
AXLE_COLOR: '#e5e5e5'
};
function CurvePainter(ctx, config) {
this.ctx = ctx;
this.windowWidth = config.windowWidth;
this.canvasWidth = config.canvasWidth;
this.canvasHeight = config.canvasHeight;
this.marginTop = config.marginTop; // 画布上边留白
this.marginBottom = config.marginBottom; // 画布底边留白
this.marginLeft = config.marginLeft; // 画布左边留白
this.marginRight = config.marginRight; // 画布右边留白
this.drawWidth = this.canvasWidth - this.marginLeft - this.marginRight; // 绘制宽度
this.drawHeight = this.canvasHeight - this.marginTop - this.marginBottom; // 绘制高度
}
CurvePainter.prototype = {
setData(data) {
this.hAxleData = data.hAxleData || []; // x轴刻度
this.hAxleTitle = data.hAxleTitle || ''; // x轴标题
this.vAxleData = data.vAxleData || []; // y轴刻度
this.vAxleTitle = data.vAxleTitle || ''; // y轴标题
this.originDataList = data.dataList || []; // 原始数据集
this.selectedIndex = data.selectedIndex; // 被选中的序号
this.reference = data.reference || 0; // 参考值
this.unit = data.unit || ''; // 数值单位
this.drawHAxle = data.drawHAxle || false; // 是否绘制横轴
this.drawVAxle = data.drawVAxle || false; // 是否绘制纵轴
this.drawCurveDecorate = data.drawCurveDecorate || false; // 是否绘制背景
this.drawCurveDataPoint = data.drawCurveDataPoint || false; // 是否绘制数据点
this.drawCurveDataText = data.drawCurveDataText || false; // 是否绘制数据值
},
setOffset(data) {
this.topOffset = data.topOffset; // 最大数据点距画布顶部距离
this.bottomOffset = data.bottomOffset; // 最小数据点距画布底部距离
},
setStyle(config) {
this.curveWidth = config.curveWidth || this.toPx(6); // 曲线宽度
this.curveColor = config.curveColor || STYLE_DEFAULT.COLOR; // 曲线颜色
this.curveDecorateColors = config.curveDecorateColors || [STYLE_DEFAULT.LIGHT_COLOR, STYLE_DEFAULT.LIGHT_COLOR]; // 背景颜色
this.scaleColor = config.scaleColor || STYLE_DEFAULT.COLOR; // 刻度字体颜色
this.selectedScaleColor = config.selectedScaleColor || STYLE_DEFAULT.COLOR; // 选中刻度的字体颜色
this.scaleFontSize = config.scaleFontSize || this.toPx(STYLE_DEFAULT.FONT_SIZE); // 刻度字体大小
this.selectedScaleFontSize = config.selectedScaleFontSize || this.toPx(STYLE_DEFAULT.FONT_SIZE); // 选中的刻度字体大小
this.dataPointFontColor = config.dataPointFontColor || STYLE_DEFAULT.COLOR; // 数据值颜色
this.selectedDataPointFontColor = config.selectedDataPointFontColor || STYLE_DEFAULT.COLOR; // 选中的数据值颜色
this.dataPointFontSize = config.dataPointFontSize || this.toPx(STYLE_DEFAULT.FONT_SIZE); // 数据值字体大小
this.selectedDataPointFontSize = config.selectedDataPointFontSize || this.toPx(STYLE_DEFAULT.FONT_SIZE); // 选中的数据值字体大小
this.textAlign = config.textAlign || 'center'; // 文字对其方式
this.hAxleTitleColor = config.hAxleTitleColor || STYLE_DEFAULT.COLOR; // x轴标题颜色
this.vAxleTitleColor = config.vAxleTitleColor || STYLE_DEFAULT.COLOR; // y轴标题颜色
this.hAxleColor = config.hAxleColor || STYLE_DEFAULT.AXLE_COLOR; // x轴线颜色
this.hAxleWidth = config.hAxleWidth || 1; // x轴宽度
this.vAxleColor = config.vAxleColor || STYLE_DEFAULT.AXLE_COLOR; // y轴颜色
this.vAxleWidth = config.vAxleWidth || 1; // y轴宽度
this.pointMarginColor = config.pointMarginColor || STYLE_DEFAULT.COLOR; // 数据点外圆颜色
this.pointMarginRadius = config.pointMarginRadius || this.toPx(24 / 2); // 数据点外缘半径
this.pointColor = config.pointColor || STYLE_DEFAULT.COLOR;// 数据点颜色
this.pointRadius = config.pointRadius || this.toPx(12 / 2); // 数据点半径
},
addAction(fn) {
if (!utils.isFunction(fn)) return;
if (!this.actions) {
this.actions = [];
}
this.actions.push(fn);
},
prepare() {
let self = this;
let data = this.originDataList;
dataToPos();
function dataToPos() {
if (!self.isValid(data)) {
return;
}
let {max, min} = self.getMaxAndMin(data, self.reference);
let range = max !== min ? max - min : 1; // 需要考虑最大值等于最小值,也就是所有值都一样的情况
let drawWidth = self.drawWidth;
let drawHeight = self.drawHeight;
let dataPointMaxHeight = drawHeight - self.topOffset - self.bottomOffset; // 数据点最大高度
let xOffset = drawWidth / (data.length - 1);
let calcData = [];
for (let i = 0; i < data.length; i++) {
if (data[i]) {
calcData.push({
x: i * xOffset,
y: self.topOffset + dataPointMaxHeight - self.calcRate(data, max, min, range, i) * dataPointMaxHeight,
value: data[i],
});
} else {
calcData.push({
value: data[i]
});
}
}
self.calcData = calcData;
}
return this;
},
// 数据合法化处理
calcRate(list, max, min, range, idx) {
if(max === min) {
return 1;
}
let diff = list[idx] - min;
if (diff === 0) {
return 0;
} else {
if (range === 0) {
return list[idx] / max;
} else {
return diff / range;
}
}
},
getMaxAndMin(list, target) {
let max = 0, min = 0, self = this;
let listWithoutZero = this.filterZero(list);
if (listWithoutZero.length > 1) {
return {
max: self.max(listWithoutZero),
min: self.minWithoutZero(listWithoutZero)
};
} else {
let only = listWithoutZero[0];
max = only > target ? only : target;
min = only > target ? target: only;
return { max, min };
}
},
max(obj) {
if (!this.isValid(obj)) {
return void 0;
}
let max = obj[0];
obj.forEach(item => {
if (item > max) {
max = item;
}
});
return max;
},
minWithoutZero(obj) {
if (!this.isValid(obj)) {
return void 0;
}
let min = obj[0];
obj.forEach(item => {
if (item > 0 && item <= min) {
min = item;
}
});
return min;
},
filterZero(list) {
return list.filter(item => item);
},
draw(reDraw) {
reDraw && this.clear();
this.performDraw();
},
performDraw() {
// 坐标轴变换方便计算
this.resetCurvesCoordinate();
// 绘制轴线
this.drawAxle();
// 绘制曲线
this.drawCurve();
this.ctx.draw();
},
clear() {
this.ctx && this.ctx.clearRect(0, 0, this.drawHeight, this.drawHeight);
},
resetCurvesCoordinate() {
let xCut = this.marginLeft;
let yCut = this.marginTop;
this.ctx.translate(xCut, yCut);
},
drawAxle() {
let ctx = this.ctx;
let drawWidth = this.drawWidth;
let drawHeight = this.drawHeight;
let defaultColor = STYLE_DEFAULT.COLOR;
let drawHAxle = this.drawHAxle;
if (drawHAxle) {
let hAxleData = this.hAxleData;
let dataLen = hAxleData.length;
let selectedIndex = this.selectedIndex;
let selectedScaleColor = this.selectedScaleColor;
let scaleFontSize = this.scaleFontSize;
let selectedScaleFontSize = this.selectedScaleFontSize;
let hAxleTitle = this.hAxleTitle;
let hAxleTitleColor = this.hAxleTitleColor;
let hAxleWidth = this.hAxleWidth;
let hAxleColor = this.hAxleColor;
// 绘制刻度
ctx.setFontSize(scaleFontSize);
ctx.setTextAlign(this.textAlign);
let item;
let xOffset = dataLen - 1 ? drawWidth / (dataLen - 1) : 0;
for (let i = 0, len = dataLen; i < len; i++) {
item = hAxleData[i];
ctx.setFillStyle(i === selectedIndex ? selectedScaleColor : defaultColor);
ctx.setFontSize(i === selectedIndex ? selectedScaleFontSize : scaleFontSize);
ctx.fillText(item, xOffset * i, drawHeight);
}
// 绘制刻度标题
ctx.setFillStyle(hAxleTitleColor);
ctx.setFontSize(scaleFontSize);
ctx.fillText(hAxleTitle, drawWidth + this.toPx(45), drawHeight); // 45 = 偏离y轴的距离
// 画轴线
ctx.setLineWidth(hAxleWidth);
ctx.setStrokeStyle(hAxleColor);
ctx.beginPath();
ctx.moveTo(0, drawHeight - this.toPx(36)); // 36 = 刻度文字与x轴的距离 + 文字大小
ctx.lineTo(drawWidth + this.toPx(55), drawHeight - this.toPx(36));
ctx.stroke();
}
},
drawCurve() {
let self = this;
let ctx = this.ctx;
let drawWidth = this.drawWidth;
let drawHeight = this.drawHeight;
let calcData = this.calcData;
let selectedIndex = self.selectedIndex;
if (calcData && calcData.length) {
let curveWidth = this.curveWidth;
let curveColor = this.curveColor;
ctx.setLineWidth(curveWidth);
let pos, lastPos = calcData[0];
ctx.beginPath();
ctx.moveTo(lastPos.x, lastPos.y);
for (let i = 1, len = calcData.length; i < len; i++) {
pos = calcData[i];
if (!pos.value) continue;
// 这里每次都得创建一个新的渐变
// FIXME 这里是为了解决,android,在同一个canvas内,
// FIXME 先用gradient绘制了线条后,无法setStrokeStyle设置为普通颜色的Bug
let gd = ctx.createLinearGradient(0, 0, pos.x, pos.y);
gd.addColorStop(0, curveColor);
gd.addColorStop(1, curveColor);
ctx.setStrokeStyle(gd);
if (i === 1) {
ctx.lineTo(pos.x, pos.y);
} else {
ctx.beginPath();
ctx.moveTo(lastPos.x, lastPos.y);
ctx.lineTo(pos.x, pos.y);
}
ctx.stroke();
lastPos = pos;
}
drawCurveDecorate(); // 绘制曲线修饰
drawCurveDataPoint(); // 绘制数据点
drawCurveDataText(); // 绘制数据值
drawCustom(); // 绘制自定义内容
}
function drawCurveDecorate() {
let drawCurveDecorate = self.drawCurveDecorate;
if (!drawCurveDecorate || calcData.length <= 1) return;
let curveDecorateColors = self.curveDecorateColors;
let lg = ctx.createLinearGradient(0, 0, 0, drawHeight);
lg.addColorStop(0, curveDecorateColors[0]);
lg.addColorStop(1, curveDecorateColors[1]);
ctx.setFillStyle(lg);
ctx.beginPath();
ctx.moveTo(calcData[0].x || 0, calcData[0].y || 0);
for(let i = 0, len = calcData.length; i < len; i++) {
let pos = calcData[i];
if (!pos.value) continue;
ctx.lineTo(pos.x, pos.y);
}
ctx.lineTo(getNonZeroPos(calcData).x, drawHeight);
ctx.lineTo(calcData[0].x || 0, drawHeight);
ctx.lineTo(calcData[0].x || 0, calcData[0].y || 0);
ctx.closePath();
ctx.fill();
}
function getNonZeroPos(list) {
let len = list.length;
for (let i = len - 1, end = 0; i >= end; i--) {
let temp = list[i];
if (!temp.value) continue;
return temp;
}
}
function drawCurveDataPoint() {
let drawCurveDataPoint = self.drawCurveDataPoint;
if (!drawCurveDataPoint) return;
let pointMarginColor = self.pointMarginColor;
let pointColor = self.pointColor;
for (let i = 0, len = calcData.length; i < len; i++) {
let pos = calcData[i];
if (!pos.value) continue;
// 被选中的数据点有外边框
if (i === selectedIndex) {
ctx.setFillStyle(pointMarginColor);
ctx.beginPath();
ctx.arc(pos.x, pos.y, self.toPx(24 / 2), 0, 2 * Math.PI);
ctx.fill();
}
// 再画颜色小圆
ctx.setFillStyle(pointColor);
ctx.beginPath();
ctx.arc(pos.x, pos.y, self.toPx(12 / 2), 0, 2 * Math.PI);
ctx.fill();
}
}
function drawCurveDataText() {
let drawCurveDataText = self.drawCurveDataText;
if (!drawCurveDataText) return;
let textAlign = self.textAlign;
let dataPointFontSize = self.dataPointFontSize;
let selectedDataPointFontSize = self.selectedDataPointFontSize;
let dataPointFontColor = self.dataPointFontColor;
let selectedDataPointFontColor = self.selectedDataPointFontColor;
ctx.setTextAlign(textAlign);
for (let i = 0, len = calcData.length; i < len; i++) {
let pos = calcData[i];
if (!pos.value) continue;
ctx.setFontSize( i === selectedIndex ? selectedDataPointFontSize : dataPointFontSize);
ctx.setFillStyle( i === selectedIndex ? selectedDataPointFontColor : dataPointFontColor);
ctx.fillText(
`${pos.value.toFixed(1)}`,
pos.x,
pos.y - self.toPx(25)); // 25 = 数据点和数据文字的距离
}
}
function drawCustom() {
let actions = self.actions;
actions && actions.forEach(action => {
action.apply(self);
});
}
},
toPx(rpx) {
let windowWidth = this.windowWidth;
return utils.rpx_to_px(rpx, windowWidth);
},
isValid(obj) {
let isArray = utils.isArray(obj);
if (isArray) {
return obj.length > 0;
} else {
return isArray;
}
}
};
module.exports = CurvePainter;

113
utils/checkinUtil.js

@ -0,0 +1,113 @@
const app = getApp();
const Crypto = require('./lib/crypto1/crypto');
const Base64 = require('./lib/crypto1/base64');
const IMG_SIZE_TYPE = {
TYPE_WIDTH: (750 / 570) * 100 | 0,
TYPE_HEIGHT: (750 / 900) * 100 | 0,
TYPE_EQUAL: (750 / 750) * 100 | 0
};
module.exports = {
// 是否是本地默认打卡图片
isDefaultRecordImage(imgPath) {
return imgPath && imgPath.startsWith('/img');
},
// 添加图片裁剪参数
addImageCutParam (owidth, oheight, imgPath) {
let ratio = owidth / oheight, width = owidth, height = oheight;
let result = {};
if ((ratio * 100 | 0) >= IMG_SIZE_TYPE.TYPE_WIDTH) {
width = parseInt(oheight * 750 / 570);
imgPath += "?imageView2/1/w/" + width + "/h/" + (height);
result.width = width;
result.height = height;
} else if ((ratio * 100 | 0) <= IMG_SIZE_TYPE.TYPE_HEIGHT) {
height = parseInt(width * 900 / 750);
imgPath += "?imageView2/1/w/" + (width) + "/h/" + height;
result.width = width;
result.height = height;
} else {
imgPath += "?imageView2/1/w/" + (owidth) + "/h/" + (owidth);
result.width = result.height = width;
}
result.imgPath = imgPath;
return result;
},
// 添加图片缩放、裁剪参数
addImageCutParamAli(owidth, oheight, imgPath) {
const MAX_LEN = 4096;
let ratio = owidth / oheight, width = owidth, height = oheight;
imgPath += '?x-oss-process=image';
// 图片宽高大于4096时,需要先进行缩放
if (owidth > MAX_LEN || oheight > MAX_LEN) {
imgPath += `/resize,h_${MAX_LEN},w_${MAX_LEN}`;
// 这里需要重新计算缩放后的图片大小
if (owidth > oheight) {
width = MAX_LEN;
let zoomRatio = width / owidth;
height = parseInt(zoomRatio * oheight);
} else if (owidth < oheight) {
height = MAX_LEN;
let zoomRatio = height / oheight;
width = parseInt(zoomRatio * owidth);
} else {
width = height = MAX_LEN;
}
}
// 裁剪
ratio = width / height;
let result = {};
if ((ratio * 100 | 0) >= IMG_SIZE_TYPE.TYPE_WIDTH) {
width = parseInt(oheight * 750 / 570);
imgPath += `/crop,w_${width},h_${height},g_center`;
result.width = width;
result.height = height;
} else if ((ratio * 100 | 0) <= IMG_SIZE_TYPE.TYPE_HEIGHT) {
height = parseInt(width * 900 / 750);
imgPath += `/crop,w_${width},h_${height},g_center`;
result.width = width;
result.height = height;
} else {
imgPath += `/crop,w_${width},h_${width},g_center`;
result.width = result.height = width;
}
result.imgPath = imgPath;
return result;
},
getMultipartParams() {
let policyText = {
"expiration": "2020-01-01T12:00:00.000Z", // 设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
"conditions": [
["content-length-range", 0, 1048576000] // 设置上传文件的大小限制
]
};
let policyBase64 = Base64.encode(JSON.stringify(policyText));
let bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, app.globalData.config.aliAccessKey, { asBytes: true }) ;
let signature = Crypto.util.bytesToBase64(bytes);
return {
'Filename': 'wx-applet-fittime/' + '${filename}',
'key': '',
'policy': policyBase64,
'OSSAccessKeyId': app.globalData.config.aliAccessId,
'success_action_status': '200', // 让服务端返回200,不然,默认会返回204
'signature': signature
};
}
};

4
utils/city.js
File diff suppressed because it is too large
View File

1
utils/countryList.js
File diff suppressed because it is too large
View File

78
utils/date.js

@ -0,0 +1,78 @@
/* *
* 把Long类型的1527672756454日期还原yyyy-MM-dd 00:00:00格式日期
*/
function datetimeFormat(longTypeDate){
var dateTypeDate = "";
var date = new Date();
date.setTime(longTypeDate);
dateTypeDate += date.getFullYear(); //年
dateTypeDate += "-" + getMonth(date); //月
dateTypeDate += "-" + getDay(date); //日
dateTypeDate += " " + getHours(date); //时
dateTypeDate += ":" + getMinutes(date); //分
dateTypeDate += ":" + getSeconds(date); //分
return dateTypeDate;
}
/*
* 时间格式化工具
* 把Long类型的1527672756454日期还原yyyy-MM-dd格式日期
*/
function dateFormat(longTypeDate){
var dateTypeDate = "";
var date = new Date();
date.setTime(longTypeDate);
dateTypeDate += date.getFullYear(); //年
dateTypeDate += "-" + getMonth(date); //月
dateTypeDate += "-" + getDay(date); //日
return dateTypeDate;
}
//返回 01-12 的月份值
function getMonth(date){
var month = "";
month = date.getMonth() + 1; //getMonth()得到的月份是0-11
if(month<10){
month = "0" + month;
}
return month;
}
//返回01-30的日期
function getDay(date){
var day = "";
day = date.getDate();
if(day<10){
day = "0" + day;
}
return day;
}
//小时
function getHours(date){
var hours = "";
hours = date.getHours();
if(hours<10){
hours = "0" + hours;
}
return hours;
}
//分
function getMinutes(date){
var minute = "";
minute = date.getMinutes();
if(minute<10){
minute = "0" + minute;
}
return minute;
}
//秒
function getSeconds(date){
var second = "";
second = date.getSeconds();
if(second<10){
second = "0" + second;
}
return second;
}
module.exports = {
datetimeFormat: datetimeFormat,
dateFormat: dateFormat,
};

135
utils/lib/crypto1/base64.js

@ -0,0 +1,135 @@
module.exports = {
// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
// public method for encoding
encode : function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = this._utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
}
return output;
},
// public method for decoding
decode : function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = this._utf8_decode(output);
return output;
},
// private method for UTF-8 encoding
_utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
},
// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while ( i < utftext.length ) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}

281
utils/lib/crypto1/crypto.js

@ -0,0 +1,281 @@
/*!
* Crypto-JS v1.1.0
* http://code.google.com/p/crypto-js/
* Copyright (c) 2009, Jeff Mott. All rights reserved.
* http://code.google.com/p/crypto-js/wiki/License
*/
var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// Global Crypto object
var Crypto = {};
// Crypto utilities
var util = Crypto.util = {
// Bit-wise rotate left
rotl: function (n, b) {
return (n << b) | (n >>> (32 - b));
},
// Bit-wise rotate right
rotr: function (n, b) {
return (n << (32 - b)) | (n >>> b);
},
// Swap big-endian to little-endian and vice versa
endian: function (n) {
// If number given, swap endian
if (n.constructor == Number) {
return util.rotl(n, 8) & 0x00FF00FF |
util.rotl(n, 24) & 0xFF00FF00;
}
// Else, assume array and swap all items
for (var i = 0; i < n.length; i++)
n[i] = util.endian(n[i]);
return n;
},
// Generate an array of any length of random bytes
randomBytes: function (n) {
for (var bytes = []; n > 0; n--)
bytes.push(Math.floor(Math.random() * 256));
return bytes;
},
// Convert a string to a byte array
stringToBytes: function (str) {
var bytes = [];
for (var i = 0; i < str.length; i++)
bytes.push(str.charCodeAt(i));
return bytes;
},
// Convert a byte array to a string
bytesToString: function (bytes) {
var str = [];
for (var i = 0; i < bytes.length; i++)
str.push(String.fromCharCode(bytes[i]));
return str.join("");
},
// Convert a string to big-endian 32-bit words
stringToWords: function (str) {
var words = [];
for (var c = 0, b = 0; c < str.length; c++, b += 8)
words[b >>> 5] |= str.charCodeAt(c) << (24 - b % 32);
return words;
},
// Convert a byte array to big-endian 32-bits words
bytesToWords: function (bytes) {
var words = [];
for (var i = 0, b = 0; i < bytes.length; i++, b += 8)
words[b >>> 5] |= bytes[i] << (24 - b % 32);
return words;
},
// Convert big-endian 32-bit words to a byte array
wordsToBytes: function (words) {
var bytes = [];
for (var b = 0; b < words.length * 32; b += 8)
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
return bytes;
},
// Convert a byte array to a hex string
bytesToHex: function (bytes) {
var hex = [];
for (var i = 0; i < bytes.length; i++) {
hex.push((bytes[i] >>> 4).toString(16));
hex.push((bytes[i] & 0xF).toString(16));
}
return hex.join("");
},
// Convert a hex string to a byte array
hexToBytes: function (hex) {
var bytes = [];
for (var c = 0; c < hex.length; c += 2)
bytes.push(parseInt(hex.substr(c, 2), 16));
return bytes;
},
// Convert a byte array to a base-64 string
bytesToBase64: function (bytes) {
// Use browser-native function if it exists
if (typeof btoa == "function") return btoa(util.bytesToString(bytes));
var base64 = [],
overflow;
for (var i = 0; i < bytes.length; i++) {
switch (i % 3) {
case 0:
base64.push(base64map.charAt(bytes[i] >>> 2));
overflow = (bytes[i] & 0x3) << 4;
break;
case 1:
base64.push(base64map.charAt(overflow | (bytes[i] >>> 4)));
overflow = (bytes[i] & 0xF) << 2;
break;
case 2:
base64.push(base64map.charAt(overflow | (bytes[i] >>> 6)));
base64.push(base64map.charAt(bytes[i] & 0x3F));
overflow = -1;
}
}
// Encode overflow bits, if there are any
if (overflow != undefined && overflow != -1)
base64.push(base64map.charAt(overflow));
// Add padding
while (base64.length % 4 != 0) base64.push("=");
return base64.join("");
},
// Convert a base-64 string to a byte array
base64ToBytes: function (base64) {
// Use browser-native function if it exists
if (typeof atob == "function") return util.stringToBytes(atob(base64));
// Remove non-base-64 characters
base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
var bytes = [];
for (var i = 0; i < base64.length; i++) {
switch (i % 4) {
case 1:
bytes.push((base64map.indexOf(base64.charAt(i - 1)) << 2) |
(base64map.indexOf(base64.charAt(i)) >>> 4));
break;
case 2:
bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0xF) << 4) |
(base64map.indexOf(base64.charAt(i)) >>> 2));
break;
case 3:
bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0x3) << 6) |
(base64map.indexOf(base64.charAt(i))));
break;
}
}
return bytes;
}
};
// Crypto mode namespace
Crypto.mode = {};
Crypto.HMAC = function (hasher, message, key, options) {
// Allow arbitrary length keys
key = key.length > hasher._blocksize * 4 ?
hasher(key, { asBytes: true }) :
util.stringToBytes(key);
// XOR keys with pad constants
var okey = key,
ikey = key.slice(0);
for (var i = 0; i < hasher._blocksize * 4; i++) {
okey[i] ^= 0x5C;
ikey[i] ^= 0x36;
}
var hmacbytes = hasher(util.bytesToString(okey) +
hasher(util.bytesToString(ikey) + message, { asString: true }),
{ asBytes: true });
return options && options.asBytes ? hmacbytes :
options && options.asString ? util.bytesToString(hmacbytes) :
util.bytesToHex(hmacbytes);
};
// Public API
var SHA1 = Crypto.SHA1 = function (message, options) {
var digestbytes = util.wordsToBytes(SHA1._sha1(message));
return options && options.asBytes ? digestbytes :
options && options.asString ? util.bytesToString(digestbytes) :
util.bytesToHex(digestbytes);
};
// The core
SHA1._sha1 = function (message) {
var m = util.stringToWords(message),
l = message.length * 8,
w = [],
H0 = 1732584193,
H1 = -271733879,
H2 = -1732584194,
H3 = 271733878,
H4 = -1009589776;
// Padding
m[l >> 5] |= 0x80 << (24 - l % 32);
m[((l + 64 >>> 9) << 4) + 15] = l;
for (var i = 0; i < m.length; i += 16) {
var a = H0,
b = H1,
c = H2,
d = H3,
e = H4;
for (var j = 0; j < 80; j++) {
if (j < 16) w[j] = m[i + j];
else {
var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];
w[j] = (n << 1) | (n >>> 31);
}
var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (
j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :
j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :
j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :
(H1 ^ H2 ^ H3) - 899497514);
H4 = H3;
H3 = H2;
H2 = (H1 << 30) | (H1 >>> 2);
H1 = H0;
H0 = t;
}
H0 += a;
H1 += b;
H2 += c;
H3 += d;
H4 += e;
}
return [H0, H1, H2, H3, H4];
};
// Package private blocksize
SHA1._blocksize = 16;
module.exports = Crypto;

1
utils/lib/es6-promise.min.js
File diff suppressed because it is too large
View File

278
utils/native.js

@ -0,0 +1,278 @@
var Promise = require('../utils/lib/es6-promise.min.js');
module.exports={
toast(params) {
if (!wx.showToast) return;
if (Object.prototype.toString.call(params) != '[object Object]') {
params = {
title: params + ''
};
}
var defaultParams = {
duration: 1500,
mask: false
}
wx.showToast(Object.assign(defaultParams, params || {}));
},
loading(params) {
if (!wx.hideLoading || !wx.showLoading) return;
if (!params) {
wx.hideLoading();
return;
} else if (Object.prototype.toString.call(params) != '[object Object]') {
params = { title: params + '' };
}
var defaultParams = {
mask: true
}
wx.showLoading(Object.assign(defaultParams, params || {}));
},
confirm(params) {
if (!wx.showModal) return;
return new Promise((resolve, reject)=>{
wx.showModal({
title: params.title || '提示',
content: params.content || '',
showCancel: true,
cancelText: params.cancelText || '取消',
confirmText: params.confirmText || '确定',
success(res) {
resolve(res);
}
});
});
},
alert(params) {
if (!wx.showModal) return;
if (Object.prototype.toString.call(params) != '[object Object]') {
params = { content: params + '' };
}
var defaultParams = {
textAlign: 'center',
title: params.title || '提示',
content: params.content || '',
showCancel: false,
success: params.success||function(){}
}
wx.showModal(defaultParams);
},
location(url) {
console.log('location');
if (!wx.navigateTo) return;
wx.navigateTo({
url: url
});
},
locationReplace(url) {
if (wx.reLaunch) {
wx.reLaunch({
url: url
})
} else {
this.location(url);
}
},
redirectTo(url){
if ( wx.redirectTo ){
wx.redirectTo({
url: url
})
} else {
this.location(url);
}
},
/*
obj : 配置信息
sync: 是否同步
*/
setStorage(obj, sync) {
if (!wx.setStorageSync || !wx.setStorage) return;
if (sync) {
wx.setStorageSync(obj.key, obj.data);
} else {
wx.setStorage(obj);
}
},
/*
key : key/配置信息
sync: 是否同步
*/
getStorage(key, sync) {
if (!wx.getStorageSync || !wx.getStorage) return;
if (sync) {
return wx.getStorageSync(key);
} else {
return wx.getStorage(key);
}
},
/*
key : key/配置信息
sync: 是否同步
*/
removeStorage(obj, sync) {
if (!wx.removeStorageSync || !wx.removeStorage) return;
if (sync) {
return wx.removeStorageSync(obj.key);
} else {
return wx.removeStorage(obj);
}
},
wxLogin() {
return new Promise((resolve, reject) => {
wx.login({
success(dt) {
resolve(dt);
},
fail(dt) {
resolve(dt);
},
complete( res ){
}
});
});
},
getUserInfo(cb) {
var that = this;
if (!wx.getUserInfo) return;
wx.getUserInfo({
success(res) {
//that.globalData.userInfo = res.userInfo;
//that.globalData.iv = res.iv;
//that.globalData.encryptedData = res.encryptedData;
typeof cb == "function" && cb(Object.assign({ iv: res.iv, encryptedData: res.encryptedData }, that.globalData.config))
},
fail(dt) {
typeof cb == "function" && cb({ statusCode: -404 })
}
})
},
getSystemInfo() {
if (!wx.getSystemInfo) return;
return new Promise((resolve, reject) => {
if (!wx.getSystemInfo) {
reject();
return;
}
wx.getSystemInfo({
success(res) {
resolve(res);
},
fail(res) {
reject(res);
}
})
})
},
getWeRunData(){
return new Promise(( resolve, reject)=>{
if (!wx.getWeRunData){
resolve({})
return;
}
wx.getWeRunData({
success( res ){
resolve( res );
},
fail( res ){
resolve( res );
}
});
})
},
chooseImage(count = 1) {//选择图片
return new Promise((resolve, reject) => {
wx.chooseImage({
count,
sizeType: ['original', 'compressed'],
sourceType: ['camera','album'],
success(res) {
resolve(res);
},
fail(res) {
reject(res);
}
})
})
},
getFileInfo(filePath){
var ctx = this;
return new Promise((resolve, reject) => {
wx.getFileInfo({
filePath,
complete( res ){
res.errMsg == 'getFileInfo:ok' ? resolve(res) : reject(res);
}
})
})
},
getNetworkType(){
return new Promise((resolve, reject) => {
wx.getNetworkType({
complete(res) {
resolve(res);
}
})
})
},
downloadFile( url ){
return new Promise((resolve, reject) => {
wx.downloadFile({
url,
success(res) {
resolve(res);
},
fail(res) {
reject(res);
}
})
})
},
navigateBack(delta=1){
if (wx.navigateBack){
wx.navigateBack({ delta });
}
},
setKeepScreenOn(keepScreenOn=true){
if (wx.setKeepScreenOn) {
wx.setKeepScreenOn({
keepScreenOn
})
}
},
getSetting(){
return new Promise((resolve, reject) => {
if(!wx.getSetting){
setTimeout(function(){
resolve({})
},20);
return;
}
wx.getSetting({
success(res) {
resolve(res.authSetting);
},
fail(res) {
resolve({});
}
})
})
},
openSetting(){
return new Promise((resolve,reject)=>{
if (!wx.openSetting){
setTimeout(function () {
resolve({ 'errorMsg':'wx.openSetting不支持'})
}, 20);
return;
}
wx.openSetting({
complete( res ){
resolve( res )
}
})
});
}
}

419
utils/parseArea/address-parse.js

@ -0,0 +1,419 @@
const areaList = require('area-list.js');
const zipCode = require('zipCode.js');
const foramtProvince = require('foramtProvince.js');
let defaultData = [];
const mCity = {};
const mArea = {};
/**
* 处理原始地址数据转换成专用数据
* @param list 原始数据
* @param init 是否初始化 如传空 已转换过不会再次转换
* @returns {boolean}
*/
function parseArea(list, init) {
if (!init && defaultData.length) {
return true;
}
defaultData = list;
defaultData.forEach(province => {
if (province.city) {
province.city.forEach(city => {
if (city.name !== '其他') {
if (!mCity[city.name]) {
mCity[city.name] = [];
}
mCity[city.name].push({
p: province.name,
c: city.name,
a: city.area || []
});
}
if (city.area) {
city.area.forEach(area => {
if (area !== '其他') {
if (!mArea[area]) {
mArea[area] = [];
}
mArea[area].push({
p: province.name,
c: city.name
})
}
})
}
})
}
});
}
/**
* 解析邮编
* @param
* @returns <array>
*/
function zipCodeFormat() {
let list = []
zipCode.forEach((el) => {
if (el.child) {
el.child.forEach((event) => {
if (event.child) {
event.child.forEach(element => {
list.push(element.zipcode)
})
}
})
}
})
return list;
}
//专用数据处理
let zipCodeList = zipCodeFormat();//邮编
parseArea(areaList);//地址
/**
* 解析
* @param address 任意地址字符串
* @returns {{name: string, mobile: string, detail: string, zip_code: string, phone: string}}
*/
function parse(address) {
address = address || '';
const parse = {
name: '',
mobile: '',
detail: '',
zip_code: '',
phone: ''
};
//去除空格...
address = address.replace(/\r\n/g, ' ').replace(/\n/g, ' ').replace(/\t/g, ' ');
address = address.replace(/\s+/g, "");
//自定义去除关键字,可自行添加
const search = ['地址', '收货地址', '收货人', '收件人', '收货', '邮编', '电话', '手机号码', '所在地区','姓名', ':', ':', ';', ';', ',', ',', '。'];
search.forEach(str => {
address = address.replace(new RegExp(str, 'g'), ' ')
});
//多个空格replace为一个
address = address.replace(/ {2,}/g, ' ');
//整理电话格式
address = address.replace(/(\d{3})-(\d{4})-(\d{4})/g, '$1$2$3');
address = address.replace(/(\d{3}) (\d{4}) (\d{4})/g, '$1$2$3');
const mobileReg = /(86-[1][0-9]{10})|(86[1][0-9]{10})|([1][0-9]{10})/g;
const mobile = mobileReg.exec(address);
if (mobile) {
parse.mobile = mobile[0];
address = address.replace(mobile[0], ' ')
}
//电话
const phoneReg = /(([0-9]{3,4}-)[0-9]{7,8})|([0-9]{12})|([0-9]{11})|([0-9]{10})|([0-9]{9})|([0-9]{8})|([0-9]{7})/g;
const phone = phoneReg.exec(address);
if (phone) {
parse.phone = phone[0];
address = address.replace(phone[0], ' ')
}
//邮编(加入门牌号;考虑到重复邮编问题;去除之前简单的六位数字校验)
for (let index = 0; index < zipCodeList.length; index++) {
if (address.indexOf(zipCodeList[index]) != -1) {
let num = address.indexOf(zipCodeList[index]);
let code = address.slice(num, num + 6);
parse.zip_code = code;
address = address.replace(code, '')
}
}
/*
const zipReg = /([0-9]{6})/g;
const zip = zipReg.exec(address);
if (zip) {
parse.zip_code = zip[0];
address = address.replace(zip[0], '')
}
*/
address = address.replace(/ {2,}/, ' ');
let detail = detail_parse_forward(address.trim());
var ignoreArea = detail.province;
if (!detail.city) {
detail = detail_parse(address.trim());
if (detail.area && !detail.city) {
detail = detail_parse(address.trim(), {
ignoreArea: true
});
console.log('smart_parse->ignoreArea(忽略区)');
} else {
// console.log('smart_parse');
}
//这个待完善
const list = address.replace(detail.province, '').replace(detail.city, '').replace(detail.area, '').split(' ').filter(str => str);
//详细住址划分关键字
//注意:只需要填写关键字最后一位即可:比如单元填写元即可!
const address_detail_list = ['室', '楼', '元', '号', '幢', '门', '户'];
if (list.length > 1) {
list.forEach(str => {
if (!parse.name || str && str.length < parse.name.length) {
parse.name = str.trim()
}
});
if (parse.name) {
detail.addr = detail.addr.replace(parse.name, '').trim()
}
} else {//若名字写在详细地址后面,根据address_detail_list进行分割;
let key = [];
address_detail_list.forEach((el) => {
key.push(detail.addr.indexOf(el))
})
var max = key.sort(function (a, b) {
return b - a;
})[0];
if (detail.name) {
parse.name = detail.name
}
if (max != -1) {
let addrBuild = detail.addr.slice(0, max + 1);
let addrNum = detail.addr.replace(addrBuild, '').replace(/[^0-9]+/g, '');
let userName = detail.addr.replace(addrBuild + addrNum, '')
detail.addr = addrBuild + addrNum
parse.name = userName
}
}
} else {
if (detail.name) {
parse.name = detail.name
} else {
const list = detail.addr.split(' ').filter(str => str);
if (list.length > 1) {
parse.name = list[list.length - 1]
}
if (parse.name) {
detail.addr = detail.addr.replace(parse.name, '').trim()
}
}
}
parse.province = detail.province == '' ? ignoreArea : detail.province;
parse.city = detail.city;
parse.area = detail.area;
parse.addr = detail.addr;
parse.result = detail.result;
//添加省以及市(2019.6.21)输出字段后填入省市等等
foramtProvince.forEach(el => {
if (el.name.indexOf(parse.province) == 0) {
parse.province = el.name
}
})
zipCode.forEach(provice => {
if (parse.province.indexOf(provice.name) == 0) {
provice.child.forEach(city => {
if (city.name.indexOf(parse.city) == 0) {
parse.city = city.name
}
})
}
})
return parse;
}
/**
* 正向解析模式
* 从前到后按 province city addr 逐级筛选
* 有city的值即可说明解析成功
* 此模式对地址顺序有要求
* @param address
* @returns {{province: string, city: string, area: string, addr: string}}
*/
function detail_parse_forward(address) {
const parse = {
province: '',
city: '',
area: '',
addr: '',
name: '',
};
const provinceKey = ['特别行政区', '古自治区', '维吾尔自治区', '壮族自治区', '回族自治区', '自治区', '省省直辖', '省', '市'];
const cityKey = ['布依族苗族自治州', '苗族侗族自治州', '自治州', '州', '市', '县'];
for (let i in defaultData) {
const province = defaultData[i];
let index = address.indexOf(province.name);
if (index > -1) {
if (index > 0) {
//省份不是在第一位,在省份之前的字段识别为名称
parse.name = address.substr(0, index).trim();
}
parse.province = province.name;
address = address.substr(index + province.name.length);
for (let k in provinceKey) {
if (address.indexOf(provinceKey[k]) === 0) {
address = address.substr(provinceKey[k].length);
}
}
for (let j in province.city) {
const city = province.city[j];
index = address.indexOf(city.name);
if (index > -1 && index < 3) {
parse.city = city.name;
address = address.substr(index + parse.city.length);
for (let k in cityKey) {
if (address.indexOf(cityKey[k]) === 0) {
address = address.substr(cityKey[k].length);
}
}
if (city.area) {
for (let k in city.area) {
const area = city.area[k];
index = address.indexOf(area);
if (index > -1 && index < 3) {
parse.area = area;
address = address.substr(index + parse.area.length);
break;
}
}
}
break;
}
}
parse.addr = address.trim();
break;
}
}
return parse;
}
/**
* 逆向解析 从后往前解析
* 有地区就能大概返回地址了
* @param address
* @param ignoreArea 是否忽视区 因为地址中含有区容易导致匹配错误 山东省蓬莱市黄海花园东区西门宝威学堂 曲荣声收15753572456
* @returns {{province: string, city: string, area: string, name: string, _area: string, addr: string}}
*/
function detail_parse(address, {
ignoreArea = false
} = {}) {
const parse = {
province: '',
city: '',
area: '',
name: '',
_area: '',
addr: '',
};
let areaIndex = -1,
cityIndex = -1;
address = address.replace(' ', ' ');
if (!ignoreArea && address.indexOf('县') > -1 || !ignoreArea && address.indexOf('区') > -1 || !ignoreArea && address.indexOf('旗') > -1) {
if (address.indexOf('旗') > -1) {
areaIndex = address.indexOf('旗');
parse.area = address.substr(areaIndex - 1, 2);
}
if (address.indexOf('区') > -1) {
areaIndex = address.indexOf('区');
if (address.lastIndexOf('市', areaIndex) > -1) {
cityIndex = address.lastIndexOf('市', areaIndex);
parse.area = address.substr(cityIndex + 1, areaIndex - cityIndex);
} else {
parse.area = address.substr(areaIndex - 2, 3);
}
}
if (address.indexOf('县') > -1) {
areaIndex = address.lastIndexOf('县');
if (address.lastIndexOf('市', areaIndex) > -1) {
cityIndex = address.lastIndexOf('市', areaIndex);
parse.area = address.substr(cityIndex + 1, areaIndex - cityIndex);
} else {
parse.area = address.substr(areaIndex - 2, 3);
}
}
parse.addr = address.substr(areaIndex + 1);
} else {
if (address.indexOf('市') > -1) {
areaIndex = address.indexOf('市');
console.log(address.split(" "))
if (address.split(" ")[0].indexOf("市") > -1) {
let areindex = address.split(" ")[0].indexOf("市")
parse.area = address.split(" ")[0].substr(0, areindex + 1);
parse.addr = address.split(" ")[0].substr(areindex + 1);
parse.name = address.split(" ")[1]
} else {
let areindex = address.split(" ")[1].indexOf("市")
parse.area = address.split(" ")[1].substr(0, areindex + 1);
parse.addr = address.split(" ")[1].substr(areindex + 1);
parse.name = address.split(" ")[0]
}
} else {
parse.addr = address
}
}
if (address.indexOf('市') > -1 || address.indexOf('盟') > -1 || address.indexOf('州') > -1) {
if (address.indexOf('市') > -1) {
parse._area = address.substr(address.indexOf('市') - 2, 2);
}
if (address.indexOf('盟') > -1 && !mCity[parse._area]) {
parse._area = address.substr(address.indexOf('盟') - 2, 2);
}
if (address.indexOf('州') > -1 && !mCity[parse._area]) {
parse._area = address.substr(address.indexOf('州') - 2, 2);
}
}
parse.area = parse.area.trim();
if (parse.area && mArea[parse.area]) {
if (mArea[parse.area].length === 1) {
parse.province = mArea[parse.area][0].p;
parse.city = mArea[parse.area][0].c
} else {
parse._area = parse._area.trim();
const addr = address.substr(0, areaIndex);
const d = mArea[parse.area].find(item => {
return item.p.indexOf(addr) > -1 || item.c === parse._area;
});
if (d) {
parse.province = d.p;
parse.city = d.c
} else {
parse.result = mArea[parse.area];
}
}
} else {
if (parse._area) {
const city = mCity[parse._area];
if (city) {
parse.province = city[0].p;
parse.city = city[0].c;
parse.addr = address.substr(address.indexOf(parse.city) + parse.city.length + 1);
parse.area = '';
for (let i in city[0].a) {
if (parse.addr.indexOf(city[0].a[i]) === 0) {
parse.area = city[0].a[i];
parse.addr = parse.addr.replace(city[0].a[i], '');
break;
}
}
}
} else {
parse.area = '';
}
}
parse.addr = parse.addr.trim();
return parse
}
export {parseArea}
export {parse};

806
utils/parseArea/area-list.js

@ -0,0 +1,806 @@
module.exports = [{
"name": "北京",
"city": [{
"name": "北京",
"area": ["东城区", "西城区", "崇文区", "宣武区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "平谷区", "怀柔区", "密云县", "延庆县"]
}],
"json": "beijing"
}, {
"name": "天津",
"city": [{
"name": "天津",
"area": ["和平区", "河东区", "河西区", "南开区", "河北区", "红桥区", "塘沽区", "汉沽区", "大港区", "东丽区", "西青区", "津南区", "北辰区", "武清区", "宝坻区", "宁河县", "静海县", "蓟县"]
}],
"json": "tianjin"
}, {
"name": "河北",
"city": [{
"name": "石家庄",
"area": ["长安区", "桥东区", "桥西区", "新华区", "郊区", "井陉矿区", "井陉县", "正定县", "栾城县", "行唐县", "灵寿县", "高邑县", "深泽县", "赞皇县", "无极县", "平山县", "元氏县", "赵县", "辛集市", "藁", "晋州市", "新乐市", "鹿泉市"]
}, {
"name": "唐山",
"area": ["路南区", "路北区", "古冶区", "开平区", "新区", "丰润县", "滦县", "滦南县", "乐亭县", "迁西县", "玉田县", "唐海县", "遵化市", "丰南市", "迁安市"]
}, {"name": "秦皇岛", "area": ["海港区", "山海关区", "北戴河区", "青龙满族自治县", "昌黎县", "抚宁县", "卢龙县"]}, {
"name": "邯郸",
"area": ["邯山区", "丛台区", "复兴区", "峰峰矿区", "邯郸县", "临漳县", "成安县", "大名县", "涉县", "磁县", "肥乡县", "永年县", "邱县", "鸡泽县", "广平县", "馆陶县", "魏县", "曲周县", "武安市"]
}, {
"name": "邢台",
"area": ["桥东区", "桥西区", "邢台县", "临城县", "内丘县", "柏乡县", "隆尧县", "任县", "南和县", "宁晋县", "巨鹿县", "新河县", "广宗县", "平乡县", "威县", "清河县", "临西县", "南宫市", "沙河市"]
}, {
"name": "保定",
"area": ["新市区", "北市区", "南市区", "满城县", "清苑县", "涞水县", "阜平县", "徐水县", "定兴县", "唐县", "高阳县", "容城县", "涞源县", "望都县", "安新县", "易县", "曲阳县", "蠡县", "顺平县", "博野", "雄县", "涿州市", "定州市", "安国市", "高碑店市"]
}, {
"name": "张家口",
"area": ["桥东区", "桥西区", "宣化区", "下花园区", "宣化县", "张北县", "康保县", "沽源县", "尚义县", "蔚县", "阳原县", "怀安县", "万全县", "怀来县", "涿鹿县", "赤城县", "崇礼县"]
}, {
"name": "承德",
"area": ["双桥区", "双滦区", "鹰手营子矿区", "承德县", "兴隆县", "平泉县", "滦平县", "隆化县", "丰宁满族自治县", "宽城满族自治县", "围场满族蒙古族自治县"]
}, {
"name": "沧州",
"area": ["新华区", "运河区", "沧县", "青县", "东光县", "海兴县", "盐山县", "肃宁县", "南皮县", "吴桥县", "献县", "孟村回族自治县", "泊头市", "任丘市", "黄骅市", "河间市"]
}, {"name": "廊坊", "area": ["安次区", "固安县", "永清县", "香河县", "大城县", "文安县", "大厂回族自治县", "霸州市", "三河市"]}, {
"name": "衡水",
"area": ["桃城区", "枣强县", "武邑县", "武强县", "饶阳县", "安平县", "故城县", "景县", "阜城县", "冀州市", "深州市"]
}],
"json": "hebei"
}, {
"name": "山西",
"city": [{
"name": "太原",
"area": ["小店区", "迎泽区", "杏花岭区", "尖草坪区", "万柏林区", "晋源区", "清徐县", "阳曲县", "娄烦县", "古交市"]
}, {"name": "大同", "area": ["城区", "矿区", "南郊区", "新荣区", "阳高县", "天镇县", "广灵县", "灵丘县", "浑源县", "左云县", "大同县"]}, {
"name": "阳泉",
"area": ["城区", "矿区", "郊区", "平定县", "盂县"]
}, {
"name": "长治",
"area": ["城区", "郊区", "长治县", "襄垣县", "屯留县", "平顺县", "黎城县", "壶关县", "长子县", "武乡县", "沁县", "沁源县", "潞城市"]
}, {"name": "晋城", "area": ["城区", "沁水县", "阳城县", "陵川县", "泽州县", "高平市"]}, {
"name": "朔州",
"area": ["朔城区", "平鲁区", "山阴县", "应县", "右玉县", "怀仁市"]
}, {
"name": "忻州",
"area": ["忻府区", "原平市", "定襄县", "五台县", "代县", "繁峙县", "宁武县", "静乐县", "神池县", "五寨县", "岢岚县", "河曲县", "保德县", "偏关县"]
}, {
"name": "吕梁",
"area": ["离石区", "孝义市", "汾阳市", "文水县", "交城县", "兴县", "临县", "柳林县", "石楼县", "岚县", "方山县", "中阳县", "交口县"]
}, {
"name": "晋中",
"area": ["榆次市", "介休市", "榆社县", "左权县", "和顺县", "昔阳县", "寿阳县", "太谷县", "祁县", "平遥县", "灵石县"]
}, {
"name": "临汾",
"area": ["临汾市", "侯马市", "霍州市", "曲沃县", "翼城县", "襄汾县", "洪洞县", "古县", "安泽县", "浮山县", "吉县", "乡宁县", "蒲县", "大宁县", "永和县", "隰县", "汾西县"]
}, {"name": "运城", "area": ["运城市", "永济市", "河津市", "芮城县", "临猗县", "万荣县", "新绛县", "稷山县", "闻喜县", "夏县", "绛县", "平陆县", "垣曲县"]}],
"json": "shanxi"
}, {
"name": "内蒙古",
"city": [{
"name": "鄂尔多斯",
"area": ["东胜区", "达拉特旗", "准格尔旗", "鄂托克前旗", "鄂托克旗", "杭锦旗", "乌审旗", "伊金霍洛旗"]
}, {
"name": "呼和浩特",
"area": ["新城区", "回民区", "玉泉区", "郊区", "土默特左旗", "托克托县", "和林格尔县", "清水河县", "武川县"]
}, {"name": "包头", "area": ["东河区", "昆都伦区", "青山区", "石拐矿区", "白云矿区", "郊区", "土默特右旗", "固阳县", "达尔罕茂明安联合旗"]}, {
"name": "乌海",
"area": ["海勃湾区", "海南区", "乌达区"]
}, {
"name": "赤峰",
"area": ["红山区", "元宝山区", "松山区", "阿鲁科尔沁旗", "巴林左旗", "巴林右旗", "林西县", "克什克腾旗", "翁牛特旗", "喀喇沁旗", "宁城县", "敖汉旗"]
}, {
"name": "呼伦贝尔",
"area": ["海拉尔市", "满洲里市", "扎兰屯市", "牙克石市", "根河市", "额尔古纳市", "阿荣旗", "莫力达瓦达斡尔族自治旗", "鄂伦春自治旗", "鄂温克族自治旗", "新巴尔虎右旗", "新巴尔虎左旗", "陈巴尔虎旗"]
}, {"name": "兴安盟", "area": ["乌兰浩特市", "阿尔山市", "科尔沁右翼前旗", "科尔沁右翼中旗", "扎赉特旗", "突泉县"]}, {
"name": "通辽",
"area": ["科尔沁区", "霍林郭勒市", "科尔沁左翼中旗", "科尔沁左翼后旗", "开鲁县", "库伦旗", "奈曼旗", "扎鲁特旗"]
}, {
"name": "锡林郭勒盟",
"area": ["二连浩特市", "锡林浩特市", "阿巴嘎旗", "苏尼特左旗", "苏尼特右旗", "东乌珠穆沁旗", "西乌珠穆沁旗", "太仆寺旗", "镶黄旗", "正镶白旗", "正蓝旗", "多伦县"]
}, {
"name": "乌兰察布盟",
"area": ["集宁市", "丰镇市", "卓资县", "化德县", "商都县", "兴和县", "凉城县", "察哈尔右翼前旗", "察哈尔右翼中旗", "察哈尔右翼后旗", "四子王旗"]
}, {"name": "伊克昭盟", "area": ["东胜市", "达拉特旗", "准格尔旗", "鄂托克前旗", "鄂托克旗", "杭锦旗", "乌审旗", "伊金霍洛旗"]}, {
"name": "巴彦淖尔盟",
"area": ["临河市", "五原县", "磴口县", "乌拉特前旗", "乌拉特中旗", "乌拉特后旗", "杭锦后旗"]
}, {"name": "阿拉善盟", "area": ["阿拉善左旗", "阿拉善右旗", "额济纳旗"]}],
"json": "neimenggu"
}, {
"name": "辽宁",
"city": [{
"name": "沈阳",
"area": ["沈河区", "皇姑区", "和平区", "大东区", "铁西区", "苏家屯区", "东陵区", "于洪区", "新民市", "法库县", "辽中县", "康平县", "新城子区", "其他"]
}, {
"name": "大连",
"area": ["西岗区", "中山区", "沙河口区", "甘井子区", "旅顺口区", "金州区", "瓦房店市", "普兰店市", "庄河市", "长海县", "其他"]
}, {"name": "鞍山", "area": ["铁东区", "铁西区", "立山区", "千山区", "海城市", "台安县", "岫岩满族自治县", "其他"]}, {
"name": "抚顺",
"area": ["顺城区", "新抚区", "东洲区", "望花区", "抚顺县", "清原满族自治县", "新宾满族自治县", "其他"]
}, {"name": "本溪", "area": ["平山区", "明山区", "溪湖区", "南芬区", "本溪满族自治县", "桓仁满族自治县", "其他"]}, {
"name": "丹东",
"area": ["振兴区", "元宝区", "振安区", "东港市", "凤城市", "宽甸满族自治县", "其他"]
}, {"name": "锦州", "area": ["太和区", "古塔区", "凌河区", "凌海市", "黑山县", "义县", "北宁市", "其他"]}, {
"name": "营口",
"area": ["站前区", "西市区", "鲅鱼圈区", "老边区", "大石桥市", "盖州市", "其他"]
}, {"name": "阜新", "area": ["海州区", "新邱区", "太平区", "清河门区", "细河区", "彰武县", "阜新蒙古族自治县", "其他"]}, {
"name": "辽阳",
"area": ["白塔区", "文圣区", "宏伟区", "太子河区", "弓长岭区", "灯塔市", "辽阳县", "其他"]
}, {"name": "盘锦", "area": ["双台子区", "兴隆台区", "盘山县", "大洼县", "其他"]}, {
"name": "铁岭",
"area": ["银州区", "清河区", "调兵山市", "开原市", "铁岭县", "昌图县", "西丰县", "其他"]
}, {"name": "朝阳", "area": ["双塔区", "龙城区", "凌源市", "北票市", "朝阳县", "建平县", "喀喇沁左翼蒙古族自治县", "其他"]}, {
"name": "葫芦岛",
"area": ["龙港区", "南票区", "连山区", "兴城市", "绥中县", "建昌县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "liaoning"
}, {
"name": "吉林",
"city": [{
"name": "长春",
"area": ["朝阳区", "宽城区", "二道区", "南关区", "绿园区", "双阳区", "九台市", "榆树市", "德惠市", "农安县", "其他"]
}, {"name": "吉林", "area": ["船营区", "昌邑区", "龙潭区", "丰满区", "舒兰市", "桦甸市", "蛟河市", "磐石市", "永吉县", "其他"]}, {
"name": "四平",
"area": ["铁西区", "铁东区", "公主岭市", "双辽市", "梨树县", "伊通满族自治县", "其他"]
}, {"name": "辽源", "area": ["龙山区", "西安区", "东辽县", "东丰县", "其他"]}, {
"name": "通化",
"area": ["东昌区", "二道江区", "梅河口市", "集安市", "通化县", "辉南县", "柳河县", "其他"]
}, {"name": "白山", "area": ["八道江区", "江源区", "临江市", "靖宇县", "抚松县", "长白朝鲜族自治县", "其他"]}, {
"name": "松原",
"area": ["宁江区", "乾安县", "长岭县", "扶余县", "前郭尔罗斯蒙古族自治县", "其他"]
}, {"name": "白城", "area": ["洮北区", "大安市", "洮南市", "镇赉县", "通榆县", "其他"]}, {
"name": "延边朝鲜族自治州",
"area": ["延吉市", "图们市", "敦化市", "龙井市", "珲春市", "和龙市", "安图县", "汪清县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "jilin"
}, {
"name": "黑龙江",
"city": [{
"name": "哈尔滨",
"area": ["松北区", "道里区", "南岗区", "平房区", "香坊区", "道外区", "呼兰区", "阿城区", "双城市", "尚志市", "五常市", "宾县", "方正县", "通河县", "巴彦县", "延寿县", "木兰县", "依兰县", "其他"]
}, {
"name": "齐齐哈尔",
"area": ["龙沙区", "昂昂溪区", "铁锋区", "建华区", "富拉尔基区", "碾子山区", "梅里斯达斡尔族区", "讷河市", "富裕县", "拜泉县", "甘南县", "依安县", "克山县", "泰来县", "克东县", "龙江县", "其他"]
}, {"name": "鹤岗", "area": ["兴山区", "工农区", "南山区", "兴安区", "向阳区", "东山区", "萝北县", "绥滨县", "其他"]}, {
"name": "双鸭山",
"area": ["尖山区", "岭东区", "四方台区", "宝山区", "集贤县", "宝清县", "友谊县", "饶河县", "其他"]
}, {"name": "鸡西", "area": ["鸡冠区", "恒山区", "城子河区", "滴道区", "梨树区", "麻山区", "密山市", "虎林市", "鸡东县", "其他"]}, {
"name": "大庆",
"area": ["萨尔图区", "红岗区", "龙凤区", "让胡路区", "大同区", "林甸县", "肇州县", "肇源县", "杜尔伯特蒙古族自治县", "其他"]
}, {
"name": "伊春",
"area": ["伊春区", "带岭区", "南岔区", "金山屯区", "西林区", "美溪区", "乌马河区", "翠峦区", "友好区", "上甘岭区", "五营区", "红星区", "新青区", "汤旺河区", "乌伊岭区", "铁力市", "嘉荫县", "其他"]
}, {
"name": "牡丹江",
"area": ["爱民区", "东安区", "阳明区", "西安区", "绥芬河市", "宁安市", "海林市", "穆棱市", "林口县", "东宁县", "其他"]
}, {
"name": "佳木斯",
"area": ["向阳区", "前进区", "东风区", "郊区", "同江市", "富锦市", "桦川县", "抚远县", "桦南县", "汤原县", "其他"]
}, {"name": "七台河", "area": ["桃山区", "新兴区", "茄子河区", "勃利县", "其他"]}, {
"name": "黑河",
"area": ["爱辉区", "北安市", "五大连池市", "逊克县", "嫩江县", "孙吴县", "其他"]
}, {
"name": "绥化",
"area": ["北林区", "安达市", "肇东市", "海伦市", "绥棱县", "兰西县", "明水县", "青冈县", "庆安县", "望奎县", "其他"]
}, {"name": "大兴安岭地区", "area": ["呼玛县", "塔河县", "漠河县", "大兴安岭辖区", "其他"]}, {"name": "其他", "area": ["其他"]}],
"json": "heilongjiang"
}, {
"name": "上海",
"city": [{
"name": "上海",
"area": ["黄浦区", "卢湾区", "徐汇区", "长宁区", "静安区", "普陀区", "闸北区", "虹口区", "杨浦区", "宝山区", "闵行区", "嘉定区", "松江区", "金山区", "青浦区", "南汇区", "奉贤区", "浦东新区", "崇明县", "其他"]
}],
"json": "shanghai"
}, {
"name": "江苏",
"city": [{
"name": "南京",
"area": ["玄武区", "白下区", "秦淮区", "建邺区", "鼓楼区", "下关区", "栖霞区", "雨花台区", "浦口区", "江宁区", "六合区", "溧水县", "高淳县", "其他"]
}, {
"name": "苏州",
"area": ["金阊区", "平江区", "沧浪区", "虎丘区", "吴中区", "相城区", "常熟市", "张家港市", "昆山市", "吴江市", "太仓市", "其他"]
}, {"name": "无锡", "area": ["崇安区", "南长区", "北塘区", "滨湖区", "锡山区", "惠山区", "江阴市", "宜兴市", "其他"]}, {
"name": "常州",
"area": ["钟楼区", "天宁区", "戚墅堰区", "新北区", "武进区", "金坛市", "溧阳市", "其他"]
}, {"name": "镇江", "area": ["京口区", "润州区", "丹徒区", "丹阳市", "扬中市", "句容市", "其他"]}, {
"name": "南通",
"area": ["崇川区", "港闸区", "通州市", "如皋市", "海门市", "启东市", "海安县", "如东县", "其他"]
}, {"name": "泰州", "area": ["海陵区", "高港区", "姜堰市", "泰兴市", "靖江市", "兴化市", "其他"]}, {
"name": "扬州",
"area": ["广陵区", "维扬区", "邗江区", "江都市", "仪征市", "高邮市", "宝应县", "其他"]
}, {"name": "盐城", "area": ["亭湖区", "盐都区", "大丰市", "东台市", "建湖县", "射阳县", "阜宁县", "滨海县", "响水县", "其他"]}, {
"name": "连云港",
"area": ["新浦区", "海州区", "连云区", "东海县", "灌云县", "赣榆县", "灌南县", "其他"]
}, {
"name": "徐州",
"area": ["云龙区", "鼓楼区", "九里区", "泉山区", "贾汪区", "邳州市", "新沂市", "铜山县", "睢宁县", "沛县", "丰县", "其他"]
}, {"name": "淮安", "area": ["清河区", "清浦区", "楚州区", "淮阴区", "涟水县", "洪泽县", "金湖县", "盱眙县", "其他"]}, {
"name": "宿迁",
"area": ["宿城区", "宿豫区", "沭阳县", "泗阳县", "泗洪县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "jiangsu"
}, {
"name": "浙江",
"city": [{
"name": "杭州",
"area": ["拱墅区", "西湖区", "上城区", "下城区", "江干区", "滨江区", "余杭区", "萧山区", "建德市", "富阳市", "临安市", "桐庐县", "淳安县", "其他"]
}, {
"name": "宁波",
"area": ["海曙区", "江东区", "江北区", "镇海区", "北仑区", "鄞州区", "余姚市", "慈溪市", "奉化市", "宁海县", "象山县", "其他"]
}, {
"name": "温州",
"area": ["鹿城区", "龙湾区", "瓯海区", "瑞安市", "乐清市", "永嘉县", "洞头县", "平阳县", "苍南县", "文成县", "泰顺县", "其他"]
}, {"name": "嘉兴", "area": ["秀城区", "秀洲区", "海宁市", "平湖市", "桐乡市", "嘉善县", "海盐县", "其他"]}, {
"name": "湖州",
"area": ["吴兴区", "南浔区", "长兴县", "德清县", "安吉县", "其他"]
}, {"name": "绍兴", "area": ["越城区", "诸暨市", "上虞市", "嵊州市", "绍兴县", "新昌县", "其他"]}, {
"name": "金华",
"area": ["婺城区", "金东区", "兰溪市", "义乌市", "东阳市", "永康市", "武义县", "浦江县", "磐安县", "其他"]
}, {"name": "衢州", "area": ["柯城区", "衢江区", "江山市", "龙游县", "常山县", "开化县", "其他"]}, {
"name": "舟山",
"area": ["定海区", "普陀区", "岱山县", "嵊泗县", "其他"]
}, {"name": "台州", "area": ["椒江区", "黄岩区", "路桥区", "临海市", "温岭市", "玉环县", "天台县", "仙居县", "三门县", "其他"]}, {
"name": "丽水",
"area": ["莲都区", "龙泉市", "缙云县", "青田县", "云和县", "遂昌县", "松阳县", "庆元县", "景宁畲族自治县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "zhejiang"
}, {
"name": "安徽",
"city": [{"name": "合肥", "area": ["庐阳区", "瑶海区", "蜀山区", "包河区", "长丰县", "肥东县", "肥西县", "其他"]}, {
"name": "芜湖",
"area": ["镜湖区", "弋江区", "鸠江区", "三山区", "芜湖县", "南陵县", "繁昌县", "其他"]
}, {"name": "蚌埠", "area": ["蚌山区", "龙子湖区", "禹会区", "淮上区", "怀远县", "固镇县", "五河县", "其他"]}, {
"name": "淮南",
"area": ["田家庵区", "大通区", "谢家集区", "八公山区", "潘集区", "凤台县", "其他"]
}, {"name": "马鞍山", "area": ["雨山区", "花山区", "金家庄区", "当涂县", "其他"]}, {
"name": "淮北",
"area": ["相山区", "杜集区", "烈山区", "濉溪县", "其他"]
}, {"name": "铜陵", "area": ["铜官山区", "狮子山区", "郊区", "铜陵县", "其他"]}, {
"name": "安庆",
"area": ["迎江区", "大观区", "宜秀区", "桐城市", "宿松县", "枞阳县", "太湖县", "怀宁县", "岳西县", "望江县", "潜山县", "其他"]
}, {"name": "黄山", "area": ["屯溪区", "黄山区", "徽州区", "休宁县", "歙县", "祁门县", "黟县", "其他"]}, {
"name": "滁州",
"area": ["琅琊区", "南谯区", "天长市", "明光市", "全椒县", "来安县", "定远县", "凤阳县", "其他"]
}, {"name": "阜阳", "area": ["颍州区", "颍东区", "颍泉区", "界首市", "临泉县", "颍上县", "阜南县", "太和县", "其他"]}, {
"name": "宿州",
"area": ["埇桥区", "萧县", "泗县", "砀山县", "灵璧县", "其他"]
}, {"name": "巢湖", "area": ["居巢区", "含山县", "无为县", "庐江县", "和县", "其他"]}, {
"name": "六安",
"area": ["金安区", "裕安区", "寿县", "霍山县", "霍邱县", "舒城县", "金寨县", "其他"]
}, {"name": "亳州", "area": ["谯城区", "利辛县", "涡阳县", "蒙城县", "其他"]}, {
"name": "池州",
"area": ["贵池区", "东至县", "石台县", "青阳县", "其他"]
}, {"name": "宣城", "area": ["宣州区", "宁国市", "广德县", "郎溪县", "泾县", "旌德县", "绩溪县", "其他"]}, {"name": "其他", "area": ["其他"]}],
"json": "anhui"
}, {
"name": "福建",
"city": [{
"name": "福州",
"area": ["鼓楼区", "台江区", "仓山区", "马尾区", "晋安区", "福清市", "长乐市", "闽侯县", "闽清县", "永泰县", "连江县", "罗源县", "平潭县", "其他"]
}, {"name": "厦门", "area": ["思明区", "海沧区", "湖里区", "集美区", "同安区", "翔安区", "其他"]}, {
"name": "莆田",
"area": ["城厢区", "涵江区", "荔城区", "秀屿区", "仙游县", "其他"]
}, {
"name": "三明",
"area": ["梅列区", "三元区", "永安市", "明溪县", "将乐县", "大田县", "宁化县", "建宁县", "沙县", "尤溪县", "清流县", "泰宁县", "其他"]
}, {
"name": "泉州",
"area": ["鲤城区", "丰泽区", "洛江区", "泉港区", "石狮市", "晋江市", "南安市", "惠安县", "永春县", "安溪县", "德化县", "金门县", "其他"]
}, {
"name": "漳州",
"area": ["芗城区", "龙文区", "龙海市", "平和县", "南靖县", "诏安县", "漳浦县", "华安县", "东山县", "长泰县", "云霄县", "其他"]
}, {
"name": "南平",
"area": ["延平区", "建瓯市", "邵武市", "武夷山市", "建阳市", "松溪县", "光泽县", "顺昌县", "浦城县", "政和县", "其他"]
}, {"name": "龙岩", "area": ["新罗区", "漳平市", "长汀县", "武平县", "上杭县", "永定县", "连城县", "其他"]}, {
"name": "宁德",
"area": ["蕉城区", "福安市", "福鼎市", "寿宁县", "霞浦县", "柘荣县", "屏南县", "古田县", "周宁县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "fujian"
}, {
"name": "江西",
"city": [{
"name": "南昌",
"area": ["东湖区", "西湖区", "青云谱区", "湾里区", "青山湖区", "新建县", "南昌县", "进贤县", "安义县", "其他"]
}, {"name": "景德镇", "area": ["珠山区", "昌江区", "乐平市", "浮梁县", "其他"]}, {
"name": "萍乡",
"area": ["安源区", "湘东区", "莲花县", "上栗县", "芦溪县", "其他"]
}, {
"name": "九江",
"area": ["浔阳区", "庐山区", "瑞昌市", "九江县", "星子县", "武宁县", "彭泽县", "永修县", "修水县", "湖口县", "德安县", "都昌县", "其他"]
}, {"name": "新余", "area": ["渝水区", "分宜县", "其他"]}, {"name": "鹰潭", "area": ["月湖区", "贵溪市", "余江县", "其他"]}, {
"name": "赣州",
"area": ["章贡区", "瑞金市", "南康市", "石城县", "安远县", "赣县", "宁都县", "寻乌县", "兴国县", "定南县", "上犹县", "于都县", "龙南县", "崇义县", "信丰县", "全南县", "大余县", "会昌县", "其他"]
}, {
"name": "吉安",
"area": ["吉州区", "青原区", "井冈山市", "吉安县", "永丰县", "永新县", "新干县", "泰和县", "峡江县", "遂川县", "安福县", "吉水县", "万安县", "其他"]
}, {
"name": "宜春",
"area": ["袁州区", "丰城市", "樟树市", "高安市", "铜鼓县", "靖安县", "宜丰县", "奉新县", "万载县", "上高县", "其他"]
}, {
"name": "抚州",
"area": ["临川区", "南丰县", "乐安县", "金溪县", "南城县", "东乡县", "资溪县", "宜黄县", "广昌县", "黎川县", "崇仁县", "其他"]
}, {
"name": "上饶",
"area": ["信州区", "德兴市", "上饶县", "广丰县", "鄱阳县", "婺源县", "铅山县", "余干县", "横峰县", "弋阳县", "玉山县", "万年县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "jiangxi"
}, {
"name": "山东",
"city": [{
"name": "济南",
"area": ["市中区", "历下区", "天桥区", "槐荫区", "历城区", "长清区", "章丘市", "平阴县", "济阳县", "商河县", "其他"]
}, {
"name": "青岛",
"area": ["市南区", "市北区", "城阳区", "四方区", "李沧区", "黄岛区", "崂山区", "胶南市", "胶州市", "平度市", "莱西市", "即墨市", "其他"]
}, {"name": "淄博", "area": ["张店区", "临淄区", "淄川区", "博山区", "周村区", "桓台县", "高青县", "沂源县", "其他"]}, {
"name": "枣庄",
"area": ["市中区", "山亭区", "峄城区", "台儿庄区", "薛城区", "滕州市", "其他"]
}, {"name": "东营", "area": ["东营区", "河口区", "垦利县", "广饶县", "利津县", "其他"]}, {
"name": "烟台",
"area": ["芝罘区", "福山区", "牟平区", "莱山区", "龙口市", "莱阳市", "莱州市", "招远市", "蓬莱市", "栖霞市", "海阳市", "长岛县", "其他"]
}, {
"name": "潍坊",
"area": ["潍城区", "寒亭区", "坊子区", "奎文区", "青州市", "诸城市", "寿光市", "安丘市", "高密市", "昌邑市", "昌乐县", "临朐县", "其他"]
}, {
"name": "济宁",
"area": ["市中区", "任城区", "曲阜市", "兖州市", "邹城市", "鱼台县", "金乡县", "嘉祥县", "微山县", "汶上县", "泗水县", "梁山县", "其他"]
}, {"name": "泰安", "area": ["泰山区", "岱岳区", "新泰市", "肥城市", "宁阳县", "东平县", "其他"]}, {
"name": "威海",
"area": ["环翠区", "乳山市", "文登市", "荣成市", "其他"]
}, {"name": "日照", "area": ["东港区", "岚山区", "五莲县", "莒县", "其他"]}, {
"name": "莱芜",
"area": ["莱城区", "钢城区", "其他"]
}, {
"name": "临沂",
"area": ["兰山区", "罗庄区", "河东区", "沂南县", "郯城县", "沂水县", "苍山县", "费县", "平邑县", "莒南县", "蒙阴县", "临沭县", "其他"]
}, {
"name": "德州",
"area": ["德城区", "乐陵市", "禹城市", "陵县", "宁津县", "齐河县", "武城县", "庆云县", "平原县", "夏津县", "临邑县", "其他"]
}, {"name": "聊城", "area": ["东昌府区", "临清市", "高唐县", "阳谷县", "茌平县", "莘县", "东阿县", "冠县", "其他"]}, {
"name": "滨州",
"area": ["滨城区", "邹平县", "沾化县", "惠民县", "博兴县", "阳信县", "无棣县", "其他"]
}, {"name": "菏泽", "area": ["牡丹区", "鄄城县", "单县", "郓城县", "曹县", "定陶县", "巨野县", "东明县", "成武县", "其他"]}, {
"name": "其他",
"area": ["其他"]
}],
"json": "shandong"
}, {
"name": "河南",
"city": [{
"name": "郑州",
"area": ["中原区", "金水区", "二七区", "管城回族区", "上街区", "惠济区", "巩义市", "新郑市", "新密市", "登封市", "荥阳市", "中牟县", "其他"]
}, {
"name": "开封",
"area": ["鼓楼区", "龙亭区", "顺河回族区", "禹王台区", "金明区", "开封县", "尉氏县", "兰考县", "杞县", "通许县", "其他"]
}, {
"name": "洛阳",
"area": ["西工区", "老城区", "涧西区", "瀍河回族区", "洛龙区", "吉利区", "偃师市", "孟津县", "汝阳县", "伊川县", "洛宁县", "嵩县", "宜阳县", "新安县", "栾川县", "其他"]
}, {"name": "平顶山", "area": ["新华区", "卫东区", "湛河区", "石龙区", "汝州市", "舞钢市", "宝丰县", "叶县", "郏县", "鲁山县", "其他"]}, {
"name": "安阳",
"area": ["北关区", "文峰区", "殷都区", "龙安区", "林州市", "安阳县", "滑县", "内黄县", "汤阴县", "其他"]
}, {"name": "鹤壁", "area": ["淇滨区", "山城区", "鹤山区", "浚县", "淇县", "其他"]}, {
"name": "新乡",
"area": ["卫滨区", "红旗区", "凤泉区", "牧野区", "卫辉市", "辉县市", "新乡县", "获嘉县", "原阳县", "长垣县", "封丘县", "延津县", "其他"]
}, {"name": "焦作", "area": ["解放区", "中站区", "马村区", "山阳区", "沁阳市", "孟州市", "修武县", "温县", "武陟县", "博爱县", "其他"]}, {
"name": "濮阳",
"area": ["华龙区", "濮阳县", "南乐县", "台前县", "清丰县", "范县", "其他"]
}, {"name": "许昌", "area": ["魏都区", "禹州市", "长葛市", "许昌县", "鄢陵县", "襄城县", "其他"]}, {
"name": "漯河",
"area": ["源汇区", "郾城区", "召陵区", "临颍县", "舞阳县", "其他"]
}, {"name": "三门峡", "area": ["湖滨区", "义马市", "灵宝市", "渑池县", "卢氏县", "陕县", "其他"]}, {
"name": "南阳",
"area": ["卧龙区", "宛城区", "邓州市", "桐柏县", "方城县", "淅川县", "镇平县", "唐河县", "南召县", "内乡县", "新野县", "社旗县", "西峡县", "其他"]
}, {"name": "商丘", "area": ["梁园区", "睢阳区", "永城市", "宁陵县", "虞城县", "民权县", "夏邑县", "柘城县", "睢县", "其他"]}, {
"name": "信阳",
"area": ["浉河区", "平桥区", "潢川县", "淮滨县", "息县", "新县", "商城县", "固始县", "罗山县", "光山县", "其他"]
}, {
"name": "周口",
"area": ["川汇区", "项城市", "商水县", "淮阳县", "太康县", "鹿邑县", "西华县", "扶沟县", "沈丘县", "郸城县", "其他"]
}, {
"name": "驻马店",
"area": ["驿城区", "确山县", "新蔡县", "上蔡县", "西平县", "泌阳县", "平舆县", "汝南县", "遂平县", "正阳县", "其他"]
}, {"name": "焦作", "area": ["济源市", "其他"]}, {"name": "其他", "area": ["其他"]}],
"json": "henan"
}, {
"name": "湖北",
"city": [{
"name": "武汉",
"area": ["江岸区", "武昌区", "江汉区", "硚口区", "汉阳区", "青山区", "洪山区", "东西湖区", "汉南区", "蔡甸区", "江夏区", "黄陂区", "新洲区", "其他"]
}, {"name": "黄石", "area": ["黄石港区", "西塞山区", "下陆区", "铁山区", "大冶市", "阳新县", "其他"]}, {
"name": "十堰",
"area": ["张湾区", "茅箭区", "丹江口市", "郧县", "竹山县", "房县", "郧西县", "竹溪县", "其他"]
}, {"name": "荆州", "area": ["沙市区", "荆州区", "洪湖市", "石首市", "松滋市", "监利县", "公安县", "江陵县", "其他"]}, {
"name": "宜昌",
"area": ["西陵区", "伍家岗区", "点军区", "猇亭区", "夷陵区", "宜都市", "当阳市", "枝江市", "秭归县", "远安县", "兴山县", "五峰土家族自治县", "长阳土家族自治县", "其他"]
}, {"name": "襄樊", "area": ["襄城区", "樊城区", "襄阳区", "老河口市", "枣阳市", "宜城市", "南漳县", "谷城县", "保康县", "其他"]}, {
"name": "鄂州",
"area": ["鄂城区", "华容区", "梁子湖区", "其他"]
}, {"name": "荆门", "area": ["东宝区", "掇刀区", "钟祥市", "京山县", "沙洋县", "其他"]}, {
"name": "孝感",
"area": ["孝南区", "应城市", "安陆市", "汉川市", "云梦县", "大悟县", "孝昌县", "其他"]
}, {
"name": "黄冈",
"area": ["黄州区", "麻城市", "武穴市", "红安县", "罗田县", "浠水县", "蕲春县", "黄梅县", "英山县", "团风县", "其他"]
}, {"name": "咸宁", "area": ["咸安区", "赤壁市", "嘉鱼县", "通山县", "崇阳县", "通城县", "其他"]}, {
"name": "随州",
"area": ["曾都区", "广水市", "其他"]
}, {"name": "恩施土家族苗族自治州", "area": ["恩施市", "利川市", "建始县", "来凤县", "巴东县", "鹤峰县", "宣恩县", "咸丰县", "其他"]}, {
"name": "仙桃",
"area": ["仙桃"]
}, {"name": "天门", "area": ["天门"]}, {"name": "潜江", "area": ["潜江"]}, {
"name": "神农架林区",
"area": ["神农架林区"]
}, {"name": "其他", "area": ["其他"]}],
"json": "hubei"
}, {
"name": "湖南",
"city": [{"name": "长沙", "area": ["岳麓区", "芙蓉区", "天心区", "开福区", "雨花区", "浏阳市", "长沙县", "望城县", "宁乡县", "其他"]}, {
"name": "株洲",
"area": ["天元区", "荷塘区", "芦淞区", "石峰区", "醴陵市", "株洲县", "炎陵县", "茶陵县", "攸县", "其他"]
}, {"name": "湘潭", "area": ["岳塘区", "雨湖区", "湘乡市", "韶山市", "湘潭县", "其他"]}, {
"name": "衡阳",
"area": ["雁峰区", "珠晖区", "石鼓区", "蒸湘区", "南岳区", "耒阳市", "常宁市", "衡阳县", "衡东县", "衡山县", "衡南县", "祁东县", "其他"]
}, {
"name": "邵阳",
"area": ["双清区", "大祥区", "北塔区", "武冈市", "邵东县", "洞口县", "新邵县", "绥宁县", "新宁县", "邵阳县", "隆回县", "城步苗族自治县", "其他"]
}, {"name": "岳阳", "area": ["岳阳楼区", "云溪区", "君山区", "临湘市", "汨罗市", "岳阳县", "湘阴县", "平江县", "华容县", "其他"]}, {
"name": "常德",
"area": ["武陵区", "鼎城区", "津市市", "澧县", "临澧县", "桃源县", "汉寿县", "安乡县", "石门县", "其他"]
}, {"name": "张家界", "area": ["永定区", "武陵源区", "慈利县", "桑植县", "其他"]}, {
"name": "益阳",
"area": ["赫山区", "资阳区", "沅江市", "桃江县", "南县", "安化县", "其他"]
}, {
"name": "郴州",
"area": ["北湖区", "苏仙区", "资兴市", "宜章县", "汝城县", "安仁县", "嘉禾县", "临武县", "桂东县", "永兴县", "桂阳县", "其他"]
}, {
"name": "永州",
"area": ["冷水滩区", "零陵区", "祁阳县", "蓝山县", "宁远县", "新田县", "东安县", "江永县", "道县", "双牌县", "江华瑶族自治县", "其他"]
}, {
"name": "怀化",
"area": ["鹤城区", "洪江市", "会同县", "沅陵县", "辰溪县", "溆浦县", "中方县", "新晃侗族自治县", "芷江侗族自治县", "通道侗族自治县", "靖州苗族侗族自治县", "麻阳苗族自治县", "其他"]
}, {"name": "娄底", "area": ["娄星区", "冷水江市", "涟源市", "新化县", "双峰县", "其他"]}, {
"name": "湘西土家族苗族自治州",
"area": ["吉首市", "古丈县", "龙山县", "永顺县", "凤凰县", "泸溪县", "保靖县", "花垣县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "hunan"
}, {
"name": "广东",
"city": [{
"name": "广州",
"area": ["越秀区", "荔湾区", "海珠区", "天河区", "白云区", "黄埔区", "番禺区", "花都区", "南沙区", "萝岗区", "增城市", "从化市", "其他"]
}, {"name": "深圳", "area": ["福田区", "罗湖区", "南山区", "宝安区", "龙岗区", "盐田区", "其他"]}, {
"name": "东莞",
"area": ["莞城", "常平", "塘厦", "其他"]
}, {"name": "中山", "area": ["中山"]}, {"name": "潮州", "area": ["湘桥区", "潮安县", "饶平县", "其他"]}, {
"name": "揭阳",
"area": ["榕城区", "揭东县", "揭西县", "惠来县", "普宁市", "其他"]
}, {"name": "云浮", "area": ["云城区", "新兴县", "郁南县", "云安县", "罗定市", "其他"]}, {
"name": "珠海",
"area": ["香洲区", "斗门区", "金湾区", "其他"]
}, {"name": "汕头", "area": ["金平区", "濠江区", "龙湖区", "潮阳区", "潮南区", "澄海区", "南澳县", "其他"]}, {
"name": "韶关",
"area": ["浈江区", "武江区", "曲江区", "乐昌市", "南雄市", "始兴县", "仁化县", "翁源县", "新丰县", "乳源瑶族自治县", "其他"]
}, {"name": "佛山", "area": ["禅城区", "南海区", "顺德区", "三水区", "高明区", "其他"]}, {
"name": "江门",
"area": ["蓬江区", "江海区", "新会区", "恩平市", "台山市", "开平市", "鹤山市", "其他"]
}, {"name": "湛江", "area": ["赤坎区", "霞山区", "坡头区", "麻章区", "吴川市", "廉江市", "雷州市", "遂溪县", "徐闻县", "其他"]}, {
"name": "茂名",
"area": ["茂南区", "茂港区", "化州市", "信宜市", "高州市", "电白县", "其他"]
}, {"name": "肇庆", "area": ["端州区", "鼎湖区", "高要市", "四会市", "广宁县", "怀集县", "封开县", "德庆县", "其他"]}, {
"name": "惠州",
"area": ["惠城区", "惠阳区", "博罗县", "惠东县", "龙门县", "其他"]
}, {"name": "梅州", "area": ["梅江区", "兴宁市", "梅县", "大埔县", "丰顺县", "五华县", "平远县", "蕉岭县", "其他"]}, {
"name": "汕尾",
"area": ["城区", "陆丰市", "海丰县", "陆河县", "其他"]
}, {"name": "河源", "area": ["源城区", "紫金县", "龙川县", "连平县", "和平县", "东源县", "其他"]}, {
"name": "阳江",
"area": ["江城区", "阳春市", "阳西县", "阳东县", "其他"]
}, {"name": "清远", "area": ["清城区", "英德市", "连州市", "佛冈县", "阳山县", "清新县", "连山壮族瑶族自治县", "连南瑶族自治县", "其他"]}],
"json": "guangdong"
}, {
"name": "广西",
"city": [{
"name": "南宁",
"area": ["青秀区", "兴宁区", "西乡塘区", "良庆区", "江南区", "邕宁区", "武鸣县", "隆安县", "马山县", "上林县", "宾阳县", "横县", "其他"]
}, {
"name": "柳州",
"area": ["城中区", "鱼峰区", "柳北区", "柳南区", "柳江县", "柳城县", "鹿寨县", "融安县", "融水苗族自治县", "三江侗族自治县", "其他"]
}, {
"name": "桂林",
"area": ["象山区", "秀峰区", "叠彩区", "七星区", "雁山区", "阳朔县", "临桂县", "灵川县", "全州县", "平乐县", "兴安县", "灌阳县", "荔浦县", "资源县", "永福县", "龙胜各族自治县", "恭城瑶族自治县", "其他"]
}, {"name": "梧州", "area": ["万秀区", "蝶山区", "长洲区", "岑溪市", "苍梧县", "藤县", "蒙山县", "其他"]}, {
"name": "北海",
"area": ["海城区", "银海区", "铁山港区", "合浦县", "其他"]
}, {"name": "防城港", "area": ["港口区", "防城区", "东兴市", "上思县", "其他"]}, {
"name": "钦州",
"area": ["钦南区", "钦北区", "灵山县", "浦北县", "其他"]
}, {"name": "贵港", "area": ["港北区", "港南区", "覃塘区", "桂平市", "平南县", "其他"]}, {
"name": "玉林",
"area": ["玉州区", "北流市", "容县", "陆川县", "博白县", "兴业县", "其他"]
}, {
"name": "百色",
"area": ["右江区", "凌云县", "平果县", "西林县", "乐业县", "德保县", "田林县", "田阳县", "靖西县", "田东县", "那坡县", "隆林各族自治县", "其他"]
}, {"name": "贺州", "area": ["八步区", "钟山县", "昭平县", "富川瑶族自治县", "其他"]}, {
"name": "河池",
"area": ["金城江区", "宜州市", "天峨县", "凤山县", "南丹县", "东兰县", "都安瑶族自治县", "罗城仫佬族自治县", "巴马瑶族自治县", "环江毛南族自治县", "大化瑶族自治县", "其他"]
}, {"name": "来宾", "area": ["兴宾区", "合山市", "象州县", "武宣县", "忻城县", "金秀瑶族自治县", "其他"]}, {
"name": "崇左",
"area": ["江州区", "凭祥市", "宁明县", "扶绥县", "龙州县", "大新县", "天等县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "guangxi"
}, {
"name": "海南",
"city": [{"name": "海口", "area": ["龙华区", "秀英区", "琼山区", "美兰区", "其他"]}, {
"name": "三亚",
"area": ["三亚市", "其他"]
}, {"name": "五指山", "area": ["五指山"]}, {"name": "琼海", "area": ["琼海"]}, {"name": "儋州", "area": ["儋州"]}, {
"name": "文昌",
"area": ["文昌"]
}, {"name": "万宁", "area": ["万宁"]}, {"name": "东方", "area": ["东方"]}, {"name": "澄迈县", "area": ["澄迈县"]}, {
"name": "定安县",
"area": ["定安县"]
}, {"name": "屯昌县", "area": ["屯昌县"]}, {"name": "临高县", "area": ["临高县"]}, {
"name": "白沙黎族自治县",
"area": ["白沙黎族自治县"]
}, {"name": "昌江黎族自治县", "area": ["昌江黎族自治县"]}, {"name": "乐东黎族自治县", "area": ["乐东黎族自治县"]}, {
"name": "陵水黎族自治县",
"area": ["陵水黎族自治县"]
}, {"name": "保亭黎族苗族自治县", "area": ["保亭黎族苗族自治县"]}, {"name": "琼中黎族苗族自治县", "area": ["琼中黎族苗族自治县"]}, {
"name": "其他",
"area": ["其他"]
}],
"json": "hainan"
}, {
"name": "重庆",
"city": [{
"name": "重庆",
"area": ["渝中区", "大渡口区", "江北区", "南岸区", "北碚区", "渝北区", "巴南区", "长寿区", "双桥区", "沙坪坝区", "万盛区", "万州区", "涪陵区", "黔江区", "永川区", "合川区", "江津区", "九龙坡区", "南川区", "綦江县", "潼南县", "荣昌县", "璧山县", "大足县", "铜梁县", "梁平县", "开县", "忠县", "城口县", "垫江县", "武隆县", "丰都县", "奉节县", "云阳县", "巫溪县", "巫山县", "石柱土家族自治县", "秀山土家族苗族自治县", "酉阳土家族苗族自治县", "彭水苗族土家族自治县", "其他"]
}],
"json": "chongqing"
}, {
"name": "四川",
"city": [{
"name": "成都",
"area": ["青羊区", "锦江区", "金牛区", "武侯区", "成华区", "龙泉驿区", "青白江区", "新都区", "温江区", "都江堰市", "彭州市", "邛崃市", "崇州市", "金堂县", "郫县", "新津县", "双流县", "蒲江县", "大邑县", "其他"]
}, {"name": "自贡", "area": ["大安区", "自流井区", "贡井区", "沿滩区", "荣县", "富顺县", "其他"]}, {
"name": "攀枝花",
"area": ["仁和区", "米易县", "盐边县", "东区", "西区", "其他"]
}, {"name": "泸州", "area": ["江阳区", "纳溪区", "龙马潭区", "泸县", "合江县", "叙永县", "古蔺县", "其他"]}, {
"name": "德阳",
"area": ["旌阳区", "广汉市", "什邡市", "绵竹市", "罗江县", "中江县", "其他"]
}, {"name": "绵阳", "area": ["涪城区", "游仙区", "江油市", "盐亭县", "三台县", "平武县", "安县", "梓潼县", "北川羌族自治县", "其他"]}, {
"name": "广元",
"area": ["元坝区", "朝天区", "青川县", "旺苍县", "剑阁县", "苍溪县", "市中区", "其他"]
}, {"name": "遂宁", "area": ["船山区", "安居区", "射洪县", "蓬溪县", "大英县", "其他"]}, {
"name": "内江",
"area": ["市中区", "东兴区", "资中县", "隆昌县", "威远县", "其他"]
}, {
"name": "乐山",
"area": ["市中区", "五通桥区", "沙湾区", "金口河区", "峨眉山市", "夹江县", "井研县", "犍为县", "沐川县", "马边彝族自治县", "峨边彝族自治县", "其他"]
}, {"name": "南充", "area": ["顺庆区", "高坪区", "嘉陵区", "阆中市", "营山县", "蓬安县", "仪陇县", "南部县", "西充县", "其他"]}, {
"name": "眉山",
"area": ["东坡区", "仁寿县", "彭山县", "洪雅县", "丹棱县", "青神县", "其他"]
}, {"name": "宜宾", "area": ["翠屏区", "宜宾县", "兴文县", "南溪县", "珙县", "长宁县", "高县", "江安县", "筠连县", "屏山县", "其他"]}, {
"name": "广安",
"area": ["广安区", "华蓥市", "岳池县", "邻水县", "武胜县", "其他"]
}, {"name": "达州", "area": ["通川区", "万源市", "达县", "渠县", "宣汉县", "开江县", "大竹县", "其他"]}, {
"name": "雅安",
"area": ["雨城区", "芦山县", "石棉县", "名山县", "天全县", "荥经县", "宝兴县", "汉源县", "其他"]
}, {"name": "巴中", "area": ["巴州区", "南江县", "平昌县", "通江县", "其他"]}, {
"name": "资阳",
"area": ["雁江区", "简阳市", "安岳县", "乐至县", "其他"]
}, {
"name": "阿坝藏族羌族自治州",
"area": ["马尔康县", "九寨沟县", "红原县", "汶川县", "阿坝县", "理县", "若尔盖县", "小金县", "黑水县", "金川县", "松潘县", "壤塘县", "茂县", "其他"]
}, {
"name": "甘孜藏族自治州",
"area": ["康定县", "丹巴县", "炉霍县", "九龙县", "甘孜县", "雅江县", "新龙县", "道孚县", "白玉县", "理塘县", "德格县", "乡城县", "石渠县", "稻城县", "色达县", "巴塘县", "泸定县", "得荣县", "其他"]
}, {
"name": "凉山彝族自治州",
"area": ["西昌市", "美姑县", "昭觉县", "金阳县", "甘洛县", "布拖县", "雷波县", "普格县", "宁南县", "喜德县", "会东县", "越西县", "会理县", "盐源县", "德昌县", "冕宁县", "木里藏族自治县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "sichuan"
}, {
"name": "贵州",
"city": [{
"name": "贵阳",
"area": ["南明区", "云岩区", "花溪区", "乌当区", "白云区", "小河区", "清镇市", "开阳县", "修文县", "息烽县", "其他"]
}, {"name": "六盘水", "area": ["钟山区", "水城县", "盘县", "六枝特区", "其他"]}, {
"name": "遵义",
"area": ["红花岗区", "汇川区", "赤水市", "仁怀市", "遵义县", "绥阳县", "桐梓县", "习水县", "凤冈县", "正安县", "余庆县", "湄潭县", "道真仡佬族苗族自治县", "务川仡佬族苗族自治县", "其他"]
}, {"name": "安顺", "area": ["西秀区", "普定县", "平坝县", "镇宁布依族苗族自治县", "紫云苗族布依族自治县", "关岭布依族苗族自治县", "其他"]}, {
"name": "铜仁地区",
"area": ["铜仁市", "德江县", "江口县", "思南县", "石阡县", "玉屏侗族自治县", "松桃苗族自治县", "印江土家族苗族自治县", "沿河土家族自治县", "万山特区", "其他"]
}, {
"name": "毕节地区",
"area": ["毕节市", "黔西县", "大方县", "织金县", "金沙县", "赫章县", "纳雍县", "威宁彝族回族苗族自治县", "其他"]
}, {
"name": "黔西南布依族苗族自治州",
"area": ["兴义市", "望谟县", "兴仁县", "普安县", "册亨县", "晴隆县", "贞丰县", "安龙县", "其他"]
}, {
"name": "黔东南苗族侗族自治州",
"area": ["凯里市", "施秉县", "从江县", "锦屏县", "镇远县", "麻江县", "台江县", "天柱县", "黄平县", "榕江县", "剑河县", "三穗县", "雷山县", "黎平县", "岑巩县", "丹寨县", "其他"]
}, {
"name": "黔南布依族苗族自治州",
"area": ["都匀市", "福泉市", "贵定县", "惠水县", "罗甸县", "瓮安县", "荔波县", "龙里县", "平塘县", "长顺县", "独山县", "三都水族自治县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "guizhou"
}, {
"name": "云南",
"city": [{
"name": "昆明",
"area": ["盘龙区", "五华区", "官渡区", "西山区", "东川区", "安宁市", "呈贡县", "晋宁县", "富民县", "宜良县", "嵩明县", "石林彝族自治县", "禄劝彝族苗族自治县", "寻甸回族彝族自治县", "其他"]
}, {"name": "曲靖", "area": ["麒麟区", "宣威市", "马龙县", "沾益县", "富源县", "罗平县", "师宗县", "陆良县", "会泽县", "其他"]}, {
"name": "玉溪",
"area": ["红塔区", "江川县", "澄江县", "通海县", "华宁县", "易门县", "峨山彝族自治县", "新平彝族傣族自治县", "元江哈尼族彝族傣族自治县", "其他"]
}, {"name": "保山", "area": ["隆阳区", "施甸县", "腾冲县", "龙陵县", "昌宁县", "其他"]}, {
"name": "昭通",
"area": ["昭阳区", "鲁甸县", "巧家县", "盐津县", "大关县", "永善县", "绥江县", "镇雄县", "彝良县", "威信县", "水富县", "其他"]
}, {"name": "丽江", "area": ["古城区", "永胜县", "华坪县", "玉龙纳西族自治县", "宁蒗彝族自治县", "其他"]}, {
"name": "普洱",
"area": ["思茅区", "普洱哈尼族彝族自治县", "墨江哈尼族自治县", "景东彝族自治县", "景谷傣族彝族自治县", "镇沅彝族哈尼族拉祜族自治县", "江城哈尼族彝族自治县", "孟连傣族拉祜族佤族自治县", "澜沧拉祜族自治县", "西盟佤族自治县", "其他"]
}, {
"name": "临沧",
"area": ["临翔区", "凤庆县", "云县", "永德县", "镇康县", "双江拉祜族佤族布朗族傣族自治县", "耿马傣族佤族自治县", "沧源佤族自治县", "其他"]
}, {"name": "德宏傣族景颇族自治州", "area": ["潞西市", "瑞丽市", "梁河县", "盈江县", "陇川县", "其他"]}, {
"name": "怒江傈僳族自治州",
"area": ["泸水县", "福贡县", "贡山独龙族怒族自治县", "兰坪白族普米族自治县", "其他"]
}, {"name": "迪庆藏族自治州", "area": ["香格里拉县", "德钦县", "维西傈僳族自治县", "其他"]}, {
"name": "大理白族自治州",
"area": ["大理市", "祥云县", "宾川县", "弥渡县", "永平县", "云龙县", "洱源县", "剑川县", "鹤庆县", "漾濞彝族自治县", "南涧彝族自治县", "巍山彝族回族自治县", "其他"]
}, {
"name": "楚雄彝族自治州",
"area": ["楚雄市", "双柏县", "牟定县", "南华县", "姚安县", "大姚县", "永仁县", "元谋县", "武定县", "禄丰县", "其他"]
}, {
"name": "红河哈尼族彝族自治州",
"area": ["蒙自县", "个旧市", "开远市", "绿春县", "建水县", "石屏县", "弥勒县", "泸西县", "元阳县", "红河县", "金平苗族瑶族傣族自治县", "河口瑶族自治县", "屏边苗族自治县", "其他"]
}, {
"name": "文山壮族苗族自治州",
"area": ["文山县", "砚山县", "西畴县", "麻栗坡县", "马关县", "丘北县", "广南县", "富宁县", "其他"]
}, {"name": "西双版纳傣族自治州", "area": ["景洪市", "勐海县", "勐腊县", "其他"]}, {"name": "其他", "area": ["其他"]}],
"json": "yunnan"
}, {
"name": "西藏",
"city": [{"name": "拉萨", "area": ["城关区", "林周县", "当雄县", "尼木县", "曲水县", "堆龙德庆县", "达孜县", "墨竹工卡县", "其他"]}, {
"name": "那曲地区",
"area": ["那曲县", "嘉黎县", "比如县", "聂荣县", "安多县", "申扎县", "索县", "班戈县", "巴青县", "尼玛县", "其他"]
}, {
"name": "昌都地区",
"area": ["昌都县", "江达县", "贡觉县", "类乌齐县", "丁青县", "察雅县", "八宿县", "左贡县", "芒康县", "洛隆县", "边坝县", "其他"]
}, {"name": "林芝地区", "area": ["林芝县", "工布江达县", "米林县", "墨脱县", "波密县", "察隅县", "朗县", "其他"]}, {
"name": "山南地区",
"area": ["乃东县", "扎囊县", "贡嘎县", "桑日县", "琼结县", "曲松县", "措美县", "洛扎县", "加查县", "隆子县", "错那县", "浪卡子县", "其他"]
}, {
"name": "日喀则地区",
"area": ["日喀则市", "南木林县", "江孜县", "定日县", "萨迦县", "拉孜县", "昂仁县", "谢通门县", "白朗县", "仁布县", "康马县", "定结县", "仲巴县", "亚东县", "吉隆县", "聂拉木县", "萨嘎县", "岗巴县", "其他"]
}, {"name": "阿里地区", "area": ["噶尔县", "普兰县", "札达县", "日土县", "革吉县", "改则县", "措勤县", "其他"]}, {"name": "其他", "area": ["其他"]}],
"json": "xizang"
}, {
"name": "陕西",
"city": [{
"name": "西安",
"area": ["莲湖区", "新城区", "碑林区", "雁塔区", "灞桥区", "未央区", "阎良区", "临潼区", "长安区", "高陵县", "蓝田县", "户县", "周至县", "其他"]
}, {"name": "铜川", "area": ["耀州区", "王益区", "印台区", "宜君县", "其他"]}, {
"name": "宝鸡",
"area": ["渭滨区", "金台区", "陈仓区", "岐山县", "凤翔县", "陇县", "太白县", "麟游县", "扶风县", "千阳县", "眉县", "凤县", "其他"]
}, {
"name": "咸阳",
"area": ["秦都区", "渭城区", "杨陵区", "兴平市", "礼泉县", "泾阳县", "永寿县", "三原县", "彬县", "旬邑县", "长武县", "乾县", "武功县", "淳化县", "其他"]
}, {
"name": "渭南",
"area": ["临渭区", "韩城市", "华阴市", "蒲城县", "潼关县", "白水县", "澄城县", "华县", "合阳县", "富平县", "大荔县", "其他"]
}, {
"name": "延安",
"area": ["宝塔区", "安塞县", "洛川县", "子长县", "黄陵县", "延川县", "富县", "延长县", "甘泉县", "宜川县", "志丹县", "黄龙县", "吴起县", "其他"]
}, {
"name": "汉中",
"area": ["汉台区", "留坝县", "镇巴县", "城固县", "南郑县", "洋县", "宁强县", "佛坪县", "勉县", "西乡县", "略阳县", "其他"]
}, {
"name": "榆林",
"area": ["榆阳区", "清涧县", "绥德县", "神木县", "佳县", "府谷县", "子洲县", "靖边县", "横山县", "米脂县", "吴堡县", "定边县", "其他"]
}, {
"name": "安康",
"area": ["汉滨区", "紫阳县", "岚皋县", "旬阳县", "镇坪县", "平利县", "石泉县", "宁陕县", "白河县", "汉阴县", "其他"]
}, {"name": "商洛", "area": ["商州区", "镇安县", "山阳县", "洛南县", "商南县", "丹凤县", "柞水县", "其他"]}, {"name": "其他", "area": ["其他"]}],
"json": "shanxi1"
}, {
"name": "甘肃",
"city": [{"name": "兰州", "area": ["城关区", "七里河区", "西固区", "安宁区", "红古区", "永登县", "皋兰县", "榆中县", "其他"]}, {
"name": "嘉峪关",
"area": ["嘉峪关市", "其他"]
}, {"name": "金昌", "area": ["金川区", "永昌县", "其他"]}, {
"name": "白银",
"area": ["白银区", "平川区", "靖远县", "会宁县", "景泰县", "其他"]
}, {"name": "天水", "area": ["清水县", "秦安县", "甘谷县", "武山县", "张家川回族自治县", "北道区", "秦城区", "其他"]}, {
"name": "武威",
"area": ["凉州区", "民勤县", "古浪县", "天祝藏族自治县", "其他"]
}, {"name": "酒泉", "area": ["肃州区", "玉门市", "敦煌市", "金塔县", "肃北蒙古族自治县", "阿克塞哈萨克族自治县", "安西县", "其他"]}, {
"name": "张掖",
"area": ["甘州区", "民乐县", "临泽县", "高台县", "山丹县", "肃南裕固族自治县", "其他"]
}, {"name": "庆阳", "area": ["西峰区", "庆城县", "环县", "华池县", "合水县", "正宁县", "宁县", "镇原县", "其他"]}, {
"name": "平凉",
"area": ["崆峒区", "泾川县", "灵台县", "崇信县", "华亭县", "庄浪县", "静宁县", "其他"]
}, {"name": "定西", "area": ["安定区", "通渭县", "临洮县", "漳县", "岷县", "渭源县", "陇西县", "其他"]}, {
"name": "陇南",
"area": ["武都区", "成县", "宕昌县", "康县", "文县", "西和县", "礼县", "两当县", "徽县", "其他"]
}, {
"name": "临夏回族自治州",
"area": ["临夏市", "临夏县", "康乐县", "永靖县", "广河县", "和政县", "东乡族自治县", "积石山保安族东乡族撒拉族自治县", "其他"]
}, {"name": "甘南藏族自治州", "area": ["合作市", "临潭县", "卓尼县", "舟曲县", "迭部县", "玛曲县", "碌曲县", "夏河县", "其他"]}, {
"name": "其他",
"area": ["其他"]
}],
"json": "gansu"
}, {
"name": "青海",
"city": [{"name": "西宁", "area": ["城中区", "城东区", "城西区", "城北区", "湟源县", "湟中县", "大通回族土族自治县", "其他"]}, {
"name": "海东地区",
"area": ["平安县", "乐都县", "民和回族土族自治县", "互助土族自治县", "化隆回族自治县", "循化撒拉族自治县", "其他"]
}, {"name": "海北藏族自治州", "area": ["海晏县", "祁连县", "刚察县", "门源回族自治县", "其他"]}, {
"name": "海南藏族自治州",
"area": ["共和县", "同德县", "贵德县", "兴海县", "贵南县", "其他"]
}, {"name": "黄南藏族自治州", "area": ["同仁县", "尖扎县", "泽库县", "河南蒙古族自治县", "其他"]}, {
"name": "果洛藏族自治州",
"area": ["玛沁县", "班玛县", "甘德县", "达日县", "久治县", "玛多县", "其他"]
}, {"name": "玉树藏族自治州", "area": ["玉树县", "杂多县", "称多县", "治多县", "囊谦县", "曲麻莱县", "其他"]}, {
"name": "海西蒙古族藏族自治州",
"area": ["德令哈市", "格尔木市", "乌兰县", "都兰县", "天峻县", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "qinghai"
}, {
"name": "宁夏",
"city": [{"name": "银川", "area": ["兴庆区", "西夏区", "金凤区", "灵武市", "永宁县", "贺兰县", "其他"]}, {
"name": "石嘴山",
"area": ["大武口区", "惠农区", "平罗县", "其他"]
}, {"name": "吴忠", "area": ["利通区", "青铜峡市", "盐池县", "同心县", "其他"]}, {
"name": "固原",
"area": ["原州区", "西吉县", "隆德县", "泾源县", "彭阳县", "其他"]
}, {"name": "中卫", "area": ["沙坡头区", "中宁县", "海原县", "其他"]}, {"name": "其他", "area": ["其他"]}],
"json": "ningxia"
}, {
"name": "新疆",
"city": [{
"name": "乌鲁木齐",
"area": ["天山区", "沙依巴克区", "新市区", "水磨沟区", "头屯河区", "达坂城区", "东山区", "乌鲁木齐县", "其他"]
}, {"name": "克拉玛依", "area": ["克拉玛依区", "独山子区", "白碱滩区", "乌尔禾区", "其他"]}, {
"name": "吐鲁番地区",
"area": ["吐鲁番市", "托克逊县", "鄯善县", "其他"]
}, {"name": "哈密地区", "area": ["哈密市", "伊吾县", "巴里坤哈萨克自治县", "其他"]}, {
"name": "和田地区",
"area": ["和田市", "和田县", "洛浦县", "民丰县", "皮山县", "策勒县", "于田县", "墨玉县", "其他"]
}, {
"name": "阿克苏地区",
"area": ["阿克苏市", "温宿县", "沙雅县", "拜城县", "阿瓦提县", "库车县", "柯坪县", "新和县", "乌什县", "其他"]
}, {
"name": "喀什地区",
"area": ["喀什市", "巴楚县", "泽普县", "伽师县", "叶城县", "岳普湖县", "疏勒县", "麦盖提县", "英吉沙县", "莎车县", "疏附县", "塔什库尔干塔吉克自治县", "其他"]
}, {"name": "克孜勒苏柯尔克孜自治州", "area": ["阿图什市", "阿合奇县", "乌恰县", "阿克陶县", "其他"]}, {
"name": "巴音郭楞蒙古自治州",
"area": ["库尔勒市", "和静县", "尉犁县", "和硕县", "且末县", "博湖县", "轮台县", "若羌县", "焉耆回族自治县", "其他"]
}, {
"name": "昌吉回族自治州",
"area": ["昌吉市", "阜康市", "奇台县", "玛纳斯县", "吉木萨尔县", "呼图壁县", "木垒哈萨克自治县", "米泉市", "其他"]
}, {"name": "博尔塔拉蒙古自治州", "area": ["博乐市", "精河县", "温泉县", "其他"]}, {"name": "石河子", "area": ["石河子"]}, {
"name": "阿拉尔",
"area": ["阿拉尔"]
}, {"name": "图木舒克", "area": ["图木舒克"]}, {"name": "五家渠", "area": ["五家渠"]}, {
"name": "伊犁哈萨克自治州",
"area": ["伊宁市", "奎屯市", "伊宁县", "特克斯县", "尼勒克县", "昭苏县", "新源县", "霍城县", "巩留县", "察布查尔锡伯自治县", "塔城地区", "阿勒泰地区", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "xinjiang"
}, {
"name": "台湾",
"city": [{
"name": "台湾",
"area": ["台北市", "高雄市", "台北县", "桃园县", "新竹县", "苗栗县", "台中县", "彰化县", "南投县", "云林县", "嘉义县", "台南县", "高雄县", "屏东县", "宜兰县", "花莲县", "台东县", "澎湖县", "基隆市", "新竹市", "台中市", "嘉义市", "台南市", "其他"]
}, {"name": "其他", "area": ["其他"]}],
"json": "taiwan"
}, {
"name": "澳门",
"city": [{"name": "澳门", "area": ["花地玛堂区", "圣安多尼堂区", "大堂区", "望德堂区", "风顺堂区", "嘉模堂区", "圣方济各堂区", "路凼", "其他"]}],
"json": "aomen"
}, {
"name": "香港",
"city": [{
"name": "香港",
"area": ["中西区", "湾仔区", "东区", "南区", "深水埗区", "油尖旺区", "九龙城区", "黄大仙区", "观塘区", "北区", "大埔区", "沙田区", "西贡区", "元朗区", "屯门区", "荃湾区", "葵青区", "离岛区", "其他"]
}],
"json": "xianggang"
}]

94
utils/parseArea/foramtProvince.js

@ -0,0 +1,94 @@
module.exports = [{
"name": "北京市",
"id": "110000000000"
}, {
"name": "天津市",
"id": "120000000000"
}, {
"name": "河北省",
"id": "130000000000"
}, {
"name": "山西省",
"id": "140000000000"
}, {
"name": "内蒙古自治区",
"id": "150000000000"
}, {
"name": "辽宁省",
"id": "210000000000"
}, {
"name": "吉林省",
"id": "220000000000"
}, {
"name": "黑龙江省",
"id": "230000000000"
}, {
"name": "上海市",
"id": "310000000000"
}, {
"name": "江苏省",
"id": "320000000000"
}, {
"name": "浙江省",
"id": "330000000000"
}, {
"name": "安徽省",
"id": "340000000000"
}, {
"name": "福建省",
"id": "350000000000"
}, {
"name": "江西省",
"id": "360000000000"
}, {
"name": "山东省",
"id": "370000000000"
}, {
"name": "河南省",
"id": "410000000000"
}, {
"name": "湖北省",
"id": "420000000000"
}, {
"name": "湖南省",
"id": "430000000000"
}, {
"name": "广东省",
"id": "440000000000"
}, {
"name": "广西壮族自治区",
"id": "450000000000"
}, {
"name": "海南省",
"id": "460000000000"
}, {
"name": "重庆市",
"id": "500000000000"
}, {
"name": "四川省",
"id": "510000000000"
}, {
"name": "贵州省",
"id": "520000000000"
}, {
"name": "云南省",
"id": "530000000000"
}, {
"name": "西藏自治区",
"id": "540000000000"
}, {
"name": "陕西省",
"id": "610000000000"
}, {
"name": "甘肃省",
"id": "620000000000"
}, {
"name": "青海省",
"id": "630000000000"
}, {
"name": "宁夏回族自治区",
"id": "640000000000"
}, {
"name": "新疆维吾尔自治区",
"id": "650000000000"
}]

13477
utils/parseArea/zipCode.js
File diff suppressed because it is too large
View File

40
utils/util.js

@ -0,0 +1,40 @@
var api = require('../api.js');
const PHONE_REG = /^[1][0-9]{10}$/;
const submitFormSource = {
ADD_CART: 1, // 1、步数兑换海贝
TOORDER: 2, // 2、首页邀请好友
INVITE_INDEX_LAYER: 3, // 3、首页浮层 邀请好友
GOODS_DETAIL_EXCHANGE: 4, // 4、商品详情页免费兑换
INVITE_GOODS_DETAIL: 5, // 5、商品详情页页邀请好友
FOLLOW: 6, // 6、引导关注公众号"知道了"按钮
EXPERIENCE: 7, // 7、健康体验,免费领取按钮
INDEX_POP_LAYER: 8, // 首页弹窗 点击后跳转任务列表
HEALTHFIT: 9, // 9、健康体验,减脂营按钮
HEALTHHOTMOMMY: 10, // 10、健康体验,辣妈营按钮
HEALTTHBODY: 11 // 11、健康体验,体态营按钮
// 20~29 为健康体验 列表从第一个到第十个
};
function submitFormId(formId,source) {
const app = getApp();
app.request({
url: api.default.submitFormId,
data: {
formId: formId,
source: source,
},
success: function (res) {
wx.hideLoading();
if (res.code == 200) {
}
}
});
}
module.exports = {
submitFormId:submitFormId
};

82
utils/utils.js

@ -0,0 +1,82 @@
function formatTime(date) {
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()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
function formatNumber(n) {
n = n.toString()
return n[1] ? n : '0' + n
}
function objectToUrlParams(obj) {
var str = "";
for (var key in obj) {
str += "&" + key + "=" + obj[key];
}
return str.substr(1);
}
module.exports = {
formatTime: formatTime,
objectToUrlParams: objectToUrlParams,
};
/**
* new Date() ---> 转化为
* let date = new Date();
* date: 传入参数日期 Date
*/
// function formatTime(date) {
// 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()
// return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
// }
// function formatNumber(n) {
// n = n.toString()
// return n[1] ? n : '0' + n
// }
/**
* 时间戳转化为年
* number: 传入时间戳
* format返回格式支持自定义但参数必须与formateArr里保持一致
*/
function formatTimeTwo(number, format) {
var formateArr = ['Y', 'M', 'D', 'h', 'm', 's'];
var returnArr = [];
var date = new Date(number);
returnArr.push(date.getFullYear());
returnArr.push(formatNumber(date.getMonth() + 1));
returnArr.push(formatNumber(date.getDate()));
returnArr.push(formatNumber(date.getHours()));
returnArr.push(formatNumber(date.getMinutes()));
returnArr.push(formatNumber(date.getSeconds()));
for (var i in returnArr) {
format = format.replace(formateArr[i], returnArr[i]);
}
return format;
}
module.exports = {
formatTime: formatTime,
formatTimeTwo: formatTimeTwo
}

292
wxParse/html2json.js

@ -0,0 +1,292 @@
/**
* 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 html2json(html, bindName) {
//处理字符串
html = removeDOCTYPE(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 (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 && 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 dosen'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 result.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) {
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
};

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save