commit
681d63db52
106 changed files with 28795 additions and 0 deletions
-
238api.js
-
31api.tpl.js
-
392app.js
-
31app.json
-
353app.wxss
-
93area-picker/area-picker.js
-
26area-picker/area-picker.wxml
-
66area-picker/area-picker.wxss
-
12commons/copyright/copyright.wxml
-
18commons/float-icon/float-icon.wxml
-
34commons/get-coupon/get-coupon.wxml
-
5698lib/city.js
-
7lib/vant/common/color.d.ts
-
7lib/vant/common/color.js
-
3lib/vant/common/component.d.ts
-
48lib/vant/common/component.js
-
1lib/vant/common/index.wxss
-
1lib/vant/common/style/clearfix.wxss
-
1lib/vant/common/style/ellipsis.wxss
-
1lib/vant/common/style/hairline.wxss
-
0lib/vant/common/style/mixins/clearfix.wxss
-
0lib/vant/common/style/mixins/ellipsis.wxss
-
0lib/vant/common/style/mixins/hairline.wxss
-
0lib/vant/common/style/theme.wxss
-
0lib/vant/common/style/var.wxss
-
8lib/vant/common/utils.d.ts
-
32lib/vant/common/utils.js
-
1lib/vant/icon/index.d.ts
-
39lib/vant/icon/index.js
-
6lib/vant/icon/index.json
-
18lib/vant/icon/index.wxml
-
1lib/vant/icon/index.wxss
-
1lib/vant/info/index.d.ts
-
8lib/vant/info/index.js
-
3lib/vant/info/index.json
-
7lib/vant/info/index.wxml
-
1lib/vant/info/index.wxss
-
1lib/vant/mixins/basic.d.ts
-
22lib/vant/mixins/basic.js
-
1lib/vant/mixins/button.d.ts
-
18lib/vant/mixins/button.js
-
1lib/vant/mixins/link.d.ts
-
17lib/vant/mixins/link.js
-
1lib/vant/mixins/observer/behavior.d.ts
-
14lib/vant/mixins/observer/behavior.js
-
1lib/vant/mixins/observer/index.d.ts
-
19lib/vant/mixins/observer/index.js
-
1lib/vant/mixins/open-type.d.ts
-
25lib/vant/mixins/open-type.js
-
1lib/vant/mixins/touch.d.ts
-
27lib/vant/mixins/touch.js
-
1lib/vant/mixins/transition.d.ts
-
120lib/vant/mixins/transition.js
-
1lib/vant/overlay/index.d.ts
-
22lib/vant/overlay/index.js
-
6lib/vant/overlay/index.json
-
8lib/vant/overlay/index.wxml
-
1lib/vant/overlay/index.wxss
-
1lib/vant/popup/index.d.ts
-
80lib/vant/popup/index.js
-
7lib/vant/popup/index.json
-
24lib/vant/popup/index.wxml
-
1lib/vant/popup/index.wxss
-
1lib/vant/transition/index.d.ts
-
13lib/vant/transition/index.js
-
3lib/vant/transition/index.json
-
8lib/vant/transition/index.wxml
-
1lib/vant/transition/index.wxss
-
5lib/vant/wxs/array.wxs
-
38lib/vant/wxs/bem.wxs
-
54lib/vant/wxs/memoize.wxs
-
13lib/vant/wxs/object.wxs
-
7lib/vant/wxs/utils.wxs
-
127pages/merchant-login/merchant-login.js
-
6pages/merchant-login/merchant-login.json
-
2pages/merchant-login/merchant-login.wxml
-
4pages/merchant-login/merchant-login.wxss
-
55project.config.json
-
9project.private.config.json
-
7sitemap.json
-
4tpl/image.wxml
-
4tpl/netError/netError.wxml
-
82tpl/timeUtil.wxs
-
16utils.js
-
406utils/CurvePainter.js
-
113utils/checkinUtil.js
-
4utils/city.js
-
1utils/countryList.js
-
78utils/date.js
-
135utils/lib/crypto1/base64.js
-
281utils/lib/crypto1/crypto.js
-
1utils/lib/es6-promise.min.js
-
278utils/native.js
-
419utils/parseArea/address-parse.js
-
806utils/parseArea/area-list.js
-
94utils/parseArea/foramtProvince.js
-
13477utils/parseArea/zipCode.js
-
40utils/util.js
-
82utils/utils.js
-
292wxParse/html2json.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; |
||||
@ -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; |
||||
@ -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, |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
|
||||
|
}); |
||||
@ -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" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -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%; |
||||
|
} |
||||
@ -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; |
||||
@ -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> |
||||
@ -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; |
||||
|
} |
||||
@ -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> |
||||
@ -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> |
||||
@ -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
File diff suppressed because it is too large
View File
@ -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"; |
||||
@ -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'; |
||||
@ -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 }; |
||||
@ -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 }; |
||||
@ -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} |
||||
@ -0,0 +1 @@ |
|||||
|
.van-clearfix:after{display:table;clear:both;content:""} |
||||
@ -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} |
||||
@ -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,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; |
||||
@ -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; |
||||
|
} |
||||
@ -0,0 +1 @@ |
|||||
|
export {}; |
||||
@ -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) |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,6 @@ |
|||||
|
{ |
||||
|
"component": true, |
||||
|
"usingComponents": { |
||||
|
"van-info": "../info/index" |
||||
|
} |
||||
|
} |
||||
@ -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
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||||
|
export {}; |
||||
@ -0,0 +1,8 @@ |
|||||
|
import { VantComponent } from '../common/component'; |
||||
|
VantComponent({ |
||||
|
props: { |
||||
|
dot: Boolean, |
||||
|
info: null, |
||||
|
customStyle: String |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"component": true |
||||
|
} |
||||
@ -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> |
||||
@ -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)} |
||||
@ -0,0 +1 @@ |
|||||
|
export declare const basic: string; |
||||
@ -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(); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1 @@ |
|||||
|
export declare const button: string; |
||||
@ -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 |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1 @@ |
|||||
|
export declare const link: string; |
||||
@ -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 }); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1 @@ |
|||||
|
export declare const behavior: string; |
||||
@ -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(); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1 @@ |
|||||
|
export declare function observe(vantOptions: any, options: any): void; |
||||
@ -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; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1 @@ |
|||||
|
export declare const openType: string; |
||||
@ -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); |
||||
|
}, |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1 @@ |
|||||
|
export declare const touch: string; |
||||
@ -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' |
||||
|
: ''; |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1 @@ |
|||||
|
export declare const transition: (showDefaultValue: boolean) => any; |
||||
@ -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 }); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
@ -0,0 +1 @@ |
|||||
|
export {}; |
||||
@ -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() { } |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,6 @@ |
|||||
|
{ |
||||
|
"component": true, |
||||
|
"usingComponents": { |
||||
|
"van-transition": "../transition/index" |
||||
|
} |
||||
|
} |
||||
@ -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" |
||||
|
/> |
||||
@ -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))} |
||||
@ -0,0 +1 @@ |
|||||
|
export {}; |
||||
@ -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); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,7 @@ |
|||||
|
{ |
||||
|
"component": true, |
||||
|
"usingComponents": { |
||||
|
"van-icon": "../icon/index", |
||||
|
"van-overlay": "../overlay/index" |
||||
|
} |
||||
|
} |
||||
@ -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> |
||||
@ -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)} |
||||
@ -0,0 +1 @@ |
|||||
|
export {}; |
||||
@ -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)] |
||||
|
}); |
||||
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"component": true |
||||
|
} |
||||
@ -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> |
||||
@ -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)} |
||||
@ -0,0 +1,5 @@ |
|||||
|
function isArray(array) { |
||||
|
return array && array.constructor === 'Array'; |
||||
|
} |
||||
|
|
||||
|
module.exports.isArray = isArray; |
||||
@ -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; |
||||
@ -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; |
||||
@ -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; |
||||
@ -0,0 +1,7 @@ |
|||||
|
var bem = require('./bem.wxs').bem; |
||||
|
var memoize = require('./memoize.wxs').memoize; |
||||
|
|
||||
|
module.exports = { |
||||
|
bem: memoize(bem), |
||||
|
memoize: memoize |
||||
|
}; |
||||
@ -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() { |
||||
|
|
||||
|
} |
||||
|
}) |
||||
@ -0,0 +1,6 @@ |
|||||
|
{ |
||||
|
"navigationBarTitleText": "商户登录", |
||||
|
"enablePullDownRefresh": false, |
||||
|
"navigationBarBackgroundColor": "#F52F3E", |
||||
|
"navigationBarTextStyle": "white" |
||||
|
} |
||||
@ -0,0 +1,2 @@ |
|||||
|
<view class="page-bg"> |
||||
|
</view> |
||||
@ -0,0 +1,4 @@ |
|||||
|
page{ |
||||
|
background: #f7f7f7; |
||||
|
} |
||||
|
|
||||
@ -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": {} |
||||
|
} |
||||
@ -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 |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
{ |
||||
|
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", |
||||
|
"rules": [{ |
||||
|
"action": "allow", |
||||
|
"page": "*" |
||||
|
}] |
||||
|
} |
||||
@ -0,0 +1,4 @@ |
|||||
|
<!-- 所有图片组件 --> |
||||
|
<template name="image"> |
||||
|
<image class="{{style}}" src="{{src}}" mode="{{mode||'scaleToFill'}}" bindtap="{{bindtap||''}}" id="{{id||''}}"></image> |
||||
|
</template> |
||||
@ -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> |
||||
@ -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 |
||||
|
}; |
||||
@ -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; |
||||
@ -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; |
||||
@ -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
File diff suppressed because it is too large
View File
1
utils/countryList.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -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, |
||||
|
}; |
||||
@ -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; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -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
File diff suppressed because it is too large
View File
@ -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 ) |
||||
|
} |
||||
|
}) |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -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}; |
||||
@ -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" |
||||
|
}] |
||||
@ -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
File diff suppressed because it is too large
View File
@ -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 |
||||
|
}; |
||||
@ -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 |
||||
|
} |
||||
@ -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
Write
Preview
Loading…
Cancel
Save
Reference in new issue