(y08oV#7twy*zC;>v4c zeydq^M{n83SM#z0s~P(`jQ%Lc9o}rwC;scUhRlJQjj_7NDr-6lS&MJGY~LDP@aGKd*T)De7VN93kB&g?n`GdF_{c``FBH$;8v|7bU$t5VxmazgunFti}D4 + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-article.vue b/mallplusui-uniapp-app2/components/jshop/jshop-article.vue new file mode 100644 index 0000000..a3a7716 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-article.vue @@ -0,0 +1,82 @@ + ++ ++ ++ + ++ + + ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-articleClassify.vue b/mallplusui-uniapp-app2/components/jshop/jshop-articleClassify.vue new file mode 100644 index 0000000..a8b4e25 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-articleClassify.vue @@ -0,0 +1,82 @@ + ++ + ++ ++ {{ item.title }} + ++ {{ item.ctime }} + ++ ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-blank.vue b/mallplusui-uniapp-app2/components/jshop/jshop-blank.vue new file mode 100644 index 0000000..d396c32 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-blank.vue @@ -0,0 +1,21 @@ + ++ ++ + ++ {{ item.title }} + ++ {{ item.ctime }} + ++ ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-content.vue b/mallplusui-uniapp-app2/components/jshop/jshop-content.vue new file mode 100644 index 0000000..252b277 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-content.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-coupon.vue b/mallplusui-uniapp-app2/components/jshop/jshop-coupon.vue new file mode 100644 index 0000000..de585f8 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-coupon.vue @@ -0,0 +1,101 @@ + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-goods.vue b/mallplusui-uniapp-app2/components/jshop/jshop-goods.vue new file mode 100644 index 0000000..f999cde --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-goods.vue @@ -0,0 +1,604 @@ + ++ ++ ++ ++ {{ item.name }} ++ {{ item.expression1 + item.expression2 }} + ++ ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-groupPurchase.vue b/mallplusui-uniapp-app2/components/jshop/jshop-groupPurchase.vue new file mode 100644 index 0000000..4eb18fb --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-groupPurchase.vue @@ -0,0 +1,132 @@ + + ++ + ++ + +新品上市 +Guess You Like It ++ + ++ + ++ {{ item.title }} +¥{{ item.price }} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-imgSingle.vue b/mallplusui-uniapp-app2/components/jshop/jshop-imgSingle.vue new file mode 100644 index 0000000..d2a0a6d --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-imgSingle.vue @@ -0,0 +1,189 @@ + + ++ ++ {{jdata.params.title}} + + ++ ++ ++ ++ + +{{item.goods.name}} ++ +¥{{item.goods.product.price}} ++ +剩余: ++ 已结束 +即将开始 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-imgSlide.vue b/mallplusui-uniapp-app2/components/jshop/jshop-imgSlide.vue new file mode 100644 index 0000000..ebe3a00 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-imgSlide.vue @@ -0,0 +1,667 @@ + + + + ++ + ++ + + ++ + + + + ++ + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-imgWindow.vue b/mallplusui-uniapp-app2/components/jshop/jshop-imgWindow.vue new file mode 100644 index 0000000..561984a --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-imgWindow.vue @@ -0,0 +1,207 @@ + ++ + + + ++ + + + + ++ ++ + +{{ swiperCurrent + 1 }} +/ +{{ jdata.options.colorGroup.length }} ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-navBar.vue b/mallplusui-uniapp-app2/components/jshop/jshop-navBar.vue new file mode 100644 index 0000000..7de5d13 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-navBar.vue @@ -0,0 +1,616 @@ + ++ ++ + ++ ++ + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-notice.vue b/mallplusui-uniapp-app2/components/jshop/jshop-notice.vue new file mode 100644 index 0000000..20031a6 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-notice.vue @@ -0,0 +1,69 @@ + ++ ++ + ++ {{item.tabs}} ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-onegoods.vue b/mallplusui-uniapp-app2/components/jshop/jshop-onegoods.vue new file mode 100644 index 0000000..a0c8e47 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-onegoods.vue @@ -0,0 +1,150 @@ + ++ ++ + ++ +{{ item.title }} ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-pintuan.vue b/mallplusui-uniapp-app2/components/jshop/jshop-pintuan.vue new file mode 100644 index 0000000..539d2c5 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-pintuan.vue @@ -0,0 +1,83 @@ + + ++ + + ++ ++ +{{jdata.name}} ++ ++ +查看更多 ++ + ++ ++ + ++ {{item.title}} + ++ +¥{{item.price}} ++ +{{item.comments_count}}条评论 +暂无评论 ++ + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-record.vue b/mallplusui-uniapp-app2/components/jshop/jshop-record.vue new file mode 100644 index 0000000..c4b9cd8 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-record.vue @@ -0,0 +1,187 @@ + ++ ++ {{jdata.params.title}} + ++ ++ ++ ++ + +{{item.goods_name}} ++ +¥{{item.pintuan_price}} ++ +剩余: +已结束 +即将开团 + ++ + + + + + + \ No newline at end of file diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-search.vue b/mallplusui-uniapp-app2/components/jshop/jshop-search.vue new file mode 100644 index 0000000..5de1b84 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-search.vue @@ -0,0 +1,118 @@ + ++ ++ ++ + {{log.nickname}} + ++ {{log.ctime}}{{log.desc}} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-slidegoods.vue b/mallplusui-uniapp-app2/components/jshop/jshop-slidegoods.vue new file mode 100644 index 0000000..09a2c8e --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-slidegoods.vue @@ -0,0 +1,614 @@ + ++ + ++ ++ ++ {{jdata.options.search_tips}} + ++ + ++ ++ ++ {{jdata.options.search_tips}} + ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-tabbar.vue b/mallplusui-uniapp-app2/components/jshop/jshop-tabbar.vue new file mode 100644 index 0000000..50a3080 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-tabbar.vue @@ -0,0 +1,163 @@ + ++ ++ + +精品团购 +Boutique Group Buying ++ + ++ ++ ++ ++ + +{{ item.title }} ++ +{{ item.price }} +¥{{ item.price }} ++ ++ {{ item.maxPeople }}人成团 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-textarea.vue b/mallplusui-uniapp-app2/components/jshop/jshop-textarea.vue new file mode 100644 index 0000000..d161d11 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-textarea.vue @@ -0,0 +1,59 @@ + ++ + ++ ++ {{item.text}} + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop-video.vue b/mallplusui-uniapp-app2/components/jshop/jshop-video.vue new file mode 100644 index 0000000..0e8f70e --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop-video.vue @@ -0,0 +1,30 @@ + ++ ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/components/jshop/jshop.vue b/mallplusui-uniapp-app2/components/jshop/jshop.vue new file mode 100644 index 0000000..cb536b6 --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/jshop.vue @@ -0,0 +1,88 @@ + ++ + + + diff --git a/mallplusui-uniapp-app2/components/jshop/test b/mallplusui-uniapp-app2/components/jshop/test new file mode 100644 index 0000000..f9d611c --- /dev/null +++ b/mallplusui-uniapp-app2/components/jshop/test @@ -0,0 +1,284 @@ + ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/likes/likes.vue b/mallplusui-uniapp-app2/components/likes/likes.vue new file mode 100644 index 0000000..3b35e05 --- /dev/null +++ b/mallplusui-uniapp-app2/components/likes/likes.vue @@ -0,0 +1,71 @@ + ++ + + ++ + ++ +{{jdata.params.title}} ++ ++ + +查看更多 ++ + + ++ ++ + ++ {{item.name}} + ++ +¥{{item.price}} ++ + + ++ ++ + ++ + ++ + ++ + ++ + ++ + ++ + ++ + ++ + + + ++ ++ +{{jdata.params.title}} ++ ++ + +查看更多 ++ + ++ ++ + ++ {{item.name}} + ++ +¥{{item.price}} ++ +{{item.comments_count}}条评论 +暂无评论 ++ + ++ + ++ ++ +{{jdata.params.title}} ++ ++ + +查看更多 ++ + ++ ++ ++ + ++ {{ item.name|substr }} + ++ +¥{{ item.price }} ++ ++ ++ ++ + ++ + ++ + ++ + ++ + ++ + ++ + ++ + ++ + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/mall-copyright/mallplusCopyright.vue b/mallplusui-uniapp-app2/components/mall-copyright/mallplusCopyright.vue new file mode 100644 index 0000000..667d793 --- /dev/null +++ b/mallplusui-uniapp-app2/components/mall-copyright/mallplusCopyright.vue @@ -0,0 +1,36 @@ + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/mehaotian-search-revision/mehaotian-search-revision.vue b/mallplusui-uniapp-app2/components/mehaotian-search-revision/mehaotian-search-revision.vue new file mode 100644 index 0000000..39b22f9 --- /dev/null +++ b/mallplusui-uniapp-app2/components/mehaotian-search-revision/mehaotian-search-revision.vue @@ -0,0 +1,223 @@ + ++ {{sysInfo.company}} © {{sysInfo.subdomain}} 版权所有 + ++ +冀ICP备10002647号-11 ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/mix-list-cell.vue b/mallplusui-uniapp-app2/components/mix-list-cell.vue new file mode 100644 index 0000000..a60259c --- /dev/null +++ b/mallplusui-uniapp-app2/components/mix-list-cell.vue @@ -0,0 +1,119 @@ + ++ + ++ ++ + + + + + + 搜索 + ++ +{{!show?searchName:'搜索'}} ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/mix-loading/mix-loading.vue b/mallplusui-uniapp-app2/components/mix-loading/mix-loading.vue new file mode 100644 index 0000000..3c38afe --- /dev/null +++ b/mallplusui-uniapp-app2/components/mix-loading/mix-loading.vue @@ -0,0 +1,68 @@ + + ++ + ++ {{title}} +{{tips}} ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/area.js b/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/area.js new file mode 100644 index 0000000..92dfc30 --- /dev/null +++ b/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/area.js @@ -0,0 +1,12542 @@ +/* eslint-disable */ +var areaData = [ + [ + [{ + "label": "东城区", + "value": "110101" + }, + { + "label": "西城区", + "value": "110102" + }, + { + "label": "朝阳区", + "value": "110105" + }, + { + "label": "丰台区", + "value": "110106" + }, + { + "label": "石景山区", + "value": "110107" + }, + { + "label": "海淀区", + "value": "110108" + }, + { + "label": "门头沟区", + "value": "110109" + }, + { + "label": "房山区", + "value": "110111" + }, + { + "label": "通州区", + "value": "110112" + }, + { + "label": "顺义区", + "value": "110113" + }, + { + "label": "昌平区", + "value": "110114" + }, + { + "label": "大兴区", + "value": "110115" + }, + { + "label": "怀柔区", + "value": "110116" + }, + { + "label": "平谷区", + "value": "110117" + }, + { + "label": "密云区", + "value": "110118" + }, + { + "label": "延庆区", + "value": "110119" + } + ] + ], + [ + [{ + "label": "和平区", + "value": "120101" + }, + { + "label": "河东区", + "value": "120102" + }, + { + "label": "河西区", + "value": "120103" + }, + { + "label": "南开区", + "value": "120104" + }, + { + "label": "河北区", + "value": "120105" + }, + { + "label": "红桥区", + "value": "120106" + }, + { + "label": "东丽区", + "value": "120110" + }, + { + "label": "西青区", + "value": "120111" + }, + { + "label": "津南区", + "value": "120112" + }, + { + "label": "北辰区", + "value": "120113" + }, + { + "label": "武清区", + "value": "120114" + }, + { + "label": "宝坻区", + "value": "120115" + }, + { + "label": "滨海新区", + "value": "120116" + }, + { + "label": "宁河区", + "value": "120117" + }, + { + "label": "静海区", + "value": "120118" + }, + { + "label": "蓟州区", + "value": "120119" + } + ] + ], + [ + [{ + "label": "长安区", + "value": "130102" + }, + { + "label": "桥西区", + "value": "130104" + }, + { + "label": "新华区", + "value": "130105" + }, + { + "label": "井陉矿区", + "value": "130107" + }, + { + "label": "裕华区", + "value": "130108" + }, + { + "label": "藁城区", + "value": "130109" + }, + { + "label": "鹿泉区", + "value": "130110" + }, + { + "label": "栾城区", + "value": "130111" + }, + { + "label": "井陉县", + "value": "130121" + }, + { + "label": "正定县", + "value": "130123" + }, + { + "label": "行唐县", + "value": "130125" + }, + { + "label": "灵寿县", + "value": "130126" + }, + { + "label": "高邑县", + "value": "130127" + }, + { + "label": "深泽县", + "value": "130128" + }, + { + "label": "赞皇县", + "value": "130129" + }, + { + "label": "无极县", + "value": "130130" + }, + { + "label": "平山县", + "value": "130131" + }, + { + "label": "元氏县", + "value": "130132" + }, + { + "label": "赵县", + "value": "130133" + }, + { + "label": "石家庄高新技术产业开发区", + "value": "130171" + }, + { + "label": "石家庄循环化工园区", + "value": "130172" + }, + { + "label": "辛集市", + "value": "130181" + }, + { + "label": "晋州市", + "value": "130183" + }, + { + "label": "新乐市", + "value": "130184" + } + ], + [{ + "label": "路南区", + "value": "130202" + }, + { + "label": "路北区", + "value": "130203" + }, + { + "label": "古冶区", + "value": "130204" + }, + { + "label": "开平区", + "value": "130205" + }, + { + "label": "丰南区", + "value": "130207" + }, + { + "label": "丰润区", + "value": "130208" + }, + { + "label": "曹妃甸区", + "value": "130209" + }, + { + "label": "滦县", + "value": "130223" + }, + { + "label": "滦南县", + "value": "130224" + }, + { + "label": "乐亭县", + "value": "130225" + }, + { + "label": "迁西县", + "value": "130227" + }, + { + "label": "玉田县", + "value": "130229" + }, + { + "label": "唐山市芦台经济技术开发区", + "value": "130271" + }, + { + "label": "唐山市汉沽管理区", + "value": "130272" + }, + { + "label": "唐山高新技术产业开发区", + "value": "130273" + }, + { + "label": "河北唐山海港经济开发区", + "value": "130274" + }, + { + "label": "遵化市", + "value": "130281" + }, + { + "label": "迁安市", + "value": "130283" + } + ], + [{ + "label": "海港区", + "value": "130302" + }, + { + "label": "山海关区", + "value": "130303" + }, + { + "label": "北戴河区", + "value": "130304" + }, + { + "label": "抚宁区", + "value": "130306" + }, + { + "label": "青龙满族自治县", + "value": "130321" + }, + { + "label": "昌黎县", + "value": "130322" + }, + { + "label": "卢龙县", + "value": "130324" + }, + { + "label": "秦皇岛市经济技术开发区", + "value": "130371" + }, + { + "label": "北戴河新区", + "value": "130372" + } + ], + [{ + "label": "邯山区", + "value": "130402" + }, + { + "label": "丛台区", + "value": "130403" + }, + { + "label": "复兴区", + "value": "130404" + }, + { + "label": "峰峰矿区", + "value": "130406" + }, + { + "label": "肥乡区", + "value": "130407" + }, + { + "label": "永年区", + "value": "130408" + }, + { + "label": "临漳县", + "value": "130423" + }, + { + "label": "成安县", + "value": "130424" + }, + { + "label": "大名县", + "value": "130425" + }, + { + "label": "涉县", + "value": "130426" + }, + { + "label": "磁县", + "value": "130427" + }, + { + "label": "邱县", + "value": "130430" + }, + { + "label": "鸡泽县", + "value": "130431" + }, + { + "label": "广平县", + "value": "130432" + }, + { + "label": "馆陶县", + "value": "130433" + }, + { + "label": "魏县", + "value": "130434" + }, + { + "label": "曲周县", + "value": "130435" + }, + { + "label": "邯郸经济技术开发区", + "value": "130471" + }, + { + "label": "邯郸冀南新区", + "value": "130473" + }, + { + "label": "武安市", + "value": "130481" + } + ], + [{ + "label": "桥东区", + "value": "130502" + }, + { + "label": "桥西区", + "value": "130503" + }, + { + "label": "邢台县", + "value": "130521" + }, + { + "label": "临城县", + "value": "130522" + }, + { + "label": "内丘县", + "value": "130523" + }, + { + "label": "柏乡县", + "value": "130524" + }, + { + "label": "隆尧县", + "value": "130525" + }, + { + "label": "任县", + "value": "130526" + }, + { + "label": "南和县", + "value": "130527" + }, + { + "label": "宁晋县", + "value": "130528" + }, + { + "label": "巨鹿县", + "value": "130529" + }, + { + "label": "新河县", + "value": "130530" + }, + { + "label": "广宗县", + "value": "130531" + }, + { + "label": "平乡县", + "value": "130532" + }, + { + "label": "威县", + "value": "130533" + }, + { + "label": "清河县", + "value": "130534" + }, + { + "label": "临西县", + "value": "130535" + }, + { + "label": "河北邢台经济开发区", + "value": "130571" + }, + { + "label": "南宫市", + "value": "130581" + }, + { + "label": "沙河市", + "value": "130582" + } + ], + [{ + "label": "竞秀区", + "value": "130602" + }, + { + "label": "莲池区", + "value": "130606" + }, + { + "label": "满城区", + "value": "130607" + }, + { + "label": "清苑区", + "value": "130608" + }, + { + "label": "徐水区", + "value": "130609" + }, + { + "label": "涞水县", + "value": "130623" + }, + { + "label": "阜平县", + "value": "130624" + }, + { + "label": "定兴县", + "value": "130626" + }, + { + "label": "唐县", + "value": "130627" + }, + { + "label": "高阳县", + "value": "130628" + }, + { + "label": "容城县", + "value": "130629" + }, + { + "label": "涞源县", + "value": "130630" + }, + { + "label": "望都县", + "value": "130631" + }, + { + "label": "安新县", + "value": "130632" + }, + { + "label": "易县", + "value": "130633" + }, + { + "label": "曲阳县", + "value": "130634" + }, + { + "label": "蠡县", + "value": "130635" + }, + { + "label": "顺平县", + "value": "130636" + }, + { + "label": "博野县", + "value": "130637" + }, + { + "label": "雄县", + "value": "130638" + }, + { + "label": "保定高新技术产业开发区", + "value": "130671" + }, + { + "label": "保定白沟新城", + "value": "130672" + }, + { + "label": "涿州市", + "value": "130681" + }, + { + "label": "定州市", + "value": "130682" + }, + { + "label": "安国市", + "value": "130683" + }, + { + "label": "高碑店市", + "value": "130684" + } + ], + [{ + "label": "桥东区", + "value": "130702" + }, + { + "label": "桥西区", + "value": "130703" + }, + { + "label": "宣化区", + "value": "130705" + }, + { + "label": "下花园区", + "value": "130706" + }, + { + "label": "万全区", + "value": "130708" + }, + { + "label": "崇礼区", + "value": "130709" + }, + { + "label": "张北县", + "value": "130722" + }, + { + "label": "康保县", + "value": "130723" + }, + { + "label": "沽源县", + "value": "130724" + }, + { + "label": "尚义县", + "value": "130725" + }, + { + "label": "蔚县", + "value": "130726" + }, + { + "label": "阳原县", + "value": "130727" + }, + { + "label": "怀安县", + "value": "130728" + }, + { + "label": "怀来县", + "value": "130730" + }, + { + "label": "涿鹿县", + "value": "130731" + }, + { + "label": "赤城县", + "value": "130732" + }, + { + "label": "张家口市高新技术产业开发区", + "value": "130771" + }, + { + "label": "张家口市察北管理区", + "value": "130772" + }, + { + "label": "张家口市塞北管理区", + "value": "130773" + } + ], + [{ + "label": "双桥区", + "value": "130802" + }, + { + "label": "双滦区", + "value": "130803" + }, + { + "label": "鹰手营子矿区", + "value": "130804" + }, + { + "label": "承德县", + "value": "130821" + }, + { + "label": "兴隆县", + "value": "130822" + }, + { + "label": "滦平县", + "value": "130824" + }, + { + "label": "隆化县", + "value": "130825" + }, + { + "label": "丰宁满族自治县", + "value": "130826" + }, + { + "label": "宽城满族自治县", + "value": "130827" + }, + { + "label": "围场满族蒙古族自治县", + "value": "130828" + }, + { + "label": "承德高新技术产业开发区", + "value": "130871" + }, + { + "label": "平泉市", + "value": "130881" + } + ], + [{ + "label": "新华区", + "value": "130902" + }, + { + "label": "运河区", + "value": "130903" + }, + { + "label": "沧县", + "value": "130921" + }, + { + "label": "青县", + "value": "130922" + }, + { + "label": "东光县", + "value": "130923" + }, + { + "label": "海兴县", + "value": "130924" + }, + { + "label": "盐山县", + "value": "130925" + }, + { + "label": "肃宁县", + "value": "130926" + }, + { + "label": "南皮县", + "value": "130927" + }, + { + "label": "吴桥县", + "value": "130928" + }, + { + "label": "献县", + "value": "130929" + }, + { + "label": "孟村回族自治县", + "value": "130930" + }, + { + "label": "河北沧州经济开发区", + "value": "130971" + }, + { + "label": "沧州高新技术产业开发区", + "value": "130972" + }, + { + "label": "沧州渤海新区", + "value": "130973" + }, + { + "label": "泊头市", + "value": "130981" + }, + { + "label": "任丘市", + "value": "130982" + }, + { + "label": "黄骅市", + "value": "130983" + }, + { + "label": "河间市", + "value": "130984" + } + ], + [{ + "label": "安次区", + "value": "131002" + }, + { + "label": "广阳区", + "value": "131003" + }, + { + "label": "固安县", + "value": "131022" + }, + { + "label": "永清县", + "value": "131023" + }, + { + "label": "香河县", + "value": "131024" + }, + { + "label": "大城县", + "value": "131025" + }, + { + "label": "文安县", + "value": "131026" + }, + { + "label": "大厂回族自治县", + "value": "131028" + }, + { + "label": "廊坊经济技术开发区", + "value": "131071" + }, + { + "label": "霸州市", + "value": "131081" + }, + { + "label": "三河市", + "value": "131082" + } + ], + [{ + "label": "桃城区", + "value": "131102" + }, + { + "label": "冀州区", + "value": "131103" + }, + { + "label": "枣强县", + "value": "131121" + }, + { + "label": "武邑县", + "value": "131122" + }, + { + "label": "武强县", + "value": "131123" + }, + { + "label": "饶阳县", + "value": "131124" + }, + { + "label": "安平县", + "value": "131125" + }, + { + "label": "故城县", + "value": "131126" + }, + { + "label": "景县", + "value": "131127" + }, + { + "label": "阜城县", + "value": "131128" + }, + { + "label": "河北衡水经济开发区", + "value": "131171" + }, + { + "label": "衡水滨湖新区", + "value": "131172" + }, + { + "label": "深州市", + "value": "131182" + } + ] + ], + [ + [{ + "label": "小店区", + "value": "140105" + }, + { + "label": "迎泽区", + "value": "140106" + }, + { + "label": "杏花岭区", + "value": "140107" + }, + { + "label": "尖草坪区", + "value": "140108" + }, + { + "label": "万柏林区", + "value": "140109" + }, + { + "label": "晋源区", + "value": "140110" + }, + { + "label": "清徐县", + "value": "140121" + }, + { + "label": "阳曲县", + "value": "140122" + }, + { + "label": "娄烦县", + "value": "140123" + }, + { + "label": "山西转型综合改革示范区", + "value": "140171" + }, + { + "label": "古交市", + "value": "140181" + } + ], + [{ + "label": "城区", + "value": "140202" + }, + { + "label": "矿区", + "value": "140203" + }, + { + "label": "南郊区", + "value": "140211" + }, + { + "label": "新荣区", + "value": "140212" + }, + { + "label": "阳高县", + "value": "140221" + }, + { + "label": "天镇县", + "value": "140222" + }, + { + "label": "广灵县", + "value": "140223" + }, + { + "label": "灵丘县", + "value": "140224" + }, + { + "label": "浑源县", + "value": "140225" + }, + { + "label": "左云县", + "value": "140226" + }, + { + "label": "大同县", + "value": "140227" + }, + { + "label": "山西大同经济开发区", + "value": "140271" + } + ], + [{ + "label": "城区", + "value": "140302" + }, + { + "label": "矿区", + "value": "140303" + }, + { + "label": "郊区", + "value": "140311" + }, + { + "label": "平定县", + "value": "140321" + }, + { + "label": "盂县", + "value": "140322" + }, + { + "label": "山西阳泉经济开发区", + "value": "140371" + } + ], + [{ + "label": "城区", + "value": "140402" + }, + { + "label": "郊区", + "value": "140411" + }, + { + "label": "长治县", + "value": "140421" + }, + { + "label": "襄垣县", + "value": "140423" + }, + { + "label": "屯留县", + "value": "140424" + }, + { + "label": "平顺县", + "value": "140425" + }, + { + "label": "黎城县", + "value": "140426" + }, + { + "label": "壶关县", + "value": "140427" + }, + { + "label": "长子县", + "value": "140428" + }, + { + "label": "武乡县", + "value": "140429" + }, + { + "label": "沁县", + "value": "140430" + }, + { + "label": "沁源县", + "value": "140431" + }, + { + "label": "山西长治高新技术产业园区", + "value": "140471" + }, + { + "label": "潞城市", + "value": "140481" + } + ], + [{ + "label": "城区", + "value": "140502" + }, + { + "label": "沁水县", + "value": "140521" + }, + { + "label": "阳城县", + "value": "140522" + }, + { + "label": "陵川县", + "value": "140524" + }, + { + "label": "泽州县", + "value": "140525" + }, + { + "label": "高平市", + "value": "140581" + } + ], + [{ + "label": "朔城区", + "value": "140602" + }, + { + "label": "平鲁区", + "value": "140603" + }, + { + "label": "山阴县", + "value": "140621" + }, + { + "label": "应县", + "value": "140622" + }, + { + "label": "右玉县", + "value": "140623" + }, + { + "label": "怀仁县", + "value": "140624" + }, + { + "label": "山西朔州经济开发区", + "value": "140671" + } + ], + [{ + "label": "榆次区", + "value": "140702" + }, + { + "label": "榆社县", + "value": "140721" + }, + { + "label": "左权县", + "value": "140722" + }, + { + "label": "和顺县", + "value": "140723" + }, + { + "label": "昔阳县", + "value": "140724" + }, + { + "label": "寿阳县", + "value": "140725" + }, + { + "label": "太谷县", + "value": "140726" + }, + { + "label": "祁县", + "value": "140727" + }, + { + "label": "平遥县", + "value": "140728" + }, + { + "label": "灵石县", + "value": "140729" + }, + { + "label": "介休市", + "value": "140781" + } + ], + [{ + "label": "盐湖区", + "value": "140802" + }, + { + "label": "临猗县", + "value": "140821" + }, + { + "label": "万荣县", + "value": "140822" + }, + { + "label": "闻喜县", + "value": "140823" + }, + { + "label": "稷山县", + "value": "140824" + }, + { + "label": "新绛县", + "value": "140825" + }, + { + "label": "绛县", + "value": "140826" + }, + { + "label": "垣曲县", + "value": "140827" + }, + { + "label": "夏县", + "value": "140828" + }, + { + "label": "平陆县", + "value": "140829" + }, + { + "label": "芮城县", + "value": "140830" + }, + { + "label": "永济市", + "value": "140881" + }, + { + "label": "河津市", + "value": "140882" + } + ], + [{ + "label": "忻府区", + "value": "140902" + }, + { + "label": "定襄县", + "value": "140921" + }, + { + "label": "五台县", + "value": "140922" + }, + { + "label": "代县", + "value": "140923" + }, + { + "label": "繁峙县", + "value": "140924" + }, + { + "label": "宁武县", + "value": "140925" + }, + { + "label": "静乐县", + "value": "140926" + }, + { + "label": "神池县", + "value": "140927" + }, + { + "label": "五寨县", + "value": "140928" + }, + { + "label": "岢岚县", + "value": "140929" + }, + { + "label": "河曲县", + "value": "140930" + }, + { + "label": "保德县", + "value": "140931" + }, + { + "label": "偏关县", + "value": "140932" + }, + { + "label": "五台山风景名胜区", + "value": "140971" + }, + { + "label": "原平市", + "value": "140981" + } + ], + [{ + "label": "尧都区", + "value": "141002" + }, + { + "label": "曲沃县", + "value": "141021" + }, + { + "label": "翼城县", + "value": "141022" + }, + { + "label": "襄汾县", + "value": "141023" + }, + { + "label": "洪洞县", + "value": "141024" + }, + { + "label": "古县", + "value": "141025" + }, + { + "label": "安泽县", + "value": "141026" + }, + { + "label": "浮山县", + "value": "141027" + }, + { + "label": "吉县", + "value": "141028" + }, + { + "label": "乡宁县", + "value": "141029" + }, + { + "label": "大宁县", + "value": "141030" + }, + { + "label": "隰县", + "value": "141031" + }, + { + "label": "永和县", + "value": "141032" + }, + { + "label": "蒲县", + "value": "141033" + }, + { + "label": "汾西县", + "value": "141034" + }, + { + "label": "侯马市", + "value": "141081" + }, + { + "label": "霍州市", + "value": "141082" + } + ], + [{ + "label": "离石区", + "value": "141102" + }, + { + "label": "文水县", + "value": "141121" + }, + { + "label": "交城县", + "value": "141122" + }, + { + "label": "兴县", + "value": "141123" + }, + { + "label": "临县", + "value": "141124" + }, + { + "label": "柳林县", + "value": "141125" + }, + { + "label": "石楼县", + "value": "141126" + }, + { + "label": "岚县", + "value": "141127" + }, + { + "label": "方山县", + "value": "141128" + }, + { + "label": "中阳县", + "value": "141129" + }, + { + "label": "交口县", + "value": "141130" + }, + { + "label": "孝义市", + "value": "141181" + }, + { + "label": "汾阳市", + "value": "141182" + } + ] + ], + [ + [{ + "label": "新城区", + "value": "150102" + }, + { + "label": "回民区", + "value": "150103" + }, + { + "label": "玉泉区", + "value": "150104" + }, + { + "label": "赛罕区", + "value": "150105" + }, + { + "label": "土默特左旗", + "value": "150121" + }, + { + "label": "托克托县", + "value": "150122" + }, + { + "label": "和林格尔县", + "value": "150123" + }, + { + "label": "清水河县", + "value": "150124" + }, + { + "label": "武川县", + "value": "150125" + }, + { + "label": "呼和浩特金海工业园区", + "value": "150171" + }, + { + "label": "呼和浩特经济技术开发区", + "value": "150172" + } + ], + [{ + "label": "东河区", + "value": "150202" + }, + { + "label": "昆都仑区", + "value": "150203" + }, + { + "label": "青山区", + "value": "150204" + }, + { + "label": "石拐区", + "value": "150205" + }, + { + "label": "白云鄂博矿区", + "value": "150206" + }, + { + "label": "九原区", + "value": "150207" + }, + { + "label": "土默特右旗", + "value": "150221" + }, + { + "label": "固阳县", + "value": "150222" + }, + { + "label": "达尔罕茂明安联合旗", + "value": "150223" + }, + { + "label": "包头稀土高新技术产业开发区", + "value": "150271" + } + ], + [{ + "label": "海勃湾区", + "value": "150302" + }, + { + "label": "海南区", + "value": "150303" + }, + { + "label": "乌达区", + "value": "150304" + } + ], + [{ + "label": "红山区", + "value": "150402" + }, + { + "label": "元宝山区", + "value": "150403" + }, + { + "label": "松山区", + "value": "150404" + }, + { + "label": "阿鲁科尔沁旗", + "value": "150421" + }, + { + "label": "巴林左旗", + "value": "150422" + }, + { + "label": "巴林右旗", + "value": "150423" + }, + { + "label": "林西县", + "value": "150424" + }, + { + "label": "克什克腾旗", + "value": "150425" + }, + { + "label": "翁牛特旗", + "value": "150426" + }, + { + "label": "喀喇沁旗", + "value": "150428" + }, + { + "label": "宁城县", + "value": "150429" + }, + { + "label": "敖汉旗", + "value": "150430" + } + ], + [{ + "label": "科尔沁区", + "value": "150502" + }, + { + "label": "科尔沁左翼中旗", + "value": "150521" + }, + { + "label": "科尔沁左翼后旗", + "value": "150522" + }, + { + "label": "开鲁县", + "value": "150523" + }, + { + "label": "库伦旗", + "value": "150524" + }, + { + "label": "奈曼旗", + "value": "150525" + }, + { + "label": "扎鲁特旗", + "value": "150526" + }, + { + "label": "通辽经济技术开发区", + "value": "150571" + }, + { + "label": "霍林郭勒市", + "value": "150581" + } + ], + [{ + "label": "东胜区", + "value": "150602" + }, + { + "label": "康巴什区", + "value": "150603" + }, + { + "label": "达拉特旗", + "value": "150621" + }, + { + "label": "准格尔旗", + "value": "150622" + }, + { + "label": "鄂托克前旗", + "value": "150623" + }, + { + "label": "鄂托克旗", + "value": "150624" + }, + { + "label": "杭锦旗", + "value": "150625" + }, + { + "label": "乌审旗", + "value": "150626" + }, + { + "label": "伊金霍洛旗", + "value": "150627" + } + ], + [{ + "label": "海拉尔区", + "value": "150702" + }, + { + "label": "扎赉诺尔区", + "value": "150703" + }, + { + "label": "阿荣旗", + "value": "150721" + }, + { + "label": "莫力达瓦达斡尔族自治旗", + "value": "150722" + }, + { + "label": "鄂伦春自治旗", + "value": "150723" + }, + { + "label": "鄂温克族自治旗", + "value": "150724" + }, + { + "label": "陈巴尔虎旗", + "value": "150725" + }, + { + "label": "新巴尔虎左旗", + "value": "150726" + }, + { + "label": "新巴尔虎右旗", + "value": "150727" + }, + { + "label": "满洲里市", + "value": "150781" + }, + { + "label": "牙克石市", + "value": "150782" + }, + { + "label": "扎兰屯市", + "value": "150783" + }, + { + "label": "额尔古纳市", + "value": "150784" + }, + { + "label": "根河市", + "value": "150785" + } + ], + [{ + "label": "临河区", + "value": "150802" + }, + { + "label": "五原县", + "value": "150821" + }, + { + "label": "磴口县", + "value": "150822" + }, + { + "label": "乌拉特前旗", + "value": "150823" + }, + { + "label": "乌拉特中旗", + "value": "150824" + }, + { + "label": "乌拉特后旗", + "value": "150825" + }, + { + "label": "杭锦后旗", + "value": "150826" + } + ], + [{ + "label": "集宁区", + "value": "150902" + }, + { + "label": "卓资县", + "value": "150921" + }, + { + "label": "化德县", + "value": "150922" + }, + { + "label": "商都县", + "value": "150923" + }, + { + "label": "兴和县", + "value": "150924" + }, + { + "label": "凉城县", + "value": "150925" + }, + { + "label": "察哈尔右翼前旗", + "value": "150926" + }, + { + "label": "察哈尔右翼中旗", + "value": "150927" + }, + { + "label": "察哈尔右翼后旗", + "value": "150928" + }, + { + "label": "四子王旗", + "value": "150929" + }, + { + "label": "丰镇市", + "value": "150981" + } + ], + [{ + "label": "乌兰浩特市", + "value": "152201" + }, + { + "label": "阿尔山市", + "value": "152202" + }, + { + "label": "科尔沁右翼前旗", + "value": "152221" + }, + { + "label": "科尔沁右翼中旗", + "value": "152222" + }, + { + "label": "扎赉特旗", + "value": "152223" + }, + { + "label": "突泉县", + "value": "152224" + } + ], + [{ + "label": "二连浩特市", + "value": "152501" + }, + { + "label": "锡林浩特市", + "value": "152502" + }, + { + "label": "阿巴嘎旗", + "value": "152522" + }, + { + "label": "苏尼特左旗", + "value": "152523" + }, + { + "label": "苏尼特右旗", + "value": "152524" + }, + { + "label": "东乌珠穆沁旗", + "value": "152525" + }, + { + "label": "西乌珠穆沁旗", + "value": "152526" + }, + { + "label": "太仆寺旗", + "value": "152527" + }, + { + "label": "镶黄旗", + "value": "152528" + }, + { + "label": "正镶白旗", + "value": "152529" + }, + { + "label": "正蓝旗", + "value": "152530" + }, + { + "label": "多伦县", + "value": "152531" + }, + { + "label": "乌拉盖管委会", + "value": "152571" + } + ], + [{ + "label": "阿拉善左旗", + "value": "152921" + }, + { + "label": "阿拉善右旗", + "value": "152922" + }, + { + "label": "额济纳旗", + "value": "152923" + }, + { + "label": "内蒙古阿拉善经济开发区", + "value": "152971" + } + ] + ], + [ + [{ + "label": "和平区", + "value": "210102" + }, + { + "label": "沈河区", + "value": "210103" + }, + { + "label": "大东区", + "value": "210104" + }, + { + "label": "皇姑区", + "value": "210105" + }, + { + "label": "铁西区", + "value": "210106" + }, + { + "label": "苏家屯区", + "value": "210111" + }, + { + "label": "浑南区", + "value": "210112" + }, + { + "label": "沈北新区", + "value": "210113" + }, + { + "label": "于洪区", + "value": "210114" + }, + { + "label": "辽中区", + "value": "210115" + }, + { + "label": "康平县", + "value": "210123" + }, + { + "label": "法库县", + "value": "210124" + }, + { + "label": "新民市", + "value": "210181" + } + ], + [{ + "label": "中山区", + "value": "210202" + }, + { + "label": "西岗区", + "value": "210203" + }, + { + "label": "沙河口区", + "value": "210204" + }, + { + "label": "甘井子区", + "value": "210211" + }, + { + "label": "旅顺口区", + "value": "210212" + }, + { + "label": "金州区", + "value": "210213" + }, + { + "label": "普兰店区", + "value": "210214" + }, + { + "label": "长海县", + "value": "210224" + }, + { + "label": "瓦房店市", + "value": "210281" + }, + { + "label": "庄河市", + "value": "210283" + } + ], + [{ + "label": "铁东区", + "value": "210302" + }, + { + "label": "铁西区", + "value": "210303" + }, + { + "label": "立山区", + "value": "210304" + }, + { + "label": "千山区", + "value": "210311" + }, + { + "label": "台安县", + "value": "210321" + }, + { + "label": "岫岩满族自治县", + "value": "210323" + }, + { + "label": "海城市", + "value": "210381" + } + ], + [{ + "label": "新抚区", + "value": "210402" + }, + { + "label": "东洲区", + "value": "210403" + }, + { + "label": "望花区", + "value": "210404" + }, + { + "label": "顺城区", + "value": "210411" + }, + { + "label": "抚顺县", + "value": "210421" + }, + { + "label": "新宾满族自治县", + "value": "210422" + }, + { + "label": "清原满族自治县", + "value": "210423" + } + ], + [{ + "label": "平山区", + "value": "210502" + }, + { + "label": "溪湖区", + "value": "210503" + }, + { + "label": "明山区", + "value": "210504" + }, + { + "label": "南芬区", + "value": "210505" + }, + { + "label": "本溪满族自治县", + "value": "210521" + }, + { + "label": "桓仁满族自治县", + "value": "210522" + } + ], + [{ + "label": "元宝区", + "value": "210602" + }, + { + "label": "振兴区", + "value": "210603" + }, + { + "label": "振安区", + "value": "210604" + }, + { + "label": "宽甸满族自治县", + "value": "210624" + }, + { + "label": "东港市", + "value": "210681" + }, + { + "label": "凤城市", + "value": "210682" + } + ], + [{ + "label": "古塔区", + "value": "210702" + }, + { + "label": "凌河区", + "value": "210703" + }, + { + "label": "太和区", + "value": "210711" + }, + { + "label": "黑山县", + "value": "210726" + }, + { + "label": "义县", + "value": "210727" + }, + { + "label": "凌海市", + "value": "210781" + }, + { + "label": "北镇市", + "value": "210782" + } + ], + [{ + "label": "站前区", + "value": "210802" + }, + { + "label": "西市区", + "value": "210803" + }, + { + "label": "鲅鱼圈区", + "value": "210804" + }, + { + "label": "老边区", + "value": "210811" + }, + { + "label": "盖州市", + "value": "210881" + }, + { + "label": "大石桥市", + "value": "210882" + } + ], + [{ + "label": "海州区", + "value": "210902" + }, + { + "label": "新邱区", + "value": "210903" + }, + { + "label": "太平区", + "value": "210904" + }, + { + "label": "清河门区", + "value": "210905" + }, + { + "label": "细河区", + "value": "210911" + }, + { + "label": "阜新蒙古族自治县", + "value": "210921" + }, + { + "label": "彰武县", + "value": "210922" + } + ], + [{ + "label": "白塔区", + "value": "211002" + }, + { + "label": "文圣区", + "value": "211003" + }, + { + "label": "宏伟区", + "value": "211004" + }, + { + "label": "弓长岭区", + "value": "211005" + }, + { + "label": "太子河区", + "value": "211011" + }, + { + "label": "辽阳县", + "value": "211021" + }, + { + "label": "灯塔市", + "value": "211081" + } + ], + [{ + "label": "双台子区", + "value": "211102" + }, + { + "label": "兴隆台区", + "value": "211103" + }, + { + "label": "大洼区", + "value": "211104" + }, + { + "label": "盘山县", + "value": "211122" + } + ], + [{ + "label": "银州区", + "value": "211202" + }, + { + "label": "清河区", + "value": "211204" + }, + { + "label": "铁岭县", + "value": "211221" + }, + { + "label": "西丰县", + "value": "211223" + }, + { + "label": "昌图县", + "value": "211224" + }, + { + "label": "调兵山市", + "value": "211281" + }, + { + "label": "开原市", + "value": "211282" + } + ], + [{ + "label": "双塔区", + "value": "211302" + }, + { + "label": "龙城区", + "value": "211303" + }, + { + "label": "朝阳县", + "value": "211321" + }, + { + "label": "建平县", + "value": "211322" + }, + { + "label": "喀喇沁左翼蒙古族自治县", + "value": "211324" + }, + { + "label": "北票市", + "value": "211381" + }, + { + "label": "凌源市", + "value": "211382" + } + ], + [{ + "label": "连山区", + "value": "211402" + }, + { + "label": "龙港区", + "value": "211403" + }, + { + "label": "南票区", + "value": "211404" + }, + { + "label": "绥中县", + "value": "211421" + }, + { + "label": "建昌县", + "value": "211422" + }, + { + "label": "兴城市", + "value": "211481" + } + ] + ], + [ + [{ + "label": "南关区", + "value": "220102" + }, + { + "label": "宽城区", + "value": "220103" + }, + { + "label": "朝阳区", + "value": "220104" + }, + { + "label": "二道区", + "value": "220105" + }, + { + "label": "绿园区", + "value": "220106" + }, + { + "label": "双阳区", + "value": "220112" + }, + { + "label": "九台区", + "value": "220113" + }, + { + "label": "农安县", + "value": "220122" + }, + { + "label": "长春经济技术开发区", + "value": "220171" + }, + { + "label": "长春净月高新技术产业开发区", + "value": "220172" + }, + { + "label": "长春高新技术产业开发区", + "value": "220173" + }, + { + "label": "长春汽车经济技术开发区", + "value": "220174" + }, + { + "label": "榆树市", + "value": "220182" + }, + { + "label": "德惠市", + "value": "220183" + } + ], + [{ + "label": "昌邑区", + "value": "220202" + }, + { + "label": "龙潭区", + "value": "220203" + }, + { + "label": "船营区", + "value": "220204" + }, + { + "label": "丰满区", + "value": "220211" + }, + { + "label": "永吉县", + "value": "220221" + }, + { + "label": "吉林经济开发区", + "value": "220271" + }, + { + "label": "吉林高新技术产业开发区", + "value": "220272" + }, + { + "label": "吉林中国新加坡食品区", + "value": "220273" + }, + { + "label": "蛟河市", + "value": "220281" + }, + { + "label": "桦甸市", + "value": "220282" + }, + { + "label": "舒兰市", + "value": "220283" + }, + { + "label": "磐石市", + "value": "220284" + } + ], + [{ + "label": "铁西区", + "value": "220302" + }, + { + "label": "铁东区", + "value": "220303" + }, + { + "label": "梨树县", + "value": "220322" + }, + { + "label": "伊通满族自治县", + "value": "220323" + }, + { + "label": "公主岭市", + "value": "220381" + }, + { + "label": "双辽市", + "value": "220382" + } + ], + [{ + "label": "龙山区", + "value": "220402" + }, + { + "label": "西安区", + "value": "220403" + }, + { + "label": "东丰县", + "value": "220421" + }, + { + "label": "东辽县", + "value": "220422" + } + ], + [{ + "label": "东昌区", + "value": "220502" + }, + { + "label": "二道江区", + "value": "220503" + }, + { + "label": "通化县", + "value": "220521" + }, + { + "label": "辉南县", + "value": "220523" + }, + { + "label": "柳河县", + "value": "220524" + }, + { + "label": "梅河口市", + "value": "220581" + }, + { + "label": "集安市", + "value": "220582" + } + ], + [{ + "label": "浑江区", + "value": "220602" + }, + { + "label": "江源区", + "value": "220605" + }, + { + "label": "抚松县", + "value": "220621" + }, + { + "label": "靖宇县", + "value": "220622" + }, + { + "label": "长白朝鲜族自治县", + "value": "220623" + }, + { + "label": "临江市", + "value": "220681" + } + ], + [{ + "label": "宁江区", + "value": "220702" + }, + { + "label": "前郭尔罗斯蒙古族自治县", + "value": "220721" + }, + { + "label": "长岭县", + "value": "220722" + }, + { + "label": "乾安县", + "value": "220723" + }, + { + "label": "吉林松原经济开发区", + "value": "220771" + }, + { + "label": "扶余市", + "value": "220781" + } + ], + [{ + "label": "洮北区", + "value": "220802" + }, + { + "label": "镇赉县", + "value": "220821" + }, + { + "label": "通榆县", + "value": "220822" + }, + { + "label": "吉林白城经济开发区", + "value": "220871" + }, + { + "label": "洮南市", + "value": "220881" + }, + { + "label": "大安市", + "value": "220882" + } + ], + [{ + "label": "延吉市", + "value": "222401" + }, + { + "label": "图们市", + "value": "222402" + }, + { + "label": "敦化市", + "value": "222403" + }, + { + "label": "珲春市", + "value": "222404" + }, + { + "label": "龙井市", + "value": "222405" + }, + { + "label": "和龙市", + "value": "222406" + }, + { + "label": "汪清县", + "value": "222424" + }, + { + "label": "安图县", + "value": "222426" + } + ] + ], + [ + [{ + "label": "道里区", + "value": "230102" + }, + { + "label": "南岗区", + "value": "230103" + }, + { + "label": "道外区", + "value": "230104" + }, + { + "label": "平房区", + "value": "230108" + }, + { + "label": "松北区", + "value": "230109" + }, + { + "label": "香坊区", + "value": "230110" + }, + { + "label": "呼兰区", + "value": "230111" + }, + { + "label": "阿城区", + "value": "230112" + }, + { + "label": "双城区", + "value": "230113" + }, + { + "label": "依兰县", + "value": "230123" + }, + { + "label": "方正县", + "value": "230124" + }, + { + "label": "宾县", + "value": "230125" + }, + { + "label": "巴彦县", + "value": "230126" + }, + { + "label": "木兰县", + "value": "230127" + }, + { + "label": "通河县", + "value": "230128" + }, + { + "label": "延寿县", + "value": "230129" + }, + { + "label": "尚志市", + "value": "230183" + }, + { + "label": "五常市", + "value": "230184" + } + ], + [{ + "label": "龙沙区", + "value": "230202" + }, + { + "label": "建华区", + "value": "230203" + }, + { + "label": "铁锋区", + "value": "230204" + }, + { + "label": "昂昂溪区", + "value": "230205" + }, + { + "label": "富拉尔基区", + "value": "230206" + }, + { + "label": "碾子山区", + "value": "230207" + }, + { + "label": "梅里斯达斡尔族区", + "value": "230208" + }, + { + "label": "龙江县", + "value": "230221" + }, + { + "label": "依安县", + "value": "230223" + }, + { + "label": "泰来县", + "value": "230224" + }, + { + "label": "甘南县", + "value": "230225" + }, + { + "label": "富裕县", + "value": "230227" + }, + { + "label": "克山县", + "value": "230229" + }, + { + "label": "克东县", + "value": "230230" + }, + { + "label": "拜泉县", + "value": "230231" + }, + { + "label": "讷河市", + "value": "230281" + } + ], + [{ + "label": "鸡冠区", + "value": "230302" + }, + { + "label": "恒山区", + "value": "230303" + }, + { + "label": "滴道区", + "value": "230304" + }, + { + "label": "梨树区", + "value": "230305" + }, + { + "label": "城子河区", + "value": "230306" + }, + { + "label": "麻山区", + "value": "230307" + }, + { + "label": "鸡东县", + "value": "230321" + }, + { + "label": "虎林市", + "value": "230381" + }, + { + "label": "密山市", + "value": "230382" + } + ], + [{ + "label": "向阳区", + "value": "230402" + }, + { + "label": "工农区", + "value": "230403" + }, + { + "label": "南山区", + "value": "230404" + }, + { + "label": "兴安区", + "value": "230405" + }, + { + "label": "东山区", + "value": "230406" + }, + { + "label": "兴山区", + "value": "230407" + }, + { + "label": "萝北县", + "value": "230421" + }, + { + "label": "绥滨县", + "value": "230422" + } + ], + [{ + "label": "尖山区", + "value": "230502" + }, + { + "label": "岭东区", + "value": "230503" + }, + { + "label": "四方台区", + "value": "230505" + }, + { + "label": "宝山区", + "value": "230506" + }, + { + "label": "集贤县", + "value": "230521" + }, + { + "label": "友谊县", + "value": "230522" + }, + { + "label": "宝清县", + "value": "230523" + }, + { + "label": "饶河县", + "value": "230524" + } + ], + [{ + "label": "萨尔图区", + "value": "230602" + }, + { + "label": "龙凤区", + "value": "230603" + }, + { + "label": "让胡路区", + "value": "230604" + }, + { + "label": "红岗区", + "value": "230605" + }, + { + "label": "大同区", + "value": "230606" + }, + { + "label": "肇州县", + "value": "230621" + }, + { + "label": "肇源县", + "value": "230622" + }, + { + "label": "林甸县", + "value": "230623" + }, + { + "label": "杜尔伯特蒙古族自治县", + "value": "230624" + }, + { + "label": "大庆高新技术产业开发区", + "value": "230671" + } + ], + [{ + "label": "伊春区", + "value": "230702" + }, + { + "label": "南岔区", + "value": "230703" + }, + { + "label": "友好区", + "value": "230704" + }, + { + "label": "西林区", + "value": "230705" + }, + { + "label": "翠峦区", + "value": "230706" + }, + { + "label": "新青区", + "value": "230707" + }, + { + "label": "美溪区", + "value": "230708" + }, + { + "label": "金山屯区", + "value": "230709" + }, + { + "label": "五营区", + "value": "230710" + }, + { + "label": "乌马河区", + "value": "230711" + }, + { + "label": "汤旺河区", + "value": "230712" + }, + { + "label": "带岭区", + "value": "230713" + }, + { + "label": "乌伊岭区", + "value": "230714" + }, + { + "label": "红星区", + "value": "230715" + }, + { + "label": "上甘岭区", + "value": "230716" + }, + { + "label": "嘉荫县", + "value": "230722" + }, + { + "label": "铁力市", + "value": "230781" + } + ], + [{ + "label": "向阳区", + "value": "230803" + }, + { + "label": "前进区", + "value": "230804" + }, + { + "label": "东风区", + "value": "230805" + }, + { + "label": "郊区", + "value": "230811" + }, + { + "label": "桦南县", + "value": "230822" + }, + { + "label": "桦川县", + "value": "230826" + }, + { + "label": "汤原县", + "value": "230828" + }, + { + "label": "同江市", + "value": "230881" + }, + { + "label": "富锦市", + "value": "230882" + }, + { + "label": "抚远市", + "value": "230883" + } + ], + [{ + "label": "新兴区", + "value": "230902" + }, + { + "label": "桃山区", + "value": "230903" + }, + { + "label": "茄子河区", + "value": "230904" + }, + { + "label": "勃利县", + "value": "230921" + } + ], + [{ + "label": "东安区", + "value": "231002" + }, + { + "label": "阳明区", + "value": "231003" + }, + { + "label": "爱民区", + "value": "231004" + }, + { + "label": "西安区", + "value": "231005" + }, + { + "label": "林口县", + "value": "231025" + }, + { + "label": "牡丹江经济技术开发区", + "value": "231071" + }, + { + "label": "绥芬河市", + "value": "231081" + }, + { + "label": "海林市", + "value": "231083" + }, + { + "label": "宁安市", + "value": "231084" + }, + { + "label": "穆棱市", + "value": "231085" + }, + { + "label": "东宁市", + "value": "231086" + } + ], + [{ + "label": "爱辉区", + "value": "231102" + }, + { + "label": "嫩江县", + "value": "231121" + }, + { + "label": "逊克县", + "value": "231123" + }, + { + "label": "孙吴县", + "value": "231124" + }, + { + "label": "北安市", + "value": "231181" + }, + { + "label": "五大连池市", + "value": "231182" + } + ], + [{ + "label": "北林区", + "value": "231202" + }, + { + "label": "望奎县", + "value": "231221" + }, + { + "label": "兰西县", + "value": "231222" + }, + { + "label": "青冈县", + "value": "231223" + }, + { + "label": "庆安县", + "value": "231224" + }, + { + "label": "明水县", + "value": "231225" + }, + { + "label": "绥棱县", + "value": "231226" + }, + { + "label": "安达市", + "value": "231281" + }, + { + "label": "肇东市", + "value": "231282" + }, + { + "label": "海伦市", + "value": "231283" + } + ], + [{ + "label": "加格达奇区", + "value": "232701" + }, + { + "label": "松岭区", + "value": "232702" + }, + { + "label": "新林区", + "value": "232703" + }, + { + "label": "呼中区", + "value": "232704" + }, + { + "label": "呼玛县", + "value": "232721" + }, + { + "label": "塔河县", + "value": "232722" + }, + { + "label": "漠河县", + "value": "232723" + } + ] + ], + [ + [{ + "label": "黄浦区", + "value": "310101" + }, + { + "label": "徐汇区", + "value": "310104" + }, + { + "label": "长宁区", + "value": "310105" + }, + { + "label": "静安区", + "value": "310106" + }, + { + "label": "普陀区", + "value": "310107" + }, + { + "label": "虹口区", + "value": "310109" + }, + { + "label": "杨浦区", + "value": "310110" + }, + { + "label": "闵行区", + "value": "310112" + }, + { + "label": "宝山区", + "value": "310113" + }, + { + "label": "嘉定区", + "value": "310114" + }, + { + "label": "浦东新区", + "value": "310115" + }, + { + "label": "金山区", + "value": "310116" + }, + { + "label": "松江区", + "value": "310117" + }, + { + "label": "青浦区", + "value": "310118" + }, + { + "label": "奉贤区", + "value": "310120" + }, + { + "label": "崇明区", + "value": "310151" + } + ] + ], + [ + [{ + "label": "玄武区", + "value": "320102" + }, + { + "label": "秦淮区", + "value": "320104" + }, + { + "label": "建邺区", + "value": "320105" + }, + { + "label": "鼓楼区", + "value": "320106" + }, + { + "label": "浦口区", + "value": "320111" + }, + { + "label": "栖霞区", + "value": "320113" + }, + { + "label": "雨花台区", + "value": "320114" + }, + { + "label": "江宁区", + "value": "320115" + }, + { + "label": "六合区", + "value": "320116" + }, + { + "label": "溧水区", + "value": "320117" + }, + { + "label": "高淳区", + "value": "320118" + } + ], + [{ + "label": "锡山区", + "value": "320205" + }, + { + "label": "惠山区", + "value": "320206" + }, + { + "label": "滨湖区", + "value": "320211" + }, + { + "label": "梁溪区", + "value": "320213" + }, + { + "label": "新吴区", + "value": "320214" + }, + { + "label": "江阴市", + "value": "320281" + }, + { + "label": "宜兴市", + "value": "320282" + } + ], + [{ + "label": "鼓楼区", + "value": "320302" + }, + { + "label": "云龙区", + "value": "320303" + }, + { + "label": "贾汪区", + "value": "320305" + }, + { + "label": "泉山区", + "value": "320311" + }, + { + "label": "铜山区", + "value": "320312" + }, + { + "label": "丰县", + "value": "320321" + }, + { + "label": "沛县", + "value": "320322" + }, + { + "label": "睢宁县", + "value": "320324" + }, + { + "label": "徐州经济技术开发区", + "value": "320371" + }, + { + "label": "新沂市", + "value": "320381" + }, + { + "label": "邳州市", + "value": "320382" + } + ], + [{ + "label": "天宁区", + "value": "320402" + }, + { + "label": "钟楼区", + "value": "320404" + }, + { + "label": "新北区", + "value": "320411" + }, + { + "label": "武进区", + "value": "320412" + }, + { + "label": "金坛区", + "value": "320413" + }, + { + "label": "溧阳市", + "value": "320481" + } + ], + [{ + "label": "虎丘区", + "value": "320505" + }, + { + "label": "吴中区", + "value": "320506" + }, + { + "label": "相城区", + "value": "320507" + }, + { + "label": "姑苏区", + "value": "320508" + }, + { + "label": "吴江区", + "value": "320509" + }, + { + "label": "苏州工业园区", + "value": "320571" + }, + { + "label": "常熟市", + "value": "320581" + }, + { + "label": "张家港市", + "value": "320582" + }, + { + "label": "昆山市", + "value": "320583" + }, + { + "label": "太仓市", + "value": "320585" + } + ], + [{ + "label": "崇川区", + "value": "320602" + }, + { + "label": "港闸区", + "value": "320611" + }, + { + "label": "通州区", + "value": "320612" + }, + { + "label": "海安县", + "value": "320621" + }, + { + "label": "如东县", + "value": "320623" + }, + { + "label": "南通经济技术开发区", + "value": "320671" + }, + { + "label": "启东市", + "value": "320681" + }, + { + "label": "如皋市", + "value": "320682" + }, + { + "label": "海门市", + "value": "320684" + } + ], + [{ + "label": "连云区", + "value": "320703" + }, + { + "label": "海州区", + "value": "320706" + }, + { + "label": "赣榆区", + "value": "320707" + }, + { + "label": "东海县", + "value": "320722" + }, + { + "label": "灌云县", + "value": "320723" + }, + { + "label": "灌南县", + "value": "320724" + }, + { + "label": "连云港经济技术开发区", + "value": "320771" + }, + { + "label": "连云港高新技术产业开发区", + "value": "320772" + } + ], + [{ + "label": "淮安区", + "value": "320803" + }, + { + "label": "淮阴区", + "value": "320804" + }, + { + "label": "清江浦区", + "value": "320812" + }, + { + "label": "洪泽区", + "value": "320813" + }, + { + "label": "涟水县", + "value": "320826" + }, + { + "label": "盱眙县", + "value": "320830" + }, + { + "label": "金湖县", + "value": "320831" + }, + { + "label": "淮安经济技术开发区", + "value": "320871" + } + ], + [{ + "label": "亭湖区", + "value": "320902" + }, + { + "label": "盐都区", + "value": "320903" + }, + { + "label": "大丰区", + "value": "320904" + }, + { + "label": "响水县", + "value": "320921" + }, + { + "label": "滨海县", + "value": "320922" + }, + { + "label": "阜宁县", + "value": "320923" + }, + { + "label": "射阳县", + "value": "320924" + }, + { + "label": "建湖县", + "value": "320925" + }, + { + "label": "盐城经济技术开发区", + "value": "320971" + }, + { + "label": "东台市", + "value": "320981" + } + ], + [{ + "label": "广陵区", + "value": "321002" + }, + { + "label": "邗江区", + "value": "321003" + }, + { + "label": "江都区", + "value": "321012" + }, + { + "label": "宝应县", + "value": "321023" + }, + { + "label": "扬州经济技术开发区", + "value": "321071" + }, + { + "label": "仪征市", + "value": "321081" + }, + { + "label": "高邮市", + "value": "321084" + } + ], + [{ + "label": "京口区", + "value": "321102" + }, + { + "label": "润州区", + "value": "321111" + }, + { + "label": "丹徒区", + "value": "321112" + }, + { + "label": "镇江新区", + "value": "321171" + }, + { + "label": "丹阳市", + "value": "321181" + }, + { + "label": "扬中市", + "value": "321182" + }, + { + "label": "句容市", + "value": "321183" + } + ], + [{ + "label": "海陵区", + "value": "321202" + }, + { + "label": "高港区", + "value": "321203" + }, + { + "label": "姜堰区", + "value": "321204" + }, + { + "label": "泰州医药高新技术产业开发区", + "value": "321271" + }, + { + "label": "兴化市", + "value": "321281" + }, + { + "label": "靖江市", + "value": "321282" + }, + { + "label": "泰兴市", + "value": "321283" + } + ], + [{ + "label": "宿城区", + "value": "321302" + }, + { + "label": "宿豫区", + "value": "321311" + }, + { + "label": "沭阳县", + "value": "321322" + }, + { + "label": "泗阳县", + "value": "321323" + }, + { + "label": "泗洪县", + "value": "321324" + }, + { + "label": "宿迁经济技术开发区", + "value": "321371" + } + ] + ], + [ + [{ + "label": "上城区", + "value": "330102" + }, + { + "label": "下城区", + "value": "330103" + }, + { + "label": "江干区", + "value": "330104" + }, + { + "label": "拱墅区", + "value": "330105" + }, + { + "label": "西湖区", + "value": "330106" + }, + { + "label": "滨江区", + "value": "330108" + }, + { + "label": "萧山区", + "value": "330109" + }, + { + "label": "余杭区", + "value": "330110" + }, + { + "label": "富阳区", + "value": "330111" + }, + { + "label": "临安区", + "value": "330112" + }, + { + "label": "桐庐县", + "value": "330122" + }, + { + "label": "淳安县", + "value": "330127" + }, + { + "label": "建德市", + "value": "330182" + } + ], + [{ + "label": "海曙区", + "value": "330203" + }, + { + "label": "江北区", + "value": "330205" + }, + { + "label": "北仑区", + "value": "330206" + }, + { + "label": "镇海区", + "value": "330211" + }, + { + "label": "鄞州区", + "value": "330212" + }, + { + "label": "奉化区", + "value": "330213" + }, + { + "label": "象山县", + "value": "330225" + }, + { + "label": "宁海县", + "value": "330226" + }, + { + "label": "余姚市", + "value": "330281" + }, + { + "label": "慈溪市", + "value": "330282" + } + ], + [{ + "label": "鹿城区", + "value": "330302" + }, + { + "label": "龙湾区", + "value": "330303" + }, + { + "label": "瓯海区", + "value": "330304" + }, + { + "label": "洞头区", + "value": "330305" + }, + { + "label": "永嘉县", + "value": "330324" + }, + { + "label": "平阳县", + "value": "330326" + }, + { + "label": "苍南县", + "value": "330327" + }, + { + "label": "文成县", + "value": "330328" + }, + { + "label": "泰顺县", + "value": "330329" + }, + { + "label": "温州经济技术开发区", + "value": "330371" + }, + { + "label": "瑞安市", + "value": "330381" + }, + { + "label": "乐清市", + "value": "330382" + } + ], + [{ + "label": "南湖区", + "value": "330402" + }, + { + "label": "秀洲区", + "value": "330411" + }, + { + "label": "嘉善县", + "value": "330421" + }, + { + "label": "海盐县", + "value": "330424" + }, + { + "label": "海宁市", + "value": "330481" + }, + { + "label": "平湖市", + "value": "330482" + }, + { + "label": "桐乡市", + "value": "330483" + } + ], + [{ + "label": "吴兴区", + "value": "330502" + }, + { + "label": "南浔区", + "value": "330503" + }, + { + "label": "德清县", + "value": "330521" + }, + { + "label": "长兴县", + "value": "330522" + }, + { + "label": "安吉县", + "value": "330523" + } + ], + [{ + "label": "越城区", + "value": "330602" + }, + { + "label": "柯桥区", + "value": "330603" + }, + { + "label": "上虞区", + "value": "330604" + }, + { + "label": "新昌县", + "value": "330624" + }, + { + "label": "诸暨市", + "value": "330681" + }, + { + "label": "嵊州市", + "value": "330683" + } + ], + [{ + "label": "婺城区", + "value": "330702" + }, + { + "label": "金东区", + "value": "330703" + }, + { + "label": "武义县", + "value": "330723" + }, + { + "label": "浦江县", + "value": "330726" + }, + { + "label": "磐安县", + "value": "330727" + }, + { + "label": "兰溪市", + "value": "330781" + }, + { + "label": "义乌市", + "value": "330782" + }, + { + "label": "东阳市", + "value": "330783" + }, + { + "label": "永康市", + "value": "330784" + } + ], + [{ + "label": "柯城区", + "value": "330802" + }, + { + "label": "衢江区", + "value": "330803" + }, + { + "label": "常山县", + "value": "330822" + }, + { + "label": "开化县", + "value": "330824" + }, + { + "label": "龙游县", + "value": "330825" + }, + { + "label": "江山市", + "value": "330881" + } + ], + [{ + "label": "定海区", + "value": "330902" + }, + { + "label": "普陀区", + "value": "330903" + }, + { + "label": "岱山县", + "value": "330921" + }, + { + "label": "嵊泗县", + "value": "330922" + } + ], + [{ + "label": "椒江区", + "value": "331002" + }, + { + "label": "黄岩区", + "value": "331003" + }, + { + "label": "路桥区", + "value": "331004" + }, + { + "label": "三门县", + "value": "331022" + }, + { + "label": "天台县", + "value": "331023" + }, + { + "label": "仙居县", + "value": "331024" + }, + { + "label": "温岭市", + "value": "331081" + }, + { + "label": "临海市", + "value": "331082" + }, + { + "label": "玉环市", + "value": "331083" + } + ], + [{ + "label": "莲都区", + "value": "331102" + }, + { + "label": "青田县", + "value": "331121" + }, + { + "label": "缙云县", + "value": "331122" + }, + { + "label": "遂昌县", + "value": "331123" + }, + { + "label": "松阳县", + "value": "331124" + }, + { + "label": "云和县", + "value": "331125" + }, + { + "label": "庆元县", + "value": "331126" + }, + { + "label": "景宁畲族自治县", + "value": "331127" + }, + { + "label": "龙泉市", + "value": "331181" + } + ] + ], + [ + [{ + "label": "瑶海区", + "value": "340102" + }, + { + "label": "庐阳区", + "value": "340103" + }, + { + "label": "蜀山区", + "value": "340104" + }, + { + "label": "包河区", + "value": "340111" + }, + { + "label": "长丰县", + "value": "340121" + }, + { + "label": "肥东县", + "value": "340122" + }, + { + "label": "肥西县", + "value": "340123" + }, + { + "label": "庐江县", + "value": "340124" + }, + { + "label": "合肥高新技术产业开发区", + "value": "340171" + }, + { + "label": "合肥经济技术开发区", + "value": "340172" + }, + { + "label": "合肥新站高新技术产业开发区", + "value": "340173" + }, + { + "label": "巢湖市", + "value": "340181" + } + ], + [{ + "label": "镜湖区", + "value": "340202" + }, + { + "label": "弋江区", + "value": "340203" + }, + { + "label": "鸠江区", + "value": "340207" + }, + { + "label": "三山区", + "value": "340208" + }, + { + "label": "芜湖县", + "value": "340221" + }, + { + "label": "繁昌县", + "value": "340222" + }, + { + "label": "南陵县", + "value": "340223" + }, + { + "label": "无为县", + "value": "340225" + }, + { + "label": "芜湖经济技术开发区", + "value": "340271" + }, + { + "label": "安徽芜湖长江大桥经济开发区", + "value": "340272" + } + ], + [{ + "label": "龙子湖区", + "value": "340302" + }, + { + "label": "蚌山区", + "value": "340303" + }, + { + "label": "禹会区", + "value": "340304" + }, + { + "label": "淮上区", + "value": "340311" + }, + { + "label": "怀远县", + "value": "340321" + }, + { + "label": "五河县", + "value": "340322" + }, + { + "label": "固镇县", + "value": "340323" + }, + { + "label": "蚌埠市高新技术开发区", + "value": "340371" + }, + { + "label": "蚌埠市经济开发区", + "value": "340372" + } + ], + [{ + "label": "大通区", + "value": "340402" + }, + { + "label": "田家庵区", + "value": "340403" + }, + { + "label": "谢家集区", + "value": "340404" + }, + { + "label": "八公山区", + "value": "340405" + }, + { + "label": "潘集区", + "value": "340406" + }, + { + "label": "凤台县", + "value": "340421" + }, + { + "label": "寿县", + "value": "340422" + } + ], + [{ + "label": "花山区", + "value": "340503" + }, + { + "label": "雨山区", + "value": "340504" + }, + { + "label": "博望区", + "value": "340506" + }, + { + "label": "当涂县", + "value": "340521" + }, + { + "label": "含山县", + "value": "340522" + }, + { + "label": "和县", + "value": "340523" + } + ], + [{ + "label": "杜集区", + "value": "340602" + }, + { + "label": "相山区", + "value": "340603" + }, + { + "label": "烈山区", + "value": "340604" + }, + { + "label": "濉溪县", + "value": "340621" + } + ], + [{ + "label": "铜官区", + "value": "340705" + }, + { + "label": "义安区", + "value": "340706" + }, + { + "label": "郊区", + "value": "340711" + }, + { + "label": "枞阳县", + "value": "340722" + } + ], + [{ + "label": "迎江区", + "value": "340802" + }, + { + "label": "大观区", + "value": "340803" + }, + { + "label": "宜秀区", + "value": "340811" + }, + { + "label": "怀宁县", + "value": "340822" + }, + { + "label": "潜山县", + "value": "340824" + }, + { + "label": "太湖县", + "value": "340825" + }, + { + "label": "宿松县", + "value": "340826" + }, + { + "label": "望江县", + "value": "340827" + }, + { + "label": "岳西县", + "value": "340828" + }, + { + "label": "安徽安庆经济开发区", + "value": "340871" + }, + { + "label": "桐城市", + "value": "340881" + } + ], + [{ + "label": "屯溪区", + "value": "341002" + }, + { + "label": "黄山区", + "value": "341003" + }, + { + "label": "徽州区", + "value": "341004" + }, + { + "label": "歙县", + "value": "341021" + }, + { + "label": "休宁县", + "value": "341022" + }, + { + "label": "黟县", + "value": "341023" + }, + { + "label": "祁门县", + "value": "341024" + } + ], + [{ + "label": "琅琊区", + "value": "341102" + }, + { + "label": "南谯区", + "value": "341103" + }, + { + "label": "来安县", + "value": "341122" + }, + { + "label": "全椒县", + "value": "341124" + }, + { + "label": "定远县", + "value": "341125" + }, + { + "label": "凤阳县", + "value": "341126" + }, + { + "label": "苏滁现代产业园", + "value": "341171" + }, + { + "label": "滁州经济技术开发区", + "value": "341172" + }, + { + "label": "天长市", + "value": "341181" + }, + { + "label": "明光市", + "value": "341182" + } + ], + [{ + "label": "颍州区", + "value": "341202" + }, + { + "label": "颍东区", + "value": "341203" + }, + { + "label": "颍泉区", + "value": "341204" + }, + { + "label": "临泉县", + "value": "341221" + }, + { + "label": "太和县", + "value": "341222" + }, + { + "label": "阜南县", + "value": "341225" + }, + { + "label": "颍上县", + "value": "341226" + }, + { + "label": "阜阳合肥现代产业园区", + "value": "341271" + }, + { + "label": "阜阳经济技术开发区", + "value": "341272" + }, + { + "label": "界首市", + "value": "341282" + } + ], + [{ + "label": "埇桥区", + "value": "341302" + }, + { + "label": "砀山县", + "value": "341321" + }, + { + "label": "萧县", + "value": "341322" + }, + { + "label": "灵璧县", + "value": "341323" + }, + { + "label": "泗县", + "value": "341324" + }, + { + "label": "宿州马鞍山现代产业园区", + "value": "341371" + }, + { + "label": "宿州经济技术开发区", + "value": "341372" + } + ], + [{ + "label": "金安区", + "value": "341502" + }, + { + "label": "裕安区", + "value": "341503" + }, + { + "label": "叶集区", + "value": "341504" + }, + { + "label": "霍邱县", + "value": "341522" + }, + { + "label": "舒城县", + "value": "341523" + }, + { + "label": "金寨县", + "value": "341524" + }, + { + "label": "霍山县", + "value": "341525" + } + ], + [{ + "label": "谯城区", + "value": "341602" + }, + { + "label": "涡阳县", + "value": "341621" + }, + { + "label": "蒙城县", + "value": "341622" + }, + { + "label": "利辛县", + "value": "341623" + } + ], + [{ + "label": "贵池区", + "value": "341702" + }, + { + "label": "东至县", + "value": "341721" + }, + { + "label": "石台县", + "value": "341722" + }, + { + "label": "青阳县", + "value": "341723" + } + ], + [{ + "label": "宣州区", + "value": "341802" + }, + { + "label": "郎溪县", + "value": "341821" + }, + { + "label": "广德县", + "value": "341822" + }, + { + "label": "泾县", + "value": "341823" + }, + { + "label": "绩溪县", + "value": "341824" + }, + { + "label": "旌德县", + "value": "341825" + }, + { + "label": "宣城市经济开发区", + "value": "341871" + }, + { + "label": "宁国市", + "value": "341881" + } + ] + ], + [ + [{ + "label": "鼓楼区", + "value": "350102" + }, + { + "label": "台江区", + "value": "350103" + }, + { + "label": "仓山区", + "value": "350104" + }, + { + "label": "马尾区", + "value": "350105" + }, + { + "label": "晋安区", + "value": "350111" + }, + { + "label": "闽侯县", + "value": "350121" + }, + { + "label": "连江县", + "value": "350122" + }, + { + "label": "罗源县", + "value": "350123" + }, + { + "label": "闽清县", + "value": "350124" + }, + { + "label": "永泰县", + "value": "350125" + }, + { + "label": "平潭县", + "value": "350128" + }, + { + "label": "福清市", + "value": "350181" + }, + { + "label": "长乐市", + "value": "350182" + } + ], + [{ + "label": "思明区", + "value": "350203" + }, + { + "label": "海沧区", + "value": "350205" + }, + { + "label": "湖里区", + "value": "350206" + }, + { + "label": "集美区", + "value": "350211" + }, + { + "label": "同安区", + "value": "350212" + }, + { + "label": "翔安区", + "value": "350213" + } + ], + [{ + "label": "城厢区", + "value": "350302" + }, + { + "label": "涵江区", + "value": "350303" + }, + { + "label": "荔城区", + "value": "350304" + }, + { + "label": "秀屿区", + "value": "350305" + }, + { + "label": "仙游县", + "value": "350322" + } + ], + [{ + "label": "梅列区", + "value": "350402" + }, + { + "label": "三元区", + "value": "350403" + }, + { + "label": "明溪县", + "value": "350421" + }, + { + "label": "清流县", + "value": "350423" + }, + { + "label": "宁化县", + "value": "350424" + }, + { + "label": "大田县", + "value": "350425" + }, + { + "label": "尤溪县", + "value": "350426" + }, + { + "label": "沙县", + "value": "350427" + }, + { + "label": "将乐县", + "value": "350428" + }, + { + "label": "泰宁县", + "value": "350429" + }, + { + "label": "建宁县", + "value": "350430" + }, + { + "label": "永安市", + "value": "350481" + } + ], + [{ + "label": "鲤城区", + "value": "350502" + }, + { + "label": "丰泽区", + "value": "350503" + }, + { + "label": "洛江区", + "value": "350504" + }, + { + "label": "泉港区", + "value": "350505" + }, + { + "label": "惠安县", + "value": "350521" + }, + { + "label": "安溪县", + "value": "350524" + }, + { + "label": "永春县", + "value": "350525" + }, + { + "label": "德化县", + "value": "350526" + }, + { + "label": "金门县", + "value": "350527" + }, + { + "label": "石狮市", + "value": "350581" + }, + { + "label": "晋江市", + "value": "350582" + }, + { + "label": "南安市", + "value": "350583" + } + ], + [{ + "label": "芗城区", + "value": "350602" + }, + { + "label": "龙文区", + "value": "350603" + }, + { + "label": "云霄县", + "value": "350622" + }, + { + "label": "漳浦县", + "value": "350623" + }, + { + "label": "诏安县", + "value": "350624" + }, + { + "label": "长泰县", + "value": "350625" + }, + { + "label": "东山县", + "value": "350626" + }, + { + "label": "南靖县", + "value": "350627" + }, + { + "label": "平和县", + "value": "350628" + }, + { + "label": "华安县", + "value": "350629" + }, + { + "label": "龙海市", + "value": "350681" + } + ], + [{ + "label": "延平区", + "value": "350702" + }, + { + "label": "建阳区", + "value": "350703" + }, + { + "label": "顺昌县", + "value": "350721" + }, + { + "label": "浦城县", + "value": "350722" + }, + { + "label": "光泽县", + "value": "350723" + }, + { + "label": "松溪县", + "value": "350724" + }, + { + "label": "政和县", + "value": "350725" + }, + { + "label": "邵武市", + "value": "350781" + }, + { + "label": "武夷山市", + "value": "350782" + }, + { + "label": "建瓯市", + "value": "350783" + } + ], + [{ + "label": "新罗区", + "value": "350802" + }, + { + "label": "永定区", + "value": "350803" + }, + { + "label": "长汀县", + "value": "350821" + }, + { + "label": "上杭县", + "value": "350823" + }, + { + "label": "武平县", + "value": "350824" + }, + { + "label": "连城县", + "value": "350825" + }, + { + "label": "漳平市", + "value": "350881" + } + ], + [{ + "label": "蕉城区", + "value": "350902" + }, + { + "label": "霞浦县", + "value": "350921" + }, + { + "label": "古田县", + "value": "350922" + }, + { + "label": "屏南县", + "value": "350923" + }, + { + "label": "寿宁县", + "value": "350924" + }, + { + "label": "周宁县", + "value": "350925" + }, + { + "label": "柘荣县", + "value": "350926" + }, + { + "label": "福安市", + "value": "350981" + }, + { + "label": "福鼎市", + "value": "350982" + } + ] + ], + [ + [{ + "label": "东湖区", + "value": "360102" + }, + { + "label": "西湖区", + "value": "360103" + }, + { + "label": "青云谱区", + "value": "360104" + }, + { + "label": "湾里区", + "value": "360105" + }, + { + "label": "青山湖区", + "value": "360111" + }, + { + "label": "新建区", + "value": "360112" + }, + { + "label": "南昌县", + "value": "360121" + }, + { + "label": "安义县", + "value": "360123" + }, + { + "label": "进贤县", + "value": "360124" + } + ], + [{ + "label": "昌江区", + "value": "360202" + }, + { + "label": "珠山区", + "value": "360203" + }, + { + "label": "浮梁县", + "value": "360222" + }, + { + "label": "乐平市", + "value": "360281" + } + ], + [{ + "label": "安源区", + "value": "360302" + }, + { + "label": "湘东区", + "value": "360313" + }, + { + "label": "莲花县", + "value": "360321" + }, + { + "label": "上栗县", + "value": "360322" + }, + { + "label": "芦溪县", + "value": "360323" + } + ], + [{ + "label": "濂溪区", + "value": "360402" + }, + { + "label": "浔阳区", + "value": "360403" + }, + { + "label": "柴桑区", + "value": "360404" + }, + { + "label": "武宁县", + "value": "360423" + }, + { + "label": "修水县", + "value": "360424" + }, + { + "label": "永修县", + "value": "360425" + }, + { + "label": "德安县", + "value": "360426" + }, + { + "label": "都昌县", + "value": "360428" + }, + { + "label": "湖口县", + "value": "360429" + }, + { + "label": "彭泽县", + "value": "360430" + }, + { + "label": "瑞昌市", + "value": "360481" + }, + { + "label": "共青城市", + "value": "360482" + }, + { + "label": "庐山市", + "value": "360483" + } + ], + [{ + "label": "渝水区", + "value": "360502" + }, + { + "label": "分宜县", + "value": "360521" + } + ], + [{ + "label": "月湖区", + "value": "360602" + }, + { + "label": "余江县", + "value": "360622" + }, + { + "label": "贵溪市", + "value": "360681" + } + ], + [{ + "label": "章贡区", + "value": "360702" + }, + { + "label": "南康区", + "value": "360703" + }, + { + "label": "赣县区", + "value": "360704" + }, + { + "label": "信丰县", + "value": "360722" + }, + { + "label": "大余县", + "value": "360723" + }, + { + "label": "上犹县", + "value": "360724" + }, + { + "label": "崇义县", + "value": "360725" + }, + { + "label": "安远县", + "value": "360726" + }, + { + "label": "龙南县", + "value": "360727" + }, + { + "label": "定南县", + "value": "360728" + }, + { + "label": "全南县", + "value": "360729" + }, + { + "label": "宁都县", + "value": "360730" + }, + { + "label": "于都县", + "value": "360731" + }, + { + "label": "兴国县", + "value": "360732" + }, + { + "label": "会昌县", + "value": "360733" + }, + { + "label": "寻乌县", + "value": "360734" + }, + { + "label": "石城县", + "value": "360735" + }, + { + "label": "瑞金市", + "value": "360781" + } + ], + [{ + "label": "吉州区", + "value": "360802" + }, + { + "label": "青原区", + "value": "360803" + }, + { + "label": "吉安县", + "value": "360821" + }, + { + "label": "吉水县", + "value": "360822" + }, + { + "label": "峡江县", + "value": "360823" + }, + { + "label": "新干县", + "value": "360824" + }, + { + "label": "永丰县", + "value": "360825" + }, + { + "label": "泰和县", + "value": "360826" + }, + { + "label": "遂川县", + "value": "360827" + }, + { + "label": "万安县", + "value": "360828" + }, + { + "label": "安福县", + "value": "360829" + }, + { + "label": "永新县", + "value": "360830" + }, + { + "label": "井冈山市", + "value": "360881" + } + ], + [{ + "label": "袁州区", + "value": "360902" + }, + { + "label": "奉新县", + "value": "360921" + }, + { + "label": "万载县", + "value": "360922" + }, + { + "label": "上高县", + "value": "360923" + }, + { + "label": "宜丰县", + "value": "360924" + }, + { + "label": "靖安县", + "value": "360925" + }, + { + "label": "铜鼓县", + "value": "360926" + }, + { + "label": "丰城市", + "value": "360981" + }, + { + "label": "樟树市", + "value": "360982" + }, + { + "label": "高安市", + "value": "360983" + } + ], + [{ + "label": "临川区", + "value": "361002" + }, + { + "label": "东乡区", + "value": "361003" + }, + { + "label": "南城县", + "value": "361021" + }, + { + "label": "黎川县", + "value": "361022" + }, + { + "label": "南丰县", + "value": "361023" + }, + { + "label": "崇仁县", + "value": "361024" + }, + { + "label": "乐安县", + "value": "361025" + }, + { + "label": "宜黄县", + "value": "361026" + }, + { + "label": "金溪县", + "value": "361027" + }, + { + "label": "资溪县", + "value": "361028" + }, + { + "label": "广昌县", + "value": "361030" + } + ], + [{ + "label": "信州区", + "value": "361102" + }, + { + "label": "广丰区", + "value": "361103" + }, + { + "label": "上饶县", + "value": "361121" + }, + { + "label": "玉山县", + "value": "361123" + }, + { + "label": "铅山县", + "value": "361124" + }, + { + "label": "横峰县", + "value": "361125" + }, + { + "label": "弋阳县", + "value": "361126" + }, + { + "label": "余干县", + "value": "361127" + }, + { + "label": "鄱阳县", + "value": "361128" + }, + { + "label": "万年县", + "value": "361129" + }, + { + "label": "婺源县", + "value": "361130" + }, + { + "label": "德兴市", + "value": "361181" + } + ] + ], + [ + [{ + "label": "历下区", + "value": "370102" + }, + { + "label": "市中区", + "value": "370103" + }, + { + "label": "槐荫区", + "value": "370104" + }, + { + "label": "天桥区", + "value": "370105" + }, + { + "label": "历城区", + "value": "370112" + }, + { + "label": "长清区", + "value": "370113" + }, + { + "label": "章丘区", + "value": "370114" + }, + { + "label": "平阴县", + "value": "370124" + }, + { + "label": "济阳县", + "value": "370125" + }, + { + "label": "商河县", + "value": "370126" + }, + { + "label": "济南高新技术产业开发区", + "value": "370171" + } + ], + [{ + "label": "市南区", + "value": "370202" + }, + { + "label": "市北区", + "value": "370203" + }, + { + "label": "黄岛区", + "value": "370211" + }, + { + "label": "崂山区", + "value": "370212" + }, + { + "label": "李沧区", + "value": "370213" + }, + { + "label": "城阳区", + "value": "370214" + }, + { + "label": "即墨区", + "value": "370215" + }, + { + "label": "青岛高新技术产业开发区", + "value": "370271" + }, + { + "label": "胶州市", + "value": "370281" + }, + { + "label": "平度市", + "value": "370283" + }, + { + "label": "莱西市", + "value": "370285" + } + ], + [{ + "label": "淄川区", + "value": "370302" + }, + { + "label": "张店区", + "value": "370303" + }, + { + "label": "博山区", + "value": "370304" + }, + { + "label": "临淄区", + "value": "370305" + }, + { + "label": "周村区", + "value": "370306" + }, + { + "label": "桓台县", + "value": "370321" + }, + { + "label": "高青县", + "value": "370322" + }, + { + "label": "沂源县", + "value": "370323" + } + ], + [{ + "label": "市中区", + "value": "370402" + }, + { + "label": "薛城区", + "value": "370403" + }, + { + "label": "峄城区", + "value": "370404" + }, + { + "label": "台儿庄区", + "value": "370405" + }, + { + "label": "山亭区", + "value": "370406" + }, + { + "label": "滕州市", + "value": "370481" + } + ], + [{ + "label": "东营区", + "value": "370502" + }, + { + "label": "河口区", + "value": "370503" + }, + { + "label": "垦利区", + "value": "370505" + }, + { + "label": "利津县", + "value": "370522" + }, + { + "label": "广饶县", + "value": "370523" + }, + { + "label": "东营经济技术开发区", + "value": "370571" + }, + { + "label": "东营港经济开发区", + "value": "370572" + } + ], + [{ + "label": "芝罘区", + "value": "370602" + }, + { + "label": "福山区", + "value": "370611" + }, + { + "label": "牟平区", + "value": "370612" + }, + { + "label": "莱山区", + "value": "370613" + }, + { + "label": "长岛县", + "value": "370634" + }, + { + "label": "烟台高新技术产业开发区", + "value": "370671" + }, + { + "label": "烟台经济技术开发区", + "value": "370672" + }, + { + "label": "龙口市", + "value": "370681" + }, + { + "label": "莱阳市", + "value": "370682" + }, + { + "label": "莱州市", + "value": "370683" + }, + { + "label": "蓬莱市", + "value": "370684" + }, + { + "label": "招远市", + "value": "370685" + }, + { + "label": "栖霞市", + "value": "370686" + }, + { + "label": "海阳市", + "value": "370687" + } + ], + [{ + "label": "潍城区", + "value": "370702" + }, + { + "label": "寒亭区", + "value": "370703" + }, + { + "label": "坊子区", + "value": "370704" + }, + { + "label": "奎文区", + "value": "370705" + }, + { + "label": "临朐县", + "value": "370724" + }, + { + "label": "昌乐县", + "value": "370725" + }, + { + "label": "潍坊滨海经济技术开发区", + "value": "370772" + }, + { + "label": "青州市", + "value": "370781" + }, + { + "label": "诸城市", + "value": "370782" + }, + { + "label": "寿光市", + "value": "370783" + }, + { + "label": "安丘市", + "value": "370784" + }, + { + "label": "高密市", + "value": "370785" + }, + { + "label": "昌邑市", + "value": "370786" + } + ], + [{ + "label": "任城区", + "value": "370811" + }, + { + "label": "兖州区", + "value": "370812" + }, + { + "label": "微山县", + "value": "370826" + }, + { + "label": "鱼台县", + "value": "370827" + }, + { + "label": "金乡县", + "value": "370828" + }, + { + "label": "嘉祥县", + "value": "370829" + }, + { + "label": "汶上县", + "value": "370830" + }, + { + "label": "泗水县", + "value": "370831" + }, + { + "label": "梁山县", + "value": "370832" + }, + { + "label": "济宁高新技术产业开发区", + "value": "370871" + }, + { + "label": "曲阜市", + "value": "370881" + }, + { + "label": "邹城市", + "value": "370883" + } + ], + [{ + "label": "泰山区", + "value": "370902" + }, + { + "label": "岱岳区", + "value": "370911" + }, + { + "label": "宁阳县", + "value": "370921" + }, + { + "label": "东平县", + "value": "370923" + }, + { + "label": "新泰市", + "value": "370982" + }, + { + "label": "肥城市", + "value": "370983" + } + ], + [{ + "label": "环翠区", + "value": "371002" + }, + { + "label": "文登区", + "value": "371003" + }, + { + "label": "威海火炬高技术产业开发区", + "value": "371071" + }, + { + "label": "威海经济技术开发区", + "value": "371072" + }, + { + "label": "威海临港经济技术开发区", + "value": "371073" + }, + { + "label": "荣成市", + "value": "371082" + }, + { + "label": "乳山市", + "value": "371083" + } + ], + [{ + "label": "东港区", + "value": "371102" + }, + { + "label": "岚山区", + "value": "371103" + }, + { + "label": "五莲县", + "value": "371121" + }, + { + "label": "莒县", + "value": "371122" + }, + { + "label": "日照经济技术开发区", + "value": "371171" + }, + { + "label": "日照国际海洋城", + "value": "371172" + } + ], + [{ + "label": "莱城区", + "value": "371202" + }, + { + "label": "钢城区", + "value": "371203" + } + ], + [{ + "label": "兰山区", + "value": "371302" + }, + { + "label": "罗庄区", + "value": "371311" + }, + { + "label": "河东区", + "value": "371312" + }, + { + "label": "沂南县", + "value": "371321" + }, + { + "label": "郯城县", + "value": "371322" + }, + { + "label": "沂水县", + "value": "371323" + }, + { + "label": "兰陵县", + "value": "371324" + }, + { + "label": "费县", + "value": "371325" + }, + { + "label": "平邑县", + "value": "371326" + }, + { + "label": "莒南县", + "value": "371327" + }, + { + "label": "蒙阴县", + "value": "371328" + }, + { + "label": "临沭县", + "value": "371329" + }, + { + "label": "临沂高新技术产业开发区", + "value": "371371" + }, + { + "label": "临沂经济技术开发区", + "value": "371372" + }, + { + "label": "临沂临港经济开发区", + "value": "371373" + } + ], + [{ + "label": "德城区", + "value": "371402" + }, + { + "label": "陵城区", + "value": "371403" + }, + { + "label": "宁津县", + "value": "371422" + }, + { + "label": "庆云县", + "value": "371423" + }, + { + "label": "临邑县", + "value": "371424" + }, + { + "label": "齐河县", + "value": "371425" + }, + { + "label": "平原县", + "value": "371426" + }, + { + "label": "夏津县", + "value": "371427" + }, + { + "label": "武城县", + "value": "371428" + }, + { + "label": "德州经济技术开发区", + "value": "371471" + }, + { + "label": "德州运河经济开发区", + "value": "371472" + }, + { + "label": "乐陵市", + "value": "371481" + }, + { + "label": "禹城市", + "value": "371482" + } + ], + [{ + "label": "东昌府区", + "value": "371502" + }, + { + "label": "阳谷县", + "value": "371521" + }, + { + "label": "莘县", + "value": "371522" + }, + { + "label": "茌平县", + "value": "371523" + }, + { + "label": "东阿县", + "value": "371524" + }, + { + "label": "冠县", + "value": "371525" + }, + { + "label": "高唐县", + "value": "371526" + }, + { + "label": "临清市", + "value": "371581" + } + ], + [{ + "label": "滨城区", + "value": "371602" + }, + { + "label": "沾化区", + "value": "371603" + }, + { + "label": "惠民县", + "value": "371621" + }, + { + "label": "阳信县", + "value": "371622" + }, + { + "label": "无棣县", + "value": "371623" + }, + { + "label": "博兴县", + "value": "371625" + }, + { + "label": "邹平县", + "value": "371626" + } + ], + [{ + "label": "牡丹区", + "value": "371702" + }, + { + "label": "定陶区", + "value": "371703" + }, + { + "label": "曹县", + "value": "371721" + }, + { + "label": "单县", + "value": "371722" + }, + { + "label": "成武县", + "value": "371723" + }, + { + "label": "巨野县", + "value": "371724" + }, + { + "label": "郓城县", + "value": "371725" + }, + { + "label": "鄄城县", + "value": "371726" + }, + { + "label": "东明县", + "value": "371728" + }, + { + "label": "菏泽经济技术开发区", + "value": "371771" + }, + { + "label": "菏泽高新技术开发区", + "value": "371772" + } + ] + ], + [ + [{ + "label": "中原区", + "value": "410102" + }, + { + "label": "二七区", + "value": "410103" + }, + { + "label": "管城回族区", + "value": "410104" + }, + { + "label": "金水区", + "value": "410105" + }, + { + "label": "上街区", + "value": "410106" + }, + { + "label": "惠济区", + "value": "410108" + }, + { + "label": "中牟县", + "value": "410122" + }, + { + "label": "郑州经济技术开发区", + "value": "410171" + }, + { + "label": "郑州高新技术产业开发区", + "value": "410172" + }, + { + "label": "郑州航空港经济综合实验区", + "value": "410173" + }, + { + "label": "巩义市", + "value": "410181" + }, + { + "label": "荥阳市", + "value": "410182" + }, + { + "label": "新密市", + "value": "410183" + }, + { + "label": "新郑市", + "value": "410184" + }, + { + "label": "登封市", + "value": "410185" + } + ], + [{ + "label": "龙亭区", + "value": "410202" + }, + { + "label": "顺河回族区", + "value": "410203" + }, + { + "label": "鼓楼区", + "value": "410204" + }, + { + "label": "禹王台区", + "value": "410205" + }, + { + "label": "祥符区", + "value": "410212" + }, + { + "label": "杞县", + "value": "410221" + }, + { + "label": "通许县", + "value": "410222" + }, + { + "label": "尉氏县", + "value": "410223" + }, + { + "label": "兰考县", + "value": "410225" + } + ], + [{ + "label": "老城区", + "value": "410302" + }, + { + "label": "西工区", + "value": "410303" + }, + { + "label": "瀍河回族区", + "value": "410304" + }, + { + "label": "涧西区", + "value": "410305" + }, + { + "label": "吉利区", + "value": "410306" + }, + { + "label": "洛龙区", + "value": "410311" + }, + { + "label": "孟津县", + "value": "410322" + }, + { + "label": "新安县", + "value": "410323" + }, + { + "label": "栾川县", + "value": "410324" + }, + { + "label": "嵩县", + "value": "410325" + }, + { + "label": "汝阳县", + "value": "410326" + }, + { + "label": "宜阳县", + "value": "410327" + }, + { + "label": "洛宁县", + "value": "410328" + }, + { + "label": "伊川县", + "value": "410329" + }, + { + "label": "洛阳高新技术产业开发区", + "value": "410371" + }, + { + "label": "偃师市", + "value": "410381" + } + ], + [{ + "label": "新华区", + "value": "410402" + }, + { + "label": "卫东区", + "value": "410403" + }, + { + "label": "石龙区", + "value": "410404" + }, + { + "label": "湛河区", + "value": "410411" + }, + { + "label": "宝丰县", + "value": "410421" + }, + { + "label": "叶县", + "value": "410422" + }, + { + "label": "鲁山县", + "value": "410423" + }, + { + "label": "郏县", + "value": "410425" + }, + { + "label": "平顶山高新技术产业开发区", + "value": "410471" + }, + { + "label": "平顶山市新城区", + "value": "410472" + }, + { + "label": "舞钢市", + "value": "410481" + }, + { + "label": "汝州市", + "value": "410482" + } + ], + [{ + "label": "文峰区", + "value": "410502" + }, + { + "label": "北关区", + "value": "410503" + }, + { + "label": "殷都区", + "value": "410505" + }, + { + "label": "龙安区", + "value": "410506" + }, + { + "label": "安阳县", + "value": "410522" + }, + { + "label": "汤阴县", + "value": "410523" + }, + { + "label": "滑县", + "value": "410526" + }, + { + "label": "内黄县", + "value": "410527" + }, + { + "label": "安阳高新技术产业开发区", + "value": "410571" + }, + { + "label": "林州市", + "value": "410581" + } + ], + [{ + "label": "鹤山区", + "value": "410602" + }, + { + "label": "山城区", + "value": "410603" + }, + { + "label": "淇滨区", + "value": "410611" + }, + { + "label": "浚县", + "value": "410621" + }, + { + "label": "淇县", + "value": "410622" + }, + { + "label": "鹤壁经济技术开发区", + "value": "410671" + } + ], + [{ + "label": "红旗区", + "value": "410702" + }, + { + "label": "卫滨区", + "value": "410703" + }, + { + "label": "凤泉区", + "value": "410704" + }, + { + "label": "牧野区", + "value": "410711" + }, + { + "label": "新乡县", + "value": "410721" + }, + { + "label": "获嘉县", + "value": "410724" + }, + { + "label": "原阳县", + "value": "410725" + }, + { + "label": "延津县", + "value": "410726" + }, + { + "label": "封丘县", + "value": "410727" + }, + { + "label": "长垣县", + "value": "410728" + }, + { + "label": "新乡高新技术产业开发区", + "value": "410771" + }, + { + "label": "新乡经济技术开发区", + "value": "410772" + }, + { + "label": "新乡市平原城乡一体化示范区", + "value": "410773" + }, + { + "label": "卫辉市", + "value": "410781" + }, + { + "label": "辉县市", + "value": "410782" + } + ], + [{ + "label": "解放区", + "value": "410802" + }, + { + "label": "中站区", + "value": "410803" + }, + { + "label": "马村区", + "value": "410804" + }, + { + "label": "山阳区", + "value": "410811" + }, + { + "label": "修武县", + "value": "410821" + }, + { + "label": "博爱县", + "value": "410822" + }, + { + "label": "武陟县", + "value": "410823" + }, + { + "label": "温县", + "value": "410825" + }, + { + "label": "焦作城乡一体化示范区", + "value": "410871" + }, + { + "label": "沁阳市", + "value": "410882" + }, + { + "label": "孟州市", + "value": "410883" + } + ], + [{ + "label": "华龙区", + "value": "410902" + }, + { + "label": "清丰县", + "value": "410922" + }, + { + "label": "南乐县", + "value": "410923" + }, + { + "label": "范县", + "value": "410926" + }, + { + "label": "台前县", + "value": "410927" + }, + { + "label": "濮阳县", + "value": "410928" + }, + { + "label": "河南濮阳工业园区", + "value": "410971" + }, + { + "label": "濮阳经济技术开发区", + "value": "410972" + } + ], + [{ + "label": "魏都区", + "value": "411002" + }, + { + "label": "建安区", + "value": "411003" + }, + { + "label": "鄢陵县", + "value": "411024" + }, + { + "label": "襄城县", + "value": "411025" + }, + { + "label": "许昌经济技术开发区", + "value": "411071" + }, + { + "label": "禹州市", + "value": "411081" + }, + { + "label": "长葛市", + "value": "411082" + } + ], + [{ + "label": "源汇区", + "value": "411102" + }, + { + "label": "郾城区", + "value": "411103" + }, + { + "label": "召陵区", + "value": "411104" + }, + { + "label": "舞阳县", + "value": "411121" + }, + { + "label": "临颍县", + "value": "411122" + }, + { + "label": "漯河经济技术开发区", + "value": "411171" + } + ], + [{ + "label": "湖滨区", + "value": "411202" + }, + { + "label": "陕州区", + "value": "411203" + }, + { + "label": "渑池县", + "value": "411221" + }, + { + "label": "卢氏县", + "value": "411224" + }, + { + "label": "河南三门峡经济开发区", + "value": "411271" + }, + { + "label": "义马市", + "value": "411281" + }, + { + "label": "灵宝市", + "value": "411282" + } + ], + [{ + "label": "宛城区", + "value": "411302" + }, + { + "label": "卧龙区", + "value": "411303" + }, + { + "label": "南召县", + "value": "411321" + }, + { + "label": "方城县", + "value": "411322" + }, + { + "label": "西峡县", + "value": "411323" + }, + { + "label": "镇平县", + "value": "411324" + }, + { + "label": "内乡县", + "value": "411325" + }, + { + "label": "淅川县", + "value": "411326" + }, + { + "label": "社旗县", + "value": "411327" + }, + { + "label": "唐河县", + "value": "411328" + }, + { + "label": "新野县", + "value": "411329" + }, + { + "label": "桐柏县", + "value": "411330" + }, + { + "label": "南阳高新技术产业开发区", + "value": "411371" + }, + { + "label": "南阳市城乡一体化示范区", + "value": "411372" + }, + { + "label": "邓州市", + "value": "411381" + } + ], + [{ + "label": "梁园区", + "value": "411402" + }, + { + "label": "睢阳区", + "value": "411403" + }, + { + "label": "民权县", + "value": "411421" + }, + { + "label": "睢县", + "value": "411422" + }, + { + "label": "宁陵县", + "value": "411423" + }, + { + "label": "柘城县", + "value": "411424" + }, + { + "label": "虞城县", + "value": "411425" + }, + { + "label": "夏邑县", + "value": "411426" + }, + { + "label": "豫东综合物流产业聚集区", + "value": "411471" + }, + { + "label": "河南商丘经济开发区", + "value": "411472" + }, + { + "label": "永城市", + "value": "411481" + } + ], + [{ + "label": "浉河区", + "value": "411502" + }, + { + "label": "平桥区", + "value": "411503" + }, + { + "label": "罗山县", + "value": "411521" + }, + { + "label": "光山县", + "value": "411522" + }, + { + "label": "新县", + "value": "411523" + }, + { + "label": "商城县", + "value": "411524" + }, + { + "label": "固始县", + "value": "411525" + }, + { + "label": "潢川县", + "value": "411526" + }, + { + "label": "淮滨县", + "value": "411527" + }, + { + "label": "息县", + "value": "411528" + }, + { + "label": "信阳高新技术产业开发区", + "value": "411571" + } + ], + [{ + "label": "川汇区", + "value": "411602" + }, + { + "label": "扶沟县", + "value": "411621" + }, + { + "label": "西华县", + "value": "411622" + }, + { + "label": "商水县", + "value": "411623" + }, + { + "label": "沈丘县", + "value": "411624" + }, + { + "label": "郸城县", + "value": "411625" + }, + { + "label": "淮阳县", + "value": "411626" + }, + { + "label": "太康县", + "value": "411627" + }, + { + "label": "鹿邑县", + "value": "411628" + }, + { + "label": "河南周口经济开发区", + "value": "411671" + }, + { + "label": "项城市", + "value": "411681" + } + ], + [{ + "label": "驿城区", + "value": "411702" + }, + { + "label": "西平县", + "value": "411721" + }, + { + "label": "上蔡县", + "value": "411722" + }, + { + "label": "平舆县", + "value": "411723" + }, + { + "label": "正阳县", + "value": "411724" + }, + { + "label": "确山县", + "value": "411725" + }, + { + "label": "泌阳县", + "value": "411726" + }, + { + "label": "汝南县", + "value": "411727" + }, + { + "label": "遂平县", + "value": "411728" + }, + { + "label": "新蔡县", + "value": "411729" + }, + { + "label": "河南驻马店经济开发区", + "value": "411771" + } + ], + [{ + "label": "济源市", + "value": "419001" + }] + ], + [ + [{ + "label": "江岸区", + "value": "420102" + }, + { + "label": "江汉区", + "value": "420103" + }, + { + "label": "硚口区", + "value": "420104" + }, + { + "label": "汉阳区", + "value": "420105" + }, + { + "label": "武昌区", + "value": "420106" + }, + { + "label": "青山区", + "value": "420107" + }, + { + "label": "洪山区", + "value": "420111" + }, + { + "label": "东西湖区", + "value": "420112" + }, + { + "label": "汉南区", + "value": "420113" + }, + { + "label": "蔡甸区", + "value": "420114" + }, + { + "label": "江夏区", + "value": "420115" + }, + { + "label": "黄陂区", + "value": "420116" + }, + { + "label": "新洲区", + "value": "420117" + } + ], + [{ + "label": "黄石港区", + "value": "420202" + }, + { + "label": "西塞山区", + "value": "420203" + }, + { + "label": "下陆区", + "value": "420204" + }, + { + "label": "铁山区", + "value": "420205" + }, + { + "label": "阳新县", + "value": "420222" + }, + { + "label": "大冶市", + "value": "420281" + } + ], + [{ + "label": "茅箭区", + "value": "420302" + }, + { + "label": "张湾区", + "value": "420303" + }, + { + "label": "郧阳区", + "value": "420304" + }, + { + "label": "郧西县", + "value": "420322" + }, + { + "label": "竹山县", + "value": "420323" + }, + { + "label": "竹溪县", + "value": "420324" + }, + { + "label": "房县", + "value": "420325" + }, + { + "label": "丹江口市", + "value": "420381" + } + ], + [{ + "label": "西陵区", + "value": "420502" + }, + { + "label": "伍家岗区", + "value": "420503" + }, + { + "label": "点军区", + "value": "420504" + }, + { + "label": "猇亭区", + "value": "420505" + }, + { + "label": "夷陵区", + "value": "420506" + }, + { + "label": "远安县", + "value": "420525" + }, + { + "label": "兴山县", + "value": "420526" + }, + { + "label": "秭归县", + "value": "420527" + }, + { + "label": "长阳土家族自治县", + "value": "420528" + }, + { + "label": "五峰土家族自治县", + "value": "420529" + }, + { + "label": "宜都市", + "value": "420581" + }, + { + "label": "当阳市", + "value": "420582" + }, + { + "label": "枝江市", + "value": "420583" + } + ], + [{ + "label": "襄城区", + "value": "420602" + }, + { + "label": "樊城区", + "value": "420606" + }, + { + "label": "襄州区", + "value": "420607" + }, + { + "label": "南漳县", + "value": "420624" + }, + { + "label": "谷城县", + "value": "420625" + }, + { + "label": "保康县", + "value": "420626" + }, + { + "label": "老河口市", + "value": "420682" + }, + { + "label": "枣阳市", + "value": "420683" + }, + { + "label": "宜城市", + "value": "420684" + } + ], + [{ + "label": "梁子湖区", + "value": "420702" + }, + { + "label": "华容区", + "value": "420703" + }, + { + "label": "鄂城区", + "value": "420704" + } + ], + [{ + "label": "东宝区", + "value": "420802" + }, + { + "label": "掇刀区", + "value": "420804" + }, + { + "label": "京山县", + "value": "420821" + }, + { + "label": "沙洋县", + "value": "420822" + }, + { + "label": "钟祥市", + "value": "420881" + } + ], + [{ + "label": "孝南区", + "value": "420902" + }, + { + "label": "孝昌县", + "value": "420921" + }, + { + "label": "大悟县", + "value": "420922" + }, + { + "label": "云梦县", + "value": "420923" + }, + { + "label": "应城市", + "value": "420981" + }, + { + "label": "安陆市", + "value": "420982" + }, + { + "label": "汉川市", + "value": "420984" + } + ], + [{ + "label": "沙市区", + "value": "421002" + }, + { + "label": "荆州区", + "value": "421003" + }, + { + "label": "公安县", + "value": "421022" + }, + { + "label": "监利县", + "value": "421023" + }, + { + "label": "江陵县", + "value": "421024" + }, + { + "label": "荆州经济技术开发区", + "value": "421071" + }, + { + "label": "石首市", + "value": "421081" + }, + { + "label": "洪湖市", + "value": "421083" + }, + { + "label": "松滋市", + "value": "421087" + } + ], + [{ + "label": "黄州区", + "value": "421102" + }, + { + "label": "团风县", + "value": "421121" + }, + { + "label": "红安县", + "value": "421122" + }, + { + "label": "罗田县", + "value": "421123" + }, + { + "label": "英山县", + "value": "421124" + }, + { + "label": "浠水县", + "value": "421125" + }, + { + "label": "蕲春县", + "value": "421126" + }, + { + "label": "黄梅县", + "value": "421127" + }, + { + "label": "龙感湖管理区", + "value": "421171" + }, + { + "label": "麻城市", + "value": "421181" + }, + { + "label": "武穴市", + "value": "421182" + } + ], + [{ + "label": "咸安区", + "value": "421202" + }, + { + "label": "嘉鱼县", + "value": "421221" + }, + { + "label": "通城县", + "value": "421222" + }, + { + "label": "崇阳县", + "value": "421223" + }, + { + "label": "通山县", + "value": "421224" + }, + { + "label": "赤壁市", + "value": "421281" + } + ], + [{ + "label": "曾都区", + "value": "421303" + }, + { + "label": "随县", + "value": "421321" + }, + { + "label": "广水市", + "value": "421381" + } + ], + [{ + "label": "恩施市", + "value": "422801" + }, + { + "label": "利川市", + "value": "422802" + }, + { + "label": "建始县", + "value": "422822" + }, + { + "label": "巴东县", + "value": "422823" + }, + { + "label": "宣恩县", + "value": "422825" + }, + { + "label": "咸丰县", + "value": "422826" + }, + { + "label": "来凤县", + "value": "422827" + }, + { + "label": "鹤峰县", + "value": "422828" + } + ], + [{ + "label": "仙桃市", + "value": "429004" + }, + { + "label": "潜江市", + "value": "429005" + }, + { + "label": "天门市", + "value": "429006" + }, + { + "label": "神农架林区", + "value": "429021" + } + ] + ], + [ + [{ + "label": "芙蓉区", + "value": "430102" + }, + { + "label": "天心区", + "value": "430103" + }, + { + "label": "岳麓区", + "value": "430104" + }, + { + "label": "开福区", + "value": "430105" + }, + { + "label": "雨花区", + "value": "430111" + }, + { + "label": "望城区", + "value": "430112" + }, + { + "label": "长沙县", + "value": "430121" + }, + { + "label": "浏阳市", + "value": "430181" + }, + { + "label": "宁乡市", + "value": "430182" + } + ], + [{ + "label": "荷塘区", + "value": "430202" + }, + { + "label": "芦淞区", + "value": "430203" + }, + { + "label": "石峰区", + "value": "430204" + }, + { + "label": "天元区", + "value": "430211" + }, + { + "label": "株洲县", + "value": "430221" + }, + { + "label": "攸县", + "value": "430223" + }, + { + "label": "茶陵县", + "value": "430224" + }, + { + "label": "炎陵县", + "value": "430225" + }, + { + "label": "云龙示范区", + "value": "430271" + }, + { + "label": "醴陵市", + "value": "430281" + } + ], + [{ + "label": "雨湖区", + "value": "430302" + }, + { + "label": "岳塘区", + "value": "430304" + }, + { + "label": "湘潭县", + "value": "430321" + }, + { + "label": "湖南湘潭高新技术产业园区", + "value": "430371" + }, + { + "label": "湘潭昭山示范区", + "value": "430372" + }, + { + "label": "湘潭九华示范区", + "value": "430373" + }, + { + "label": "湘乡市", + "value": "430381" + }, + { + "label": "韶山市", + "value": "430382" + } + ], + [{ + "label": "珠晖区", + "value": "430405" + }, + { + "label": "雁峰区", + "value": "430406" + }, + { + "label": "石鼓区", + "value": "430407" + }, + { + "label": "蒸湘区", + "value": "430408" + }, + { + "label": "南岳区", + "value": "430412" + }, + { + "label": "衡阳县", + "value": "430421" + }, + { + "label": "衡南县", + "value": "430422" + }, + { + "label": "衡山县", + "value": "430423" + }, + { + "label": "衡东县", + "value": "430424" + }, + { + "label": "祁东县", + "value": "430426" + }, + { + "label": "衡阳综合保税区", + "value": "430471" + }, + { + "label": "湖南衡阳高新技术产业园区", + "value": "430472" + }, + { + "label": "湖南衡阳松木经济开发区", + "value": "430473" + }, + { + "label": "耒阳市", + "value": "430481" + }, + { + "label": "常宁市", + "value": "430482" + } + ], + [{ + "label": "双清区", + "value": "430502" + }, + { + "label": "大祥区", + "value": "430503" + }, + { + "label": "北塔区", + "value": "430511" + }, + { + "label": "邵东县", + "value": "430521" + }, + { + "label": "新邵县", + "value": "430522" + }, + { + "label": "邵阳县", + "value": "430523" + }, + { + "label": "隆回县", + "value": "430524" + }, + { + "label": "洞口县", + "value": "430525" + }, + { + "label": "绥宁县", + "value": "430527" + }, + { + "label": "新宁县", + "value": "430528" + }, + { + "label": "城步苗族自治县", + "value": "430529" + }, + { + "label": "武冈市", + "value": "430581" + } + ], + [{ + "label": "岳阳楼区", + "value": "430602" + }, + { + "label": "云溪区", + "value": "430603" + }, + { + "label": "君山区", + "value": "430611" + }, + { + "label": "岳阳县", + "value": "430621" + }, + { + "label": "华容县", + "value": "430623" + }, + { + "label": "湘阴县", + "value": "430624" + }, + { + "label": "平江县", + "value": "430626" + }, + { + "label": "岳阳市屈原管理区", + "value": "430671" + }, + { + "label": "汨罗市", + "value": "430681" + }, + { + "label": "临湘市", + "value": "430682" + } + ], + [{ + "label": "武陵区", + "value": "430702" + }, + { + "label": "鼎城区", + "value": "430703" + }, + { + "label": "安乡县", + "value": "430721" + }, + { + "label": "汉寿县", + "value": "430722" + }, + { + "label": "澧县", + "value": "430723" + }, + { + "label": "临澧县", + "value": "430724" + }, + { + "label": "桃源县", + "value": "430725" + }, + { + "label": "石门县", + "value": "430726" + }, + { + "label": "常德市西洞庭管理区", + "value": "430771" + }, + { + "label": "津市市", + "value": "430781" + } + ], + [{ + "label": "永定区", + "value": "430802" + }, + { + "label": "武陵源区", + "value": "430811" + }, + { + "label": "慈利县", + "value": "430821" + }, + { + "label": "桑植县", + "value": "430822" + } + ], + [{ + "label": "资阳区", + "value": "430902" + }, + { + "label": "赫山区", + "value": "430903" + }, + { + "label": "南县", + "value": "430921" + }, + { + "label": "桃江县", + "value": "430922" + }, + { + "label": "安化县", + "value": "430923" + }, + { + "label": "益阳市大通湖管理区", + "value": "430971" + }, + { + "label": "湖南益阳高新技术产业园区", + "value": "430972" + }, + { + "label": "沅江市", + "value": "430981" + } + ], + [{ + "label": "北湖区", + "value": "431002" + }, + { + "label": "苏仙区", + "value": "431003" + }, + { + "label": "桂阳县", + "value": "431021" + }, + { + "label": "宜章县", + "value": "431022" + }, + { + "label": "永兴县", + "value": "431023" + }, + { + "label": "嘉禾县", + "value": "431024" + }, + { + "label": "临武县", + "value": "431025" + }, + { + "label": "汝城县", + "value": "431026" + }, + { + "label": "桂东县", + "value": "431027" + }, + { + "label": "安仁县", + "value": "431028" + }, + { + "label": "资兴市", + "value": "431081" + } + ], + [{ + "label": "零陵区", + "value": "431102" + }, + { + "label": "冷水滩区", + "value": "431103" + }, + { + "label": "祁阳县", + "value": "431121" + }, + { + "label": "东安县", + "value": "431122" + }, + { + "label": "双牌县", + "value": "431123" + }, + { + "label": "道县", + "value": "431124" + }, + { + "label": "江永县", + "value": "431125" + }, + { + "label": "宁远县", + "value": "431126" + }, + { + "label": "蓝山县", + "value": "431127" + }, + { + "label": "新田县", + "value": "431128" + }, + { + "label": "江华瑶族自治县", + "value": "431129" + }, + { + "label": "永州经济技术开发区", + "value": "431171" + }, + { + "label": "永州市金洞管理区", + "value": "431172" + }, + { + "label": "永州市回龙圩管理区", + "value": "431173" + } + ], + [{ + "label": "鹤城区", + "value": "431202" + }, + { + "label": "中方县", + "value": "431221" + }, + { + "label": "沅陵县", + "value": "431222" + }, + { + "label": "辰溪县", + "value": "431223" + }, + { + "label": "溆浦县", + "value": "431224" + }, + { + "label": "会同县", + "value": "431225" + }, + { + "label": "麻阳苗族自治县", + "value": "431226" + }, + { + "label": "新晃侗族自治县", + "value": "431227" + }, + { + "label": "芷江侗族自治县", + "value": "431228" + }, + { + "label": "靖州苗族侗族自治县", + "value": "431229" + }, + { + "label": "通道侗族自治县", + "value": "431230" + }, + { + "label": "怀化市洪江管理区", + "value": "431271" + }, + { + "label": "洪江市", + "value": "431281" + } + ], + [{ + "label": "娄星区", + "value": "431302" + }, + { + "label": "双峰县", + "value": "431321" + }, + { + "label": "新化县", + "value": "431322" + }, + { + "label": "冷水江市", + "value": "431381" + }, + { + "label": "涟源市", + "value": "431382" + } + ], + [{ + "label": "吉首市", + "value": "433101" + }, + { + "label": "泸溪县", + "value": "433122" + }, + { + "label": "凤凰县", + "value": "433123" + }, + { + "label": "花垣县", + "value": "433124" + }, + { + "label": "保靖县", + "value": "433125" + }, + { + "label": "古丈县", + "value": "433126" + }, + { + "label": "永顺县", + "value": "433127" + }, + { + "label": "龙山县", + "value": "433130" + }, + { + "label": "湖南吉首经济开发区", + "value": "433172" + }, + { + "label": "湖南永顺经济开发区", + "value": "433173" + } + ] + ], + [ + [{ + "label": "荔湾区", + "value": "440103" + }, + { + "label": "越秀区", + "value": "440104" + }, + { + "label": "海珠区", + "value": "440105" + }, + { + "label": "天河区", + "value": "440106" + }, + { + "label": "白云区", + "value": "440111" + }, + { + "label": "黄埔区", + "value": "440112" + }, + { + "label": "番禺区", + "value": "440113" + }, + { + "label": "花都区", + "value": "440114" + }, + { + "label": "南沙区", + "value": "440115" + }, + { + "label": "从化区", + "value": "440117" + }, + { + "label": "增城区", + "value": "440118" + } + ], + [{ + "label": "武江区", + "value": "440203" + }, + { + "label": "浈江区", + "value": "440204" + }, + { + "label": "曲江区", + "value": "440205" + }, + { + "label": "始兴县", + "value": "440222" + }, + { + "label": "仁化县", + "value": "440224" + }, + { + "label": "翁源县", + "value": "440229" + }, + { + "label": "乳源瑶族自治县", + "value": "440232" + }, + { + "label": "新丰县", + "value": "440233" + }, + { + "label": "乐昌市", + "value": "440281" + }, + { + "label": "南雄市", + "value": "440282" + } + ], + [{ + "label": "罗湖区", + "value": "440303" + }, + { + "label": "福田区", + "value": "440304" + }, + { + "label": "南山区", + "value": "440305" + }, + { + "label": "宝安区", + "value": "440306" + }, + { + "label": "龙岗区", + "value": "440307" + }, + { + "label": "盐田区", + "value": "440308" + }, + { + "label": "龙华区", + "value": "440309" + }, + { + "label": "坪山区", + "value": "440310" + } + ], + [{ + "label": "香洲区", + "value": "440402" + }, + { + "label": "斗门区", + "value": "440403" + }, + { + "label": "金湾区", + "value": "440404" + } + ], + [{ + "label": "龙湖区", + "value": "440507" + }, + { + "label": "金平区", + "value": "440511" + }, + { + "label": "濠江区", + "value": "440512" + }, + { + "label": "潮阳区", + "value": "440513" + }, + { + "label": "潮南区", + "value": "440514" + }, + { + "label": "澄海区", + "value": "440515" + }, + { + "label": "南澳县", + "value": "440523" + } + ], + [{ + "label": "禅城区", + "value": "440604" + }, + { + "label": "南海区", + "value": "440605" + }, + { + "label": "顺德区", + "value": "440606" + }, + { + "label": "三水区", + "value": "440607" + }, + { + "label": "高明区", + "value": "440608" + } + ], + [{ + "label": "蓬江区", + "value": "440703" + }, + { + "label": "江海区", + "value": "440704" + }, + { + "label": "新会区", + "value": "440705" + }, + { + "label": "台山市", + "value": "440781" + }, + { + "label": "开平市", + "value": "440783" + }, + { + "label": "鹤山市", + "value": "440784" + }, + { + "label": "恩平市", + "value": "440785" + } + ], + [{ + "label": "赤坎区", + "value": "440802" + }, + { + "label": "霞山区", + "value": "440803" + }, + { + "label": "坡头区", + "value": "440804" + }, + { + "label": "麻章区", + "value": "440811" + }, + { + "label": "遂溪县", + "value": "440823" + }, + { + "label": "徐闻县", + "value": "440825" + }, + { + "label": "廉江市", + "value": "440881" + }, + { + "label": "雷州市", + "value": "440882" + }, + { + "label": "吴川市", + "value": "440883" + } + ], + [{ + "label": "茂南区", + "value": "440902" + }, + { + "label": "电白区", + "value": "440904" + }, + { + "label": "高州市", + "value": "440981" + }, + { + "label": "化州市", + "value": "440982" + }, + { + "label": "信宜市", + "value": "440983" + } + ], + [{ + "label": "端州区", + "value": "441202" + }, + { + "label": "鼎湖区", + "value": "441203" + }, + { + "label": "高要区", + "value": "441204" + }, + { + "label": "广宁县", + "value": "441223" + }, + { + "label": "怀集县", + "value": "441224" + }, + { + "label": "封开县", + "value": "441225" + }, + { + "label": "德庆县", + "value": "441226" + }, + { + "label": "四会市", + "value": "441284" + } + ], + [{ + "label": "惠城区", + "value": "441302" + }, + { + "label": "惠阳区", + "value": "441303" + }, + { + "label": "博罗县", + "value": "441322" + }, + { + "label": "惠东县", + "value": "441323" + }, + { + "label": "龙门县", + "value": "441324" + } + ], + [{ + "label": "梅江区", + "value": "441402" + }, + { + "label": "梅县区", + "value": "441403" + }, + { + "label": "大埔县", + "value": "441422" + }, + { + "label": "丰顺县", + "value": "441423" + }, + { + "label": "五华县", + "value": "441424" + }, + { + "label": "平远县", + "value": "441426" + }, + { + "label": "蕉岭县", + "value": "441427" + }, + { + "label": "兴宁市", + "value": "441481" + } + ], + [{ + "label": "城区", + "value": "441502" + }, + { + "label": "海丰县", + "value": "441521" + }, + { + "label": "陆河县", + "value": "441523" + }, + { + "label": "陆丰市", + "value": "441581" + } + ], + [{ + "label": "源城区", + "value": "441602" + }, + { + "label": "紫金县", + "value": "441621" + }, + { + "label": "龙川县", + "value": "441622" + }, + { + "label": "连平县", + "value": "441623" + }, + { + "label": "和平县", + "value": "441624" + }, + { + "label": "东源县", + "value": "441625" + } + ], + [{ + "label": "江城区", + "value": "441702" + }, + { + "label": "阳东区", + "value": "441704" + }, + { + "label": "阳西县", + "value": "441721" + }, + { + "label": "阳春市", + "value": "441781" + } + ], + [{ + "label": "清城区", + "value": "441802" + }, + { + "label": "清新区", + "value": "441803" + }, + { + "label": "佛冈县", + "value": "441821" + }, + { + "label": "阳山县", + "value": "441823" + }, + { + "label": "连山壮族瑶族自治县", + "value": "441825" + }, + { + "label": "连南瑶族自治县", + "value": "441826" + }, + { + "label": "英德市", + "value": "441881" + }, + { + "label": "连州市", + "value": "441882" + } + ], + [{ + "label": "东莞市", + "value": "441900" + }], + [{ + "label": "中山市", + "value": "442000" + }], + [{ + "label": "湘桥区", + "value": "445102" + }, + { + "label": "潮安区", + "value": "445103" + }, + { + "label": "饶平县", + "value": "445122" + } + ], + [{ + "label": "榕城区", + "value": "445202" + }, + { + "label": "揭东区", + "value": "445203" + }, + { + "label": "揭西县", + "value": "445222" + }, + { + "label": "惠来县", + "value": "445224" + }, + { + "label": "普宁市", + "value": "445281" + } + ], + [{ + "label": "云城区", + "value": "445302" + }, + { + "label": "云安区", + "value": "445303" + }, + { + "label": "新兴县", + "value": "445321" + }, + { + "label": "郁南县", + "value": "445322" + }, + { + "label": "罗定市", + "value": "445381" + } + ] + ], + [ + [{ + "label": "兴宁区", + "value": "450102" + }, + { + "label": "青秀区", + "value": "450103" + }, + { + "label": "江南区", + "value": "450105" + }, + { + "label": "西乡塘区", + "value": "450107" + }, + { + "label": "良庆区", + "value": "450108" + }, + { + "label": "邕宁区", + "value": "450109" + }, + { + "label": "武鸣区", + "value": "450110" + }, + { + "label": "隆安县", + "value": "450123" + }, + { + "label": "马山县", + "value": "450124" + }, + { + "label": "上林县", + "value": "450125" + }, + { + "label": "宾阳县", + "value": "450126" + }, + { + "label": "横县", + "value": "450127" + } + ], + [{ + "label": "城中区", + "value": "450202" + }, + { + "label": "鱼峰区", + "value": "450203" + }, + { + "label": "柳南区", + "value": "450204" + }, + { + "label": "柳北区", + "value": "450205" + }, + { + "label": "柳江区", + "value": "450206" + }, + { + "label": "柳城县", + "value": "450222" + }, + { + "label": "鹿寨县", + "value": "450223" + }, + { + "label": "融安县", + "value": "450224" + }, + { + "label": "融水苗族自治县", + "value": "450225" + }, + { + "label": "三江侗族自治县", + "value": "450226" + } + ], + [{ + "label": "秀峰区", + "value": "450302" + }, + { + "label": "叠彩区", + "value": "450303" + }, + { + "label": "象山区", + "value": "450304" + }, + { + "label": "七星区", + "value": "450305" + }, + { + "label": "雁山区", + "value": "450311" + }, + { + "label": "临桂区", + "value": "450312" + }, + { + "label": "阳朔县", + "value": "450321" + }, + { + "label": "灵川县", + "value": "450323" + }, + { + "label": "全州县", + "value": "450324" + }, + { + "label": "兴安县", + "value": "450325" + }, + { + "label": "永福县", + "value": "450326" + }, + { + "label": "灌阳县", + "value": "450327" + }, + { + "label": "龙胜各族自治县", + "value": "450328" + }, + { + "label": "资源县", + "value": "450329" + }, + { + "label": "平乐县", + "value": "450330" + }, + { + "label": "荔浦县", + "value": "450331" + }, + { + "label": "恭城瑶族自治县", + "value": "450332" + } + ], + [{ + "label": "万秀区", + "value": "450403" + }, + { + "label": "长洲区", + "value": "450405" + }, + { + "label": "龙圩区", + "value": "450406" + }, + { + "label": "苍梧县", + "value": "450421" + }, + { + "label": "藤县", + "value": "450422" + }, + { + "label": "蒙山县", + "value": "450423" + }, + { + "label": "岑溪市", + "value": "450481" + } + ], + [{ + "label": "海城区", + "value": "450502" + }, + { + "label": "银海区", + "value": "450503" + }, + { + "label": "铁山港区", + "value": "450512" + }, + { + "label": "合浦县", + "value": "450521" + } + ], + [{ + "label": "港口区", + "value": "450602" + }, + { + "label": "防城区", + "value": "450603" + }, + { + "label": "上思县", + "value": "450621" + }, + { + "label": "东兴市", + "value": "450681" + } + ], + [{ + "label": "钦南区", + "value": "450702" + }, + { + "label": "钦北区", + "value": "450703" + }, + { + "label": "灵山县", + "value": "450721" + }, + { + "label": "浦北县", + "value": "450722" + } + ], + [{ + "label": "港北区", + "value": "450802" + }, + { + "label": "港南区", + "value": "450803" + }, + { + "label": "覃塘区", + "value": "450804" + }, + { + "label": "平南县", + "value": "450821" + }, + { + "label": "桂平市", + "value": "450881" + } + ], + [{ + "label": "玉州区", + "value": "450902" + }, + { + "label": "福绵区", + "value": "450903" + }, + { + "label": "容县", + "value": "450921" + }, + { + "label": "陆川县", + "value": "450922" + }, + { + "label": "博白县", + "value": "450923" + }, + { + "label": "兴业县", + "value": "450924" + }, + { + "label": "北流市", + "value": "450981" + } + ], + [{ + "label": "右江区", + "value": "451002" + }, + { + "label": "田阳县", + "value": "451021" + }, + { + "label": "田东县", + "value": "451022" + }, + { + "label": "平果县", + "value": "451023" + }, + { + "label": "德保县", + "value": "451024" + }, + { + "label": "那坡县", + "value": "451026" + }, + { + "label": "凌云县", + "value": "451027" + }, + { + "label": "乐业县", + "value": "451028" + }, + { + "label": "田林县", + "value": "451029" + }, + { + "label": "西林县", + "value": "451030" + }, + { + "label": "隆林各族自治县", + "value": "451031" + }, + { + "label": "靖西市", + "value": "451081" + } + ], + [{ + "label": "八步区", + "value": "451102" + }, + { + "label": "平桂区", + "value": "451103" + }, + { + "label": "昭平县", + "value": "451121" + }, + { + "label": "钟山县", + "value": "451122" + }, + { + "label": "富川瑶族自治县", + "value": "451123" + } + ], + [{ + "label": "金城江区", + "value": "451202" + }, + { + "label": "宜州区", + "value": "451203" + }, + { + "label": "南丹县", + "value": "451221" + }, + { + "label": "天峨县", + "value": "451222" + }, + { + "label": "凤山县", + "value": "451223" + }, + { + "label": "东兰县", + "value": "451224" + }, + { + "label": "罗城仫佬族自治县", + "value": "451225" + }, + { + "label": "环江毛南族自治县", + "value": "451226" + }, + { + "label": "巴马瑶族自治县", + "value": "451227" + }, + { + "label": "都安瑶族自治县", + "value": "451228" + }, + { + "label": "大化瑶族自治县", + "value": "451229" + } + ], + [{ + "label": "兴宾区", + "value": "451302" + }, + { + "label": "忻城县", + "value": "451321" + }, + { + "label": "象州县", + "value": "451322" + }, + { + "label": "武宣县", + "value": "451323" + }, + { + "label": "金秀瑶族自治县", + "value": "451324" + }, + { + "label": "合山市", + "value": "451381" + } + ], + [{ + "label": "江州区", + "value": "451402" + }, + { + "label": "扶绥县", + "value": "451421" + }, + { + "label": "宁明县", + "value": "451422" + }, + { + "label": "龙州县", + "value": "451423" + }, + { + "label": "大新县", + "value": "451424" + }, + { + "label": "天等县", + "value": "451425" + }, + { + "label": "凭祥市", + "value": "451481" + } + ] + ], + [ + [{ + "label": "秀英区", + "value": "460105" + }, + { + "label": "龙华区", + "value": "460106" + }, + { + "label": "琼山区", + "value": "460107" + }, + { + "label": "美兰区", + "value": "460108" + } + ], + [{ + "label": "海棠区", + "value": "460202" + }, + { + "label": "吉阳区", + "value": "460203" + }, + { + "label": "天涯区", + "value": "460204" + }, + { + "label": "崖州区", + "value": "460205" + } + ], + [{ + "label": "西沙群岛", + "value": "460321" + }, + { + "label": "南沙群岛", + "value": "460322" + }, + { + "label": "中沙群岛的岛礁及其海域", + "value": "460323" + } + ], + [{ + "label": "儋州市", + "value": "460400" + }], + [{ + "label": "五指山市", + "value": "469001" + }, + { + "label": "琼海市", + "value": "469002" + }, + { + "label": "文昌市", + "value": "469005" + }, + { + "label": "万宁市", + "value": "469006" + }, + { + "label": "东方市", + "value": "469007" + }, + { + "label": "定安县", + "value": "469021" + }, + { + "label": "屯昌县", + "value": "469022" + }, + { + "label": "澄迈县", + "value": "469023" + }, + { + "label": "临高县", + "value": "469024" + }, + { + "label": "白沙黎族自治县", + "value": "469025" + }, + { + "label": "昌江黎族自治县", + "value": "469026" + }, + { + "label": "乐东黎族自治县", + "value": "469027" + }, + { + "label": "陵水黎族自治县", + "value": "469028" + }, + { + "label": "保亭黎族苗族自治县", + "value": "469029" + }, + { + "label": "琼中黎族苗族自治县", + "value": "469030" + } + ] + ], + [ + [{ + "label": "万州区", + "value": "500101" + }, + { + "label": "涪陵区", + "value": "500102" + }, + { + "label": "渝中区", + "value": "500103" + }, + { + "label": "大渡口区", + "value": "500104" + }, + { + "label": "江北区", + "value": "500105" + }, + { + "label": "沙坪坝区", + "value": "500106" + }, + { + "label": "九龙坡区", + "value": "500107" + }, + { + "label": "南岸区", + "value": "500108" + }, + { + "label": "北碚区", + "value": "500109" + }, + { + "label": "綦江区", + "value": "500110" + }, + { + "label": "大足区", + "value": "500111" + }, + { + "label": "渝北区", + "value": "500112" + }, + { + "label": "巴南区", + "value": "500113" + }, + { + "label": "黔江区", + "value": "500114" + }, + { + "label": "长寿区", + "value": "500115" + }, + { + "label": "江津区", + "value": "500116" + }, + { + "label": "合川区", + "value": "500117" + }, + { + "label": "永川区", + "value": "500118" + }, + { + "label": "南川区", + "value": "500119" + }, + { + "label": "璧山区", + "value": "500120" + }, + { + "label": "铜梁区", + "value": "500151" + }, + { + "label": "潼南区", + "value": "500152" + }, + { + "label": "荣昌区", + "value": "500153" + }, + { + "label": "开州区", + "value": "500154" + }, + { + "label": "梁平区", + "value": "500155" + }, + { + "label": "武隆区", + "value": "500156" + } + ], + [{ + "label": "城口县", + "value": "500229" + }, + { + "label": "丰都县", + "value": "500230" + }, + { + "label": "垫江县", + "value": "500231" + }, + { + "label": "忠县", + "value": "500233" + }, + { + "label": "云阳县", + "value": "500235" + }, + { + "label": "奉节县", + "value": "500236" + }, + { + "label": "巫山县", + "value": "500237" + }, + { + "label": "巫溪县", + "value": "500238" + }, + { + "label": "石柱土家族自治县", + "value": "500240" + }, + { + "label": "秀山土家族苗族自治县", + "value": "500241" + }, + { + "label": "酉阳土家族苗族自治县", + "value": "500242" + }, + { + "label": "彭水苗族土家族自治县", + "value": "500243" + } + ] + ], + [ + [{ + "label": "锦江区", + "value": "510104" + }, + { + "label": "青羊区", + "value": "510105" + }, + { + "label": "金牛区", + "value": "510106" + }, + { + "label": "武侯区", + "value": "510107" + }, + { + "label": "成华区", + "value": "510108" + }, + { + "label": "龙泉驿区", + "value": "510112" + }, + { + "label": "青白江区", + "value": "510113" + }, + { + "label": "新都区", + "value": "510114" + }, + { + "label": "温江区", + "value": "510115" + }, + { + "label": "双流区", + "value": "510116" + }, + { + "label": "郫都区", + "value": "510117" + }, + { + "label": "金堂县", + "value": "510121" + }, + { + "label": "大邑县", + "value": "510129" + }, + { + "label": "蒲江县", + "value": "510131" + }, + { + "label": "新津县", + "value": "510132" + }, + { + "label": "都江堰市", + "value": "510181" + }, + { + "label": "彭州市", + "value": "510182" + }, + { + "label": "邛崃市", + "value": "510183" + }, + { + "label": "崇州市", + "value": "510184" + }, + { + "label": "简阳市", + "value": "510185" + } + ], + [{ + "label": "自流井区", + "value": "510302" + }, + { + "label": "贡井区", + "value": "510303" + }, + { + "label": "大安区", + "value": "510304" + }, + { + "label": "沿滩区", + "value": "510311" + }, + { + "label": "荣县", + "value": "510321" + }, + { + "label": "富顺县", + "value": "510322" + } + ], + [{ + "label": "东区", + "value": "510402" + }, + { + "label": "西区", + "value": "510403" + }, + { + "label": "仁和区", + "value": "510411" + }, + { + "label": "米易县", + "value": "510421" + }, + { + "label": "盐边县", + "value": "510422" + } + ], + [{ + "label": "江阳区", + "value": "510502" + }, + { + "label": "纳溪区", + "value": "510503" + }, + { + "label": "龙马潭区", + "value": "510504" + }, + { + "label": "泸县", + "value": "510521" + }, + { + "label": "合江县", + "value": "510522" + }, + { + "label": "叙永县", + "value": "510524" + }, + { + "label": "古蔺县", + "value": "510525" + } + ], + [{ + "label": "旌阳区", + "value": "510603" + }, + { + "label": "罗江区", + "value": "510604" + }, + { + "label": "中江县", + "value": "510623" + }, + { + "label": "广汉市", + "value": "510681" + }, + { + "label": "什邡市", + "value": "510682" + }, + { + "label": "绵竹市", + "value": "510683" + } + ], + [{ + "label": "涪城区", + "value": "510703" + }, + { + "label": "游仙区", + "value": "510704" + }, + { + "label": "安州区", + "value": "510705" + }, + { + "label": "三台县", + "value": "510722" + }, + { + "label": "盐亭县", + "value": "510723" + }, + { + "label": "梓潼县", + "value": "510725" + }, + { + "label": "北川羌族自治县", + "value": "510726" + }, + { + "label": "平武县", + "value": "510727" + }, + { + "label": "江油市", + "value": "510781" + } + ], + [{ + "label": "利州区", + "value": "510802" + }, + { + "label": "昭化区", + "value": "510811" + }, + { + "label": "朝天区", + "value": "510812" + }, + { + "label": "旺苍县", + "value": "510821" + }, + { + "label": "青川县", + "value": "510822" + }, + { + "label": "剑阁县", + "value": "510823" + }, + { + "label": "苍溪县", + "value": "510824" + } + ], + [{ + "label": "船山区", + "value": "510903" + }, + { + "label": "安居区", + "value": "510904" + }, + { + "label": "蓬溪县", + "value": "510921" + }, + { + "label": "射洪县", + "value": "510922" + }, + { + "label": "大英县", + "value": "510923" + } + ], + [{ + "label": "市中区", + "value": "511002" + }, + { + "label": "东兴区", + "value": "511011" + }, + { + "label": "威远县", + "value": "511024" + }, + { + "label": "资中县", + "value": "511025" + }, + { + "label": "内江经济开发区", + "value": "511071" + }, + { + "label": "隆昌市", + "value": "511083" + } + ], + [{ + "label": "市中区", + "value": "511102" + }, + { + "label": "沙湾区", + "value": "511111" + }, + { + "label": "五通桥区", + "value": "511112" + }, + { + "label": "金口河区", + "value": "511113" + }, + { + "label": "犍为县", + "value": "511123" + }, + { + "label": "井研县", + "value": "511124" + }, + { + "label": "夹江县", + "value": "511126" + }, + { + "label": "沐川县", + "value": "511129" + }, + { + "label": "峨边彝族自治县", + "value": "511132" + }, + { + "label": "马边彝族自治县", + "value": "511133" + }, + { + "label": "峨眉山市", + "value": "511181" + } + ], + [{ + "label": "顺庆区", + "value": "511302" + }, + { + "label": "高坪区", + "value": "511303" + }, + { + "label": "嘉陵区", + "value": "511304" + }, + { + "label": "南部县", + "value": "511321" + }, + { + "label": "营山县", + "value": "511322" + }, + { + "label": "蓬安县", + "value": "511323" + }, + { + "label": "仪陇县", + "value": "511324" + }, + { + "label": "西充县", + "value": "511325" + }, + { + "label": "阆中市", + "value": "511381" + } + ], + [{ + "label": "东坡区", + "value": "511402" + }, + { + "label": "彭山区", + "value": "511403" + }, + { + "label": "仁寿县", + "value": "511421" + }, + { + "label": "洪雅县", + "value": "511423" + }, + { + "label": "丹棱县", + "value": "511424" + }, + { + "label": "青神县", + "value": "511425" + } + ], + [{ + "label": "翠屏区", + "value": "511502" + }, + { + "label": "南溪区", + "value": "511503" + }, + { + "label": "宜宾县", + "value": "511521" + }, + { + "label": "江安县", + "value": "511523" + }, + { + "label": "长宁县", + "value": "511524" + }, + { + "label": "高县", + "value": "511525" + }, + { + "label": "珙县", + "value": "511526" + }, + { + "label": "筠连县", + "value": "511527" + }, + { + "label": "兴文县", + "value": "511528" + }, + { + "label": "屏山县", + "value": "511529" + } + ], + [{ + "label": "广安区", + "value": "511602" + }, + { + "label": "前锋区", + "value": "511603" + }, + { + "label": "岳池县", + "value": "511621" + }, + { + "label": "武胜县", + "value": "511622" + }, + { + "label": "邻水县", + "value": "511623" + }, + { + "label": "华蓥市", + "value": "511681" + } + ], + [{ + "label": "通川区", + "value": "511702" + }, + { + "label": "达川区", + "value": "511703" + }, + { + "label": "宣汉县", + "value": "511722" + }, + { + "label": "开江县", + "value": "511723" + }, + { + "label": "大竹县", + "value": "511724" + }, + { + "label": "渠县", + "value": "511725" + }, + { + "label": "达州经济开发区", + "value": "511771" + }, + { + "label": "万源市", + "value": "511781" + } + ], + [{ + "label": "雨城区", + "value": "511802" + }, + { + "label": "名山区", + "value": "511803" + }, + { + "label": "荥经县", + "value": "511822" + }, + { + "label": "汉源县", + "value": "511823" + }, + { + "label": "石棉县", + "value": "511824" + }, + { + "label": "天全县", + "value": "511825" + }, + { + "label": "芦山县", + "value": "511826" + }, + { + "label": "宝兴县", + "value": "511827" + } + ], + [{ + "label": "巴州区", + "value": "511902" + }, + { + "label": "恩阳区", + "value": "511903" + }, + { + "label": "通江县", + "value": "511921" + }, + { + "label": "南江县", + "value": "511922" + }, + { + "label": "平昌县", + "value": "511923" + }, + { + "label": "巴中经济开发区", + "value": "511971" + } + ], + [{ + "label": "雁江区", + "value": "512002" + }, + { + "label": "安岳县", + "value": "512021" + }, + { + "label": "乐至县", + "value": "512022" + } + ], + [{ + "label": "马尔康市", + "value": "513201" + }, + { + "label": "汶川县", + "value": "513221" + }, + { + "label": "理县", + "value": "513222" + }, + { + "label": "茂县", + "value": "513223" + }, + { + "label": "松潘县", + "value": "513224" + }, + { + "label": "九寨沟县", + "value": "513225" + }, + { + "label": "金川县", + "value": "513226" + }, + { + "label": "小金县", + "value": "513227" + }, + { + "label": "黑水县", + "value": "513228" + }, + { + "label": "壤塘县", + "value": "513230" + }, + { + "label": "阿坝县", + "value": "513231" + }, + { + "label": "若尔盖县", + "value": "513232" + }, + { + "label": "红原县", + "value": "513233" + } + ], + [{ + "label": "康定市", + "value": "513301" + }, + { + "label": "泸定县", + "value": "513322" + }, + { + "label": "丹巴县", + "value": "513323" + }, + { + "label": "九龙县", + "value": "513324" + }, + { + "label": "雅江县", + "value": "513325" + }, + { + "label": "道孚县", + "value": "513326" + }, + { + "label": "炉霍县", + "value": "513327" + }, + { + "label": "甘孜县", + "value": "513328" + }, + { + "label": "新龙县", + "value": "513329" + }, + { + "label": "德格县", + "value": "513330" + }, + { + "label": "白玉县", + "value": "513331" + }, + { + "label": "石渠县", + "value": "513332" + }, + { + "label": "色达县", + "value": "513333" + }, + { + "label": "理塘县", + "value": "513334" + }, + { + "label": "巴塘县", + "value": "513335" + }, + { + "label": "乡城县", + "value": "513336" + }, + { + "label": "稻城县", + "value": "513337" + }, + { + "label": "得荣县", + "value": "513338" + } + ], + [{ + "label": "西昌市", + "value": "513401" + }, + { + "label": "木里藏族自治县", + "value": "513422" + }, + { + "label": "盐源县", + "value": "513423" + }, + { + "label": "德昌县", + "value": "513424" + }, + { + "label": "会理县", + "value": "513425" + }, + { + "label": "会东县", + "value": "513426" + }, + { + "label": "宁南县", + "value": "513427" + }, + { + "label": "普格县", + "value": "513428" + }, + { + "label": "布拖县", + "value": "513429" + }, + { + "label": "金阳县", + "value": "513430" + }, + { + "label": "昭觉县", + "value": "513431" + }, + { + "label": "喜德县", + "value": "513432" + }, + { + "label": "冕宁县", + "value": "513433" + }, + { + "label": "越西县", + "value": "513434" + }, + { + "label": "甘洛县", + "value": "513435" + }, + { + "label": "美姑县", + "value": "513436" + }, + { + "label": "雷波县", + "value": "513437" + } + ] + ], + [ + [{ + "label": "南明区", + "value": "520102" + }, + { + "label": "云岩区", + "value": "520103" + }, + { + "label": "花溪区", + "value": "520111" + }, + { + "label": "乌当区", + "value": "520112" + }, + { + "label": "白云区", + "value": "520113" + }, + { + "label": "观山湖区", + "value": "520115" + }, + { + "label": "开阳县", + "value": "520121" + }, + { + "label": "息烽县", + "value": "520122" + }, + { + "label": "修文县", + "value": "520123" + }, + { + "label": "清镇市", + "value": "520181" + } + ], + [{ + "label": "钟山区", + "value": "520201" + }, + { + "label": "六枝特区", + "value": "520203" + }, + { + "label": "水城县", + "value": "520221" + }, + { + "label": "盘州市", + "value": "520281" + } + ], + [{ + "label": "红花岗区", + "value": "520302" + }, + { + "label": "汇川区", + "value": "520303" + }, + { + "label": "播州区", + "value": "520304" + }, + { + "label": "桐梓县", + "value": "520322" + }, + { + "label": "绥阳县", + "value": "520323" + }, + { + "label": "正安县", + "value": "520324" + }, + { + "label": "道真仡佬族苗族自治县", + "value": "520325" + }, + { + "label": "务川仡佬族苗族自治县", + "value": "520326" + }, + { + "label": "凤冈县", + "value": "520327" + }, + { + "label": "湄潭县", + "value": "520328" + }, + { + "label": "余庆县", + "value": "520329" + }, + { + "label": "习水县", + "value": "520330" + }, + { + "label": "赤水市", + "value": "520381" + }, + { + "label": "仁怀市", + "value": "520382" + } + ], + [{ + "label": "西秀区", + "value": "520402" + }, + { + "label": "平坝区", + "value": "520403" + }, + { + "label": "普定县", + "value": "520422" + }, + { + "label": "镇宁布依族苗族自治县", + "value": "520423" + }, + { + "label": "关岭布依族苗族自治县", + "value": "520424" + }, + { + "label": "紫云苗族布依族自治县", + "value": "520425" + } + ], + [{ + "label": "七星关区", + "value": "520502" + }, + { + "label": "大方县", + "value": "520521" + }, + { + "label": "黔西县", + "value": "520522" + }, + { + "label": "金沙县", + "value": "520523" + }, + { + "label": "织金县", + "value": "520524" + }, + { + "label": "纳雍县", + "value": "520525" + }, + { + "label": "威宁彝族回族苗族自治县", + "value": "520526" + }, + { + "label": "赫章县", + "value": "520527" + } + ], + [{ + "label": "碧江区", + "value": "520602" + }, + { + "label": "万山区", + "value": "520603" + }, + { + "label": "江口县", + "value": "520621" + }, + { + "label": "玉屏侗族自治县", + "value": "520622" + }, + { + "label": "石阡县", + "value": "520623" + }, + { + "label": "思南县", + "value": "520624" + }, + { + "label": "印江土家族苗族自治县", + "value": "520625" + }, + { + "label": "德江县", + "value": "520626" + }, + { + "label": "沿河土家族自治县", + "value": "520627" + }, + { + "label": "松桃苗族自治县", + "value": "520628" + } + ], + [{ + "label": "兴义市", + "value": "522301" + }, + { + "label": "兴仁县", + "value": "522322" + }, + { + "label": "普安县", + "value": "522323" + }, + { + "label": "晴隆县", + "value": "522324" + }, + { + "label": "贞丰县", + "value": "522325" + }, + { + "label": "望谟县", + "value": "522326" + }, + { + "label": "册亨县", + "value": "522327" + }, + { + "label": "安龙县", + "value": "522328" + } + ], + [{ + "label": "凯里市", + "value": "522601" + }, + { + "label": "黄平县", + "value": "522622" + }, + { + "label": "施秉县", + "value": "522623" + }, + { + "label": "三穗县", + "value": "522624" + }, + { + "label": "镇远县", + "value": "522625" + }, + { + "label": "岑巩县", + "value": "522626" + }, + { + "label": "天柱县", + "value": "522627" + }, + { + "label": "锦屏县", + "value": "522628" + }, + { + "label": "剑河县", + "value": "522629" + }, + { + "label": "台江县", + "value": "522630" + }, + { + "label": "黎平县", + "value": "522631" + }, + { + "label": "榕江县", + "value": "522632" + }, + { + "label": "从江县", + "value": "522633" + }, + { + "label": "雷山县", + "value": "522634" + }, + { + "label": "麻江县", + "value": "522635" + }, + { + "label": "丹寨县", + "value": "522636" + } + ], + [{ + "label": "都匀市", + "value": "522701" + }, + { + "label": "福泉市", + "value": "522702" + }, + { + "label": "荔波县", + "value": "522722" + }, + { + "label": "贵定县", + "value": "522723" + }, + { + "label": "瓮安县", + "value": "522725" + }, + { + "label": "独山县", + "value": "522726" + }, + { + "label": "平塘县", + "value": "522727" + }, + { + "label": "罗甸县", + "value": "522728" + }, + { + "label": "长顺县", + "value": "522729" + }, + { + "label": "龙里县", + "value": "522730" + }, + { + "label": "惠水县", + "value": "522731" + }, + { + "label": "三都水族自治县", + "value": "522732" + } + ] + ], + [ + [{ + "label": "五华区", + "value": "530102" + }, + { + "label": "盘龙区", + "value": "530103" + }, + { + "label": "官渡区", + "value": "530111" + }, + { + "label": "西山区", + "value": "530112" + }, + { + "label": "东川区", + "value": "530113" + }, + { + "label": "呈贡区", + "value": "530114" + }, + { + "label": "晋宁区", + "value": "530115" + }, + { + "label": "富民县", + "value": "530124" + }, + { + "label": "宜良县", + "value": "530125" + }, + { + "label": "石林彝族自治县", + "value": "530126" + }, + { + "label": "嵩明县", + "value": "530127" + }, + { + "label": "禄劝彝族苗族自治县", + "value": "530128" + }, + { + "label": "寻甸回族彝族自治县", + "value": "530129" + }, + { + "label": "安宁市", + "value": "530181" + } + ], + [{ + "label": "麒麟区", + "value": "530302" + }, + { + "label": "沾益区", + "value": "530303" + }, + { + "label": "马龙县", + "value": "530321" + }, + { + "label": "陆良县", + "value": "530322" + }, + { + "label": "师宗县", + "value": "530323" + }, + { + "label": "罗平县", + "value": "530324" + }, + { + "label": "富源县", + "value": "530325" + }, + { + "label": "会泽县", + "value": "530326" + }, + { + "label": "宣威市", + "value": "530381" + } + ], + [{ + "label": "红塔区", + "value": "530402" + }, + { + "label": "江川区", + "value": "530403" + }, + { + "label": "澄江县", + "value": "530422" + }, + { + "label": "通海县", + "value": "530423" + }, + { + "label": "华宁县", + "value": "530424" + }, + { + "label": "易门县", + "value": "530425" + }, + { + "label": "峨山彝族自治县", + "value": "530426" + }, + { + "label": "新平彝族傣族自治县", + "value": "530427" + }, + { + "label": "元江哈尼族彝族傣族自治县", + "value": "530428" + } + ], + [{ + "label": "隆阳区", + "value": "530502" + }, + { + "label": "施甸县", + "value": "530521" + }, + { + "label": "龙陵县", + "value": "530523" + }, + { + "label": "昌宁县", + "value": "530524" + }, + { + "label": "腾冲市", + "value": "530581" + } + ], + [{ + "label": "昭阳区", + "value": "530602" + }, + { + "label": "鲁甸县", + "value": "530621" + }, + { + "label": "巧家县", + "value": "530622" + }, + { + "label": "盐津县", + "value": "530623" + }, + { + "label": "大关县", + "value": "530624" + }, + { + "label": "永善县", + "value": "530625" + }, + { + "label": "绥江县", + "value": "530626" + }, + { + "label": "镇雄县", + "value": "530627" + }, + { + "label": "彝良县", + "value": "530628" + }, + { + "label": "威信县", + "value": "530629" + }, + { + "label": "水富县", + "value": "530630" + } + ], + [{ + "label": "古城区", + "value": "530702" + }, + { + "label": "玉龙纳西族自治县", + "value": "530721" + }, + { + "label": "永胜县", + "value": "530722" + }, + { + "label": "华坪县", + "value": "530723" + }, + { + "label": "宁蒗彝族自治县", + "value": "530724" + } + ], + [{ + "label": "思茅区", + "value": "530802" + }, + { + "label": "宁洱哈尼族彝族自治县", + "value": "530821" + }, + { + "label": "墨江哈尼族自治县", + "value": "530822" + }, + { + "label": "景东彝族自治县", + "value": "530823" + }, + { + "label": "景谷傣族彝族自治县", + "value": "530824" + }, + { + "label": "镇沅彝族哈尼族拉祜族自治县", + "value": "530825" + }, + { + "label": "江城哈尼族彝族自治县", + "value": "530826" + }, + { + "label": "孟连傣族拉祜族佤族自治县", + "value": "530827" + }, + { + "label": "澜沧拉祜族自治县", + "value": "530828" + }, + { + "label": "西盟佤族自治县", + "value": "530829" + } + ], + [{ + "label": "临翔区", + "value": "530902" + }, + { + "label": "凤庆县", + "value": "530921" + }, + { + "label": "云县", + "value": "530922" + }, + { + "label": "永德县", + "value": "530923" + }, + { + "label": "镇康县", + "value": "530924" + }, + { + "label": "双江拉祜族佤族布朗族傣族自治县", + "value": "530925" + }, + { + "label": "耿马傣族佤族自治县", + "value": "530926" + }, + { + "label": "沧源佤族自治县", + "value": "530927" + } + ], + [{ + "label": "楚雄市", + "value": "532301" + }, + { + "label": "双柏县", + "value": "532322" + }, + { + "label": "牟定县", + "value": "532323" + }, + { + "label": "南华县", + "value": "532324" + }, + { + "label": "姚安县", + "value": "532325" + }, + { + "label": "大姚县", + "value": "532326" + }, + { + "label": "永仁县", + "value": "532327" + }, + { + "label": "元谋县", + "value": "532328" + }, + { + "label": "武定县", + "value": "532329" + }, + { + "label": "禄丰县", + "value": "532331" + } + ], + [{ + "label": "个旧市", + "value": "532501" + }, + { + "label": "开远市", + "value": "532502" + }, + { + "label": "蒙自市", + "value": "532503" + }, + { + "label": "弥勒市", + "value": "532504" + }, + { + "label": "屏边苗族自治县", + "value": "532523" + }, + { + "label": "建水县", + "value": "532524" + }, + { + "label": "石屏县", + "value": "532525" + }, + { + "label": "泸西县", + "value": "532527" + }, + { + "label": "元阳县", + "value": "532528" + }, + { + "label": "红河县", + "value": "532529" + }, + { + "label": "金平苗族瑶族傣族自治县", + "value": "532530" + }, + { + "label": "绿春县", + "value": "532531" + }, + { + "label": "河口瑶族自治县", + "value": "532532" + } + ], + [{ + "label": "文山市", + "value": "532601" + }, + { + "label": "砚山县", + "value": "532622" + }, + { + "label": "西畴县", + "value": "532623" + }, + { + "label": "麻栗坡县", + "value": "532624" + }, + { + "label": "马关县", + "value": "532625" + }, + { + "label": "丘北县", + "value": "532626" + }, + { + "label": "广南县", + "value": "532627" + }, + { + "label": "富宁县", + "value": "532628" + } + ], + [{ + "label": "景洪市", + "value": "532801" + }, + { + "label": "勐海县", + "value": "532822" + }, + { + "label": "勐腊县", + "value": "532823" + } + ], + [{ + "label": "大理市", + "value": "532901" + }, + { + "label": "漾濞彝族自治县", + "value": "532922" + }, + { + "label": "祥云县", + "value": "532923" + }, + { + "label": "宾川县", + "value": "532924" + }, + { + "label": "弥渡县", + "value": "532925" + }, + { + "label": "南涧彝族自治县", + "value": "532926" + }, + { + "label": "巍山彝族回族自治县", + "value": "532927" + }, + { + "label": "永平县", + "value": "532928" + }, + { + "label": "云龙县", + "value": "532929" + }, + { + "label": "洱源县", + "value": "532930" + }, + { + "label": "剑川县", + "value": "532931" + }, + { + "label": "鹤庆县", + "value": "532932" + } + ], + [{ + "label": "瑞丽市", + "value": "533102" + }, + { + "label": "芒市", + "value": "533103" + }, + { + "label": "梁河县", + "value": "533122" + }, + { + "label": "盈江县", + "value": "533123" + }, + { + "label": "陇川县", + "value": "533124" + } + ], + [{ + "label": "泸水市", + "value": "533301" + }, + { + "label": "福贡县", + "value": "533323" + }, + { + "label": "贡山独龙族怒族自治县", + "value": "533324" + }, + { + "label": "兰坪白族普米族自治县", + "value": "533325" + } + ], + [{ + "label": "香格里拉市", + "value": "533401" + }, + { + "label": "德钦县", + "value": "533422" + }, + { + "label": "维西傈僳族自治县", + "value": "533423" + } + ] + ], + [ + [{ + "label": "城关区", + "value": "540102" + }, + { + "label": "堆龙德庆区", + "value": "540103" + }, + { + "label": "林周县", + "value": "540121" + }, + { + "label": "当雄县", + "value": "540122" + }, + { + "label": "尼木县", + "value": "540123" + }, + { + "label": "曲水县", + "value": "540124" + }, + { + "label": "达孜县", + "value": "540126" + }, + { + "label": "墨竹工卡县", + "value": "540127" + }, + { + "label": "格尔木藏青工业园区", + "value": "540171" + }, + { + "label": "拉萨经济技术开发区", + "value": "540172" + }, + { + "label": "西藏文化旅游创意园区", + "value": "540173" + }, + { + "label": "达孜工业园区", + "value": "540174" + } + ], + [{ + "label": "桑珠孜区", + "value": "540202" + }, + { + "label": "南木林县", + "value": "540221" + }, + { + "label": "江孜县", + "value": "540222" + }, + { + "label": "定日县", + "value": "540223" + }, + { + "label": "萨迦县", + "value": "540224" + }, + { + "label": "拉孜县", + "value": "540225" + }, + { + "label": "昂仁县", + "value": "540226" + }, + { + "label": "谢通门县", + "value": "540227" + }, + { + "label": "白朗县", + "value": "540228" + }, + { + "label": "仁布县", + "value": "540229" + }, + { + "label": "康马县", + "value": "540230" + }, + { + "label": "定结县", + "value": "540231" + }, + { + "label": "仲巴县", + "value": "540232" + }, + { + "label": "亚东县", + "value": "540233" + }, + { + "label": "吉隆县", + "value": "540234" + }, + { + "label": "聂拉木县", + "value": "540235" + }, + { + "label": "萨嘎县", + "value": "540236" + }, + { + "label": "岗巴县", + "value": "540237" + } + ], + [{ + "label": "卡若区", + "value": "540302" + }, + { + "label": "江达县", + "value": "540321" + }, + { + "label": "贡觉县", + "value": "540322" + }, + { + "label": "类乌齐县", + "value": "540323" + }, + { + "label": "丁青县", + "value": "540324" + }, + { + "label": "察雅县", + "value": "540325" + }, + { + "label": "八宿县", + "value": "540326" + }, + { + "label": "左贡县", + "value": "540327" + }, + { + "label": "芒康县", + "value": "540328" + }, + { + "label": "洛隆县", + "value": "540329" + }, + { + "label": "边坝县", + "value": "540330" + } + ], + [{ + "label": "巴宜区", + "value": "540402" + }, + { + "label": "工布江达县", + "value": "540421" + }, + { + "label": "米林县", + "value": "540422" + }, + { + "label": "墨脱县", + "value": "540423" + }, + { + "label": "波密县", + "value": "540424" + }, + { + "label": "察隅县", + "value": "540425" + }, + { + "label": "朗县", + "value": "540426" + } + ], + [{ + "label": "乃东区", + "value": "540502" + }, + { + "label": "扎囊县", + "value": "540521" + }, + { + "label": "贡嘎县", + "value": "540522" + }, + { + "label": "桑日县", + "value": "540523" + }, + { + "label": "琼结县", + "value": "540524" + }, + { + "label": "曲松县", + "value": "540525" + }, + { + "label": "措美县", + "value": "540526" + }, + { + "label": "洛扎县", + "value": "540527" + }, + { + "label": "加查县", + "value": "540528" + }, + { + "label": "隆子县", + "value": "540529" + }, + { + "label": "错那县", + "value": "540530" + }, + { + "label": "浪卡子县", + "value": "540531" + } + ], + [{ + "label": "那曲县", + "value": "542421" + }, + { + "label": "嘉黎县", + "value": "542422" + }, + { + "label": "比如县", + "value": "542423" + }, + { + "label": "聂荣县", + "value": "542424" + }, + { + "label": "安多县", + "value": "542425" + }, + { + "label": "申扎县", + "value": "542426" + }, + { + "label": "索县", + "value": "542427" + }, + { + "label": "班戈县", + "value": "542428" + }, + { + "label": "巴青县", + "value": "542429" + }, + { + "label": "尼玛县", + "value": "542430" + }, + { + "label": "双湖县", + "value": "542431" + } + ], + [{ + "label": "普兰县", + "value": "542521" + }, + { + "label": "札达县", + "value": "542522" + }, + { + "label": "噶尔县", + "value": "542523" + }, + { + "label": "日土县", + "value": "542524" + }, + { + "label": "革吉县", + "value": "542525" + }, + { + "label": "改则县", + "value": "542526" + }, + { + "label": "措勤县", + "value": "542527" + } + ] + ], + [ + [{ + "label": "新城区", + "value": "610102" + }, + { + "label": "碑林区", + "value": "610103" + }, + { + "label": "莲湖区", + "value": "610104" + }, + { + "label": "灞桥区", + "value": "610111" + }, + { + "label": "未央区", + "value": "610112" + }, + { + "label": "雁塔区", + "value": "610113" + }, + { + "label": "阎良区", + "value": "610114" + }, + { + "label": "临潼区", + "value": "610115" + }, + { + "label": "长安区", + "value": "610116" + }, + { + "label": "高陵区", + "value": "610117" + }, + { + "label": "鄠邑区", + "value": "610118" + }, + { + "label": "蓝田县", + "value": "610122" + }, + { + "label": "周至县", + "value": "610124" + } + ], + [{ + "label": "王益区", + "value": "610202" + }, + { + "label": "印台区", + "value": "610203" + }, + { + "label": "耀州区", + "value": "610204" + }, + { + "label": "宜君县", + "value": "610222" + } + ], + [{ + "label": "渭滨区", + "value": "610302" + }, + { + "label": "金台区", + "value": "610303" + }, + { + "label": "陈仓区", + "value": "610304" + }, + { + "label": "凤翔县", + "value": "610322" + }, + { + "label": "岐山县", + "value": "610323" + }, + { + "label": "扶风县", + "value": "610324" + }, + { + "label": "眉县", + "value": "610326" + }, + { + "label": "陇县", + "value": "610327" + }, + { + "label": "千阳县", + "value": "610328" + }, + { + "label": "麟游县", + "value": "610329" + }, + { + "label": "凤县", + "value": "610330" + }, + { + "label": "太白县", + "value": "610331" + } + ], + [{ + "label": "秦都区", + "value": "610402" + }, + { + "label": "杨陵区", + "value": "610403" + }, + { + "label": "渭城区", + "value": "610404" + }, + { + "label": "三原县", + "value": "610422" + }, + { + "label": "泾阳县", + "value": "610423" + }, + { + "label": "乾县", + "value": "610424" + }, + { + "label": "礼泉县", + "value": "610425" + }, + { + "label": "永寿县", + "value": "610426" + }, + { + "label": "彬县", + "value": "610427" + }, + { + "label": "长武县", + "value": "610428" + }, + { + "label": "旬邑县", + "value": "610429" + }, + { + "label": "淳化县", + "value": "610430" + }, + { + "label": "武功县", + "value": "610431" + }, + { + "label": "兴平市", + "value": "610481" + } + ], + [{ + "label": "临渭区", + "value": "610502" + }, + { + "label": "华州区", + "value": "610503" + }, + { + "label": "潼关县", + "value": "610522" + }, + { + "label": "大荔县", + "value": "610523" + }, + { + "label": "合阳县", + "value": "610524" + }, + { + "label": "澄城县", + "value": "610525" + }, + { + "label": "蒲城县", + "value": "610526" + }, + { + "label": "白水县", + "value": "610527" + }, + { + "label": "富平县", + "value": "610528" + }, + { + "label": "韩城市", + "value": "610581" + }, + { + "label": "华阴市", + "value": "610582" + } + ], + [{ + "label": "宝塔区", + "value": "610602" + }, + { + "label": "安塞区", + "value": "610603" + }, + { + "label": "延长县", + "value": "610621" + }, + { + "label": "延川县", + "value": "610622" + }, + { + "label": "子长县", + "value": "610623" + }, + { + "label": "志丹县", + "value": "610625" + }, + { + "label": "吴起县", + "value": "610626" + }, + { + "label": "甘泉县", + "value": "610627" + }, + { + "label": "富县", + "value": "610628" + }, + { + "label": "洛川县", + "value": "610629" + }, + { + "label": "宜川县", + "value": "610630" + }, + { + "label": "黄龙县", + "value": "610631" + }, + { + "label": "黄陵县", + "value": "610632" + } + ], + [{ + "label": "汉台区", + "value": "610702" + }, + { + "label": "南郑区", + "value": "610703" + }, + { + "label": "城固县", + "value": "610722" + }, + { + "label": "洋县", + "value": "610723" + }, + { + "label": "西乡县", + "value": "610724" + }, + { + "label": "勉县", + "value": "610725" + }, + { + "label": "宁强县", + "value": "610726" + }, + { + "label": "略阳县", + "value": "610727" + }, + { + "label": "镇巴县", + "value": "610728" + }, + { + "label": "留坝县", + "value": "610729" + }, + { + "label": "佛坪县", + "value": "610730" + } + ], + [{ + "label": "榆阳区", + "value": "610802" + }, + { + "label": "横山区", + "value": "610803" + }, + { + "label": "府谷县", + "value": "610822" + }, + { + "label": "靖边县", + "value": "610824" + }, + { + "label": "定边县", + "value": "610825" + }, + { + "label": "绥德县", + "value": "610826" + }, + { + "label": "米脂县", + "value": "610827" + }, + { + "label": "佳县", + "value": "610828" + }, + { + "label": "吴堡县", + "value": "610829" + }, + { + "label": "清涧县", + "value": "610830" + }, + { + "label": "子洲县", + "value": "610831" + }, + { + "label": "神木市", + "value": "610881" + } + ], + [{ + "label": "汉滨区", + "value": "610902" + }, + { + "label": "汉阴县", + "value": "610921" + }, + { + "label": "石泉县", + "value": "610922" + }, + { + "label": "宁陕县", + "value": "610923" + }, + { + "label": "紫阳县", + "value": "610924" + }, + { + "label": "岚皋县", + "value": "610925" + }, + { + "label": "平利县", + "value": "610926" + }, + { + "label": "镇坪县", + "value": "610927" + }, + { + "label": "旬阳县", + "value": "610928" + }, + { + "label": "白河县", + "value": "610929" + } + ], + [{ + "label": "商州区", + "value": "611002" + }, + { + "label": "洛南县", + "value": "611021" + }, + { + "label": "丹凤县", + "value": "611022" + }, + { + "label": "商南县", + "value": "611023" + }, + { + "label": "山阳县", + "value": "611024" + }, + { + "label": "镇安县", + "value": "611025" + }, + { + "label": "柞水县", + "value": "611026" + } + ] + ], + [ + [{ + "label": "城关区", + "value": "620102" + }, + { + "label": "七里河区", + "value": "620103" + }, + { + "label": "西固区", + "value": "620104" + }, + { + "label": "安宁区", + "value": "620105" + }, + { + "label": "红古区", + "value": "620111" + }, + { + "label": "永登县", + "value": "620121" + }, + { + "label": "皋兰县", + "value": "620122" + }, + { + "label": "榆中县", + "value": "620123" + }, + { + "label": "兰州新区", + "value": "620171" + } + ], + [{ + "label": "嘉峪关市", + "value": "620201" + }], + [{ + "label": "金川区", + "value": "620302" + }, + { + "label": "永昌县", + "value": "620321" + } + ], + [{ + "label": "白银区", + "value": "620402" + }, + { + "label": "平川区", + "value": "620403" + }, + { + "label": "靖远县", + "value": "620421" + }, + { + "label": "会宁县", + "value": "620422" + }, + { + "label": "景泰县", + "value": "620423" + } + ], + [{ + "label": "秦州区", + "value": "620502" + }, + { + "label": "麦积区", + "value": "620503" + }, + { + "label": "清水县", + "value": "620521" + }, + { + "label": "秦安县", + "value": "620522" + }, + { + "label": "甘谷县", + "value": "620523" + }, + { + "label": "武山县", + "value": "620524" + }, + { + "label": "张家川回族自治县", + "value": "620525" + } + ], + [{ + "label": "凉州区", + "value": "620602" + }, + { + "label": "民勤县", + "value": "620621" + }, + { + "label": "古浪县", + "value": "620622" + }, + { + "label": "天祝藏族自治县", + "value": "620623" + } + ], + [{ + "label": "甘州区", + "value": "620702" + }, + { + "label": "肃南裕固族自治县", + "value": "620721" + }, + { + "label": "民乐县", + "value": "620722" + }, + { + "label": "临泽县", + "value": "620723" + }, + { + "label": "高台县", + "value": "620724" + }, + { + "label": "山丹县", + "value": "620725" + } + ], + [{ + "label": "崆峒区", + "value": "620802" + }, + { + "label": "泾川县", + "value": "620821" + }, + { + "label": "灵台县", + "value": "620822" + }, + { + "label": "崇信县", + "value": "620823" + }, + { + "label": "华亭县", + "value": "620824" + }, + { + "label": "庄浪县", + "value": "620825" + }, + { + "label": "静宁县", + "value": "620826" + }, + { + "label": "平凉工业园区", + "value": "620871" + } + ], + [{ + "label": "肃州区", + "value": "620902" + }, + { + "label": "金塔县", + "value": "620921" + }, + { + "label": "瓜州县", + "value": "620922" + }, + { + "label": "肃北蒙古族自治县", + "value": "620923" + }, + { + "label": "阿克塞哈萨克族自治县", + "value": "620924" + }, + { + "label": "玉门市", + "value": "620981" + }, + { + "label": "敦煌市", + "value": "620982" + } + ], + [{ + "label": "西峰区", + "value": "621002" + }, + { + "label": "庆城县", + "value": "621021" + }, + { + "label": "环县", + "value": "621022" + }, + { + "label": "华池县", + "value": "621023" + }, + { + "label": "合水县", + "value": "621024" + }, + { + "label": "正宁县", + "value": "621025" + }, + { + "label": "宁县", + "value": "621026" + }, + { + "label": "镇原县", + "value": "621027" + } + ], + [{ + "label": "安定区", + "value": "621102" + }, + { + "label": "通渭县", + "value": "621121" + }, + { + "label": "陇西县", + "value": "621122" + }, + { + "label": "渭源县", + "value": "621123" + }, + { + "label": "临洮县", + "value": "621124" + }, + { + "label": "漳县", + "value": "621125" + }, + { + "label": "岷县", + "value": "621126" + } + ], + [{ + "label": "武都区", + "value": "621202" + }, + { + "label": "成县", + "value": "621221" + }, + { + "label": "文县", + "value": "621222" + }, + { + "label": "宕昌县", + "value": "621223" + }, + { + "label": "康县", + "value": "621224" + }, + { + "label": "西和县", + "value": "621225" + }, + { + "label": "礼县", + "value": "621226" + }, + { + "label": "徽县", + "value": "621227" + }, + { + "label": "两当县", + "value": "621228" + } + ], + [{ + "label": "临夏市", + "value": "622901" + }, + { + "label": "临夏县", + "value": "622921" + }, + { + "label": "康乐县", + "value": "622922" + }, + { + "label": "永靖县", + "value": "622923" + }, + { + "label": "广河县", + "value": "622924" + }, + { + "label": "和政县", + "value": "622925" + }, + { + "label": "东乡族自治县", + "value": "622926" + }, + { + "label": "积石山保安族东乡族撒拉族自治县", + "value": "622927" + } + ], + [{ + "label": "合作市", + "value": "623001" + }, + { + "label": "临潭县", + "value": "623021" + }, + { + "label": "卓尼县", + "value": "623022" + }, + { + "label": "舟曲县", + "value": "623023" + }, + { + "label": "迭部县", + "value": "623024" + }, + { + "label": "玛曲县", + "value": "623025" + }, + { + "label": "碌曲县", + "value": "623026" + }, + { + "label": "夏河县", + "value": "623027" + } + ] + ], + [ + [{ + "label": "城东区", + "value": "630102" + }, + { + "label": "城中区", + "value": "630103" + }, + { + "label": "城西区", + "value": "630104" + }, + { + "label": "城北区", + "value": "630105" + }, + { + "label": "大通回族土族自治县", + "value": "630121" + }, + { + "label": "湟中县", + "value": "630122" + }, + { + "label": "湟源县", + "value": "630123" + } + ], + [{ + "label": "乐都区", + "value": "630202" + }, + { + "label": "平安区", + "value": "630203" + }, + { + "label": "民和回族土族自治县", + "value": "630222" + }, + { + "label": "互助土族自治县", + "value": "630223" + }, + { + "label": "化隆回族自治县", + "value": "630224" + }, + { + "label": "循化撒拉族自治县", + "value": "630225" + } + ], + [{ + "label": "门源回族自治县", + "value": "632221" + }, + { + "label": "祁连县", + "value": "632222" + }, + { + "label": "海晏县", + "value": "632223" + }, + { + "label": "刚察县", + "value": "632224" + } + ], + [{ + "label": "同仁县", + "value": "632321" + }, + { + "label": "尖扎县", + "value": "632322" + }, + { + "label": "泽库县", + "value": "632323" + }, + { + "label": "河南蒙古族自治县", + "value": "632324" + } + ], + [{ + "label": "共和县", + "value": "632521" + }, + { + "label": "同德县", + "value": "632522" + }, + { + "label": "贵德县", + "value": "632523" + }, + { + "label": "兴海县", + "value": "632524" + }, + { + "label": "贵南县", + "value": "632525" + } + ], + [{ + "label": "玛沁县", + "value": "632621" + }, + { + "label": "班玛县", + "value": "632622" + }, + { + "label": "甘德县", + "value": "632623" + }, + { + "label": "达日县", + "value": "632624" + }, + { + "label": "久治县", + "value": "632625" + }, + { + "label": "玛多县", + "value": "632626" + } + ], + [{ + "label": "玉树市", + "value": "632701" + }, + { + "label": "杂多县", + "value": "632722" + }, + { + "label": "称多县", + "value": "632723" + }, + { + "label": "治多县", + "value": "632724" + }, + { + "label": "囊谦县", + "value": "632725" + }, + { + "label": "曲麻莱县", + "value": "632726" + } + ], + [{ + "label": "格尔木市", + "value": "632801" + }, + { + "label": "德令哈市", + "value": "632802" + }, + { + "label": "乌兰县", + "value": "632821" + }, + { + "label": "都兰县", + "value": "632822" + }, + { + "label": "天峻县", + "value": "632823" + }, + { + "label": "大柴旦行政委员会", + "value": "632857" + }, + { + "label": "冷湖行政委员会", + "value": "632858" + }, + { + "label": "茫崖行政委员会", + "value": "632859" + } + ] + ], + [ + [{ + "label": "兴庆区", + "value": "640104" + }, + { + "label": "西夏区", + "value": "640105" + }, + { + "label": "金凤区", + "value": "640106" + }, + { + "label": "永宁县", + "value": "640121" + }, + { + "label": "贺兰县", + "value": "640122" + }, + { + "label": "灵武市", + "value": "640181" + } + ], + [{ + "label": "大武口区", + "value": "640202" + }, + { + "label": "惠农区", + "value": "640205" + }, + { + "label": "平罗县", + "value": "640221" + } + ], + [{ + "label": "利通区", + "value": "640302" + }, + { + "label": "红寺堡区", + "value": "640303" + }, + { + "label": "盐池县", + "value": "640323" + }, + { + "label": "同心县", + "value": "640324" + }, + { + "label": "青铜峡市", + "value": "640381" + } + ], + [{ + "label": "原州区", + "value": "640402" + }, + { + "label": "西吉县", + "value": "640422" + }, + { + "label": "隆德县", + "value": "640423" + }, + { + "label": "泾源县", + "value": "640424" + }, + { + "label": "彭阳县", + "value": "640425" + } + ], + [{ + "label": "沙坡头区", + "value": "640502" + }, + { + "label": "中宁县", + "value": "640521" + }, + { + "label": "海原县", + "value": "640522" + } + ] + ], + [ + [{ + "label": "天山区", + "value": "650102" + }, + { + "label": "沙依巴克区", + "value": "650103" + }, + { + "label": "新市区", + "value": "650104" + }, + { + "label": "水磨沟区", + "value": "650105" + }, + { + "label": "头屯河区", + "value": "650106" + }, + { + "label": "达坂城区", + "value": "650107" + }, + { + "label": "米东区", + "value": "650109" + }, + { + "label": "乌鲁木齐县", + "value": "650121" + }, + { + "label": "乌鲁木齐经济技术开发区", + "value": "650171" + }, + { + "label": "乌鲁木齐高新技术产业开发区", + "value": "650172" + } + ], + [{ + "label": "独山子区", + "value": "650202" + }, + { + "label": "克拉玛依区", + "value": "650203" + }, + { + "label": "白碱滩区", + "value": "650204" + }, + { + "label": "乌尔禾区", + "value": "650205" + } + ], + [{ + "label": "高昌区", + "value": "650402" + }, + { + "label": "鄯善县", + "value": "650421" + }, + { + "label": "托克逊县", + "value": "650422" + } + ], + [{ + "label": "伊州区", + "value": "650502" + }, + { + "label": "巴里坤哈萨克自治县", + "value": "650521" + }, + { + "label": "伊吾县", + "value": "650522" + } + ], + [{ + "label": "昌吉市", + "value": "652301" + }, + { + "label": "阜康市", + "value": "652302" + }, + { + "label": "呼图壁县", + "value": "652323" + }, + { + "label": "玛纳斯县", + "value": "652324" + }, + { + "label": "奇台县", + "value": "652325" + }, + { + "label": "吉木萨尔县", + "value": "652327" + }, + { + "label": "木垒哈萨克自治县", + "value": "652328" + } + ], + [{ + "label": "博乐市", + "value": "652701" + }, + { + "label": "阿拉山口市", + "value": "652702" + }, + { + "label": "精河县", + "value": "652722" + }, + { + "label": "温泉县", + "value": "652723" + } + ], + [{ + "label": "库尔勒市", + "value": "652801" + }, + { + "label": "轮台县", + "value": "652822" + }, + { + "label": "尉犁县", + "value": "652823" + }, + { + "label": "若羌县", + "value": "652824" + }, + { + "label": "且末县", + "value": "652825" + }, + { + "label": "焉耆回族自治县", + "value": "652826" + }, + { + "label": "和静县", + "value": "652827" + }, + { + "label": "和硕县", + "value": "652828" + }, + { + "label": "博湖县", + "value": "652829" + }, + { + "label": "库尔勒经济技术开发区", + "value": "652871" + } + ], + [{ + "label": "阿克苏市", + "value": "652901" + }, + { + "label": "温宿县", + "value": "652922" + }, + { + "label": "库车县", + "value": "652923" + }, + { + "label": "沙雅县", + "value": "652924" + }, + { + "label": "新和县", + "value": "652925" + }, + { + "label": "拜城县", + "value": "652926" + }, + { + "label": "乌什县", + "value": "652927" + }, + { + "label": "阿瓦提县", + "value": "652928" + }, + { + "label": "柯坪县", + "value": "652929" + } + ], + [{ + "label": "阿图什市", + "value": "653001" + }, + { + "label": "阿克陶县", + "value": "653022" + }, + { + "label": "阿合奇县", + "value": "653023" + }, + { + "label": "乌恰县", + "value": "653024" + } + ], + [{ + "label": "喀什市", + "value": "653101" + }, + { + "label": "疏附县", + "value": "653121" + }, + { + "label": "疏勒县", + "value": "653122" + }, + { + "label": "英吉沙县", + "value": "653123" + }, + { + "label": "泽普县", + "value": "653124" + }, + { + "label": "莎车县", + "value": "653125" + }, + { + "label": "叶城县", + "value": "653126" + }, + { + "label": "麦盖提县", + "value": "653127" + }, + { + "label": "岳普湖县", + "value": "653128" + }, + { + "label": "伽师县", + "value": "653129" + }, + { + "label": "巴楚县", + "value": "653130" + }, + { + "label": "塔什库尔干塔吉克自治县", + "value": "653131" + } + ], + [{ + "label": "和田市", + "value": "653201" + }, + { + "label": "和田县", + "value": "653221" + }, + { + "label": "墨玉县", + "value": "653222" + }, + { + "label": "皮山县", + "value": "653223" + }, + { + "label": "洛浦县", + "value": "653224" + }, + { + "label": "策勒县", + "value": "653225" + }, + { + "label": "于田县", + "value": "653226" + }, + { + "label": "民丰县", + "value": "653227" + } + ], + [{ + "label": "伊宁市", + "value": "654002" + }, + { + "label": "奎屯市", + "value": "654003" + }, + { + "label": "霍尔果斯市", + "value": "654004" + }, + { + "label": "伊宁县", + "value": "654021" + }, + { + "label": "察布查尔锡伯自治县", + "value": "654022" + }, + { + "label": "霍城县", + "value": "654023" + }, + { + "label": "巩留县", + "value": "654024" + }, + { + "label": "新源县", + "value": "654025" + }, + { + "label": "昭苏县", + "value": "654026" + }, + { + "label": "特克斯县", + "value": "654027" + }, + { + "label": "尼勒克县", + "value": "654028" + } + ], + [{ + "label": "塔城市", + "value": "654201" + }, + { + "label": "乌苏市", + "value": "654202" + }, + { + "label": "额敏县", + "value": "654221" + }, + { + "label": "沙湾县", + "value": "654223" + }, + { + "label": "托里县", + "value": "654224" + }, + { + "label": "裕民县", + "value": "654225" + }, + { + "label": "和布克赛尔蒙古自治县", + "value": "654226" + } + ], + [{ + "label": "阿勒泰市", + "value": "654301" + }, + { + "label": "布尔津县", + "value": "654321" + }, + { + "label": "富蕴县", + "value": "654322" + }, + { + "label": "福海县", + "value": "654323" + }, + { + "label": "哈巴河县", + "value": "654324" + }, + { + "label": "青河县", + "value": "654325" + }, + { + "label": "吉木乃县", + "value": "654326" + } + ], + [{ + "label": "石河子市", + "value": "659001" + }, + { + "label": "阿拉尔市", + "value": "659002" + }, + { + "label": "图木舒克市", + "value": "659003" + }, + { + "label": "五家渠市", + "value": "659004" + }, + { + "label": "铁门关市", + "value": "659006" + } + ] + ], + [ + [{ + "label": "台北", + "value": "660101" + }], + [{ + "label": "高雄", + "value": "660201" + }], + [{ + "label": "基隆", + "value": "660301" + }], + [{ + "label": "台中", + "value": "660401" + }], + [{ + "label": "台南", + "value": "660501" + }], + [{ + "label": "新竹", + "value": "660601" + }], + [{ + "label": "嘉义", + "value": "660701" + }], + [{ + "label": "宜兰", + "value": "660801" + }], + [{ + "label": "桃园", + "value": "660901" + }], + [{ + "label": "苗栗", + "value": "661001" + }], + [{ + "label": "彰化", + "value": "661101" + }], + [{ + "label": "南投", + "value": "661201" + }], + [{ + "label": "云林", + "value": "661301" + }], + [{ + "label": "屏东", + "value": "661401" + }], + [{ + "label": "台东", + "value": "661501" + }], + [{ + "label": "花莲", + "value": "661601" + }], + [{ + "label": "澎湖", + "value": "661701" + }] + ], + [ + [{ + "label": "香港岛", + "value": "670101" + }], + [{ + "label": "九龙", + "value": "670201" + }], + [{ + "label": "新界", + "value": "670301" + }] + ], + [ + [{ + "label": "澳门半岛", + "value": "680101" + }], + [{ + "label": "氹仔岛", + "value": "680201" + }], + [{ + "label": "路环岛", + "value": "680301" + }], + [{ + "label": "路氹城", + "value": "680401" + }] + ] +] +export default areaData; diff --git a/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/city.js b/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/city.js new file mode 100644 index 0000000..8c1dc26 --- /dev/null +++ b/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/city.js @@ -0,0 +1,1503 @@ +/* eslint-disable */ +var cityData = [ + [{ + "label": "市辖区", + "value": "1101" + }], + [{ + "label": "市辖区", + "value": "1201" + }], + [{ + "label": "石家庄市", + "value": "1301" + }, + { + "label": "唐山市", + "value": "1302" + }, + { + "label": "秦皇岛市", + "value": "1303" + }, + { + "label": "邯郸市", + "value": "1304" + }, + { + "label": "邢台市", + "value": "1305" + }, + { + "label": "保定市", + "value": "1306" + }, + { + "label": "张家口市", + "value": "1307" + }, + { + "label": "承德市", + "value": "1308" + }, + { + "label": "沧州市", + "value": "1309" + }, + { + "label": "廊坊市", + "value": "1310" + }, + { + "label": "衡水市", + "value": "1311" + } + ], + [{ + "label": "太原市", + "value": "1401" + }, + { + "label": "大同市", + "value": "1402" + }, + { + "label": "阳泉市", + "value": "1403" + }, + { + "label": "长治市", + "value": "1404" + }, + { + "label": "晋城市", + "value": "1405" + }, + { + "label": "朔州市", + "value": "1406" + }, + { + "label": "晋中市", + "value": "1407" + }, + { + "label": "运城市", + "value": "1408" + }, + { + "label": "忻州市", + "value": "1409" + }, + { + "label": "临汾市", + "value": "1410" + }, + { + "label": "吕梁市", + "value": "1411" + } + ], + [{ + "label": "呼和浩特市", + "value": "1501" + }, + { + "label": "包头市", + "value": "1502" + }, + { + "label": "乌海市", + "value": "1503" + }, + { + "label": "赤峰市", + "value": "1504" + }, + { + "label": "通辽市", + "value": "1505" + }, + { + "label": "鄂尔多斯市", + "value": "1506" + }, + { + "label": "呼伦贝尔市", + "value": "1507" + }, + { + "label": "巴彦淖尔市", + "value": "1508" + }, + { + "label": "乌兰察布市", + "value": "1509" + }, + { + "label": "兴安盟", + "value": "1522" + }, + { + "label": "锡林郭勒盟", + "value": "1525" + }, + { + "label": "阿拉善盟", + "value": "1529" + } + ], + [{ + "label": "沈阳市", + "value": "2101" + }, + { + "label": "大连市", + "value": "2102" + }, + { + "label": "鞍山市", + "value": "2103" + }, + { + "label": "抚顺市", + "value": "2104" + }, + { + "label": "本溪市", + "value": "2105" + }, + { + "label": "丹东市", + "value": "2106" + }, + { + "label": "锦州市", + "value": "2107" + }, + { + "label": "营口市", + "value": "2108" + }, + { + "label": "阜新市", + "value": "2109" + }, + { + "label": "辽阳市", + "value": "2110" + }, + { + "label": "盘锦市", + "value": "2111" + }, + { + "label": "铁岭市", + "value": "2112" + }, + { + "label": "朝阳市", + "value": "2113" + }, + { + "label": "葫芦岛市", + "value": "2114" + } + ], + [{ + "label": "长春市", + "value": "2201" + }, + { + "label": "吉林市", + "value": "2202" + }, + { + "label": "四平市", + "value": "2203" + }, + { + "label": "辽源市", + "value": "2204" + }, + { + "label": "通化市", + "value": "2205" + }, + { + "label": "白山市", + "value": "2206" + }, + { + "label": "松原市", + "value": "2207" + }, + { + "label": "白城市", + "value": "2208" + }, + { + "label": "延边朝鲜族自治州", + "value": "2224" + } + ], + [{ + "label": "哈尔滨市", + "value": "2301" + }, + { + "label": "齐齐哈尔市", + "value": "2302" + }, + { + "label": "鸡西市", + "value": "2303" + }, + { + "label": "鹤岗市", + "value": "2304" + }, + { + "label": "双鸭山市", + "value": "2305" + }, + { + "label": "大庆市", + "value": "2306" + }, + { + "label": "伊春市", + "value": "2307" + }, + { + "label": "佳木斯市", + "value": "2308" + }, + { + "label": "七台河市", + "value": "2309" + }, + { + "label": "牡丹江市", + "value": "2310" + }, + { + "label": "黑河市", + "value": "2311" + }, + { + "label": "绥化市", + "value": "2312" + }, + { + "label": "大兴安岭地区", + "value": "2327" + } + ], + [{ + "label": "市辖区", + "value": "3101" + }], + [{ + "label": "南京市", + "value": "3201" + }, + { + "label": "无锡市", + "value": "3202" + }, + { + "label": "徐州市", + "value": "3203" + }, + { + "label": "常州市", + "value": "3204" + }, + { + "label": "苏州市", + "value": "3205" + }, + { + "label": "南通市", + "value": "3206" + }, + { + "label": "连云港市", + "value": "3207" + }, + { + "label": "淮安市", + "value": "3208" + }, + { + "label": "盐城市", + "value": "3209" + }, + { + "label": "扬州市", + "value": "3210" + }, + { + "label": "镇江市", + "value": "3211" + }, + { + "label": "泰州市", + "value": "3212" + }, + { + "label": "宿迁市", + "value": "3213" + } + ], + [{ + "label": "杭州市", + "value": "3301" + }, + { + "label": "宁波市", + "value": "3302" + }, + { + "label": "温州市", + "value": "3303" + }, + { + "label": "嘉兴市", + "value": "3304" + }, + { + "label": "湖州市", + "value": "3305" + }, + { + "label": "绍兴市", + "value": "3306" + }, + { + "label": "金华市", + "value": "3307" + }, + { + "label": "衢州市", + "value": "3308" + }, + { + "label": "舟山市", + "value": "3309" + }, + { + "label": "台州市", + "value": "3310" + }, + { + "label": "丽水市", + "value": "3311" + } + ], + [{ + "label": "合肥市", + "value": "3401" + }, + { + "label": "芜湖市", + "value": "3402" + }, + { + "label": "蚌埠市", + "value": "3403" + }, + { + "label": "淮南市", + "value": "3404" + }, + { + "label": "马鞍山市", + "value": "3405" + }, + { + "label": "淮北市", + "value": "3406" + }, + { + "label": "铜陵市", + "value": "3407" + }, + { + "label": "安庆市", + "value": "3408" + }, + { + "label": "黄山市", + "value": "3410" + }, + { + "label": "滁州市", + "value": "3411" + }, + { + "label": "阜阳市", + "value": "3412" + }, + { + "label": "宿州市", + "value": "3413" + }, + { + "label": "六安市", + "value": "3415" + }, + { + "label": "亳州市", + "value": "3416" + }, + { + "label": "池州市", + "value": "3417" + }, + { + "label": "宣城市", + "value": "3418" + } + ], + [{ + "label": "福州市", + "value": "3501" + }, + { + "label": "厦门市", + "value": "3502" + }, + { + "label": "莆田市", + "value": "3503" + }, + { + "label": "三明市", + "value": "3504" + }, + { + "label": "泉州市", + "value": "3505" + }, + { + "label": "漳州市", + "value": "3506" + }, + { + "label": "南平市", + "value": "3507" + }, + { + "label": "龙岩市", + "value": "3508" + }, + { + "label": "宁德市", + "value": "3509" + } + ], + [{ + "label": "南昌市", + "value": "3601" + }, + { + "label": "景德镇市", + "value": "3602" + }, + { + "label": "萍乡市", + "value": "3603" + }, + { + "label": "九江市", + "value": "3604" + }, + { + "label": "新余市", + "value": "3605" + }, + { + "label": "鹰潭市", + "value": "3606" + }, + { + "label": "赣州市", + "value": "3607" + }, + { + "label": "吉安市", + "value": "3608" + }, + { + "label": "宜春市", + "value": "3609" + }, + { + "label": "抚州市", + "value": "3610" + }, + { + "label": "上饶市", + "value": "3611" + } + ], + [{ + "label": "济南市", + "value": "3701" + }, + { + "label": "青岛市", + "value": "3702" + }, + { + "label": "淄博市", + "value": "3703" + }, + { + "label": "枣庄市", + "value": "3704" + }, + { + "label": "东营市", + "value": "3705" + }, + { + "label": "烟台市", + "value": "3706" + }, + { + "label": "潍坊市", + "value": "3707" + }, + { + "label": "济宁市", + "value": "3708" + }, + { + "label": "泰安市", + "value": "3709" + }, + { + "label": "威海市", + "value": "3710" + }, + { + "label": "日照市", + "value": "3711" + }, + { + "label": "莱芜市", + "value": "3712" + }, + { + "label": "临沂市", + "value": "3713" + }, + { + "label": "德州市", + "value": "3714" + }, + { + "label": "聊城市", + "value": "3715" + }, + { + "label": "滨州市", + "value": "3716" + }, + { + "label": "菏泽市", + "value": "3717" + } + ], + [{ + "label": "郑州市", + "value": "4101" + }, + { + "label": "开封市", + "value": "4102" + }, + { + "label": "洛阳市", + "value": "4103" + }, + { + "label": "平顶山市", + "value": "4104" + }, + { + "label": "安阳市", + "value": "4105" + }, + { + "label": "鹤壁市", + "value": "4106" + }, + { + "label": "新乡市", + "value": "4107" + }, + { + "label": "焦作市", + "value": "4108" + }, + { + "label": "濮阳市", + "value": "4109" + }, + { + "label": "许昌市", + "value": "4110" + }, + { + "label": "漯河市", + "value": "4111" + }, + { + "label": "三门峡市", + "value": "4112" + }, + { + "label": "南阳市", + "value": "4113" + }, + { + "label": "商丘市", + "value": "4114" + }, + { + "label": "信阳市", + "value": "4115" + }, + { + "label": "周口市", + "value": "4116" + }, + { + "label": "驻马店市", + "value": "4117" + }, + { + "label": "省直辖县级行政区划", + "value": "4190" + } + ], + [{ + "label": "武汉市", + "value": "4201" + }, + { + "label": "黄石市", + "value": "4202" + }, + { + "label": "十堰市", + "value": "4203" + }, + { + "label": "宜昌市", + "value": "4205" + }, + { + "label": "襄阳市", + "value": "4206" + }, + { + "label": "鄂州市", + "value": "4207" + }, + { + "label": "荆门市", + "value": "4208" + }, + { + "label": "孝感市", + "value": "4209" + }, + { + "label": "荆州市", + "value": "4210" + }, + { + "label": "黄冈市", + "value": "4211" + }, + { + "label": "咸宁市", + "value": "4212" + }, + { + "label": "随州市", + "value": "4213" + }, + { + "label": "恩施土家族苗族自治州", + "value": "4228" + }, + { + "label": "省直辖县级行政区划", + "value": "4290" + } + ], + [{ + "label": "长沙市", + "value": "4301" + }, + { + "label": "株洲市", + "value": "4302" + }, + { + "label": "湘潭市", + "value": "4303" + }, + { + "label": "衡阳市", + "value": "4304" + }, + { + "label": "邵阳市", + "value": "4305" + }, + { + "label": "岳阳市", + "value": "4306" + }, + { + "label": "常德市", + "value": "4307" + }, + { + "label": "张家界市", + "value": "4308" + }, + { + "label": "益阳市", + "value": "4309" + }, + { + "label": "郴州市", + "value": "4310" + }, + { + "label": "永州市", + "value": "4311" + }, + { + "label": "怀化市", + "value": "4312" + }, + { + "label": "娄底市", + "value": "4313" + }, + { + "label": "湘西土家族苗族自治州", + "value": "4331" + } + ], + [{ + "label": "广州市", + "value": "4401" + }, + { + "label": "韶关市", + "value": "4402" + }, + { + "label": "深圳市", + "value": "4403" + }, + { + "label": "珠海市", + "value": "4404" + }, + { + "label": "汕头市", + "value": "4405" + }, + { + "label": "佛山市", + "value": "4406" + }, + { + "label": "江门市", + "value": "4407" + }, + { + "label": "湛江市", + "value": "4408" + }, + { + "label": "茂名市", + "value": "4409" + }, + { + "label": "肇庆市", + "value": "4412" + }, + { + "label": "惠州市", + "value": "4413" + }, + { + "label": "梅州市", + "value": "4414" + }, + { + "label": "汕尾市", + "value": "4415" + }, + { + "label": "河源市", + "value": "4416" + }, + { + "label": "阳江市", + "value": "4417" + }, + { + "label": "清远市", + "value": "4418" + }, + { + "label": "东莞市", + "value": "4419" + }, + { + "label": "中山市", + "value": "4420" + }, + { + "label": "潮州市", + "value": "4451" + }, + { + "label": "揭阳市", + "value": "4452" + }, + { + "label": "云浮市", + "value": "4453" + } + ], + [{ + "label": "南宁市", + "value": "4501" + }, + { + "label": "柳州市", + "value": "4502" + }, + { + "label": "桂林市", + "value": "4503" + }, + { + "label": "梧州市", + "value": "4504" + }, + { + "label": "北海市", + "value": "4505" + }, + { + "label": "防城港市", + "value": "4506" + }, + { + "label": "钦州市", + "value": "4507" + }, + { + "label": "贵港市", + "value": "4508" + }, + { + "label": "玉林市", + "value": "4509" + }, + { + "label": "百色市", + "value": "4510" + }, + { + "label": "贺州市", + "value": "4511" + }, + { + "label": "河池市", + "value": "4512" + }, + { + "label": "来宾市", + "value": "4513" + }, + { + "label": "崇左市", + "value": "4514" + } + ], + [{ + "label": "海口市", + "value": "4601" + }, + { + "label": "三亚市", + "value": "4602" + }, + { + "label": "三沙市", + "value": "4603" + }, + { + "label": "儋州市", + "value": "4604" + }, + { + "label": "省直辖县级行政区划", + "value": "4690" + } + ], + [{ + "label": "市辖区", + "value": "5001" + }, + { + "label": "县", + "value": "5002" + } + ], + [{ + "label": "成都市", + "value": "5101" + }, + { + "label": "自贡市", + "value": "5103" + }, + { + "label": "攀枝花市", + "value": "5104" + }, + { + "label": "泸州市", + "value": "5105" + }, + { + "label": "德阳市", + "value": "5106" + }, + { + "label": "绵阳市", + "value": "5107" + }, + { + "label": "广元市", + "value": "5108" + }, + { + "label": "遂宁市", + "value": "5109" + }, + { + "label": "内江市", + "value": "5110" + }, + { + "label": "乐山市", + "value": "5111" + }, + { + "label": "南充市", + "value": "5113" + }, + { + "label": "眉山市", + "value": "5114" + }, + { + "label": "宜宾市", + "value": "5115" + }, + { + "label": "广安市", + "value": "5116" + }, + { + "label": "达州市", + "value": "5117" + }, + { + "label": "雅安市", + "value": "5118" + }, + { + "label": "巴中市", + "value": "5119" + }, + { + "label": "资阳市", + "value": "5120" + }, + { + "label": "阿坝藏族羌族自治州", + "value": "5132" + }, + { + "label": "甘孜藏族自治州", + "value": "5133" + }, + { + "label": "凉山彝族自治州", + "value": "5134" + } + ], + [{ + "label": "贵阳市", + "value": "5201" + }, + { + "label": "六盘水市", + "value": "5202" + }, + { + "label": "遵义市", + "value": "5203" + }, + { + "label": "安顺市", + "value": "5204" + }, + { + "label": "毕节市", + "value": "5205" + }, + { + "label": "铜仁市", + "value": "5206" + }, + { + "label": "黔西南布依族苗族自治州", + "value": "5223" + }, + { + "label": "黔东南苗族侗族自治州", + "value": "5226" + }, + { + "label": "黔南布依族苗族自治州", + "value": "5227" + } + ], + [{ + "label": "昆明市", + "value": "5301" + }, + { + "label": "曲靖市", + "value": "5303" + }, + { + "label": "玉溪市", + "value": "5304" + }, + { + "label": "保山市", + "value": "5305" + }, + { + "label": "昭通市", + "value": "5306" + }, + { + "label": "丽江市", + "value": "5307" + }, + { + "label": "普洱市", + "value": "5308" + }, + { + "label": "临沧市", + "value": "5309" + }, + { + "label": "楚雄彝族自治州", + "value": "5323" + }, + { + "label": "红河哈尼族彝族自治州", + "value": "5325" + }, + { + "label": "文山壮族苗族自治州", + "value": "5326" + }, + { + "label": "西双版纳傣族自治州", + "value": "5328" + }, + { + "label": "大理白族自治州", + "value": "5329" + }, + { + "label": "德宏傣族景颇族自治州", + "value": "5331" + }, + { + "label": "怒江傈僳族自治州", + "value": "5333" + }, + { + "label": "迪庆藏族自治州", + "value": "5334" + } + ], + [{ + "label": "拉萨市", + "value": "5401" + }, + { + "label": "日喀则市", + "value": "5402" + }, + { + "label": "昌都市", + "value": "5403" + }, + { + "label": "林芝市", + "value": "5404" + }, + { + "label": "山南市", + "value": "5405" + }, + { + "label": "那曲地区", + "value": "5424" + }, + { + "label": "阿里地区", + "value": "5425" + } + ], + [{ + "label": "西安市", + "value": "6101" + }, + { + "label": "铜川市", + "value": "6102" + }, + { + "label": "宝鸡市", + "value": "6103" + }, + { + "label": "咸阳市", + "value": "6104" + }, + { + "label": "渭南市", + "value": "6105" + }, + { + "label": "延安市", + "value": "6106" + }, + { + "label": "汉中市", + "value": "6107" + }, + { + "label": "榆林市", + "value": "6108" + }, + { + "label": "安康市", + "value": "6109" + }, + { + "label": "商洛市", + "value": "6110" + } + ], + [{ + "label": "兰州市", + "value": "6201" + }, + { + "label": "嘉峪关市", + "value": "6202" + }, + { + "label": "金昌市", + "value": "6203" + }, + { + "label": "白银市", + "value": "6204" + }, + { + "label": "天水市", + "value": "6205" + }, + { + "label": "武威市", + "value": "6206" + }, + { + "label": "张掖市", + "value": "6207" + }, + { + "label": "平凉市", + "value": "6208" + }, + { + "label": "酒泉市", + "value": "6209" + }, + { + "label": "庆阳市", + "value": "6210" + }, + { + "label": "定西市", + "value": "6211" + }, + { + "label": "陇南市", + "value": "6212" + }, + { + "label": "临夏回族自治州", + "value": "6229" + }, + { + "label": "甘南藏族自治州", + "value": "6230" + } + ], + [{ + "label": "西宁市", + "value": "6301" + }, + { + "label": "海东市", + "value": "6302" + }, + { + "label": "海北藏族自治州", + "value": "6322" + }, + { + "label": "黄南藏族自治州", + "value": "6323" + }, + { + "label": "海南藏族自治州", + "value": "6325" + }, + { + "label": "果洛藏族自治州", + "value": "6326" + }, + { + "label": "玉树藏族自治州", + "value": "6327" + }, + { + "label": "海西蒙古族藏族自治州", + "value": "6328" + } + ], + [{ + "label": "银川市", + "value": "6401" + }, + { + "label": "石嘴山市", + "value": "6402" + }, + { + "label": "吴忠市", + "value": "6403" + }, + { + "label": "固原市", + "value": "6404" + }, + { + "label": "中卫市", + "value": "6405" + } + ], + [{ + "label": "乌鲁木齐市", + "value": "6501" + }, + { + "label": "克拉玛依市", + "value": "6502" + }, + { + "label": "吐鲁番市", + "value": "6504" + }, + { + "label": "哈密市", + "value": "6505" + }, + { + "label": "昌吉回族自治州", + "value": "6523" + }, + { + "label": "博尔塔拉蒙古自治州", + "value": "6527" + }, + { + "label": "巴音郭楞蒙古自治州", + "value": "6528" + }, + { + "label": "阿克苏地区", + "value": "6529" + }, + { + "label": "克孜勒苏柯尔克孜自治州", + "value": "6530" + }, + { + "label": "喀什地区", + "value": "6531" + }, + { + "label": "和田地区", + "value": "6532" + }, + { + "label": "伊犁哈萨克自治州", + "value": "6540" + }, + { + "label": "塔城地区", + "value": "6542" + }, + { + "label": "阿勒泰地区", + "value": "6543" + }, + { + "label": "自治区直辖县级行政区划", + "value": "6590" + } + ], + [{ + "label": "台北", + "value": "6601" + }, + { + "label": "高雄", + "value": "6602" + }, + { + "label": "基隆", + "value": "6603" + }, + { + "label": "台中", + "value": "6604" + }, + { + "label": "台南", + "value": "6605" + }, + { + "label": "新竹", + "value": "6606" + }, + { + "label": "嘉义", + "value": "6607" + }, + { + "label": "宜兰", + "value": "6608" + }, + { + "label": "桃园", + "value": "6609" + }, + { + "label": "苗栗", + "value": "6610" + }, + { + "label": "彰化", + "value": "6611" + }, + { + "label": "南投", + "value": "6612" + }, + { + "label": "云林", + "value": "6613" + }, + { + "label": "屏东", + "value": "6614" + }, + { + "label": "台东", + "value": "6615" + }, + { + "label": "花莲", + "value": "6616" + }, + { + "label": "澎湖", + "value": "6617" + } + ], + [{ + "label": "香港岛", + "value": "6701" + }, + { + "label": "九龙", + "value": "6702" + }, + { + "label": "新界", + "value": "6703" + } + ], + [{ + "label": "澳门半岛", + "value": "6801" + }, + { + "label": "氹仔岛", + "value": "6802" + }, + { + "label": "路环岛", + "value": "6803" + }, + { + "label": "路氹城", + "value": "6804" + } + ] +] +export default cityData; diff --git a/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/province.js b/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/province.js new file mode 100644 index 0000000..1bd680e --- /dev/null +++ b/mallplusui-uniapp-app2/components/mpvue-citypicker/city-data/province.js @@ -0,0 +1,139 @@ +/* eslint-disable */ +var provinceData = [{ + "label": "北京市", + "value": "11" + }, + { + "label": "天津市", + "value": "12" + }, + { + "label": "河北省", + "value": "13" + }, + { + "label": "山西省", + "value": "14" + }, + { + "label": "内蒙古自治区", + "value": "15" + }, + { + "label": "辽宁省", + "value": "21" + }, + { + "label": "吉林省", + "value": "22" + }, + { + "label": "黑龙江省", + "value": "23" + }, + { + "label": "上海市", + "value": "31" + }, + { + "label": "江苏省", + "value": "32" + }, + { + "label": "浙江省", + "value": "33" + }, + { + "label": "安徽省", + "value": "34" + }, + { + "label": "福建省", + "value": "35" + }, + { + "label": "江西省", + "value": "36" + }, + { + "label": "山东省", + "value": "37" + }, + { + "label": "河南省", + "value": "41" + }, + { + "label": "湖北省", + "value": "42" + }, + { + "label": "湖南省", + "value": "43" + }, + { + "label": "广东省", + "value": "44" + }, + { + "label": "广西壮族自治区", + "value": "45" + }, + { + "label": "海南省", + "value": "46" + }, + { + "label": "重庆市", + "value": "50" + }, + { + "label": "四川省", + "value": "51" + }, + { + "label": "贵州省", + "value": "52" + }, + { + "label": "云南省", + "value": "53" + }, + { + "label": "西藏自治区", + "value": "54" + }, + { + "label": "陕西省", + "value": "61" + }, + { + "label": "甘肃省", + "value": "62" + }, + { + "label": "青海省", + "value": "63" + }, + { + "label": "宁夏回族自治区", + "value": "64" + }, + { + "label": "新疆维吾尔自治区", + "value": "65" + }, + { + "label": "台湾", + "value": "66" + }, + { + "label": "香港", + "value": "67" + }, + { + "label": "澳门", + "value": "68" + } +] +export default provinceData; diff --git a/mallplusui-uniapp-app2/components/mpvue-citypicker/mpvueCityPicker.vue b/mallplusui-uniapp-app2/components/mpvue-citypicker/mpvueCityPicker.vue new file mode 100644 index 0000000..2a0416c --- /dev/null +++ b/mallplusui-uniapp-app2/components/mpvue-citypicker/mpvueCityPicker.vue @@ -0,0 +1,210 @@ + ++ ++ ++ ++ + + + + diff --git a/mallplusui-uniapp-app2/components/mpvue-picker/mpvuePicker.vue b/mallplusui-uniapp-app2/components/mpvue-picker/mpvuePicker.vue new file mode 100644 index 0000000..dbd2009 --- /dev/null +++ b/mallplusui-uniapp-app2/components/mpvue-picker/mpvuePicker.vue @@ -0,0 +1,463 @@ + +++++取消+确定++ ++ ++ +{{item.label}}++ +{{item.label}}++ +{{item.label}}++ + + + + + diff --git a/mallplusui-uniapp-app2/components/neil-modal.vue b/mallplusui-uniapp-app2/components/neil-modal.vue new file mode 100644 index 0000000..d84f9c8 --- /dev/null +++ b/mallplusui-uniapp-app2/components/neil-modal.vue @@ -0,0 +1,260 @@ + ++ + ++ + +取消 +确定 ++ + ++ ++ +{{item.label}} ++ + ++ ++ +{{item.label}} ++ +{{item.label}} ++ + ++ ++ +{{item.label}} ++ + ++ ++ +{{item.label}} ++ +{{item.label}} ++ ++ ++ +{{item.label}} ++ +{{item.label}} ++ +{{item.label}} ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/payments/paymentsByAli.vue b/mallplusui-uniapp-app2/components/payments/paymentsByAli.vue new file mode 100644 index 0000000..c55d11f --- /dev/null +++ b/mallplusui-uniapp-app2/components/payments/paymentsByAli.vue @@ -0,0 +1,246 @@ + ++ + +{{title}} ++ + +{{content}} + + ++ + + ++ {{cancelText}} + ++ {{confirmText}} + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/components/payments/paymentsByApp.vue b/mallplusui-uniapp-app2/components/payments/paymentsByApp.vue new file mode 100644 index 0000000..ce53a88 --- /dev/null +++ b/mallplusui-uniapp-app2/components/payments/paymentsByApp.vue @@ -0,0 +1,287 @@ + ++ ++ + + + + + +{{ item.name }} +{{ item.memo }} ++ + + + + diff --git a/mallplusui-uniapp-app2/components/payments/paymentsByH5.vue b/mallplusui-uniapp-app2/components/payments/paymentsByH5.vue new file mode 100644 index 0000000..74ac3c2 --- /dev/null +++ b/mallplusui-uniapp-app2/components/payments/paymentsByH5.vue @@ -0,0 +1,412 @@ + ++ ++ + + + + + +{{ item.name }} +{{ item.memo }} ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/components/payments/paymentsByWx.vue b/mallplusui-uniapp-app2/components/payments/paymentsByWx.vue new file mode 100644 index 0000000..0ef409a --- /dev/null +++ b/mallplusui-uniapp-app2/components/payments/paymentsByWx.vue @@ -0,0 +1,249 @@ + ++ ++ + + + + +{{ item.name }} +{{ item.memo }} ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/components/raffle-wheel/raffle-wheel.vue b/mallplusui-uniapp-app2/components/raffle-wheel/raffle-wheel.vue new file mode 100644 index 0000000..e69de29 diff --git a/mallplusui-uniapp-app2/components/red-bag/index.vue b/mallplusui-uniapp-app2/components/red-bag/index.vue new file mode 100644 index 0000000..66ed499 --- /dev/null +++ b/mallplusui-uniapp-app2/components/red-bag/index.vue @@ -0,0 +1,79 @@ + ++ + ++ + +{{ item.name }} +{{ item.memo }} ++ + + + + \ No newline at end of file diff --git a/mallplusui-uniapp-app2/components/reserve-date/reserve-date.vue b/mallplusui-uniapp-app2/components/reserve-date/reserve-date.vue new file mode 100644 index 0000000..1c3e934 --- /dev/null +++ b/mallplusui-uniapp-app2/components/reserve-date/reserve-date.vue @@ -0,0 +1,496 @@ + ++ ++ ++ + ++ ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/reserve-date/uni-icon.vue b/mallplusui-uniapp-app2/components/reserve-date/uni-icon.vue new file mode 100644 index 0000000..5955046 --- /dev/null +++ b/mallplusui-uniapp-app2/components/reserve-date/uni-icon.vue @@ -0,0 +1,419 @@ + ++ ++ +{{swiperData.year}}年{{swiperData.month}}月 ++ ++ + + + ++ 日 + 一 + 二 + 三 + 四 + 五 + + 六 + ++ +{{val.day}} +{{val.price == undefined ? '' : val.price}}¥ ++ + + + + \ No newline at end of file diff --git a/mallplusui-uniapp-app2/components/share.vue b/mallplusui-uniapp-app2/components/share.vue new file mode 100644 index 0000000..e9b2634 --- /dev/null +++ b/mallplusui-uniapp-app2/components/share.vue @@ -0,0 +1,238 @@ + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/time-filter/time-filter.vue b/mallplusui-uniapp-app2/components/time-filter/time-filter.vue new file mode 100644 index 0000000..6691974 --- /dev/null +++ b/mallplusui-uniapp-app2/components/time-filter/time-filter.vue @@ -0,0 +1,205 @@ + ++ ++ +分享到 ++ ++ ++ {{ item.text }} +取消 ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/u-charts/component.vue b/mallplusui-uniapp-app2/components/u-charts/component.vue new file mode 100644 index 0000000..413c360 --- /dev/null +++ b/mallplusui-uniapp-app2/components/u-charts/component.vue @@ -0,0 +1,165 @@ + + + + + + + diff --git a/mallplusui-uniapp-app2/components/u-charts/u-charts.js b/mallplusui-uniapp-app2/components/u-charts/u-charts.js new file mode 100644 index 0000000..1785ec4 --- /dev/null +++ b/mallplusui-uniapp-app2/components/u-charts/u-charts.js @@ -0,0 +1,5633 @@ +/* + * uCharts v1.9.3.20190922 + * uni-app平台高性能跨全端图表,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360) + * Copyright (c) 2019 QIUN秋云 https://www.ucharts.cn All rights reserved. + * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) + * + * uCharts官方网站 + * https://www.uCharts.cn + * + * 开源地址: + * https://gitee.com/uCharts/uCharts + * + * uni-app插件市场地址: + * http://ext.dcloud.net.cn/plugin?id=271 + * + */ + +'use strict'; + +var config = { + yAxisWidth: 15, + yAxisSplit: 5, + xAxisHeight: 15, + xAxisLineHeight: 15, + legendHeight: 15, + yAxisTitleWidth: 15, + padding: [10, 10, 10, 10], + pixelRatio: 1, + rotate: false, + columePadding: 3, + fontSize: 13, + //dataPointShape: ['diamond', 'circle', 'triangle', 'rect'], + dataPointShape: ['circle', 'circle', 'circle', 'circle'], + colors: ['#1890ff', '#2fc25b', '#facc14', '#f04864', '#8543e0', '#90ed7d'], + pieChartLinePadding: 15, + pieChartTextPadding: 5, + xAxisTextPadding: 3, + titleColor: '#333333', + titleFontSize: 20, + subtitleColor: '#999999', + subtitleFontSize: 15, + toolTipPadding: 3, + toolTipBackground: '#000000', + toolTipOpacity: 0.7, + toolTipLineHeight: 20, + radarLabelTextMargin: 15, + gaugeLabelTextMargin: 15 +}; + +let assign = function (target, ...varArgs) { + if (target == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!varArgs || varArgs.length <= 0) { + return target; + } + // 深度合并对象 + function deepAssign(obj1, obj2) { + for (let key in obj2) { + obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" ? + deepAssign(obj1[key], obj2[key]) : obj1[key] = obj2[key]; + } + return obj1; + } + + varArgs.forEach(val => { + target = deepAssign(target, val); + }); + return target; +}; + +var util = { + toFixed: function toFixed(num, limit) { + limit = limit || 2; + if (this.isFloat(num)) { + num = num.toFixed(limit); + } + return num; + }, + isFloat: function isFloat(num) { + return num % 1 !== 0; + }, + approximatelyEqual: function approximatelyEqual(num1, num2) { + return Math.abs(num1 - num2) < 1e-10; + }, + isSameSign: function isSameSign(num1, num2) { + return Math.abs(num1) === num1 && Math.abs(num2) === num2 || Math.abs(num1) !== num1 && Math.abs(num2) !== num2; + }, + isSameXCoordinateArea: function isSameXCoordinateArea(p1, p2) { + return this.isSameSign(p1.x, p2.x); + }, + isCollision: function isCollision(obj1, obj2) { + obj1.end = {}; + obj1.end.x = obj1.start.x + obj1.width; + obj1.end.y = obj1.start.y - obj1.height; + obj2.end = {}; + obj2.end.x = obj2.start.x + obj2.width; + obj2.end.y = obj2.start.y - obj2.height; + var flag = obj2.start.x > obj1.end.x || obj2.end.x < obj1.start.x || obj2.end.y > obj1.start.y || obj2.start.y < obj1.end.y; + return !flag; + } +}; + +//兼容H5点击事件 +function getH5Offset(e) { + e.mp = { + changedTouches: [] + }; + e.mp.changedTouches.push({ + x: e.offsetX, + y: e.offsetY + }); + return e; +} + +// hex 转 rgba +function hexToRgb(hexValue, opc) { + var rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + var hex = hexValue.replace(rgx, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + var r = parseInt(rgb[1], 16); + var g = parseInt(rgb[2], 16); + var b = parseInt(rgb[3], 16); + return 'rgba(' + r + ',' + g + ',' + b + ',' + opc + ')'; +} + +function findRange(num, type, limit) { + if (isNaN(num)) { + throw new Error('[uCharts] unvalid series data!'); + } + limit = limit || 10; + type = type ? type : 'upper'; + var multiple = 1; + while (limit < 1) { + limit *= 10; + multiple *= 10; + } + if (type === 'upper') { + num = Math.ceil(num * multiple); + } else { + num = Math.floor(num * multiple); + } + while (num % limit !== 0) { + if (type === 'upper') { + num++; + } else { + num--; + } + } + return num / multiple; +} + +function calCandleMA(dayArr, nameArr, colorArr, kdata) { + let seriesTemp = []; + for (let k = 0; k < dayArr.length; k++) { + let seriesItem = { + data: [], + name: nameArr[k], + color: colorArr[k] + }; + for (let i = 0, len = kdata.length; i < len; i++) { + if (i < dayArr[k]) { + seriesItem.data.push(null); + continue; + } + let sum = 0; + for (let j = 0; j < dayArr[k]; j++) { + sum += kdata[i - j][1]; + } + seriesItem.data.push(+(sum / dayArr[k]).toFixed(3)); + } + seriesTemp.push(seriesItem); + } + return seriesTemp; +} + +function calValidDistance(self,distance, chartData, config, opts) { + var dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3]; + var dataChartWidth = chartData.eachSpacing * (opts.chartData.xAxisData.xAxisPoints.length-1); + var validDistance = distance; + if (distance >= 0) { + validDistance = 0; + self.event.trigger('scrollLeft'); + } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) { + validDistance = dataChartAreaWidth - dataChartWidth; + self.event.trigger('scrollRight'); + } + return validDistance; +} + +function isInAngleRange(angle, startAngle, endAngle) { + function adjust(angle) { + while (angle < 0) { + angle += 2 * Math.PI; + } + while (angle > 2 * Math.PI) { + angle -= 2 * Math.PI; + } + return angle; + } + angle = adjust(angle); + startAngle = adjust(startAngle); + endAngle = adjust(endAngle); + if (startAngle > endAngle) { + endAngle += 2 * Math.PI; + if (angle < startAngle) { + angle += 2 * Math.PI; + } + } + return angle >= startAngle && angle <= endAngle; +} + +function calRotateTranslate(x, y, h) { + var xv = x; + var yv = h - y; + var transX = xv + (h - yv - xv) / Math.sqrt(2); + transX *= -1; + var transY = (h - yv) * (Math.sqrt(2) - 1) - (h - yv - xv) / Math.sqrt(2); + return { + transX: transX, + transY: transY + }; +} + +function createCurveControlPoints(points, i) { + + function isNotMiddlePoint(points, i) { + if (points[i - 1] && points[i + 1]) { + return points[i].y >= Math.max(points[i - 1].y, points[i + 1].y) || points[i].y <= Math.min(points[i - 1].y, + points[ + i + 1].y); + } else { + return false; + } + } + var a = 0.2; + var b = 0.2; + var pAx = null; + var pAy = null; + var pBx = null; + var pBy = null; + if (i < 1) { + pAx = points[0].x + (points[1].x - points[0].x) * a; + pAy = points[0].y + (points[1].y - points[0].y) * a; + } else { + pAx = points[i].x + (points[i + 1].x - points[i - 1].x) * a; + pAy = points[i].y + (points[i + 1].y - points[i - 1].y) * a; + } + + if (i > points.length - 3) { + var last = points.length - 1; + pBx = points[last].x - (points[last].x - points[last - 1].x) * b; + pBy = points[last].y - (points[last].y - points[last - 1].y) * b; + } else { + pBx = points[i + 1].x - (points[i + 2].x - points[i].x) * b; + pBy = points[i + 1].y - (points[i + 2].y - points[i].y) * b; + } + if (isNotMiddlePoint(points, i + 1)) { + pBy = points[i + 1].y; + } + if (isNotMiddlePoint(points, i)) { + pAy = points[i].y; + } + if (pAy >= Math.max(points[i].y, points[i + 1].y) || pAy <= Math.min(points[i].y, points[i + 1].y)) { + pAy = points[i].y; + } + if (pBy >= Math.max(points[i].y, points[i + 1].y) || pBy <= Math.min(points[i].y, points[i + 1].y)) { + pBy = points[i + 1].y; + } + return { + ctrA: { + x: pAx, + y: pAy + }, + ctrB: { + x: pBx, + y: pBy + } + }; +} + +function convertCoordinateOrigin(x, y, center) { + return { + x: center.x + x, + y: center.y - y + }; +} + +function avoidCollision(obj, target) { + if (target) { + // is collision test + while (util.isCollision(obj, target)) { + if (obj.start.x > 0) { + obj.start.y--; + } else if (obj.start.x < 0) { + obj.start.y++; + } else { + if (obj.start.y > 0) { + obj.start.y++; + } else { + obj.start.y--; + } + } + } + } + return obj; +} + +function fillSeries(series, opts, config) { + var index = 0; + return series.map(function(item) { + if (!item.color) { + item.color = config.colors[index]; + index = (index + 1) % config.colors.length; + } + if (!item.index) { + item.index = 0; + } + if (!item.type) { + item.type = opts.type; + } + if (typeof item.show == "undefined") { + item.show = true; + } + if (!item.type) { + item.type = opts.type; + } + if (!item.pointShape) { + item.pointShape = "circle"; + } + if (!item.legendShape) { + switch (item.type) { + case 'line': + item.legendShape = "line"; + break; + case 'column': + item.legendShape = "rect"; + break; + case 'area': + item.legendShape = "triangle"; + break; + default: + item.legendShape = "circle"; + } + } + return item; + }); +} + +function getDataRange(minData, maxData) { + var limit = 0; + var range = maxData - minData; + if (range >= 10000) { + limit = 1000; + } else if (range >= 1000) { + limit = 100; + } else if (range >= 100) { + limit = 10; + } else if (range >= 10) { + limit = 5; + } else if (range >= 1) { + limit = 1; + } else if (range >= 0.1) { + limit = 0.1; + } else if (range >= 0.01) { + limit = 0.01; + } else if (range >= 0.001) { + limit = 0.001; + } else if (range >= 0.0001) { + limit = 0.0001; + } else if (range >= 0.00001) { + limit = 0.00001; + } else { + limit = 0.000001; + } + return { + minRange: findRange(minData, 'lower', limit), + maxRange: findRange(maxData, 'upper', limit) + }; +} + +function measureText(text) { + var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : config.fontSize; + text = String(text); + var text = text.split(''); + var width = 0; + for (let i = 0; i < text.length; i++) { + let item = text[i]; + if (/[a-zA-Z]/.test(item)) { + width += 7; + } else if (/[0-9]/.test(item)) { + width += 5.5; + } else if (/\./.test(item)) { + width += 2.7; + } else if (/-/.test(item)) { + width += 3.25; + } else if (/[\u4e00-\u9fa5]/.test(item)) { + width += 10; + } else if (/\(|\)/.test(item)) { + width += 3.73; + } else if (/\s/.test(item)) { + width += 2.5; + } else if (/%/.test(item)) { + width += 8; + } else { + width += 10; + } + } + return width * fontSize / 10; +} + +function dataCombine(series) { + return series.reduce(function(a, b) { + return (a.data ? a.data : a).concat(b.data); + }, []); +} + +function dataCombineStack(series, len) { + var sum = new Array(len); + for (var j = 0; j < sum.length; j++) { + sum[j] = 0; + } + for (var i = 0; i < series.length; i++) { + for (var j = 0; j < sum.length; j++) { + sum[j] += series[i].data[j]; + } + } + return series.reduce(function(a, b) { + return (a.data ? a.data : a).concat(b.data).concat(sum); + }, []); +} + +function getTouches(touches, opts, e) { + let x, y; + if (touches.clientX) { + if (opts.rotate) { + y = opts.height - touches.clientX * opts.pixelRatio; + x = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) * + opts.pixelRatio; + } else { + x = touches.clientX * opts.pixelRatio; + y = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) * + opts.pixelRatio; + } + } else { + if (opts.rotate) { + y = opts.height - touches.x * opts.pixelRatio; + x = touches.y * opts.pixelRatio; + } else { + x = touches.x * opts.pixelRatio; + y = touches.y * opts.pixelRatio; + } + } + return { + x: x, + y: y + } +} + +function getSeriesDataItem(series, index) { + var data = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + if (item.data[index] !== null && typeof item.data[index] !== 'undefined' && item.show) { + let seriesItem = {}; + seriesItem.color = item.color; + seriesItem.type = item.type; + seriesItem.style = item.style; + seriesItem.pointShape = item.pointShape; + seriesItem.disableLegend = item.disableLegend; + seriesItem.name = item.name; + seriesItem.show = item.show; + seriesItem.data = item.format ? item.format(item.data[index]) : item.data[index]; + data.push(seriesItem); + } + } + return data; +} + +function getMaxTextListLength(list) { + var lengthList = list.map(function(item) { + return measureText(item); + }); + return Math.max.apply(null, lengthList); +} + +function getRadarCoordinateSeries(length) { + var eachAngle = 2 * Math.PI / length; + var CoordinateSeries = []; + for (var i = 0; i < length; i++) { + CoordinateSeries.push(eachAngle * i); + } + + return CoordinateSeries.map(function(item) { + return -1 * item + Math.PI / 2; + }); +} + +function getToolTipData(seriesData, calPoints, index, categories) { + var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + var textList = seriesData.map(function(item) { + let titleText=[]; + if(categories){ + titleText=categories; + }else{ + titleText=item.data; + } + return { + text: option.format ? option.format(item, titleText[index]) : item.name + ': ' + item.data, + color: item.color + }; + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + for (let i = 0; i < validCalPoints.length; i++) { + let item = validCalPoints[i]; + offset.x = Math.round(item.x); + offset.y += item.y; + } + offset.y /= validCalPoints.length; + return { + textList: textList, + offset: offset + }; +} + +function getMixToolTipData(seriesData, calPoints, index, categories) { + var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + var textList = seriesData.map(function(item) { + return { + text: option.format ? option.format(item, categories[index]) : item.name + ': ' + item.data, + color: item.color, + disableLegend: item.disableLegend ? true : false + }; + }); + textList = textList.filter(function(item) { + if (item.disableLegend !== true) { + return item; + } + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + for (let i = 0; i < validCalPoints.length; i++) { + let item = validCalPoints[i]; + offset.x = Math.round(item.x); + offset.y += item.y; + } + offset.y /= validCalPoints.length; + return { + textList: textList, + offset: offset + }; +} + +function getCandleToolTipData(series, seriesData, calPoints, index, categories, extra) { + var option = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}; + let upColor = extra.color.upFill; + let downColor = extra.color.downFill; + //颜色顺序为开盘,收盘,最低,最高 + let color = [upColor, upColor, downColor, upColor]; + var textList = []; + let text0 = { + text: categories[index], + color: null + }; + textList.push(text0); + seriesData.map(function(item) { + if (index == 0 && item.data[1] - item.data[0] < 0) { + color[1] = downColor; + } else { + if (item.data[0] < series[index - 1][1]) { + color[0] = downColor; + } + if (item.data[1] < item.data[0]) { + color[1] = downColor; + } + if (item.data[2] > series[index - 1][1]) { + color[2] = upColor; + } + if (item.data[3] < series[index - 1][1]) { + color[3] = downColor; + } + } + let text1 = { + text: '开盘:' + item.data[0], + color: color[0] + }; + let text2 = { + text: '收盘:' + item.data[1], + color: color[1] + }; + let text3 = { + text: '最低:' + item.data[2], + color: color[2] + }; + let text4 = { + text: '最高:' + item.data[3], + color: color[3] + }; + textList.push(text1, text2, text3, text4); + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + offset.x = Math.round(validCalPoints[0][0].x); + return { + textList: textList, + offset: offset + }; +} + +function filterSeries(series) { + let tempSeries = []; + for (let i = 0; i < series.length; i++) { + if (series[i].show == true) { + tempSeries.push(series[i]) + } + } + return tempSeries; +} + +function findCurrentIndex(currentPoints, calPoints, opts, config) { + var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var currentIndex = -1; + var spacing = 0; + let xAxisPoints=[]; + for(let i=0;i+ + + ++ {{item.name}} +item) { + currentIndex = index; + } + }); + } + return currentIndex; +} + +function findLegendIndex(currentPoints, legendData, opts) { + let currentIndex = -1; + if (isInExactLegendArea(currentPoints, legendData.area)) { + let points = legendData.points; + let index = -1; + for (let i = 0, len = points.length; i < len; i++) { + let item = points[i]; + for (let j = 0; j < item.length; j++) { + index += 1; + let area = item[j]['area']; + if (currentPoints.x > area[0] && currentPoints.x < area[2] && currentPoints.y > area[1] && currentPoints.y < area[3]) { + currentIndex = index; + break; + } + } + } + return currentIndex; + } + return currentIndex; +} + +function isInExactLegendArea(currentPoints, area) { + return currentPoints.x > area.start.x && currentPoints.x < area.end.x && currentPoints.y > area.start.y && + currentPoints.y < area.end.y; +} + +function isInExactChartArea(currentPoints, opts, config) { + return currentPoints.x <= opts.width - opts.area[1] + 10 && currentPoints.x >= opts.area[3] -10 && currentPoints.y >= opts.area[0] && currentPoints.y <= opts.height - opts.area[2]; +} + +function findRadarChartCurrentIndex(currentPoints, radarData, count) { + var eachAngleArea = 2 * Math.PI / count; + var currentIndex = -1; + if (isInExactPieChartArea(currentPoints, radarData.center, radarData.radius)) { + var fixAngle = function fixAngle(angle) { + if (angle < 0) { + angle += 2 * Math.PI; + } + if (angle > 2 * Math.PI) { + angle -= 2 * Math.PI; + } + return angle; + }; + + var angle = Math.atan2(radarData.center.y - currentPoints.y, currentPoints.x - radarData.center.x); + angle = -1 * angle; + if (angle < 0) { + angle += 2 * Math.PI; + } + + var angleList = radarData.angleList.map(function(item) { + item = fixAngle(-1 * item); + + return item; + }); + + angleList.forEach(function(item, index) { + var rangeStart = fixAngle(item - eachAngleArea / 2); + var rangeEnd = fixAngle(item + eachAngleArea / 2); + if (rangeEnd < rangeStart) { + rangeEnd += 2 * Math.PI; + } + if (angle >= rangeStart && angle <= rangeEnd || angle + 2 * Math.PI >= rangeStart && angle + 2 * Math.PI <= + rangeEnd) { + currentIndex = index; + } + }); + } + + return currentIndex; +} + +function findFunnelChartCurrentIndex(currentPoints, funnelData) { + var currentIndex = -1; + for (var i = 0, len = funnelData.series.length; i < len; i++) { + var item = funnelData.series[i]; + if (currentPoints.x > item.funnelArea[0] && currentPoints.x < item.funnelArea[2] && currentPoints.y > item.funnelArea[1] && currentPoints.y < item.funnelArea[3]) { + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findWordChartCurrentIndex(currentPoints, wordData) { + var currentIndex = -1; + for (var i = 0, len = wordData.length; i < len; i++) { + var item = wordData[i]; + if (currentPoints.x > item.area[0] && currentPoints.x < item.area[2] && currentPoints.y > item.area[1] && currentPoints.y < item.area[3]) { + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findMapChartCurrentIndex(currentPoints, opts) { + var currentIndex = -1; + var cData=opts.chartData.mapData; + var data=opts.series; + var tmp=pointToCoordinate(currentPoints.y, currentPoints.x,cData.bounds,cData.scale,cData.xoffset,cData.yoffset); + var poi=[tmp.x, tmp.y]; + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i].geometry.coordinates; + if(isPoiWithinPoly(poi,item)){ + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findPieChartCurrentIndex(currentPoints, pieData) { + var currentIndex = -1; + if (isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) { + var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x); + angle = -angle; + for (var i = 0, len = pieData.series.length; i < len; i++) { + var item = pieData.series[i]; + if (isInAngleRange(angle, item._start_, item._start_ + item._proportion_ * 2 * Math.PI)) { + currentIndex = i; + break; + } + } + } + + return currentIndex; +} + +function isInExactPieChartArea(currentPoints, center, radius) { + return Math.pow(currentPoints.x - center.x, 2) + Math.pow(currentPoints.y - center.y, 2) <= Math.pow(radius, 2); +} + +function splitPoints(points) { + var newPoints = []; + var items = []; + points.forEach(function(item, index) { + if (item !== null) { + items.push(item); + } else { + if (items.length) { + newPoints.push(items); + } + items = []; + } + }); + if (items.length) { + newPoints.push(items); + } + + return newPoints; +} + +function calLegendData(series, opts, config, chartData) { + let legendData = { + area: { + start: { + x: 0, + y: 0 + }, + end: { + x: 0, + y: 0 + }, + width: 0, + height: 0, + wholeWidth: 0, + wholeHeight: 0 + }, + points: [], + widthArr: [], + heightArr: [] + }; + if (opts.legend.show === false) { + chartData.legendData = legendData; + return legendData; + } + + let padding = opts.legend.padding; + let margin = opts.legend.margin; + let fontSize = opts.legend.fontSize; + let shapeWidth = 15 * opts.pixelRatio; + let shapeRight = 5 * opts.pixelRatio; + let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize); + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + let legendList = []; + let widthCount = 0; + let widthCountArr = []; + let currentRow = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + let itemWidth = shapeWidth + shapeRight + measureText(item.name || 'undefined', fontSize) + opts.legend.itemGap; + if (widthCount + itemWidth > opts.width - opts.padding[1] - opts.padding[3]) { + legendList.push(currentRow); + widthCountArr.push(widthCount - opts.legend.itemGap); + widthCount = itemWidth; + currentRow = [item]; + } else { + widthCount += itemWidth; + currentRow.push(item); + } + } + if (currentRow.length) { + legendList.push(currentRow); + widthCountArr.push(widthCount - opts.legend.itemGap); + legendData.widthArr = widthCountArr; + let legendWidth = Math.max.apply(null, widthCountArr); + switch (opts.legend.float) { + case 'left': + legendData.area.start.x = opts.padding[3]; + legendData.area.end.x = opts.padding[3] + 2 * padding; + break; + case 'right': + legendData.area.start.x = opts.width - opts.padding[1] - legendWidth - 2 * padding; + legendData.area.end.x = opts.width - opts.padding[1]; + break; + default: + legendData.area.start.x = (opts.width - legendWidth) / 2 - padding; + legendData.area.end.x = (opts.width + legendWidth) / 2 + padding; + } + legendData.area.width = legendWidth + 2 * padding; + legendData.area.wholeWidth = legendWidth + 2 * padding; + legendData.area.height = legendList.length * lineHeight + 2 * padding; + legendData.area.wholeHeight = legendList.length * lineHeight + 2 * padding + 2 * margin; + legendData.points = legendList; + } + } else { + let len = series.length; + let maxHeight = opts.height - opts.padding[0] - opts.padding[2] - 2 * margin - 2 * padding; + let maxLength = Math.min(Math.floor(maxHeight / lineHeight), len); + legendData.area.height = maxLength * lineHeight + padding * 2; + legendData.area.wholeHeight = maxLength * lineHeight + padding * 2; + switch (opts.legend.float) { + case 'top': + legendData.area.start.y = opts.padding[0] + margin; + legendData.area.end.y = opts.padding[0] + margin + legendData.area.height; + break; + case 'bottom': + legendData.area.start.y = opts.height - opts.padding[2] - margin - legendData.area.height; + legendData.area.end.y = opts.height - opts.padding[2] - margin; + break; + default: + legendData.area.start.y = (opts.height - legendData.area.height) / 2; + legendData.area.end.y = (opts.height + legendData.area.height) / 2; + } + let lineNum = len % maxLength === 0 ? len / maxLength : Math.floor((len / maxLength) + 1); + let currentRow = []; + for (let i = 0; i < lineNum; i++) { + let temp = series.slice(i * maxLength, i * maxLength + maxLength); + currentRow.push(temp); + } + + legendData.points = currentRow; + + if (currentRow.length) { + for (let i = 0; i < currentRow.length; i++) { + let item = currentRow[i]; + let maxWidth = 0; + for (let j = 0; j < item.length; j++) { + let itemWidth = shapeWidth + shapeRight + measureText(item[j].name || 'undefined', fontSize) + opts.legend.itemGap; + if (itemWidth > maxWidth) { + maxWidth = itemWidth; + } + } + legendData.widthArr.push(maxWidth); + legendData.heightArr.push(item.length * lineHeight + padding * 2); + } + let legendWidth = 0 + for (let i = 0; i < legendData.widthArr.length; i++) { + legendWidth += legendData.widthArr[i]; + } + legendData.area.width = legendWidth - opts.legend.itemGap + 2 * padding; + legendData.area.wholeWidth = legendData.area.width + padding; + } + } + + switch (opts.legend.position) { + case 'top': + legendData.area.start.y = opts.padding[0] + margin; + legendData.area.end.y = opts.padding[0] + margin + legendData.area.height; + break; + case 'bottom': + legendData.area.start.y = opts.height - opts.padding[2] - legendData.area.height - margin; + legendData.area.end.y = opts.height - opts.padding[2] - margin; + break; + case 'left': + legendData.area.start.x = opts.padding[3]; + legendData.area.end.x = opts.padding[3] + legendData.area.width; + break; + case 'right': + legendData.area.start.x = opts.width - opts.padding[1] - legendData.area.width; + legendData.area.end.x = opts.width - opts.padding[1]; + break; + } + chartData.legendData = legendData; + return legendData; +} + +function calCategoriesData(categories, opts, config, eachSpacing) { + var result = { + angle: 0, + xAxisHeight: config.xAxisHeight + }; + var categoriesTextLenth = categories.map(function(item) { + return measureText(item,opts.xAxis.fontSize||config.fontSize); + }); + var maxTextLength = Math.max.apply(this, categoriesTextLenth); + + if (opts.xAxis.rotateLabel == true && maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) { + result.angle = 45 * Math.PI / 180; + result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle); + } + return result; +} + +function getXAxisTextList(series, opts, config) { + var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var data = dataCombine(series); + var sorted = []; + // remove null from data + data = data.filter(function(item) { + //return item !== null; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + return item !== null; + } else { + return item.value !== null; + } + } else { + return item !== null; + } + }); + data.map(function(item) { + if (typeof item === 'object') { + if (item.constructor == Array) { + if(opts.type=='candle'){ + item.map(function(subitem) { + sorted.push(subitem); + }) + }else{ + sorted.push(item[0]); + } + } else { + sorted.push(item.value); + } + } else { + sorted.push(item); + } + }) + + var minData = 0; + var maxData = 0; + if (sorted.length > 0) { + minData = Math.min.apply(this, sorted); + maxData = Math.max.apply(this, sorted); + } + //为了兼容v1.9.0之前的项目 + if(index>-1){ + if (typeof opts.xAxis.data[index].min === 'number') { + minData = Math.min(opts.xAxis.data[index].min, minData); + } + if (typeof opts.xAxis.data[index].max === 'number') { + maxData = Math.max(opts.xAxis.data[index].max, maxData); + } + }else{ + if (typeof opts.xAxis.min === 'number') { + minData = Math.min(opts.xAxis.min, minData); + } + if (typeof opts.xAxis.max === 'number') { + maxData = Math.max(opts.xAxis.max, maxData); + } + } + + + if (minData === maxData) { + var rangeSpan = maxData || 10; + maxData += rangeSpan; + } + + var dataRange = getDataRange(minData, maxData); + var minRange = dataRange.minRange; + var maxRange = dataRange.maxRange; + + var range = []; + var eachRange = (maxRange - minRange) / opts.xAxis.splitNumber; + + for (var i = 0; i <= opts.xAxis.splitNumber; i++) { + range.push(minRange + eachRange * i); + } + return range; +} + +function calXAxisData(series, opts, config){ + var result = { + angle: 0, + xAxisHeight: config.xAxisHeight + }; + + result.ranges = getXAxisTextList(series, opts, config); + result.rangesFormat = result.ranges.map(function(item){ + item = opts.xAxis.format? opts.xAxis.format(item):util.toFixed(item, 2); + return item; + }); + var xAxisScaleValues = result.ranges.map(function (item) { + // 如果刻度值是浮点数,则保留两位小数 + item = util.toFixed(item, 2); + // 若有自定义格式则调用自定义的格式化函数 + item = opts.xAxis.format ? opts.xAxis.format(Number(item)) : item; + return item; + }); + + result = Object.assign(result,getXAxisPoints(xAxisScaleValues, opts, config)); + // 计算X轴刻度的属性譬如每个刻度的间隔,刻度的起始点\结束点以及总长 + var eachSpacing = result.eachSpacing; + + var textLength = xAxisScaleValues.map(function (item) { + return measureText(item); + }); + + // get max length of categories text + var maxTextLength = Math.max.apply(this, textLength); + + // 如果刻度值文本内容过长,则将其逆时针旋转45° + if (maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) { + result.angle = 45 * Math.PI / 180; + result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle); + } + + if (opts.xAxis.disabled === true) { + result.xAxisHeight = 0; + } + + return result; +} + +function getRadarDataPoints(angleList, center, radius, series, opts) { + var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1; + + var radarOption = opts.extra.radar || {}; + radarOption.max = radarOption.max || 0; + var maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series))); + + var data = []; + for (let i = 0; i < series.length; i++) { + let each = series[i]; + let listItem = {}; + listItem.color = each.color; + listItem.legendShape = each.legendShape; + listItem.pointShape = each.pointShape; + listItem.data = []; + each.data.forEach(function(item, index) { + let tmp = {}; + tmp.angle = angleList[index]; + + tmp.proportion = item / maxData; + tmp.position = convertCoordinateOrigin(radius * tmp.proportion * process * Math.cos(tmp.angle), radius * tmp.proportion * + process * Math.sin(tmp.angle), center); + listItem.data.push(tmp); + }); + + data.push(listItem); + } + + return data; +} + +function getPieDataPoints(series, radius) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + + var count = 0; + var _start_ = 0; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + count += item.data; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (count === 0) { + item._proportion_ = 1 / series.length * process; + } else { + item._proportion_ = item.data / count * process; + } + item._radius_ = radius; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item._start_ = _start_; + _start_ += 2 * item._proportion_ * Math.PI; + } + + return series; +} + +function getFunnelDataPoints(series, radius) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + series = series.sort(function(a,b){return parseInt(b.data)-parseInt(a.data);}); + for (let i = 0; i < series.length; i++) { + series[i].radius = series[i].data/series[0].data*radius*process; + series[i]._proportion_ = series[i].data/series[0].data; + } + return series.reverse(); +} + +function getRoseDataPoints(series, type, minRadius, radius) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var count = 0; + var _start_ = 0; + + var dataArr = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + count += item.data; + dataArr.push(item.data); + } + + var minData = Math.min.apply(null, dataArr); + var maxData = Math.max.apply(null, dataArr); + var radiusLength = radius - minRadius; + + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (count === 0 || type == 'area') { + item._proportion_ = item.data / count * process; + item._rose_proportion_ = 1 / series.length * process; + } else { + item._proportion_ = item.data / count * process; + item._rose_proportion_ = item.data / count * process; + } + item._radius_ = minRadius + radiusLength * ((item.data - minData) / (maxData - minData)); + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item._start_ = _start_; + _start_ += 2 * item._rose_proportion_ * Math.PI; + } + + return series; +} + +function getArcbarDataPoints(series, arcbarOption) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + if (process == 1) { + process = 0.999999; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + let totalAngle; + if (arcbarOption.type == 'circle') { + totalAngle = 2; + } else { + if (arcbarOption.endAngle < arcbarOption.startAngle) { + totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle; + } else{ + totalAngle = arcbarOption.startAngle - arcbarOption.endAngle; + } + } + item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle; + if (item._proportion_ >= 2) { + item._proportion_ = item._proportion_ % 2; + } + } + return series; +} + +function getGaugeAxisPoints(categories, startAngle, endAngle) { + let totalAngle = startAngle - endAngle + 1; + let tempStartAngle = startAngle; + for (let i = 0; i < categories.length; i++) { + categories[i].value = categories[i].value === null ? 0 : categories[i].value; + categories[i]._startAngle_ = tempStartAngle; + categories[i]._endAngle_ = totalAngle * categories[i].value + startAngle; + if (categories[i]._endAngle_ >= 2) { + categories[i]._endAngle_ = categories[i]._endAngle_ % 2; + } + tempStartAngle = categories[i]._endAngle_; + } + return categories; +} + +function getGaugeDataPoints(series, categories, gaugeOption) { + let process = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (gaugeOption.pointer.color == 'auto') { + for (let i = 0; i < categories.length; i++) { + if (item.data <= categories[i].value) { + item.color = categories[i].color; + break; + } + } + } else { + item.color = gaugeOption.pointer.color; + } + let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + item._endAngle_ = totalAngle * item.data + gaugeOption.startAngle; + item._oldAngle_ = gaugeOption.oldAngle; + if (gaugeOption.oldAngle < gaugeOption.endAngle) { + item._oldAngle_ += 2; + } + if (item.data >= gaugeOption.oldData) { + item._proportion_ = (item._endAngle_ - item._oldAngle_) * process + gaugeOption.oldAngle; + } else { + item._proportion_ = item._oldAngle_ - (item._oldAngle_ - item._endAngle_) * process; + } + if (item._proportion_ >= 2) { + item._proportion_ = item._proportion_ % 2; + } + } + return series; +} + +function getPieTextMaxLength(series) { + series = getPieDataPoints(series); + let maxLength = 0; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + let text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) + '%'; + maxLength = Math.max(maxLength, measureText(text)); + } + + return maxLength; +} + +function fixColumeData(points, eachSpacing, columnLen, index, config, opts) { + return points.map(function(item) { + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / columnLen); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + if (item.width <= 0) { + item.width = 1; + } + item.x += (index + 0.5 - columnLen / 2) * item.width; + return item; + }); +} + +function fixColumeMeterData(points, eachSpacing, columnLen, index, config, opts, border) { + return points.map(function(item) { + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + + if (index > 0) { + item.width -= 2 * border; + } + return item; + }); +} + +function fixColumeStackData(points, eachSpacing, columnLen, index, config, opts, series) { + + return points.map(function(item, indexn) { + + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + return item; + }); +} + +function getXAxisPoints(categories, opts, config) { + var spacingValid = opts.width - opts.area[1] - opts.area[3]; + var dataCount = opts.enableScroll ? Math.min(opts.xAxis.itemCount, categories.length) : categories.length; + if((opts.type=='line' || opts.type=='area') && dataCount>1 && opts.xAxis.boundaryGap=='justify'){ + dataCount -=1; + } + var eachSpacing = spacingValid / dataCount; + + var xAxisPoints = []; + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + categories.forEach(function(item, index) { + xAxisPoints.push(startX + index * eachSpacing); + }); + if(opts.xAxis.boundaryGap !=='justify'){ + if (opts.enableScroll === true) { + xAxisPoints.push(startX + categories.length * eachSpacing); + } else { + xAxisPoints.push(endX); + } + } + return { + xAxisPoints: xAxisPoints, + startX: startX, + endX: endX, + eachSpacing: eachSpacing + }; +} + +function getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) { + var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1; + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var cPoints = []; + item.forEach(function(items, indexs) { + var point = {}; + point.x = xAxisPoints[index] + Math.round(eachSpacing / 2); + var value = items.value || items; + var height = validHeight * (value - minRange) / (maxRange - minRange); + height *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + cPoints.push(point); + }); + points.push(cPoints); + } + }); + + return points; +} + +function getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) { + var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1; + var boundaryGap='center'; + if (opts.type == 'line'||opts.type == 'area'){ + boundaryGap=opts.xAxis.boundaryGap; + } + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + var validWidth = opts.width - opts.area[1] - opts.area[3]; + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var point = {}; + point.color = item.color; + point.x = xAxisPoints[index]; + var value = item; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + let xranges,xminRange,xmaxRange; + xranges = [].concat(opts.chartData.xAxisData.ranges); + + xminRange = xranges.shift(); + xmaxRange = xranges.pop(); + value = item[1]; + point.x = opts.area[3]+ validWidth * (item[0] - xminRange) / (xmaxRange - xminRange); + } else { + value = item.value; + } + } + if(boundaryGap=='center'){ + point.x += Math.round(eachSpacing / 2); + } + var height = validHeight * (value - minRange) / (maxRange - minRange); + height *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + points.push(point); + } + }); + + return points; +} + +function getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) { + var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1; + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var point = {}; + point.color = item.color; + point.x = xAxisPoints[index] + Math.round(eachSpacing / 2); + + if (seriesIndex > 0) { + var value = 0; + for (let i = 0; i <= seriesIndex; i++) { + value += stackSeries[i].data[index]; + } + var value0 = value - item; + var height = validHeight * (value - minRange) / (maxRange - minRange); + var height0 = validHeight * (value0 - minRange) / (maxRange - minRange); + } else { + var value = item; + var height = validHeight * (value - minRange) / (maxRange - minRange); + var height0 = 0; + } + var heightc = height0; + height *= process; + heightc *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + point.y0 = opts.height - Math.round(heightc) - opts.area[2]; + points.push(point); + } + }); + + return points; +} + +function getYAxisTextList(series, opts, config, stack) { + var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var data; + if (stack == 'stack') { + data = dataCombineStack(series, opts.categories.length); + } else { + data = dataCombine(series); + } + var sorted = []; + // remove null from data + data = data.filter(function(item) { + //return item !== null; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + return item !== null; + } else { + return item.value !== null; + } + } else { + return item !== null; + } + }); + data.map(function(item) { + if (typeof item === 'object') { + if (item.constructor == Array) { + if(opts.type=='candle'){ + item.map(function(subitem) { + sorted.push(subitem); + }) + }else{ + sorted.push(item[1]); + } + } else { + sorted.push(item.value); + } + } else { + sorted.push(item); + } + }) + + var minData = 0; + var maxData = 0; + if (sorted.length > 0) { + minData = Math.min.apply(this, sorted); + maxData = Math.max.apply(this, sorted); + } + //为了兼容v1.9.0之前的项目 + if(index>-1){ + if (typeof opts.yAxis.data[index].min === 'number') { + minData = Math.min(opts.yAxis.data[index].min, minData); + } + if (typeof opts.yAxis.data[index].max === 'number') { + maxData = Math.max(opts.yAxis.data[index].max, maxData); + } + }else{ + if (typeof opts.yAxis.min === 'number') { + minData = Math.min(opts.yAxis.min, minData); + } + if (typeof opts.yAxis.max === 'number') { + maxData = Math.max(opts.yAxis.max, maxData); + } + } + + + if (minData === maxData) { + var rangeSpan = maxData || 10; + maxData += rangeSpan; + } + + var dataRange = getDataRange(minData, maxData); + var minRange = dataRange.minRange; + var maxRange = dataRange.maxRange; + + var range = []; + var eachRange = (maxRange - minRange) / opts.yAxis.splitNumber; + + for (var i = 0; i <= opts.yAxis.splitNumber; i++) { + range.push(minRange + eachRange * i); + } + return range.reverse(); +} + +function calYAxisData(series, opts, config) { + //堆叠图重算Y轴 + var columnstyle = assign({}, { + type: "" + }, opts.extra.column); + //如果是多Y轴,重新计算 + var YLength = opts.yAxis.data.length; + var newSeries=new Array(YLength); + if(YLength>0){ + for(let i=0;i = 2) { + nowAngle = nowAngle % 2; + } + nowNumber += splitNumber; + } + +} + +function drawRadarLabel(angleList, radius, centerPosition, opts, config, context) { + var radarOption = opts.extra.radar || {}; + radius += config.radarLabelTextMargin; + + angleList.forEach(function(angle, index) { + var pos = { + x: radius * Math.cos(angle), + y: radius * Math.sin(angle) + }; + var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition); + var startX = posRelativeCanvas.x; + var startY = posRelativeCanvas.y; + if (util.approximatelyEqual(pos.x, 0)) { + startX -= measureText(opts.categories[index] || '') / 2; + } else if (pos.x < 0) { + startX -= measureText(opts.categories[index] || ''); + } + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(radarOption.labelColor || '#666666'); + context.fillText(opts.categories[index] || '', startX, startY + config.fontSize / 2); + context.closePath(); + context.stroke(); + }); + +} + +function drawPieText(series, opts, config, context, radius, center) { + var lineRadius = config.pieChartLinePadding; + var textObjectCollection = []; + var lastTextObject = null; + + var seriesConvert = series.map(function(item) { + var text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_.toFixed(4) * 100) +'%'; + if(item._rose_proportion_) item._proportion_=item._rose_proportion_; + var arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._proportion_ / 2); + var color = item.color; + var radius = item._radius_; + return { + arc: arc, + text: text, + color: color, + radius: radius, + textColor: item.textColor, + textSize: item.textSize, + }; + }); + for (let i = 0; i < seriesConvert.length; i++) { + let item = seriesConvert[i]; + // line end + let orginX1 = Math.cos(item.arc) * (item.radius + lineRadius); + let orginY1 = Math.sin(item.arc) * (item.radius + lineRadius); + + // line start + let orginX2 = Math.cos(item.arc) * item.radius; + let orginY2 = Math.sin(item.arc) * item.radius; + + // text start + let orginX3 = orginX1 >= 0 ? orginX1 + config.pieChartTextPadding : orginX1 - config.pieChartTextPadding; + let orginY3 = orginY1; + let textWidth = measureText(item.text,item.textSize||config.fontSize); + let startY = orginY3; + + if (lastTextObject && util.isSameXCoordinateArea(lastTextObject.start, { + x: orginX3 + })) { + if (orginX3 > 0) { + startY = Math.min(orginY3, lastTextObject.start.y); + } else if (orginX1 < 0) { + startY = Math.max(orginY3, lastTextObject.start.y); + } else { + if (orginY3 > 0) { + startY = Math.max(orginY3, lastTextObject.start.y); + } else { + startY = Math.min(orginY3, lastTextObject.start.y); + } + } + } + if (orginX3 < 0) { + orginX3 -= textWidth; + } + + let textObject = { + lineStart: { + x: orginX2, + y: orginY2 + }, + lineEnd: { + x: orginX1, + y: orginY1 + }, + start: { + x: orginX3, + y: startY + }, + width: textWidth, + height: config.fontSize, + text: item.text, + color: item.color, + textColor: item.textColor, + textSize: item.textSize + }; + lastTextObject = avoidCollision(textObject, lastTextObject); + textObjectCollection.push(lastTextObject); + } + + for (let i = 0; i < textObjectCollection.length; i++) { + let item = textObjectCollection[i]; + let lineStartPoistion = convertCoordinateOrigin(item.lineStart.x, item.lineStart.y, center); + let lineEndPoistion = convertCoordinateOrigin(item.lineEnd.x, item.lineEnd.y, center); + let textPosition = convertCoordinateOrigin(item.start.x, item.start.y, center); + context.setLineWidth(1 * opts.pixelRatio); + context.setFontSize(config.fontSize); + context.beginPath(); + context.setStrokeStyle(item.color); + context.setFillStyle(item.color); + context.moveTo(lineStartPoistion.x, lineStartPoistion.y); + let curveStartX = item.start.x < 0 ? textPosition.x + item.width : textPosition.x; + let textStartX = item.start.x < 0 ? textPosition.x - 5 : textPosition.x + 5; + context.quadraticCurveTo(lineEndPoistion.x, lineEndPoistion.y, curveStartX, textPosition.y); + context.moveTo(lineStartPoistion.x, lineStartPoistion.y); + context.stroke(); + context.closePath(); + context.beginPath(); + context.moveTo(textPosition.x + item.width, textPosition.y); + context.arc(curveStartX, textPosition.y, 2, 0, 2 * Math.PI); + context.closePath(); + context.fill(); + context.beginPath(); + context.setFontSize(item.textSize || config.fontSize); + context.setFillStyle(item.textColor || '#666666'); + context.fillText(item.text, textStartX, textPosition.y + 3); + context.closePath(); + context.stroke(); + context.closePath(); + } +} + +function drawToolTipSplitLine(offsetX, opts, config, context) { + var toolTipOption = opts.extra.tooltip || {}; + toolTipOption.gridType = toolTipOption.gridType == undefined ? 'solid' : toolTipOption.gridType; + toolTipOption.dashLength = toolTipOption.dashLength == undefined ? 4 : toolTipOption.dashLength; + var startY = opts.area[0]; + var endY = opts.height - opts.area[2]; + + if (toolTipOption.gridType == 'dash') { + context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]); + } + context.setStrokeStyle(toolTipOption.gridColor || '#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(offsetX, startY); + context.lineTo(offsetX, endY); + context.stroke(); + context.setLineDash([]); + + if (toolTipOption.xAxisLabel) { + let labelText = opts.categories[opts.tooltip.index]; + context.setFontSize(config.fontSize); + let textWidth = measureText(labelText, config.fontSize); + + let textX = offsetX - 0.5 * textWidth; + let textY = endY; + context.beginPath(); + context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity)); + context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground); + context.setLineWidth(1 * opts.pixelRatio); + context.rect(textX - config.toolTipPadding, textY, textWidth + 2 * config.toolTipPadding, config.fontSize + 2 * config.toolTipPadding); + context.closePath(); + context.stroke(); + context.fill(); + + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(toolTipOption.labelFontColor || config.fontColor); + context.fillText(String(labelText), textX, textY + config.toolTipPadding + config.fontSize); + context.closePath(); + context.stroke(); + } +} + +function drawMarkLine(opts, config, context) { + let markLineOption = assign({}, { + type: 'solid', + dashLength: 4, + data: [] + }, opts.extra.markLine); + let startX = opts.area[3]; + let endX = opts.width - opts.area[1]; + let points = calMarkLineData(markLineOption.data, opts); + + for (let i = 0; i < points.length; i++) { + let item = assign({}, { + lineColor: '#DE4A42', + showLabel: false, + labelFontColor: '#666666', + labelBgColor: '#DFE8FF', + labelBgOpacity: 0.8, + yAxisIndex: 0 + }, points[i]); + + if (markLineOption.type == 'dash') { + context.setLineDash([markLineOption.dashLength, markLineOption.dashLength]); + } + context.setStrokeStyle(item.lineColor); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(startX, item.y); + context.lineTo(endX, item.y); + context.stroke(); + context.setLineDash([]); + if (item.showLabel) { + let labelText = opts.yAxis.format ? opts.yAxis.format(Number(item.value)) : item.value; + context.setFontSize(config.fontSize); + let textWidth = measureText(labelText, config.fontSize); + let bgStartX = opts.padding[3] + config.yAxisTitleWidth - config.toolTipPadding; + let bgEndX = Math.max(opts.area[3], textWidth + config.toolTipPadding * 2); + let bgWidth = bgEndX - bgStartX; + + let textX = bgStartX + (bgWidth - textWidth) / 2; + let textY = item.y; + context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity)); + context.setStrokeStyle(item.labelBgColor); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding); + context.closePath(); + context.stroke(); + context.fill(); + + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(item.labelFontColor); + context.fillText(String(labelText), textX, textY + 0.5 * config.fontSize); + context.stroke(); + } + } +} + +function drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) { + var toolTipOption = assign({}, { + gridType: 'solid', + dashLength: 4 + }, opts.extra.tooltip); + + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + + if (toolTipOption.gridType == 'dash') { + context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]); + } + context.setStrokeStyle(toolTipOption.gridColor || '#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(startX, opts.tooltip.offset.y); + context.lineTo(endX, opts.tooltip.offset.y); + context.stroke(); + context.setLineDash([]); + + if (toolTipOption.yAxisLabel) { + let labelText = calTooltipYAxisData(opts.tooltip.offset.y, opts.series, opts, config, eachSpacing); + let widthArr = opts.chartData.yAxisData.yAxisWidth; + let tStartLeft=opts.area[3]; + let tStartRight=opts.width-opts.area[1]; + for(let i=0;i opts.width) { + isOverRightBorder = true; + } + if (toolTipHeight + offset.y > opts.height) { + offset.y = opts.height - toolTipHeight; + } + // draw background rect + context.beginPath(); + context.setFillStyle(hexToRgb(toolTipOption.bgColor || config.toolTipBackground, toolTipOption.bgOpacity || config.toolTipOpacity)); + if (isOverRightBorder) { + context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio); + context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio); + context.lineTo(offset.x - arrowWidth, offset.y); + context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y); + context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y + toolTipHeight); + context.lineTo(offset.x - arrowWidth, offset.y + toolTipHeight); + context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio); + context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio); + } else { + context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio); + context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio); + context.lineTo(offset.x + arrowWidth, offset.y); + context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y); + context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y + toolTipHeight); + context.lineTo(offset.x + arrowWidth, offset.y + toolTipHeight); + context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio); + context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio); + } + + context.closePath(); + context.fill(); + + // draw legend + textList.forEach(function(item, index) { + if (item.color !== null) { + context.beginPath(); + context.setFillStyle(item.color); + var startX = offset.x + arrowWidth + 2 * config.toolTipPadding; + var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + + config.toolTipPadding + 1; + if (isOverRightBorder) { + startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding; + } + context.fillRect(startX, startY, legendWidth, config.fontSize); + context.closePath(); + } + }); + + // draw text list + + textList.forEach(function(item, index) { + var startX = offset.x + arrowWidth + 2 * config.toolTipPadding + legendWidth + legendMarginRight; + if (isOverRightBorder) { + startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding + +legendWidth + legendMarginRight; + } + var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + + config.toolTipPadding; + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(toolTipOption.fontColor); + context.fillText(item.text, startX, startY + config.fontSize); + context.closePath(); + context.stroke(); + }); +} + +function drawYAxisTitle(title, opts, config, context) { + var startX = config.xAxisHeight + (opts.height - config.xAxisHeight - measureText(title)) / 2; + context.save(); + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(opts.yAxis.titleFontColor || '#333333'); + context.translate(0, opts.height); + context.rotate(-90 * Math.PI / 180); + context.fillText(title, startX, opts.padding[3] + 0.5 * config.fontSize); + context.closePath(); + context.stroke(); + context.restore(); +} + +function drawColumnDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + let columnOption = assign({}, { + type: 'group', + width: eachSpacing / 2, + meter: { + border: 4, + fillColor: '#FFFFFF' + } + }, opts.extra.column); + + let calPoints = []; + context.save(); + + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + } + if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) { + drawToolTipSplitArea(opts.tooltip.offset.x, opts, config, context, eachSpacing); + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + switch (columnOption.type) { + case 'group': + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + var tooltipPoints = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process); + calPoints.push(tooltipPoints); + points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts); + for(let i=0;i leftNum && i leftNum && i 0) { + height -= height0; + } + context.moveTo(startX, item.y); + context.fillRect(startX, item.y, item.width - 2, height); + context.closePath(); + context.fill(); + } + }; + break; + case 'meter': + // 绘制温度计数据图 + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + points = fixColumeMeterData(points, eachSpacing, series.length, seriesIndex, config, opts, columnOption.meter.border); + if (seriesIndex == 0) { + for(let i=0;i leftNum && i 0) { + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(columnOption.meter.border * opts.pixelRatio); + context.moveTo(startX + columnOption.meter.border * 0.5, item.y + height); + context.lineTo(startX + columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5); + context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5); + context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + height); + context.stroke(); + } + } + }; + } else { + for(let i=0;i leftNum && i 5 && arguments[5] !== undefined ? arguments[5] : 1; + var candleOption = assign({}, { + color: {}, + average: {} + }, opts.extra.candle); + candleOption.color = assign({}, { + upLine: '#f04864', + upFill: '#f04864', + downLine: '#2fc25b', + downFill: '#2fc25b' + }, candleOption.color); + candleOption.average = assign({}, { + show: false, + name: [], + day: [], + color: config.colors + }, candleOption.average); + opts.extra.candle = candleOption; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let calPoints = []; + + context.save(); + + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + //画均线 + if (candleOption.average.show) { + seriesMA.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + var splitPointList = splitPoints(points); + + for(let i=0;i leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + } + context.moveTo(points[0].x, points[0].y); + } + context.closePath(); + context.stroke(); + } + }); + } + //画K线 + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + var splitPointList = splitPoints(points); + + for(let i=0;i leftNum && i 0) { + context.setStrokeStyle(candleOption.color.upLine); + context.setFillStyle(candleOption.color.upFill); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(item[3].x, item[3].y); //顶点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点 + context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[2].x, item[2].y); //底点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点 + context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.moveTo(item[3].x, item[3].y); //顶点 + } else { + context.setStrokeStyle(candleOption.color.downLine); + context.setFillStyle(candleOption.color.downFill); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(item[3].x, item[3].y); //顶点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点 + context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[2].x, item[2].y); //底点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点 + context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.moveTo(item[3].x, item[3].y); //顶点 + } + context.closePath(); + context.fill(); + context.stroke(); + } + } + }); + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawAreaDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var areaOption = assign({},{ + type: 'straight', + opacity: 0.2, + addLine: false, + width: 2, + gradient:false + },opts.extra.area); + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let endY = opts.height - opts.area[2]; + let calPoints = []; + + context.save(); + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + let data = eachSeries.data; + let points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + + let splitPointList = splitPoints(points); + for (let i = 0; i < splitPointList.length; i++) { + let points = splitPointList[i]; + // 绘制区域数 + context.beginPath(); + context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity)); + if(areaOption.gradient){ + let gradient = context.createLinearGradient(0, opts.area[0], 0, opts.height-opts.area[2]); + gradient.addColorStop('0', hexToRgb(eachSeries.color, areaOption.opacity)); + gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1)); + context.setFillStyle(gradient); + }else{ + context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity)); + } + context.setLineWidth(areaOption.width * opts.pixelRatio); + if (points.length > 1) { + let firstPoint = points[0]; + let lastPoint = points[points.length - 1]; + context.moveTo(firstPoint.x, firstPoint.y); + let startPoint=0; + if (areaOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + let ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + + context.lineTo(lastPoint.x, endY); + context.lineTo(firstPoint.x, endY); + context.lineTo(firstPoint.x, firstPoint.y); + } else { + let item = points[0]; + context.moveTo(item.x - eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, endY); + context.lineTo(item.x - eachSpacing / 2, endY); + context.moveTo(item.x - eachSpacing / 2, item.y); + } + context.closePath(); + context.fill(); + + //画连线 + if (areaOption.addLine) { + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(areaOption.width * opts.pixelRatio); + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (areaOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + let ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.moveTo(points[0].x, points[0].y); + } + context.stroke(); + context.setLineDash([]); + } + } + + //画点 + if (opts.dataPointShape !== false) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + + }); + + if (opts.dataLabel !== false && process === 1) { + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + drawPointText(points, eachSeries, config, context); + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawLineDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var lineOption = assign({},{ + type: 'straight', + width: 2 + },opts.extra.line); + lineOption.width *=opts.pixelRatio; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + var calPoints = []; + + context.save(); + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + var splitPointList = splitPoints(points); + + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(lineOption.width); + + splitPointList.forEach(function(points, index) { + + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (lineOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.moveTo(points[0].x, points[0].y); + } + + }); + + context.stroke(); + context.setLineDash([]); + + if (opts.dataPointShape !== false) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + + if (opts.dataLabel !== false && process === 1) { + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + drawPointText(points, eachSeries, config, context); + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawMixDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let endY = opts.height - opts.area[2]; + let calPoints = []; + + var columnIndex = 0; + var columnLength = 0; + series.forEach(function(eachSeries, seriesIndex) { + if (eachSeries.type == 'column') { + columnLength += 1; + } + }); + context.save(); + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + + // 绘制柱状数据图 + if (eachSeries.type == 'column') { + points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts); + for(let i=0;i leftNum && i 1) { + var firstPoint = points[0]; + let lastPoint = points[points.length - 1]; + context.moveTo(firstPoint.x, firstPoint.y); + let startPoint=0; + if (eachSeries.style === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.lineTo(lastPoint.x, endY); + context.lineTo(firstPoint.x, endY); + context.lineTo(firstPoint.x, firstPoint.y); + } else { + let item = points[0]; + context.moveTo(item.x - eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, endY); + context.lineTo(item.x - eachSpacing / 2, endY); + context.moveTo(item.x - eachSpacing / 2, item.y); + } + context.closePath(); + context.fill(); + } + } + + // 绘制折线数据图 + if (eachSeries.type == 'line') { + var splitPointList = splitPoints(points); + splitPointList.forEach(function(points, index) { + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(2 * opts.pixelRatio); + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (eachSeries.style == 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y); + } + } + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + } + } + context.moveTo(points[0].x, points[0].y); + } + context.stroke(); + context.setLineDash([]); + }); + } + + // 绘制点数据图 + if (eachSeries.type == 'point') { + eachSeries.addPoint = true; + } + + if (eachSeries.addPoint == true && eachSeries.type !== 'column' ) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + if (opts.dataLabel !== false && process === 1) { + var columnIndex = 0; + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + if (eachSeries.type !== 'column') { + drawPointText(points, eachSeries, config, context); + } else { + points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts); + drawPointText(points, eachSeries, config, context); + columnIndex += 1; + } + + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing, + } +} + +function drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints) { + var toolTipOption = opts.extra.tooltip || {}; + if (toolTipOption.horizentalLine && opts.tooltip && process === 1 && (opts.type == 'line' || opts.type == 'area' || opts.type == 'column' || opts.type == 'candle' || opts.type == 'mix')) { + drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) + } + context.save(); + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + } + if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) { + drawToolTip(opts.tooltip.textList, opts.tooltip.offset, opts, config, context, eachSpacing, xAxisPoints); + } + context.restore(); + +} + +function drawXAxis(categories, opts, config, context) { + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + startX = xAxisData.startX, + endX = xAxisData.endX, + eachSpacing = xAxisData.eachSpacing; + var boundaryGap='center'; + if (opts.type == 'line'||opts.type == 'area'){ + boundaryGap=opts.xAxis.boundaryGap; + } + var startY = opts.height - opts.area[2]; + var endY = opts.area[0]; + + //绘制滚动条 + if (opts.enableScroll && opts.xAxis.scrollShow) { + var scrollY = opts.height - opts.area[2] + config.xAxisHeight; + var scrollScreenWidth = endX - startX; + var scrollTotalWidth = eachSpacing * (xAxisPoints.length - 1); + var scrollWidth = scrollScreenWidth * scrollScreenWidth / scrollTotalWidth; + var scrollLeft = 0; + if (opts._scrollDistance_) { + scrollLeft = -opts._scrollDistance_ * (scrollScreenWidth) / scrollTotalWidth; + } + context.beginPath(); + context.setLineCap('round'); + context.setLineWidth(6 * opts.pixelRatio); + context.setStrokeStyle(opts.xAxis.scrollBackgroundColor || "#EFEBEF"); + context.moveTo(startX, scrollY); + context.lineTo(endX, scrollY); + context.stroke(); + context.closePath(); + context.beginPath(); + context.setLineCap('round'); + context.setLineWidth(6 * opts.pixelRatio); + context.setStrokeStyle(opts.xAxis.scrollColor || "#A6A6A6"); + context.moveTo(startX + scrollLeft, scrollY); + context.lineTo(startX + scrollLeft + scrollWidth, scrollY); + context.stroke(); + context.closePath(); + context.setLineCap('butt'); + } + + context.save(); + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) { + context.translate(opts._scrollDistance_, 0); + } + + //绘制X轴刻度线 + if (opts.xAxis.calibration === true) { + context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc"); + context.setLineCap('butt'); + context.setLineWidth(1 * opts.pixelRatio); + xAxisPoints.forEach(function(item, index) { + if (index > 0) { + context.beginPath(); + context.moveTo(item - eachSpacing / 2, startY); + context.lineTo(item - eachSpacing / 2, startY + 3 * opts.pixelRatio); + context.closePath(); + context.stroke(); + } + }); + } + //绘制X轴网格 + if (opts.xAxis.disableGrid !== true) { + context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc"); + context.setLineCap('butt'); + context.setLineWidth(1 * opts.pixelRatio); + if (opts.xAxis.gridType == 'dash') { + context.setLineDash([opts.xAxis.dashLength, opts.xAxis.dashLength]); + } + opts.xAxis.gridEval = opts.xAxis.gridEval || 1; + xAxisPoints.forEach(function(item, index) { + if (index % opts.xAxis.gridEval == 0) { + context.beginPath(); + context.moveTo(item, startY); + context.lineTo(item, endY); + context.stroke(); + } + }); + context.setLineDash([]); + } + + + //绘制X轴文案 + if (opts.xAxis.disabled !== true) { + // 对X轴列表做抽稀处理 + //默认全部显示X轴标签 + let maxXAxisListLength = categories.length; + //如果设置了X轴单屏数量 + if (opts.xAxis.labelCount) { + //如果设置X轴密度 + if (opts.xAxis.itemCount) { + maxXAxisListLength = Math.ceil(categories.length / opts.xAxis.itemCount * opts.xAxis.labelCount); + } else { + maxXAxisListLength = opts.xAxis.labelCount; + } + maxXAxisListLength -= 1; + } + + let ratio = Math.ceil(categories.length / maxXAxisListLength); + + let newCategories = []; + let cgLength = categories.length; + for (let i = 0; i < cgLength; i++) { + if (i % ratio !== 0) { + newCategories.push(""); + } else { + newCategories.push(categories[i]); + } + } + newCategories[cgLength - 1] = categories[cgLength - 1]; + + var xAxisFontSize = opts.xAxis.fontSize || config.fontSize; + if (config._xAxisTextAngle_ === 0) { + newCategories.forEach(function(item, index) { + var offset = - measureText(String(item), xAxisFontSize) / 2; + if(boundaryGap == 'center'){ + offset+=eachSpacing / 2; + } + var scrollHeight=0; + if(opts.xAxis.scrollShow){ + scrollHeight=6*opts.pixelRatio; + } + context.beginPath(); + context.setFontSize(xAxisFontSize); + context.setFillStyle(opts.xAxis.fontColor || '#666666'); + context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + (config.xAxisHeight - scrollHeight - xAxisFontSize) / 2); + context.closePath(); + context.stroke(); + }); + + } else { + newCategories.forEach(function(item, index) { + context.save(); + context.beginPath(); + context.setFontSize(xAxisFontSize); + context.setFillStyle(opts.xAxis.fontColor || '#666666'); + var textWidth = measureText(String(item),xAxisFontSize); + var offset = - textWidth; + if(boundaryGap == 'center'){ + offset+=eachSpacing / 2; + } + var _calRotateTranslate = calRotateTranslate(xAxisPoints[index] + eachSpacing / 2, startY + xAxisFontSize / 2 + 5, opts.height), + transX = _calRotateTranslate.transX, + transY = _calRotateTranslate.transY; + + context.rotate(-1 * config._xAxisTextAngle_); + context.translate(transX, transY); + context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + 5); + context.closePath(); + context.stroke(); + context.restore(); + }); + } + } + context.restore(); + + //绘制X轴轴线 + if(opts.xAxis.axisLine){ + context.beginPath(); + context.setStrokeStyle(opts.xAxis.axisLineColor); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(startX,opts.height-opts.area[2]); + context.lineTo(endX,opts.height-opts.area[2]); + context.stroke(); + } +} + +function drawYAxisGrid(categories, opts, config, context) { + if (opts.yAxis.disableGrid === true) { + return; + } + let spacingValid = opts.height - opts.area[0] - opts.area[2]; + let eachSpacing = spacingValid / opts.yAxis.splitNumber; + let startX = opts.area[3]; + let xAxisPoints = opts.chartData.xAxisData.xAxisPoints, + xAxiseachSpacing = opts.chartData.xAxisData.eachSpacing; + let TotalWidth = xAxiseachSpacing * (xAxisPoints.length - 1); + let endX = startX + TotalWidth; + + let points = []; + for (let i = 0; i < opts.yAxis.splitNumber + 1; i++) { + points.push(opts.height - opts.area[2] - eachSpacing * i); + } + + context.save(); + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) { + context.translate(opts._scrollDistance_, 0); + } + + if (opts.yAxis.gridType == 'dash') { + context.setLineDash([opts.yAxis.dashLength, opts.yAxis.dashLength]); + } + context.setStrokeStyle(opts.yAxis.gridColor); + context.setLineWidth(1 * opts.pixelRatio); + points.forEach(function(item, index) { + context.beginPath(); + context.moveTo(startX, item); + context.lineTo(endX, item); + context.stroke(); + }); + context.setLineDash([]); + + context.restore(); +} + +function drawYAxis(series, opts, config, context) { + if (opts.yAxis.disabled === true) { + return; + } + var spacingValid = opts.height - opts.area[0] - opts.area[2]; + var eachSpacing = spacingValid / opts.yAxis.splitNumber; + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + var endY = opts.height - opts.area[2]; + var fillEndY = endY + config.xAxisHeight; + if (opts.xAxis.scrollShow) { + fillEndY -= 3 * opts.pixelRatio; + } + if (opts.xAxis.rotateLabel){ + fillEndY = opts.height - opts.area[2]+3; + } + // set YAxis background + context.beginPath(); + context.setFillStyle(opts.background || '#ffffff'); + if (opts._scrollDistance_ < 0) { + context.fillRect(0, 0, startX, fillEndY); + } + if(opts.enableScroll == true){ + context.fillRect(endX, 0, opts.width, fillEndY); + } + context.closePath(); + context.stroke(); + + var points = []; + for (let i = 0; i <= opts.yAxis.splitNumber; i++) { + points.push(opts.area[0] + eachSpacing * i); + } + + let tStartLeft=opts.area[3]; + let tStartRight=opts.width-opts.area[1]; + + for (let i = 0; i < opts.yAxis.data.length; i++) { + let yData = opts.yAxis.data[i]; + if(yData.disabled !== true){ + let rangesFormat = opts.chartData.yAxisData.rangesFormat[i]; + let yAxisFontSize = yData.fontSize || config.fontSize; + let yAxisWidth = opts.chartData.yAxisData.yAxisWidth[i]; + //画Y轴刻度及文案 + rangesFormat.forEach(function(item, index) { + var pos = points[index] ? points[index] : endY; + context.beginPath(); + context.setFontSize(yAxisFontSize); + context.setLineWidth(1*opts.pixelRatio); + context.setStrokeStyle(yData.axisLineColor||'#cccccc'); + context.setFillStyle(yData.fontColor|| '#666666'); + if(yAxisWidth.position=='left'){ + context.fillText(String(item), tStartLeft - yAxisWidth.width , pos + yAxisFontSize / 2); + //画刻度线 + if(yData.calibration==true){ + context.moveTo(tStartLeft,pos); + context.lineTo(tStartLeft - 3*opts.pixelRatio,pos); + } + }else{ + context.fillText(String(item), tStartRight + 4*opts.pixelRatio, pos + yAxisFontSize / 2); + //画刻度线 + if(yData.calibration==true){ + context.moveTo(tStartRight,pos); + context.lineTo(tStartRight + 3*opts.pixelRatio,pos); + } + } + context.closePath(); + context.stroke(); + }); + //画Y轴轴线 + if (yData.axisLine!==false) { + context.beginPath(); + context.setStrokeStyle(yData.axisLineColor||'#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + if(yAxisWidth.position=='left'){ + context.moveTo(tStartLeft,opts.height-opts.area[2]); + context.lineTo(tStartLeft,opts.area[0]); + }else{ + context.moveTo(tStartRight,opts.height-opts.area[2]); + context.lineTo(tStartRight,opts.area[0]); + } + context.stroke(); + } + + //画Y轴标题 + if (opts.yAxis.showTitle) { + + let titleFontSize = yData.titleFontSize || config.fontSize; + let title = yData.title; + context.beginPath(); + context.setFontSize(titleFontSize); + context.setFillStyle(yData.titleFontColor || '#666666'); + if(yAxisWidth.position=='left'){ + context.fillText(title, tStartLeft - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio); + }else{ + context.fillText(title,tStartRight - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio); + } + context.closePath(); + context.stroke(); + } + if(yAxisWidth.position=='left'){ + tStartLeft -=(yAxisWidth.width + opts.yAxis.padding); + }else{ + tStartRight +=yAxisWidth.width+ opts.yAxis.padding; + } + } + } +} + +function drawLegend(series, opts, config, context, chartData) { + if (opts.legend.show === false) { + return; + } + let legendData = chartData.legendData; + let legendList = legendData.points; + let legendArea = legendData.area; + let padding = opts.legend.padding; + let fontSize = opts.legend.fontSize; + let shapeWidth = 15 * opts.pixelRatio; + let shapeRight = 5 * opts.pixelRatio; + let itemGap = opts.legend.itemGap; + let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize); + + //画背景及边框 + context.beginPath(); + context.setLineWidth(opts.legend.borderWidth); + context.setStrokeStyle(opts.legend.borderColor); + context.setFillStyle(opts.legend.backgroundColor); + context.moveTo(legendArea.start.x, legendArea.start.y); + context.rect(legendArea.start.x, legendArea.start.y, legendArea.width, legendArea.height); + context.closePath(); + context.fill(); + context.stroke(); + + legendList.forEach(function(itemList, listIndex) { + let width = 0; + let height = 0; + width = legendData.widthArr[listIndex]; + height = legendData.heightArr[listIndex]; + let startX = 0; + let startY = 0; + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + startX = legendArea.start.x + (legendArea.width - width) / 2; + startY = legendArea.start.y + padding + listIndex * lineHeight; + } else { + if (listIndex == 0) { + width = 0; + } else { + width = legendData.widthArr[listIndex - 1]; + } + startX = legendArea.start.x + padding + width; + startY = legendArea.start.y + padding + (legendArea.height - height) / 2; + } + + context.setFontSize(config.fontSize); + for (let i = 0; i < itemList.length; i++) { + let item = itemList[i]; + item.area = [0, 0, 0, 0]; + item.area[0] = startX; + item.area[1] = startY; + item.area[3] = startY + lineHeight; + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(item.show ? item.color : opts.legend.hiddenColor); + context.setFillStyle(item.show ? item.color : opts.legend.hiddenColor); + switch (item.legendShape) { + case 'line': + context.moveTo(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio, 15 * opts.pixelRatio, 4 * opts.pixelRatio); + break; + case 'triangle': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + break; + case 'diamond': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + break; + case 'circle': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.arc(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight, 5 * opts.pixelRatio, 0, 2 * Math.PI); + break; + case 'rect': + context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio); + break; + default: + context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio); + } + context.closePath(); + context.fill(); + context.stroke(); + + startX += shapeWidth + shapeRight; + let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2; + context.beginPath(); + context.setFontSize(fontSize); + context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor); + context.fillText(item.name, startX, startY + fontTrans); + context.closePath(); + context.stroke(); + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + startX += measureText(item.name, fontSize) + itemGap; + item.area[2] = startX; + } else { + item.area[2] = startX + measureText(item.name, fontSize) + itemGap;; + startX -= shapeWidth + shapeRight; + startY += lineHeight; + } + } + }); +} + +function drawPieDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var pieOption = assign({}, { + activeOpacity: 0.5, + activeRadius: 10 * opts.pixelRatio, + offsetAngle: 0, + labelWidth: 15 * opts.pixelRatio, + ringWidth: 0, + border:false, + borderWidth:2, + borderColor:'#FFFFFF' + }, opts.extra.pie); + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + if (config.pieChartLinePadding == 0) { + config.pieChartLinePadding = pieOption.activeRadius; + } + + var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding); + + series = getPieDataPoints(series, radius, process); + + var activeRadius = pieOption.activeRadius; + + series = series.map(function(eachSeries) { + eachSeries._start_ += (pieOption.offsetAngle) * Math.PI / 180; + return eachSeries; + }); + series.forEach(function(eachSeries, seriesIndex) { + if (opts.tooltip) { + if (opts.tooltip.index == seriesIndex) { + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, opts.extra.pie.activeOpacity || 0.5)); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_ + activeRadius, eachSeries._start_, + eachSeries._start_ + 2 * + eachSeries._proportion_ * Math.PI); + context.closePath(); + context.fill(); + } + } + context.beginPath(); + context.setLineWidth(pieOption.borderWidth * opts.pixelRatio); + context.lineJoin = "round"; + context.setStrokeStyle(pieOption.borderColor); + context.setFillStyle(eachSeries.color); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * eachSeries._proportion_ * Math.PI); + context.closePath(); + context.fill(); + if (pieOption.border == true) { + context.stroke(); + } + }); + + if (opts.type === 'ring') { + var innerPieWidth = radius * 0.6; + if (typeof opts.extra.pie.ringWidth === 'number' && opts.extra.pie.ringWidth > 0) { + innerPieWidth = Math.max(0, radius - opts.extra.pie.ringWidth); + } + context.beginPath(); + context.setFillStyle(opts.background || '#ffffff'); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, innerPieWidth, 0, 2 * Math.PI); + context.closePath(); + context.fill(); + } + + if (opts.dataLabel !== false && process === 1) { + var valid = false; + for (var i = 0, len = series.length; i < len; i++) { + if (series[i].data > 0) { + valid = true; + break; + } + } + + if (valid) { + drawPieText(series, opts, config, context, radius, centerPosition); + } + } + + if (process === 1 && opts.type === 'ring') { + drawRingTitle(opts, config, context, centerPosition); + } + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawRoseDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var roseOption = assign({}, { + type: 'area', + activeOpacity: 0.5, + activeRadius: 10 * opts.pixelRatio, + offsetAngle: 0, + labelWidth: 15 * opts.pixelRatio, + border:false, + borderWidth:2, + borderColor:'#FFFFFF' + }, opts.extra.rose); + if (config.pieChartLinePadding == 0) { + config.pieChartLinePadding = roseOption.activeRadius; + } + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding); + var minRadius = roseOption.minRadius || radius * 0.5; + + series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process); + + var activeRadius = roseOption.activeRadius; + + series = series.map(function(eachSeries) { + eachSeries._start_ += (roseOption.offsetAngle || 0) * Math.PI / 180; + return eachSeries; + }); + + series.forEach(function(eachSeries, seriesIndex) { + if (opts.tooltip) { + if (opts.tooltip.index == seriesIndex) { + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, roseOption.activeOpacity || 0.5)); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, activeRadius + eachSeries._radius_, eachSeries._start_, + eachSeries._start_ + 2 * eachSeries._rose_proportion_ * Math.PI); + context.closePath(); + context.fill(); + } + } + context.beginPath(); + context.setLineWidth(roseOption.borderWidth * opts.pixelRatio); + context.lineJoin = "round"; + context.setStrokeStyle(roseOption.borderColor); + context.setFillStyle(eachSeries.color); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * + eachSeries._rose_proportion_ * Math.PI); + context.closePath(); + context.fill(); + if (roseOption.border == true) { + context.stroke(); + } + }); + + if (opts.dataLabel !== false && process === 1) { + var valid = false; + for (var i = 0, len = series.length; i < len; i++) { + if (series[i].data > 0) { + valid = true; + break; + } + } + + if (valid) { + drawPieText(series, opts, config, context, radius, centerPosition); + } + } + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawArcbarDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var arcbarOption = assign({}, { + startAngle: 0.75, + endAngle: 0.25, + type: 'default', + width: 12 * opts.pixelRatio, + gap:2 * opts.pixelRatio + }, opts.extra.arcbar); + + series = getArcbarDataPoints(series, arcbarOption, process); + + var centerPosition; + if(arcbarOption.center){ + centerPosition=arcbarOption.center; + }else{ + centerPosition= { + x: opts.width / 2, + y: opts.height / 2 + }; + } + + var radius; + if(arcbarOption.radius){ + radius=arcbarOption.radius; + }else{ + radius = Math.min(centerPosition.x, centerPosition.y); + radius -= 5 * opts.pixelRatio; + radius -= arcbarOption.width / 2; + } + + for (let i = 0; i < series.length; i++) { + let eachSeries = series[i]; + //背景颜色 + context.setLineWidth(arcbarOption.width); + context.setStrokeStyle(arcbarOption.backgroundColor || '#E9E9E9'); + context.setLineCap('round'); + context.beginPath(); + if (arcbarOption.type == 'default') { + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle * Math.PI, false); + } else { + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, 0, 2 * Math.PI, false); + } + context.stroke(); + //进度条 + context.setLineWidth(arcbarOption.width); + context.setStrokeStyle(eachSeries.color); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, eachSeries._proportion_ * Math.PI, false); + context.stroke(); + } + + drawRingTitle(opts, config, context, centerPosition); + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawGaugeDataPoints(categories, series, opts, config, context) { + var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1; + var gaugeOption = assign({}, { + type:'default', + startAngle: 0.75, + endAngle: 0.25, + width: 15, + splitLine: { + fixRadius: 0, + splitNumber: 10, + width: 15, + color: '#FFFFFF', + childNumber: 5, + childWidth: 5 + }, + pointer: { + width: 15, + color: 'auto' + } + }, opts.extra.gauge); + + if (gaugeOption.oldAngle == undefined) { + gaugeOption.oldAngle = gaugeOption.startAngle; + } + if (gaugeOption.oldData == undefined) { + gaugeOption.oldData = 0; + } + categories = getGaugeAxisPoints(categories, gaugeOption.startAngle, gaugeOption.endAngle); + + var centerPosition = { + x: opts.width / 2, + y: opts.height / 2 + }; + var radius = Math.min(centerPosition.x, centerPosition.y); + radius -= 5 * opts.pixelRatio; + radius -= gaugeOption.width / 2; + var innerRadius = radius - gaugeOption.width; + var totalAngle=0; + + //判断仪表盘的样式:default百度样式,progress新样式 + if(gaugeOption.type == 'progress'){ + + //## 第一步画中心圆形背景和进度条背景 + //中心圆形背景 + var pieRadius = radius - gaugeOption.width*3; + context.beginPath(); + let gradient = context.createLinearGradient(centerPosition.x, centerPosition.y-pieRadius, centerPosition.x , centerPosition.y+pieRadius); + //配置渐变填充(起点:中心点向上减半径;结束点中心点向下加半径) + gradient.addColorStop('0', hexToRgb(series[0].color, 0.3)); + gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1)); + context.setFillStyle(gradient); + context.arc(centerPosition.x, centerPosition.y, pieRadius, 0, 2*Math.PI, false); + context.fill(); + //画进度条背景 + context.setLineWidth(gaugeOption.width); + context.setStrokeStyle(hexToRgb(series[0].color, 0.3)); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, gaugeOption.endAngle *Math.PI, false); + context.stroke(); + + //## 第二步画刻度线 + totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber; + let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber; + let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius; + let endX = -radius - gaugeOption.width - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + let len = gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; + let proc = series[0].data * process; + for (let i = 0; i < len; i++) { + context.beginPath(); + //刻度线随进度变色 + if(proc>(i/len)){ + context.setStrokeStyle(hexToRgb(series[0].color, 1)); + }else{ + context.setStrokeStyle(hexToRgb(series[0].color, 0.3)); + } + context.setLineWidth(3 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(endX, 0); + context.stroke(); + context.rotate(childAngle * Math.PI); + } + context.restore(); + + //## 第三步画进度条 + series = getArcbarDataPoints(series, gaugeOption, process); + context.setLineWidth(gaugeOption.width); + context.setStrokeStyle(series[0].color); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, series[0]._proportion_ *Math.PI, false); + context.stroke(); + + //## 第四步画指针 + let pointerRadius = radius - gaugeOption.width*2.5; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((series[0]._proportion_ - 1) * Math.PI); + context.beginPath(); + context.setLineWidth(gaugeOption.width/3); + let gradient3 = context.createLinearGradient(0, -pointerRadius*0.6, 0 , pointerRadius*0.6); + gradient3.addColorStop('0', hexToRgb('#FFFFFF', 0)); + gradient3.addColorStop('0.5', hexToRgb(series[0].color, 1)); + gradient3.addColorStop('1.0', hexToRgb('#FFFFFF', 0)); + context.setStrokeStyle(gradient3); + context.arc(0, 0, pointerRadius , 0.85* Math.PI, 1.15 * Math.PI, false); + context.stroke(); + context.beginPath(); + context.setLineWidth(1); + context.setStrokeStyle(series[0].color); + context.setFillStyle(series[0].color); + context.moveTo(-pointerRadius-gaugeOption.width/3/2,-4); + context.lineTo(-pointerRadius-gaugeOption.width/3/2-4,0); + context.lineTo(-pointerRadius-gaugeOption.width/3/2,4); + context.lineTo(-pointerRadius-gaugeOption.width/3/2,-4); + context.stroke(); + context.fill(); + context.restore(); + + //default百度样式 + }else{ + //画背景 + context.setLineWidth(gaugeOption.width); + context.setLineCap('butt'); + for (let i = 0; i < categories.length; i++) { + let eachCategories = categories[i]; + context.beginPath(); + context.setStrokeStyle(eachCategories.color); + context.arc(centerPosition.x, centerPosition.y, radius, eachCategories._startAngle_ * Math.PI, eachCategories._endAngle_ *Math.PI, false); + context.stroke(); + } + context.save(); + + //画刻度线 + totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber; + let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber; + let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius; + let endX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width; + let childendX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.childWidth; + + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + + for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) { + context.beginPath(); + context.setStrokeStyle(gaugeOption.splitLine.color); + context.setLineWidth(2 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(endX, 0); + context.stroke(); + context.rotate(splitAngle * Math.PI); + } + context.restore(); + + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + + for (let i = 0; i < gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; i++) { + context.beginPath(); + context.setStrokeStyle(gaugeOption.splitLine.color); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(childendX, 0); + context.stroke(); + context.rotate(childAngle * Math.PI); + } + context.restore(); + + //画指针 + series = getGaugeDataPoints(series, categories, gaugeOption, process); + + for (let i = 0; i < series.length; i++) { + let eachSeries = series[i]; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((eachSeries._proportion_ - 1) * Math.PI); + context.beginPath(); + context.setFillStyle(eachSeries.color); + context.moveTo(gaugeOption.pointer.width, 0); + context.lineTo(0, -gaugeOption.pointer.width / 2); + context.lineTo(-innerRadius, 0); + context.lineTo(0, gaugeOption.pointer.width / 2); + context.lineTo(gaugeOption.pointer.width, 0); + context.closePath(); + context.fill(); + context.beginPath(); + context.setFillStyle('#FFFFFF'); + context.arc(0, 0, gaugeOption.pointer.width / 6, 0, 2 * Math.PI, false); + context.fill(); + context.restore(); + } + + if (opts.dataLabel !== false) { + drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context); + } + } + + //画仪表盘标题,副标题 + drawRingTitle(opts, config, context, centerPosition); + + if (process === 1 && opts.type === 'gauge') { + opts.extra.gauge.oldAngle = series[0]._proportion_; + opts.extra.gauge.oldData = series[0].data; + } + return { + center: centerPosition, + radius: radius, + innerRadius: innerRadius, + categories: categories, + totalAngle: totalAngle + }; +} + +function drawRadarDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var radarOption = assign({},{ + gridColor: '#cccccc', + labelColor: '#666666', + opacity: 0.2, + gridCount:3 + },opts.extra.radar); + + var coordinateAngle = getRadarCoordinateSeries(opts.categories.length); + + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + + var radius = Math.min(centerPosition.x - (getMaxTextListLength(opts.categories) + config.radarLabelTextMargin), + centerPosition.y - config.radarLabelTextMargin); + //TODO逻辑不对 + radius -= opts.padding[1]; + + // draw grid + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(radarOption.gridColor); + coordinateAngle.forEach(function(angle) { + var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition); + context.moveTo(centerPosition.x, centerPosition.y); + context.lineTo(pos.x, pos.y); + }); + context.stroke(); + context.closePath(); + // draw split line grid + + var _loop = function _loop(i) { + var startPos = {}; + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(radarOption.gridColor); + coordinateAngle.forEach(function(angle, index) { + var pos = convertCoordinateOrigin(radius / radarOption.gridCount * i * Math.cos(angle), radius / radarOption.gridCount * i * Math.sin(angle), centerPosition); + if (index === 0) { + startPos = pos; + context.moveTo(pos.x, pos.y); + } else { + context.lineTo(pos.x, pos.y); + } + }); + context.lineTo(startPos.x, startPos.y); + context.stroke(); + context.closePath(); + }; + + for (var i = 1; i <= radarOption.gridCount; i++) { + _loop(i); + } + + var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process); + + radarDataPoints.forEach(function(eachSeries, seriesIndex) { + // 绘制区域数据 + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, radarOption.opacity)); + eachSeries.data.forEach(function(item, index) { + if (index === 0) { + context.moveTo(item.position.x, item.position.y); + } else { + context.lineTo(item.position.x, item.position.y); + } + }); + context.closePath(); + context.fill(); + + if (opts.dataPointShape !== false) { + var points = eachSeries.data.map(function(item) { + return item.position; + }); + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + // draw label text + drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context); + + return { + center: centerPosition, + radius: radius, + angleList: coordinateAngle + }; +} + +function normalInt(min, max, iter) { + iter = iter==0?1:iter; + var arr = []; + for (var i = 0; i < iter; i++) { + arr[i] = Math.random(); + }; + return Math.floor(arr.reduce(function(i,j){return i+j})/iter*(max-min))+min; +}; + +function collisionNew(area,points,width,height){ + var isIn=false; + for(let i=0;i points[i].area[2]||area[1]>points[i].area[3]||area[2] width || area[3]>height){ + isIn=true; + break; + }else{ + isIn=false; + } + }else{ + isIn=true; + break; + } + } + } + return isIn; +}; + +function getBoundingBox(data) { + var bounds = {}, coords; + bounds.xMin = 180; + bounds.xMax = 0; + bounds.yMin = 90; + bounds.yMax = 0 + for (var i = 0; i < data.length; i++) { + var coorda = data[i].geometry.coordinates + for (var k = 0; k < coorda.length; k++) { + coords = coorda[k]; + if (coords.length == 1) { + coords = coords[0] + } + for (var j = 0; j < coords.length; j++) { + var longitude = coords[j][0]; + var latitude = coords[j][1]; + var point = { + x: longitude, + y: latitude + } + bounds.xMin = bounds.xMin < point.x ? bounds.xMin : point.x; + bounds.xMax = bounds.xMax > point.x ? bounds.xMax : point.x; + bounds.yMin = bounds.yMin < point.y ? bounds.yMin : point.y; + bounds.yMax = bounds.yMax > point.y ? bounds.yMax : point.y; + } + } + } + return bounds; +} + +function coordinateToPoint(latitude, longitude,bounds,scale,xoffset,yoffset) { + return { + x: (longitude - bounds.xMin) * scale+xoffset, + y: (bounds.yMax - latitude) * scale+yoffset + }; +} + +function pointToCoordinate(pointY, pointX,bounds,scale,xoffset,yoffset) { + return { + x: (pointX-xoffset)/scale+bounds.xMin, + y: bounds.yMax - (pointY-yoffset)/scale + }; +} + +function isRayIntersectsSegment(poi,s_poi,e_poi){ + if (s_poi[1]==e_poi[1]){return false;} + if (s_poi[1]>poi[1] && e_poi[1]>poi[1]){return false;} + if (s_poi[1] poi[1]){return false;} + if (e_poi[1]==poi[1] && s_poi[1]>poi[1]){return false;} + if (s_poi[0] 0.7) { + return true; + }else {return false}; + }; + for (let i = 0; i < points.length; i++) { + let text = points[i].name; + let tHeight = points[i].textSize; + let tWidth = measureText(text,tHeight); + let isSpin = Spin(); + let x,y,area,areav; + let breaknum=0; + while(true) { + breaknum++; + let isCollision; + if (isSpin) { + x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2; + y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2; + area=[y-5-tWidth+opts.width/2,(-x-5+opts.height/2),y+5+opts.width/2,(-x+tHeight+5+opts.height/2)]; + areav=[opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)-5,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)-5,opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)+tHeight,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)+tWidth+5]; + isCollision = collisionNew(areav,points,opts.height,opts.width); + }else{ + x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2; + y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2; + area=[x-5+opts.width/2,y-5-tHeight+opts.height/2,x+tWidth+5+opts.width/2,y+5+opts.height/2]; + isCollision = collisionNew(area,points,opts.width,opts.height); + } + if (!isCollision) break; + if (breaknum==1000){ + area=[-1000,-1000,-1000,-1000]; + break; + } + }; + if (isSpin) { + points[i].area=areav; + points[i].areav=area; + }else{ + points[i].area=area; + } + points[i].rotate=isSpin; + }; + break; + } + return points; +} + + +function drawWordCloudDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let wordOption = assign({},{ + type: 'normal', + autoColors: true + },opts.extra.word); + + context.beginPath(); + context.setFillStyle(opts.background||'#FFFFFF'); + context.rect(0,0,opts.width,opts.height); + context.fill(); + context.save(); + let points = opts.chartData.wordCloudData; + context.translate(opts.width/2,opts.height/2); + + for(let i=0;i 0){ + if (opts.tooltip) { + if (opts.tooltip.index == i) { + context.strokeText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + }else{ + context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + } + }else{ + context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + } + } + }else{ + if(points[i].area[0]>0){ + if (opts.tooltip) { + if (opts.tooltip.index == i) { + context.strokeText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + }else{ + context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + } + }else{ + context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + } + + } + } + + context.stroke(); + context.restore(); + } + context.restore(); +} + +function drawFunnelDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let funnelOption = assign({},{ + activeWidth:10, + activeOpacity:0.3, + border:false, + borderWidth:2, + borderColor:'#FFFFFF', + fillOpacity:1, + labelAlign:'right' + },opts.extra.funnel); + let eachSpacing = (opts.height - opts.area[0] - opts.area[2])/series.length; + let centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.height-opts.area[2] + }; + let activeWidth = funnelOption.activeWidth; + let radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - activeWidth, (opts.height - opts.area[0] - opts.area[2]) / 2 - activeWidth); + series = getFunnelDataPoints(series, radius, process); + context.save(); + context.translate(centerPosition.x,centerPosition.y); + for(let i=0;i 0){ + opts.area[3] += yAxisWidth[i].width + opts.yAxis.padding; + }else{ + opts.area[3] += yAxisWidth[i].width; + } + leftIndex +=1; + }else{ + if(rightIndex>0){ + opts.area[1] += yAxisWidth[i].width + opts.yAxis.padding; + }else{ + opts.area[1] += yAxisWidth[i].width; + } + rightIndex +=1; + } + } + }else{ + config.yAxisWidth = yAxisWidth; + } + opts.chartData.yAxisData = _calYAxisData; + + if (opts.categories && opts.categories.length) { + opts.chartData.xAxisData = getXAxisPoints(opts.categories, opts, config); + let _calCategoriesData = calCategoriesData(opts.categories, opts, config, opts.chartData.xAxisData.eachSpacing), + xAxisHeight = _calCategoriesData.xAxisHeight, + angle = _calCategoriesData.angle; + config.xAxisHeight = xAxisHeight; + config._xAxisTextAngle_ = angle; + opts.area[2] += xAxisHeight; + opts.chartData.categoriesData = _calCategoriesData; + }else{ + if (opts.type === 'line' || opts.type === 'area' || opts.type === 'points') { + opts.chartData.xAxisData = calXAxisData(series, opts, config); + categories=opts.chartData.xAxisData.rangesFormat; + let _calCategoriesData = calCategoriesData(categories, opts, config, opts.chartData.xAxisData.eachSpacing), + xAxisHeight = _calCategoriesData.xAxisHeight, + angle = _calCategoriesData.angle; + config.xAxisHeight = xAxisHeight; + config._xAxisTextAngle_ = angle; + opts.area[2] += xAxisHeight; + opts.chartData.categoriesData = _calCategoriesData; + }else{ + opts.chartData.xAxisData={ + xAxisPoints: [] + }; + } + } + //计算右对齐偏移距离 + if (opts.enableScroll && opts.xAxis.scrollAlign == 'right' && opts._scrollDistance_ === undefined) { + let offsetLeft = 0, + xAxisPoints = opts.chartData.xAxisData.xAxisPoints, + startX = opts.chartData.xAxisData.startX, + endX = opts.chartData.xAxisData.endX, + eachSpacing = opts.chartData.xAxisData.eachSpacing; + let totalWidth = eachSpacing * (xAxisPoints.length - 1); + let screenWidth = endX - startX; + offsetLeft = screenWidth - totalWidth; + _this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + opts._scrollDistance_ = offsetLeft; + } + + if (type === 'pie' || type === 'ring' || type === 'rose') { + config._pieTextMaxLength_ = opts.dataLabel === false ? 0 : getPieTextMaxLength(seriesMA); + } + + switch (type) { + case 'word': + let wordOption = assign({},{ + type: 'normal', + autoColors: true + },opts.extra.word); + if(opts.updateData==true || opts.updateData==undefined){ + opts.chartData.wordCloudData=getWordCloudPoint(opts,wordOption.type); + } + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawWordCloudDataPoints(series, opts, config, context,process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'map': + context.clearRect(0, 0, opts.width, opts.height); + drawMapDataPoints(series, opts, config, context); + break; + case 'funnel': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.funnelData = drawFunnelDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'line': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawLineDataPoints = drawLineDataPoints(series, opts, config, context, process), + xAxisPoints = _drawLineDataPoints.xAxisPoints, + calPoints = _drawLineDataPoints.calPoints, + eachSpacing = _drawLineDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'mix': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawMixDataPoints = drawMixDataPoints(series, opts, config, context, process), + xAxisPoints = _drawMixDataPoints.xAxisPoints, + calPoints = _drawMixDataPoints.calPoints, + eachSpacing = _drawMixDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'column': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawColumnDataPoints = drawColumnDataPoints(series, opts, config, context, process), + xAxisPoints = _drawColumnDataPoints.xAxisPoints, + calPoints = _drawColumnDataPoints.calPoints, + eachSpacing = _drawColumnDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'area': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawAreaDataPoints = drawAreaDataPoints(series, opts, config, context, process), + xAxisPoints = _drawAreaDataPoints.xAxisPoints, + calPoints = _drawAreaDataPoints.calPoints, + eachSpacing = _drawAreaDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'ring': + case 'pie': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.pieData = drawPieDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'rose': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.pieData = drawRoseDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'radar': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.radarData = drawRadarDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'arcbar': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.arcbarData = drawArcbarDataPoints(series, opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'gauge': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.gaugeData = drawGaugeDataPoints(categories, series, opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'candle': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawCandleDataPoints = drawCandleDataPoints(series, seriesMA, opts, config, context, process), + xAxisPoints = _drawCandleDataPoints.xAxisPoints, + calPoints = _drawCandleDataPoints.calPoints, + eachSpacing = _drawCandleDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + if (seriesMA) { + drawLegend(seriesMA, opts, config, context, opts.chartData); + } else { + drawLegend(opts.series, opts, config, context, opts.chartData); + } + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + } +} + +// simple event implement + +function Event() { + this.events = {}; +} + +Event.prototype.addEventListener = function(type, listener) { + this.events[type] = this.events[type] || []; + this.events[type].push(listener); +}; + +Event.prototype.trigger = function() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var type = args[0]; + var params = args.slice(1); + if (!!this.events[type]) { + this.events[type].forEach(function(listener) { + try { + listener.apply(null, params); + } catch (e) { + console.error(e); + } + }); + } +}; + +var Charts = function Charts(opts) { + opts.pixelRatio = opts.pixelRatio ? opts.pixelRatio : 1; + opts.fontSize = opts.fontSize ? opts.fontSize * opts.pixelRatio : 13 * opts.pixelRatio; + opts.title = assign({}, opts.title); + opts.subtitle = assign({}, opts.subtitle); + opts.duration = opts.duration ? opts.duration : 1000; + opts.yAxis = assign({}, { + data:[], + showTitle:false, + disabled:false, + disableGrid:false, + splitNumber:5, + gridType: 'solid', + dashLength: 4 * opts.pixelRatio, + gridColor:'#cccccc', + padding:10, + fontColor:'#666666' + }, opts.yAxis); + opts.yAxis.dashLength *= opts.pixelRatio; + opts.yAxis.padding *= opts.pixelRatio; + opts.xAxis = assign({}, { + rotateLabel: false, + type: 'calibration', + gridType: 'solid', + dashLength: 4, + scrollAlign: 'left', + boundaryGap:'center', + axisLine:true, + axisLineColor:'#cccccc' + }, opts.xAxis); + opts.xAxis.dashLength *= opts.pixelRatio; + opts.legend = assign({}, { + show: true, + position: 'bottom', + float: 'center', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + padding: 5, + margin: 5, + itemGap: 10, + fontSize: opts.fontSize, + lineHeight: opts.fontSize, + fontColor: '#333333', + format: {}, + hiddenColor: '#CECECE' + }, opts.legend); + opts.legend.borderWidth = opts.legend.borderWidth * opts.pixelRatio; + opts.legend.itemGap = opts.legend.itemGap * opts.pixelRatio; + opts.legend.padding = opts.legend.padding * opts.pixelRatio; + opts.legend.margin = opts.legend.margin * opts.pixelRatio; + opts.extra = assign({}, opts.extra); + opts.rotate = opts.rotate ? true : false; + opts.animation = opts.animation ? true : false; + opts.rotate = opts.rotate ? true : false; + + let config$$1 = JSON.parse(JSON.stringify(config)); + config$$1.colors = opts.colors ? opts.colors : config$$1.colors; + config$$1.yAxisTitleWidth = opts.yAxis.disabled !== true && opts.yAxis.title ? config$$1.yAxisTitleWidth : 0; + if (opts.type == 'pie' || opts.type == 'ring') { + config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.pie.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio; + } + if (opts.type == 'rose') { + config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.rose.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio; + } + config$$1.pieChartTextPadding = opts.dataLabel === false ? 0 : config$$1.pieChartTextPadding * opts.pixelRatio; + config$$1.yAxisSplit = opts.yAxis.splitNumber ? opts.yAxis.splitNumber : config.yAxisSplit; + + //屏幕旋转 + config$$1.rotate = opts.rotate; + if (opts.rotate) { + let tempWidth = opts.width; + let tempHeight = opts.height; + opts.width = tempHeight; + opts.height = tempWidth; + } + + //适配高分屏 + opts.padding = opts.padding ? opts.padding : config$$1.padding; + for (let i = 0; i < 4; i++) { + opts.padding[i] *= opts.pixelRatio; + } + config$$1.yAxisWidth = config.yAxisWidth * opts.pixelRatio; + config$$1.xAxisHeight = config.xAxisHeight * opts.pixelRatio; + if (opts.enableScroll && opts.xAxis.scrollShow) { + config$$1.xAxisHeight += 6 * opts.pixelRatio; + } + config$$1.xAxisLineHeight = config.xAxisLineHeight * opts.pixelRatio; + config$$1.fontSize = opts.fontSize; + config$$1.titleFontSize = config.titleFontSize * opts.pixelRatio; + config$$1.subtitleFontSize = config.subtitleFontSize * opts.pixelRatio; + config$$1.toolTipPadding = config.toolTipPadding * opts.pixelRatio; + config$$1.toolTipLineHeight = config.toolTipLineHeight * opts.pixelRatio; + config$$1.columePadding = config.columePadding * opts.pixelRatio; + opts.$this = opts.$this ? opts.$this : this; + + this.context = uni.createCanvasContext(opts.canvasId, opts.$this); + /* 兼容原生H5 + this.context = document.getElementById(opts.canvasId).getContext("2d"); + this.context.setStrokeStyle = function(e){ return this.strokeStyle=e; } + this.context.setLineWidth = function(e){ return this.lineWidth=e; } + this.context.setLineCap = function(e){ return this.lineCap=e; } + this.context.setFontSize = function(e){ return this.font=e+"px sans-serif"; } + this.context.setFillStyle = function(e){ return this.fillStyle=e; } + this.context.draw = function(){ } + */ + + opts.chartData = {}; + this.event = new Event(); + this.scrollOption = { + currentOffset: 0, + startTouchX: 0, + distance: 0, + lastMoveTime: 0 + }; + + this.opts = opts; + this.config = config$$1; + + drawCharts.call(this, opts.type, opts, config$$1, this.context); +}; + +Charts.prototype.updateData = function() { + let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.opts = assign({}, this.opts, data); + this.opts.updateData = true; + let scrollPosition = data.scrollPosition || 'current'; + switch (scrollPosition) { + case 'current': + this.opts._scrollDistance_ = this.scrollOption.currentOffset; + break; + case 'left': + this.opts._scrollDistance_ = 0; + this.scrollOption = { + currentOffset: 0, + startTouchX: 0, + distance: 0, + lastMoveTime: 0 + }; + break; + case 'right': + let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config), + yAxisWidth = _calYAxisData.yAxisWidth; + this.config.yAxisWidth = yAxisWidth; + let offsetLeft = 0; + let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config), + xAxisPoints = _getXAxisPoints0.xAxisPoints, + startX = _getXAxisPoints0.startX, + endX = _getXAxisPoints0.endX, + eachSpacing = _getXAxisPoints0.eachSpacing; + let totalWidth = eachSpacing * (xAxisPoints.length - 1); + let screenWidth = endX - startX; + offsetLeft = screenWidth - totalWidth; + this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + this.opts._scrollDistance_ = offsetLeft; + break; + } + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); +}; + +Charts.prototype.zoom = function() { + var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.opts.xAxis.itemCount; + if (this.opts.enableScroll !== true) { + console.log('请启用滚动条后使用!') + return; + } + //当前屏幕中间点 + let centerPoint = Math.round(Math.abs(this.scrollOption.currentOffset) / this.opts.chartData.eachSpacing) + Math.round( + this.opts.xAxis.itemCount / 2); + this.opts.animation = false; + this.opts.xAxis.itemCount = val.itemCount; + //重新计算x轴偏移距离 + let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config), + yAxisWidth = _calYAxisData.yAxisWidth; + this.config.yAxisWidth = yAxisWidth; + let offsetLeft = 0; + let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config), + xAxisPoints = _getXAxisPoints0.xAxisPoints, + startX = _getXAxisPoints0.startX, + endX = _getXAxisPoints0.endX, + eachSpacing = _getXAxisPoints0.eachSpacing; + let centerLeft = eachSpacing * centerPoint; + let screenWidth = endX - startX; + let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1); + offsetLeft = screenWidth / 2 - centerLeft; + if (offsetLeft > 0) { + offsetLeft = 0; + } + if (offsetLeft < MaxLeft) { + offsetLeft = MaxLeft; + } + this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + this.opts._scrollDistance_ = offsetLeft; + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); +}; + +Charts.prototype.stopAnimation = function() { + this.animationInstance && this.animationInstance.stop(); +}; + +Charts.prototype.addEventListener = function(type, listener) { + this.event.addEventListener(type, listener); +}; + +Charts.prototype.getCurrentDataIndex = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + let _touches$ = getTouches(touches, this.opts, e); + if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose') { + return findPieChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.pieData); + } else if (this.opts.type === 'radar') { + return findRadarChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.radarData, this.opts.categories.length); + } else if (this.opts.type === 'funnel') { + return findFunnelChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.funnelData); + } else if (this.opts.type === 'map') { + return findMapChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts); + }else if (this.opts.type === 'word') { + return findWordChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.wordCloudData); + } else { + return findCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.calPoints, this.opts, this.config, Math.abs(this.scrollOption.currentOffset)); + } + } + return -1; +}; + +Charts.prototype.getLegendDataIndex = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + let _touches$ = getTouches(touches, this.opts, e); + return findLegendIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.legendData); + } + return -1; +}; + +Charts.prototype.touchLegend = function(e) { + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + var _touches$ = getTouches(touches, this.opts, e); + var index = this.getLegendDataIndex(e); + if (index >= 0) { + this.opts.series[index].show = !this.opts.series[index].show; + this.opts.animation = option.animation ? true : false; + this.opts._scrollDistance_= this.scrollOption.currentOffset; + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); + } + } + +}; + +Charts.prototype.showToolTip = function(e) { + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (!touches) { + console.log("touchError"); + } + var _touches$ = getTouches(touches, this.opts, e); + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + if (this.opts.type === 'line' || this.opts.type === 'area' || this.opts.type === 'column') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getToolTipData = getToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option), + textList = _getToolTipData.textList, + offset = _getToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'mix') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getMixToolTipData = getMixToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option), + textList = _getMixToolTipData.textList, + offset = _getMixToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'candle') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getToolTipData = getCandleToolTipData(this.opts.series[0].data, seriesData, this.opts.chartData.calPoints, + index, this.opts.categories, this.opts.extra.candle, option), + textList = _getToolTipData.textList, + offset = _getToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose'||this.opts.type === 'funnel' ) { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = this.opts._series_[index]; + var textList = [{ + text: option.format ? option.format(seriesData) : seriesData.name + ': ' + seriesData.data, + color: seriesData.color + }]; + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'map'||this.opts.type === 'word') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = this.opts._series_[index]; + var textList = [{ + text: option.format ? option.format(seriesData) : seriesData.properties.name , + color: seriesData.color + }]; + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + opts.updateData = false; + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'radar') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var textList = seriesData.map(function(item) { + return { + text: option.format ? option.format(item) : item.name + ': ' + item.data, + color: item.color + }; + }); + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } +}; + +Charts.prototype.translate = function(distance) { + this.scrollOption = { + currentOffset: distance, + startTouchX: distance, + distance: 0, + lastMoveTime: 0 + }; + let opts = assign({}, this.opts, { + _scrollDistance_: distance, + animation: false + }); + drawCharts.call(this, this.opts.type, opts, this.config, this.context); +}; + +Charts.prototype.scrollStart = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + var _touches$ = getTouches(touches, this.opts, e); + if (touches && this.opts.enableScroll === true) { + this.scrollOption.startTouchX = _touches$.x; + } +}; + +Charts.prototype.scroll = function(e) { + if (this.scrollOption.lastMoveTime === 0) { + this.scrollOption.lastMoveTime = Date.now(); + } + let Limit = this.opts.extra.touchMoveLimit || 20; + let currMoveTime = Date.now(); + let duration = currMoveTime - this.scrollOption.lastMoveTime; + if (duration < Math.floor(1000 / Limit)) return; + this.scrollOption.lastMoveTime = currMoveTime; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches && this.opts.enableScroll === true) { + var _touches$ = getTouches(touches, this.opts, e); + var _distance; + _distance = _touches$.x - this.scrollOption.startTouchX; + var currentOffset = this.scrollOption.currentOffset; + var validDistance = calValidDistance(this,currentOffset + _distance, this.opts.chartData, this.config, this.opts); + this.scrollOption.distance = _distance = validDistance - currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset + _distance, + animation: false + }); + drawCharts.call(this, opts.type, opts, this.config, this.context); + return currentOffset + _distance; + } +}; + +Charts.prototype.scrollEnd = function(e) { + if (this.opts.enableScroll === true) { + var _scrollOption = this.scrollOption, + currentOffset = _scrollOption.currentOffset, + distance = _scrollOption.distance; + this.scrollOption.currentOffset = currentOffset + distance; + this.scrollOption.distance = 0; + } +}; +if (typeof module === "object" && typeof module.exports === "object") { + module.exports = Charts; + //export default Charts;//建议使用nodejs的module导出方式,如报错请使用export方式导出 +} diff --git a/mallplusui-uniapp-app2/components/u-charts/u-charts.min.js b/mallplusui-uniapp-app2/components/u-charts/u-charts.min.js new file mode 100644 index 0000000..ba10de5 --- /dev/null +++ b/mallplusui-uniapp-app2/components/u-charts/u-charts.min.js @@ -0,0 +1 @@ +'use strict';var config={yAxisWidth:15,yAxisSplit:5,xAxisHeight:15,xAxisLineHeight:15,legendHeight:15,yAxisTitleWidth:15,padding:[10,10,10,10],pixelRatio:1,rotate:!1,columePadding:3,fontSize:13,dataPointShape:["circle","circle","circle","circle"],colors:["#1890ff","#2fc25b","#facc14","#f04864","#8543e0","#90ed7d"],pieChartLinePadding:15,pieChartTextPadding:5,xAxisTextPadding:3,titleColor:"#333333",titleFontSize:20,subtitleColor:"#999999",subtitleFontSize:15,toolTipPadding:3,toolTipBackground:"#000000",toolTipOpacity:.7,toolTipLineHeight:20,radarLabelTextMargin:15,gaugeLabelTextMargin:15};let assign=function(e,...t){function i(e,t){for(let a in t)e[a]=e[a]&&"[object Object]"===e[a].toString()?i(e[a],t[a]):e[a]=t[a];return e}if(null==e)throw new TypeError("Cannot convert undefined or null to object");return!t||0>=t.length?e:(t.forEach(t=>{e=i(e,t)}),e)};var util={toFixed:function(e,t){return t=t||2,this.isFloat(e)&&(e=e.toFixed(t)),e},isFloat:function(e){return 0!=e%1},approximatelyEqual:function(e,t){return 1e-10>Math.abs(e-t)},isSameSign:function(e,t){var i=Math.abs;return i(e)===e&&i(t)===t||i(e)!==e&&i(t)!==t},isSameXCoordinateArea:function(e,t){return this.isSameSign(e.x,t.x)},isCollision:function(e,t){e.end={},e.end.x=e.start.x+e.width,e.end.y=e.start.y-e.height,t.end={},t.end.x=t.start.x+t.width,t.end.y=t.start.y-t.height;var i=t.start.x>e.end.x||t.end.x e.start.y||t.start.y i;)i*=10,a*=10;for(e="upper"===t?Math.ceil(e*a):Math.floor(e*a);0!=e%i;)"upper"===t?e++:e--;return e/a}function calCandleMA(e,t,i,a){let o=[];for(let n,l=0;l =l-n&&(r=n-l,e.event.trigger("scrollRight")),r}function isInAngleRange(e,t,i){function a(e){for(;0>e;)e+=2*o;for(;e>2*o;)e-=2*o;return e}var o=Math.PI;return e=a(e),t=a(t),i=a(i),t>i&&(i+=2*o,e =t&&e<=i}function calRotateTranslate(e,t,i){var a=e,o=i-t,n=a+(i-o-a)/1.4142135623730951;n*=-1;return{transX:n,transY:(i-o)*(1.4142135623730951-1)-(i-o-a)/1.4142135623730951}}function createCurveControlPoints(e,t){function i(e,t){return!!(e[t-1]&&e[t+1])&&(e[t].y>=n(e[t-1].y,e[t+1].y)||e[t].y<=o(e[t-1].y,e[t+1].y))}var o=Math.min,n=Math.max,l=.2,a=.2,r=null,s=null,d=null,h=null;if(1>t?(r=e[0].x+(e[1].x-e[0].x)*l,s=e[0].y+(e[1].y-e[0].y)*l):(r=e[t].x+(e[t+1].x-e[t-1].x)*l,s=e[t].y+(e[t+1].y-e[t-1].y)*l),t>e.length-3){var x=e.length-1;d=e[x].x-(e[x].x-e[x-1].x)*a,h=e[x].y-(e[x].y-e[x-1].y)*a}else d=e[t+1].x-(e[t+2].x-e[t].x)*a,h=e[t+1].y-(e[t+2].y-e[t].y)*a;return i(e,t+1)&&(h=e[t+1].y),i(e,t)&&(s=e[t].y),(s>=n(e[t].y,e[t+1].y)||s<=o(e[t].y,e[t+1].y))&&(s=e[t].y),(h>=n(e[t].y,e[t+1].y)||h<=o(e[t].y,e[t+1].y))&&(h=e[t+1].y),{ctrA:{x:r,y:s},ctrB:{x:d,y:h}}}function convertCoordinateOrigin(e,t,i){return{x:i.x+e,y:i.y-t}}function avoidCollision(e,t){if(t)for(;util.isCollision(e,t);)0 e.start.x?e.start.y++:0 t.data[1]-t.data[0]?s[1]=r:(t.data[0] e[o-1][1]&&(s[2]=l),t.data[3] t&&(n=i)}),n}function findLegendIndex(e,t){let i=-1;if(isInExactLegendArea(e,t.area)){let a=t.points,o=-1;for(let t,n=0,l=a.length;n n[0]&&e.x n[1]&&e.y t.start.x&&e.x t.start.y&&e.y =t.area[3]-10&&e.y>=t.area[0]&&e.y<=t.height-t.area[2]}function findRadarChartCurrentIndex(e,t,i){var a=Math.PI,o=2*a/i,n=-1;if(isInExactPieChartArea(e,t.center,t.radius)){var l=function(e){return 0>e&&(e+=2*a),e>2*a&&(e-=2*a),e},r=Math.atan2(t.center.y-e.y,e.x-t.center.x);r=-1*r,0>r&&(r+=2*a);var s=t.angleList.map(function(e){return e=l(-1*e),e});s.forEach(function(e,t){var i=l(e-o/2),s=l(e+o/2);s=i&&r<=s||r+2*a>=i&&r+2*a<=s)&&(n=t)})}return n}function findFunnelChartCurrentIndex(e,t){for(var a,o=-1,n=0,l=t.series.length;n a.funnelArea[0]&&e.x a.funnelArea[1]&&e.y a.area[0]&&e.x a.area[1]&&e.y t.width-t.padding[1]-t.padding[3]?(a.push(g),p.push(n-t.legend.itemGap),n=l,g=[i]):(n+=l,g.push(i))}if(g.length){a.push(g),p.push(n-t.legend.itemGap),l.widthArr=p;let e=o.apply(null,p);switch(t.legend.float){case"left":l.area.start.x=t.padding[3],l.area.end.x=t.padding[3]+2*r;break;case"right":l.area.start.x=t.width-t.padding[1]-e-2*r,l.area.end.x=t.width-t.padding[1];break;default:l.area.start.x=(t.width-e)/2-r,l.area.end.x=(t.width+e)/2+r;}l.area.width=e+2*r,l.area.wholeWidth=e+2*r,l.area.height=a.length*c+2*r,l.area.wholeHeight=a.length*c+2*r+2*s,l.points=a}}else{let i=e.length,a=t.height-t.padding[0]-t.padding[2]-2*s-2*r,o=Math.min(n(a/c),i);switch(l.area.height=o*c+2*r,l.area.wholeHeight=o*c+2*r,t.legend.float){case"top":l.area.start.y=t.padding[0]+s,l.area.end.y=t.padding[0]+s+l.area.height;break;case"bottom":l.area.start.y=t.height-t.padding[2]-s-l.area.height,l.area.end.y=t.height-t.padding[2]-s;break;default:l.area.start.y=(t.height-l.area.height)/2,l.area.end.y=(t.height+l.area.height)/2;}let p=0==i%o?i/o:n(i/o+1),g=[];for(let t,a=0;a a&&(a=e);l.widthArr.push(a),l.heightArr.push(i.length*c+2*r)}let e=0;for(let t=0;t
a&&(o.angle=45*Math.PI/180,o.xAxisHeight=2*i.xAxisTextPadding+l*Math.sin(o.angle)),o}function getXAxisTextList(e,t){var a=Math.min,o=Math.max,n=4 n&&(a.angle=45*Math.PI/180,a.xAxisHeight=2*i.xAxisTextPadding+r*Math.sin(a.angle)),!0===t.xAxis.disabled&&(a.xAxisHeight=0),a}function getRadarDataPoints(e,t,i,a,o){var n=Math.max,l=5 =a.oldData?(n._endAngle_-n._oldAngle_)*o+a.oldAngle:n._oldAngle_-(n._oldAngle_-n._endAngle_)*o,2<=n._proportion_&&(n._proportion_%=2)}return e}function getPieTextMaxLength(e){e=getPieDataPoints(e);let t=0;for(let a=0;a =e.width&&(e.width=1),e.x+=(a+.5-i/2)*e.width,e)})}function fixColumeMeterData(e,t,i,a,o,n,l){return e.map(function(e){return null===e?null:(e.width=Math.ceil((t-2*o.columePadding)/2),n.extra.column&&n.extra.column.width&&0<+n.extra.column.width&&(e.width=Math.min(e.width,+n.extra.column.width)),0s.x&&(h-=measureText(a.categories[r]||"")),n.beginPath(),n.setFontSize(o.fontSize),n.setFillStyle(l.labelColor||"#666666"),n.fillText(a.categories[r]||"",h,x+o.fontSize/2),n.closePath(),n.stroke()})}function drawPieText(e,t,a,o,i,n){var l=Math.cos,r=Math.sin,s=Math.min,d=Math.max,h=Math.PI,x=a.pieChartLinePadding,c=[],p=null,g=e.map(function(e){var t=e.format?e.format(+e._proportion_.toFixed(2)):util.toFixed(100*e._proportion_.toFixed(4))+"%";e._rose_proportion_&&(e._proportion_=e._rose_proportion_);var i=2*h-(e._start_+2*h*e._proportion_/2),a=e.color,o=e._radius_;return{arc:i,text:t,color:a,radius:o,textColor:e.textColor,textSize:e.textSize}});for(let h=0;h t?m=d(f,p.start.y):0 y&&(y-=u);let S={lineStart:{x:o,y:n},lineEnd:{x:t,y:i},start:{x:y,y:m},width:u,height:a.fontSize,text:e.text,color:e.color,textColor:e.textColor,textSize:e.textSize};p=avoidCollision(S,p),c.push(p)}for(let l=0;l e.start.x?s.x+e.width:s.x,x=0>e.start.x?s.x-5:s.x+5;o.quadraticCurveTo(r.x,r.y,d,s.y),o.moveTo(i.x,i.y),o.stroke(),o.closePath(),o.beginPath(),o.moveTo(s.x+e.width,s.y),o.arc(d,s.y,2,0,2*h),o.closePath(),o.fill(),o.beginPath(),o.setFontSize(e.textSize||a.fontSize),o.setFillStyle(e.textColor||"#666666"),o.fillText(e.text,x,s.y+3),o.closePath(),o.stroke(),o.closePath()}}function drawToolTipSplitLine(e,t,i,a){var o=t.extra.tooltip||{};o.gridType=null==o.gridType?"solid":o.gridType,o.dashLength=null==o.dashLength?4:o.dashLength;var n=t.area[0],l=t.height-t.area[2];if("dash"==o.gridType&&a.setLineDash([o.dashLength,o.dashLength]),a.setStrokeStyle(o.gridColor||"#cccccc"),a.setLineWidth(1*t.pixelRatio),a.beginPath(),a.moveTo(e,n),a.lineTo(e,l),a.stroke(),a.setLineDash([]),o.xAxisLabel){let n=t.categories[t.tooltip.index];a.setFontSize(i.fontSize);let r=measureText(n,i.fontSize),s=e-.5*r,d=l;a.beginPath(),a.setFillStyle(hexToRgb(o.labelBgColor||i.toolTipBackground,o.labelBgOpacity||i.toolTipOpacity)),a.setStrokeStyle(o.labelBgColor||i.toolTipBackground),a.setLineWidth(1*t.pixelRatio),a.rect(s-i.toolTipPadding,d,r+2*i.toolTipPadding,i.fontSize+2*i.toolTipPadding),a.closePath(),a.stroke(),a.fill(),a.beginPath(),a.setFontSize(i.fontSize),a.setFillStyle(o.labelFontColor||i.fontColor),a.fillText(n+"",s,d+i.toolTipPadding+i.fontSize),a.closePath(),a.stroke()}}function drawMarkLine(e,t,a){let o=assign({},{type:"solid",dashLength:4,data:[]},e.extra.markLine),n=e.area[3],l=e.width-e.area[1],r=calMarkLineData(o.data,e);for(let s,d=0;d i.width&&(h=!0),p+t.y>i.height&&(t.y=i.height-p),o.beginPath(),o.setFillStyle(hexToRgb(l.bgColor||a.toolTipBackground,l.bgOpacity||a.toolTipOpacity)),h?(o.moveTo(t.x,t.y+10*i.pixelRatio),o.lineTo(t.x-d,t.y+10*i.pixelRatio-5*i.pixelRatio),o.lineTo(t.x-d,t.y),o.lineTo(t.x-d-n(c),t.y),o.lineTo(t.x-d-n(c),t.y+p),o.lineTo(t.x-d,t.y+p),o.lineTo(t.x-d,t.y+10*i.pixelRatio+5*i.pixelRatio),o.lineTo(t.x,t.y+10*i.pixelRatio)):(o.moveTo(t.x,t.y+10*i.pixelRatio),o.lineTo(t.x+d,t.y+10*i.pixelRatio-5*i.pixelRatio),o.lineTo(t.x+d,t.y),o.lineTo(t.x+d+n(c),t.y),o.lineTo(t.x+d+n(c),t.y+p),o.lineTo(t.x+d,t.y+p),o.lineTo(t.x+d,t.y+10*i.pixelRatio+5*i.pixelRatio),o.lineTo(t.x,t.y+10*i.pixelRatio)),o.closePath(),o.fill(),e.forEach(function(e,i){if(null!==e.color){o.beginPath(),o.setFillStyle(e.color);var n=t.x+d+2*a.toolTipPadding,l=t.y+(a.toolTipLineHeight-a.fontSize)/2+a.toolTipLineHeight*i+a.toolTipPadding+1;h&&(n=t.x-c-d+2*a.toolTipPadding),o.fillRect(n,l,r,a.fontSize),o.closePath()}}),e.forEach(function(e,i){var n=t.x+d+2*a.toolTipPadding+r+s;h&&(n=t.x-c-d+2*a.toolTipPadding+ +r+s);var x=t.y+(a.toolTipLineHeight-a.fontSize)/2+a.toolTipLineHeight*i+a.toolTipPadding;o.beginPath(),o.setFontSize(a.fontSize),o.setFillStyle(l.fontColor),o.fillText(e.text,n,x+a.fontSize),o.closePath(),o.stroke()}))}function drawYAxisTitle(e,t,i,a){var o=i.xAxisHeight+(t.height-i.xAxisHeight-measureText(e))/2;a.save(),a.beginPath(),a.setFontSize(i.fontSize),a.setFillStyle(t.yAxis.titleFontColor||"#333333"),a.translate(0,t.height),a.rotate(-90*Math.PI/180),a.fillText(e,o,t.padding[3]+.5*i.fontSize),a.closePath(),a.stroke(),a.restore()}function drawColumnDataPoints(e,t,i,a){let o=4 h&&o h&&o h&&o h&&o p&&(o.moveTo(i.x,i.y),e=1),0p&&i.x x&&t x&&(a.moveTo(e.x,e.y),i=1),0 x&&e.x x&&(a.moveTo(e.x,e.y),i=1),0 x&&e.x x&&(a.moveTo(t.x,t.y),e=1),0x&&t.x x&&(a.moveTo(t.x,t.y),e=1),0x&&t.x h&&(a.moveTo(o.x,o.y),i=1),0 h&&o.x h&&(a.moveTo(t.x,t.y),i=1),0 h&&t.x c&&n g&&(a.moveTo(e.x,e.y),i=1),0
g&&e.x g&&(a.moveTo(e.x,e.y),i=1),0 g&&e.x g&&(a.moveTo(e.x,e.y),t=1),0 g&&e.x g&&(a.moveTo(e.x,e.y),t=1),0 g&&e.x t._scrollDistance_&&o.fillRect(0,0,l,d),!0==t.enableScroll&&o.fillRect(r,0,t.width,d),o.closePath(),o.stroke();var h=[];for(let l=0;l<=t.yAxis.splitNumber;l++)h.push(t.area[0]+n*l);let x=t.area[3],c=t.width-t.area[1];for(let n,l=0;l e/f?o.setStrokeStyle(hexToRgb(t[0].color,1)):o.setStrokeStyle(hexToRgb(t[0].color,.3)),o.setLineWidth(3*a.pixelRatio),o.moveTo(g,0),o.lineTo(y,0),o.stroke(),o.rotate(p*n);o.restore(),t=getArcbarDataPoints(t,r,l),o.setLineWidth(r.width),o.setStrokeStyle(t[0].color),o.setLineCap("round"),o.beginPath(),o.arc(s.x,s.y,h,r.startAngle*n,t[0]._proportion_*n,!1),o.stroke();let m=d-2.5*r.width;o.save(),o.translate(s.x,s.y),o.rotate((t[0]._proportion_-1)*n),o.beginPath(),o.setLineWidth(r.width/3);let S=o.createLinearGradient(0,.6*-m,0,.6*m);S.addColorStop("0",hexToRgb("#FFFFFF",0)),S.addColorStop("0.5",hexToRgb(t[0].color,1)),S.addColorStop("1.0",hexToRgb("#FFFFFF",0)),o.setStrokeStyle(S),o.arc(0,0,m,.85*n,1.15*n,!1),o.stroke(),o.beginPath(),o.setLineWidth(1),o.setStrokeStyle(t[0].color),o.setFillStyle(t[0].color),o.moveTo(-m-r.width/3/2,-4),o.lineTo(-m-r.width/3/2-4,0),o.lineTo(-m-r.width/3/2,4),o.lineTo(-m-r.width/3/2,-4),o.stroke(),o.fill(),o.restore()}else{o.setLineWidth(r.width),o.setLineCap("butt");for(let t,a=0;a t[l].area[2]||e[1]>t[l].area[3]||e[2] e[0]||0>e[1]||e[2]>a||e[3]>o){n=!0;break}else n=!1;return n}function getBoundingBox(e){var t,a={};a.xMin=180,a.xMax=0,a.yMin=90,a.yMax=0;for(var o,n=0;n h.x?a.xMax:h.x,a.yMin=a.yMin h.y?a.yMax:h.y}}}return a}function coordinateToPoint(e,t,i,a,o,n){return{x:(t-i.xMin)*a+o,y:(i.yMax-e)*a+n}}function pointToCoordinate(e,t,i,a,o,n){return{x:(t-o)/a+i.xMin,y:i.yMax-(e-n)/a}}function isRayIntersectsSegment(e,t,i){if(t[1]==i[1])return!1;if(t[1]>e[1]&&i[1]>e[1])return!1;if(t[1] e[1])return!1;if(i[1]==e[1]&&t[1]>e[1])return!1;if(t[0] (e/=.5)?.5*t(e,3):.5*(t(e-2,3)+2)},linear:function(e){return e}};function Animation(e){this.isStop=!1,e.duration="undefined"==typeof e.duration?1e3:e.duration,e.timing=e.timing||"linear";var t=function(){return"undefined"==typeof setTimeout?"undefined"==typeof requestAnimationFrame?function(e){e(null)}:requestAnimationFrame:function(e,t){setTimeout(function(){var t=+new Date;e(t)},t)}}(),i=null,a=function(o){if(null===o||!0===this.isStop)return e.onProcess&&e.onProcess(1),void(e.onAnimationFinish&&e.onAnimationFinish());if(null===i&&(i=o),o-i o;o++)t.area[o]=t.padding[o];var d=calLegendData(s,t,a,t.chartData),h=d.area.wholeHeight,x=d.area.wholeWidth;switch(t.legend.position){case"top":t.area[0]+=h;break;case"bottom":t.area[2]+=h;break;case"left":t.area[3]+=x;break;case"right":t.area[1]+=x;}let c={},p=0;if("line"===t.type||"column"===t.type||"area"===t.type||"mix"===t.type||"candle"===t.type){if(c=calYAxisData(n,t,a),p=c.yAxisWidth,t.yAxis.showTitle){let e=0;for(let o=0;o t;t++)e.padding[t]*=e.pixelRatio;t.yAxisWidth=config.yAxisWidth*e.pixelRatio,t.xAxisHeight=config.xAxisHeight*e.pixelRatio,e.enableScroll&&e.xAxis.scrollShow&&(t.xAxisHeight+=6*e.pixelRatio),t.xAxisLineHeight=config.xAxisLineHeight*e.pixelRatio,t.fontSize=e.fontSize,t.titleFontSize=config.titleFontSize*e.pixelRatio,t.subtitleFontSize=config.subtitleFontSize*e.pixelRatio,t.toolTipPadding=config.toolTipPadding*e.pixelRatio,t.toolTipLineHeight=config.toolTipLineHeight*e.pixelRatio,t.columePadding=config.columePadding*e.pixelRatio,e.$this=e.$this?e.$this:this,this.context=uni.createCanvasContext(e.canvasId,e.$this),e.chartData={},this.event=new Event,this.scrollOption={currentOffset:0,startTouchX:0,distance:0,lastMoveTime:0},this.opts=e,this.config=t,drawCharts.call(this,e.type,e,t,this.context)};Charts.prototype.updateData=function(){let e=0 + {{ text }} + + + + + diff --git a/mallplusui-uniapp-app2/components/uni-countdown/readme.md b/mallplusui-uniapp-app2/components/uni-countdown/readme.md new file mode 100644 index 0000000..b879097 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-countdown/readme.md @@ -0,0 +1,73 @@ +### CountDown 倒计时 + +倒计时组件,组件名:``uni-countdown``,代码块: uCountDown。 + +**使用方式:** + +在 ``script`` 中引用组件 + +```javascript +import uniCountdown from "@/components/uni-countdown/uni-countdown.vue" +export default { + components: {uniCountdown} +} +``` + +一般用法 + +```html ++ +``` + +不显示天数 + +```html ++ +``` + +修改颜色 + +```html ++ +``` + +实际效果参考:[https://github.com/dcloudio/uni-ui](https://github.com/dcloudio/uni-ui) + +**uniCountDown 属性说明:** + +|属性名|类型|默认值 |说明| +|---|----|---|---| +|background-color|String|#FFFFFF|背景色| +|border-color|String|#000000|边框颜色| +|color |String |#000000|文字颜色| +|splitor-color|String|#000000|割符号颜色| +|day|Number|0|天数| +|hour|Number|0|小时| +|minute|Number|0|分钟| +|second|Number|0|秒| +|show-day|Boolean|true|是否显示天数| +|show-colon|Boolean|true|是否以冒号为分隔符| + +**uniCountDown 事件说明:** + +|事件称名|说明|返回参数| +|---|----|---| +|timeup|倒计时时间到触发事件|-| diff --git a/mallplusui-uniapp-app2/components/uni-countdown/uni-countdown.vue b/mallplusui-uniapp-app2/components/uni-countdown/uni-countdown.vue new file mode 100644 index 0000000..d2ce202 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-countdown/uni-countdown.vue @@ -0,0 +1,156 @@ + ++ + + + diff --git a/mallplusui-uniapp-app2/components/uni-grid-item/uni-grid-item.vue b/mallplusui-uniapp-app2/components/uni-grid-item/uni-grid-item.vue new file mode 100644 index 0000000..a705055 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-grid-item/uni-grid-item.vue @@ -0,0 +1,239 @@ + +{{d}} +天 +{{h}} +{{showColon ? ':' : '时'}} +{{i}} +{{showColon ? ':' : '分'}} +{{s}} +秒 ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/uni-grid/uni-grid.vue b/mallplusui-uniapp-app2/components/uni-grid/uni-grid.vue new file mode 100644 index 0000000..7f7fa55 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-grid/uni-grid.vue @@ -0,0 +1,96 @@ + ++ ++ + ++ + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/components/uni-icon/readme.md b/mallplusui-uniapp-app2/components/uni-icon/readme.md new file mode 100644 index 0000000..2ae276a --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-icon/readme.md @@ -0,0 +1,127 @@ +### Icon 图标 + +用于展示 icon,组件名:``uni-icon``,代码块: uIcon。 + +**使用方式:** + +在 ``script`` 中引用组件 + +```javascript +import uniIcon from "@/components/uni-icon/uni-icon.vue" +export default { + components: {uniIcon} +} +``` + +在 ``template`` 中使用组件 + +```html ++ +``` + +实际效果参考:[https://github.com/dcloudio/uni-ui](https://github.com/dcloudio/uni-ui) + +**Icon 属性说明:** + +|属性名 |类型|默认值 |说明| +|---|----|---|---| +|type |String |-|图标图案,参考下表| +|color |String |-|图标颜色 | +|size |Number |24|图标大小| +|@click |EventHandle|-|点击 Icon 触发事件| + +**type 类型:** + + + +diff --git a/mallplusui-uniapp-app2/components/uni-icon/uni-icon.vue b/mallplusui-uniapp-app2/components/uni-icon/uni-icon.vue new file mode 100644 index 0000000..53883c4 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-icon/uni-icon.vue @@ -0,0 +1,421 @@ + ++
+- contact
+- person
+- personadd
+- contact-filled
+- person-filled
+- personadd-filled
+- phone
+- chatbubble
+- chatboxes
+- phone-filled
+- email-filled
+- chatbubble-filled
+- chatboxes-filled
+- weixin
+- pengyouquan
+- chat
+- videocam
+- camera
+- mic
+- location
+- mic-filled
+- location-filled
+- micoff
+- image
+- map
+- compose
+- trash
+- upload
+- download
+- close
+- redo
+- undo
+- refresh
+- star
+- plus
+- minus
+- circle
+- clear
+- refresh-filled
+- star-filled
+- plus-filled
+- minus-filled
+- circle-filled
+- checkbox-filled
+- closeempty
+- refreshempty
+- reload
+- starhalf
+- spinner
+- spinner-cycle
+- search
+- plusempty
+- forward
+- back
+- checkmarkempty
+- home
+- navigate
+- gear
+- paperplane
+- info
+- help
+- locked
+- more
+- flag
+- home-filled
+- gear-filled
+- info-filled
+- help-filled
+- more-filled
+- settings
+- list
+- bars
+- loop
+- paperclip
+- eye
+- arrowup
+- arrowdown
+- arrowleft
+- arrowright
+- arrowthinup
+- arrowthindown
+- arrowthinleft
+- arrowthinright
+- pulldown
+- scan
++ + + + + diff --git a/mallplusui-uniapp-app2/components/uni-load-more/uni-load-more.vue b/mallplusui-uniapp-app2/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..6c43365 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,194 @@ + + + + + + + + \ No newline at end of file diff --git a/mallplusui-uniapp-app2/components/uni-number-box.vue b/mallplusui-uniapp-app2/components/uni-number-box.vue new file mode 100644 index 0000000..8f626ac --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-number-box.vue @@ -0,0 +1,199 @@ + ++ ++ ++ + + + + ++ + + + + ++ + + + {{status === 'more' ? contentText.contentdown : (status === 'loading' ? contentText.contentrefresh : contentText.contentnomore)}} ++ + + + diff --git a/mallplusui-uniapp-app2/components/uni-rate/readme.md b/mallplusui-uniapp-app2/components/uni-rate/readme.md new file mode 100644 index 0000000..e0138b3 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-rate/readme.md @@ -0,0 +1,59 @@ +### Rate 评分 + +评分组件,组件名:``uni-rate``,代码块: uRate。 + +**使用方式:** + +在 ``script`` 中引用组件 + +```javascript +import uniRate from "@/components/uni-rate/uni-rate.vue" +export default { + components: {uniRate} +} +``` + +基本用法 + +```html ++ + ++ + ++ +``` + +自定义星星大小 + +```html + +``` + +设置评分数 + +```html + +``` + +不可点击状态 + +```html + +``` + +实际效果参考:[https://github.com/dcloudio/uni-ui](https://github.com/dcloudio/uni-ui) + +**属性说明:** + +|属性名|类型|默认值 |说明| +|---|----|---|---| +|value|Number|0|当前评分| +|max|Number|5|最大的评分| +|size|Number|24|星星的大小| +|margin|Number|0|星星的间距| +|color|String|#ececec|星星的颜色| +|active-color|String|#ffca3e|选中状态的星星的颜色| +|is-fill|Boolean|true|星星的类型,是否为实心类型| +|disabled|Boolean|false|是否为不可点击状态| + +**事件说明:** + +|事件称名|说明|返回参数| +|---|----|---| +|change|Rate 的 value 改变时触发事件,返回参数为Rate的value|{value:Number}| diff --git a/mallplusui-uniapp-app2/components/uni-rate/uni-rate.vue b/mallplusui-uniapp-app2/components/uni-rate/uni-rate.vue new file mode 100644 index 0000000..5a12b63 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-rate/uni-rate.vue @@ -0,0 +1,125 @@ + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/uni-section/uni-section.vue b/mallplusui-uniapp-app2/components/uni-section/uni-section.vue new file mode 100644 index 0000000..7591bd1 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-section/uni-section.vue @@ -0,0 +1,135 @@ + ++ ++ + ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/uni-tag/uni-tag.vue b/mallplusui-uniapp-app2/components/uni-tag/uni-tag.vue new file mode 100644 index 0000000..a9e7087 --- /dev/null +++ b/mallplusui-uniapp-app2/components/uni-tag/uni-tag.vue @@ -0,0 +1,230 @@ + ++ ++ + +{{ title }} +{{ subTitle }} ++ + + + + + + diff --git a/mallplusui-uniapp-app2/components/upload-images.vue b/mallplusui-uniapp-app2/components/upload-images.vue new file mode 100644 index 0000000..71bb4a3 --- /dev/null +++ b/mallplusui-uniapp-app2/components/upload-images.vue @@ -0,0 +1,226 @@ + +{{ text }} ++ + + + + + diff --git a/mallplusui-uniapp-app2/components/xiujun-evaluate/Readme.md b/mallplusui-uniapp-app2/components/xiujun-evaluate/Readme.md new file mode 100644 index 0000000..cb5f559 --- /dev/null +++ b/mallplusui-uniapp-app2/components/xiujun-evaluate/Readme.md @@ -0,0 +1,40 @@ +### 评价 列表 + +评价列表组件,组件名:``uni-evaluate``,可预览图片 + +**使用方式:** + +下载组件,在 ``script`` 中引用组件 + +```javascript +import uniEvaluate from '../../components/xiujun-evaluate/uni-evaluate.vue'; +export default { + components: {uniEvaluate} +} +``` + +用法 + +```html ++ ++ ++ + +{{item.progress}}% ++ +``` + +**组件属性说明:** + +|属性名|类型|默认值 |说明| +|---|----|---|---| +|listData|Array|-|评价列表数据| +|rate|Number|-|总评分| +|isShowTotal|Boolean|true|是否显示总评价数量| +|isShowIcon|Boolean|true|是否显示评价头图标| + +**listData属性说明:** + +|属性名|类型|默认值|说明| +|---|----|---|---| +|header_img|String|-|用户头像| +|user_name|String| - |用户名| +|rate|Number|-|评分| +|create_time|String|-|发表评论时间| +|content|String|-|评价内容文本| +|imgs|Array|-|评价内容图片格式['图片地址1','图片地址2']| diff --git a/mallplusui-uniapp-app2/components/xiujun-evaluate/iconfont.css b/mallplusui-uniapp-app2/components/xiujun-evaluate/iconfont.css new file mode 100644 index 0000000..c373fd4 --- /dev/null +++ b/mallplusui-uniapp-app2/components/xiujun-evaluate/iconfont.css @@ -0,0 +1,26 @@ +@font-face { + font-family: 'iconfont'; /* project id 1237225 */ + src: url('https://at.alicdn.com/t/font_1237225_y90nldmnpij.eot'); + src: url('https://at.alicdn.com/t/font_1237225_y90nldmnpij.eot?#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_1237225_y90nldmnpij.woff2') format('woff2'), + url('https://at.alicdn.com/t/font_1237225_y90nldmnpij.woff') format('woff'), + url('https://at.alicdn.com/t/font_1237225_y90nldmnpij.ttf') format('truetype'), + url('https://at.alicdn.com/t/font_1237225_y90nldmnpij.svg#iconfont') format('svg'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-pingjia-copy:before { + content: "\e640"; +} + +.icon-xingxing:before { + content: "\e870"; +} + diff --git a/mallplusui-uniapp-app2/components/xiujun-evaluate/list.js b/mallplusui-uniapp-app2/components/xiujun-evaluate/list.js new file mode 100644 index 0000000..584e604 --- /dev/null +++ b/mallplusui-uniapp-app2/components/xiujun-evaluate/list.js @@ -0,0 +1,62 @@ +//测试数据 +const listData = [{ + header_img: "http://cs.zhangkaixing.com/face/face_2.jpg", + user_name: "测试1", + rate:5, + create_time: "2019-04-12", + content: "好评", + imgs:[ + '/com/face/face.jpg', + 'http://cs.zhangkaixing.com/face/p10.jpg', + 'http://cs.zhangkaixing.com/face/face_14.jpg', + 'http://cs.zhangkaixing.com/face/face.jpg', + 'http://cs.zhangkaixing.com/face/p10.jpg', + ] +}, +{ + content: "中评", + create_time: "2019-04-12", + header_img: "http://cs.zhangkaixing.com/face/face_12.jpg", + user_name: "测试2", + rate:4, + // imgs:[] +}, +{ + content: "", + create_time: "2019-04-12", + header_img: "http://cs.zhangkaixing.com/face/face_15.jpg", + user_name: "测试3", + rate:2, + // imgs:[] +},{ + content: "好评", + create_time: "2019-04-12", + header_img: "http://cs.zhangkaixing.com/face/face_2.jpg", + user_name: "测试1", + rate:5, + imgs:[ + 'http://cs.zhangkaixing.com/face/face.jpg', + 'http://cs.zhangkaixing.com/face/p10.jpg', + 'http://cs.zhangkaixing.com/face/face_14.jpg', + 'http://cs.zhangkaixing.com/face/face.jpg', + 'http://cs.zhangkaixing.com/face/p10.jpg', + ] +}, +{ + content: "中评", + create_time: "2019-04-12", + header_img: "http://cs.zhangkaixing.com/face/face_12.jpg", + user_name: "测试2", + rate:3.5, + // imgs:[] +}, +{ + content: "", + create_time: "2019-04-12", + header_img: "http://cs.zhangkaixing.com/face/face_15.jpg", + user_name: "测试3", + rate:2.3, + // imgs:[] +}] + +export default listData \ No newline at end of file diff --git a/mallplusui-uniapp-app2/components/xiujun-evaluate/uni-evaluate.vue b/mallplusui-uniapp-app2/components/xiujun-evaluate/uni-evaluate.vue new file mode 100644 index 0000000..fe778e3 --- /dev/null +++ b/mallplusui-uniapp-app2/components/xiujun-evaluate/uni-evaluate.vue @@ -0,0 +1,236 @@ + + + + + + + + diff --git a/mallplusui-uniapp-app2/components/zhouWei-navBar/index.vue b/mallplusui-uniapp-app2/components/zhouWei-navBar/index.vue new file mode 100644 index 0000000..c5a2638 --- /dev/null +++ b/mallplusui-uniapp-app2/components/zhouWei-navBar/index.vue @@ -0,0 +1,430 @@ + ++ + ++ + +评价 ({{ listData.length }}) ++ ++ ++ ++ ++ + ++ ++ {{ rate }}{{ (rate * 10) % 10 == 0 ? '.0' : '' }} ++ ++ ++ ++ + ++ +{{ item.user_name }} +{{ item.create_time }} ++ ++ ++ ++ + ++ ++ + +{{ item.content || '用户暂未评价' }} ++ ++ ++ 暂无评论 ++ + + + diff --git a/mallplusui-uniapp-app2/components/zhouWei-navBar/zhouWei-navBar.md b/mallplusui-uniapp-app2/components/zhouWei-navBar/zhouWei-navBar.md new file mode 100644 index 0000000..68f5886 --- /dev/null +++ b/mallplusui-uniapp-app2/components/zhouWei-navBar/zhouWei-navBar.md @@ -0,0 +1,132 @@ +# zhouWei-navBar 适用于 uni-app 项目的头部导航组件 + +导航栏组件,主要用于头部导航,组件名:zhouWei-navBar + +本组件目前兼容微信小程序、H5、5+APP。其他平台没试过 + +本组件支持模式: +1. 普通固定顶部导航 +2. 透明导航 +3. 透明固定顶部导航 +4. 不固定普通导航 +5. 颜色渐变导航 + +本组件内置特殊功能: +1. fontColor字体颜色为白色的时候手机状态栏会自动显示白色,否则显示灰色 +2. 页面为第一个页面时左上角自动显示返回主页的图标(具体看组件:zhouWei-navBar/index.vue =>页面script) + +### 本组件全局配置(位置:zhouWei-navBar/index.vue =>页面script) +1. 主页页面的页面路径 +2. 首页页面路径 + +``` +// 主页页面的页面路径 +// 关联功能:打开的页面只有一个的时候右上角自动显示返回首页按钮,下面这个数组是排除显示返回首页的页面。 +// 主页使用场景:小程序分享出去的页面,用户点击开是分享页面,很多情况下是没有返回首页按钮的 +const mainPagePath = ["pages/navList"]; +//返回首页的地址 +const homePath = "/pages/navList"; +``` + +### 在main.js引入组件,并注册全局组件 +``` +import zhouWeiNavBar from "@/components/zhouWei-navBar"; +Vue.component("nav-bar", zhouWeiNavBar); +``` + +### 或者在页面script中引入组件,并注册组件 +``` +import navBar from "@/components/zhouWei-navBar"; +export default { + components: {navBar} +} +``` + +### 案例一 +默认特性:左上角有返回箭头,nav-bar导航固定在顶部、标题居中 +``` ++ ++ ++ ++ ++ + + + +{{ navTitle }} ++ + ++ ++ ++ ++ + + + +{{ navTitle }} ++ + 我的 +``` + +### 案例二 +特性:无返回箭头、字体色为白色、标题左对齐、nav-bar导航透明并不固定在顶部、右边插槽有按钮 +``` ++ +``` + +### 案例三:颜色渐变导航 +特性:颜色渐变导航 +``` +设置 ++``` + +### 案例四:颜色渐变导航 +特性:颜色渐变导航 +``` + + +bgColorList:[ + {color:"#f37402",scale:"0%"}, + {color:"#0f0",scale:"20%"}, + {color:"#f00",scale:"80%"}, + {color:"#00f",scale:"100%"} +] +``` + +### 案例五:滑动透明导航 +特性:有返回箭头、nav-bar导航透明并固定在顶部、透明状态字体为白色、页面想下滑动nav-bar导航条逐渐变白色、右边插槽有按钮 +``` + + +``` + +### 案例六:搜索框|地区选择 +特性:无返回箭头、nav-bar导航固定在顶部、地区选择、搜索框 +``` +预览 //透明状态下的按钮 +预览 //不状态下的按钮 ++ +``` + +### 属性 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ------------- | ---------------------------------------------------| +| backState | String | 1000 | 返回上一页面按钮,1000 显示返回按钮,2000 不显示返回按钮,3000自定义返回按钮方法,点击返回箭头后会发送一个backClick事件| +| home | Boolean | true | 返回首页按钮(首页地址在源文件里配置) | +| bgColor | String|Array | #FFF | 导航背景颜色,值为数组的时候显示渐变颜色(只支持2个颜色渐变),bgColor="themeBgColor"的时候会调用全局class="themeBgColor"的样式| +| bgColorAngle | String|Number | 90 | 导航背景颜色渐变角度(bgColor为数组生效) | +| fontColor | String | #000 | 导航字体颜色,(当颜色为白色的时候导航状态栏和图片为白色的)| +| titleCenter | Boolean | true | 标题title居中 | +| title | String | -- | 标题title值 | +| transparentFixedFontColor | String | #000 | 导航type类型为transparentFixed时透明状态下的字体颜色 | +| type | String | fixed | 导航类型,可选:1.fixed固定导航 2.ordinary不固定导航 3.transparent透明不固定导航 4.transparentFixed透明固定导航| + +### bgColor数组值为JSON的参数 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ------------- | ---------------------------------------------------| +| color | String | -- | 渐变颜色值 | +| scale | String | -- | 渐变比例(百分比%) | + +### 插槽 +| 名称 | 描述 | +| ----------------------|-------------------------------------------------------------------| +| left | 左插槽 | +| default | 中间标题插槽(type类型为transparentFixed时插槽只会穿透到实色背景下) | +| right | 右插槽 | +| transparentFixed | 导航type类型为transparentFixed时透明状态下中间插槽 | +| transparentFixedRight | 导航type类型为transparentFixed时透明状态下右插槽 | +| transparentFixedRight | 导航type类型为transparentFixed时透明状态下右插槽 | + +### 事件(type类型为transparentFixed时可用) +| 名称 | 参数 | 描述 | +| -----------------|------------------| --------------------------| +| scroll | 滚动条到顶部距离 | 代替页面的onPageScroll函数 | +| backClick | 返回上一页按钮方法 | backState=3000时生效 | diff --git a/mallplusui-uniapp-app2/config/api.js b/mallplusui-uniapp-app2/config/api.js new file mode 100644 index 0000000..04081d4 --- /dev/null +++ b/mallplusui-uniapp-app2/config/api.js @@ -0,0 +1,408 @@ +import { + apiBaseUrl +} from './config.js'; +import mallplusCopyright from '@/components/mall-copyright/mallplusCopyright.vue'; +import Api from '@/common/api'; +import * as common from './common.js' //引入common +import * as db from './db.js' //引入common +// 需要登陆的,都写到这里,否则就是不需要登陆的接口 +const methodsToken = [ + 'user.info', + 'user.editinfo', + 'user.changeavatar', + 'user.logout', + 'user.addgoodsbrowsing', + 'user.delgoodsbrowsing', + 'user.goodsbrowsing', + 'user.goodscollection', + 'user.goodscollectionlist', + 'user.vuesaveusership', + 'user.saveusership', + 'user.getshipdetail', + 'user.setdefship', + 'user.editship', + 'user.removeship', + 'user.getusership', + 'user.pay', + 'user.orderevaluate', + 'user.getuserdefaultship', + 'user.issign', + 'user.sign', + 'user.mypoint', + 'user.userpointlog', + 'user.getbankcardlist', + 'user.getdefaultbankcard', + 'user.addbankcard', + 'user.removebankcard', + 'user.setdefaultbankcard', + 'user.getbankcardinfo', + 'user.editpwd', + 'user.forgotpwd', + 'user.recommend', + 'user.balancelist', + 'user.sharecode', + 'user.cash', + 'user.cashlist', + 'user.myinvite', + 'user.activationinvite', + 'coupon.getcoupon', + 'coupon.usercoupon', + 'cart.add', + 'cart.del', + 'cart.getlist', + 'cart.setnums', + 'cart.getnumber', + 'order.cancel', + 'order.del', + 'order.details', + 'order.confirm', + 'order.getlist', + 'order.create', + 'order.getship', + 'order.getorderlist', + 'order.getorderstatusnum', + 'order.aftersaleslist', + 'order.aftersalesinfo', + 'order.aftersalesstatus', + 'order.addaftersales', + 'order.sendreship', + 'order.iscomment', + 'payments.getinfo', + 'user.getuserpoint', + 'coupon.getcouponkey', + 'store.isclerk', + 'store.storeladinglist', + 'store.ladinginfo', + 'store.lading', + 'store.ladingdel', + 'distribution_center-api-info', + 'distribution_center-api-applydistribution', + 'distribution_center-api-setstore', + 'distribution_center-api-myorder', + 'pintuan.pintuanteam', + 'lottery-api-getLotteryConfig', + 'lottery-api-lottery', + 'lottery-api-lotteryLog' +]; + +const post = (method, data, callback) => { + uni.showLoading({ + title: '加载中' + }); + + // 判断token是否存在 + if (methodsToken.indexOf(method) >= 0) { + // 获取用户token + let userToken = db.get("userToken"); + if (!userToken) { + common.jumpToLogin(); + return false; + } else { + data.token = userToken; + } + } + + data.method = method; + + uni.request({ + url: apiBaseUrl + 'api.html', + data: data, + header: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + // 'Content-Type': 'application/x-www-form-urlencoded', //自定义请求头信息 + }, + method: 'POST', + success: (response) => { + uni.hideLoading(); + const result = response.data + if (!result.status) { + // 登录信息过期或者未登录 + if (result.data === 14007 || result.data === 14006) { + db.del("userToken"); + uni.showToast({ + title: result.msg, + icon: 'none', + duration: 1000, + complete: function() { + setTimeout(function() { + uni.hideToast(); + // #ifdef H5 || APP-PLUS + uni.navigateTo({ + url: '/pages/login/login/index1' + }) + // #endif + // #ifdef MP-WEIXIN || MP-ALIPAY + uni.navigateTo({ + url: '/pages/login/choose/index', + animationType: 'pop-in', + animationDuration: 200 + }); + // #endif + }, 1000) + } + }); + } + } + callback(result); + }, + complete: () => { + uni.hideLoading(); + }, + fail: (error) => { + uni.hideLoading(); + if (error && error.response) { + showError(error.response); + } + }, + }); + +} + +//插件post +const pluginsPost = (method, data, callback) => { + uni.showLoading({ + title: '加载中' + }); + + // 判断token是否存在 + if (methodsToken.indexOf(method) >= 0) { + // 获取用户token + let userToken = db.get("userToken"); + if (!userToken) { + common.jumpToLogin(); + return false; + } else { + data.token = userToken; + } + } + uni.request({ + url: apiBaseUrl + 'plugins/' + method + '.html', + data: data, + header: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + // 'Content-Type': 'application/x-www-form-urlencoded', //自定义请求头信息 + }, + method: 'POST', + success: (response) => { + uni.hideLoading(); + const result = response.data + if (!result.status) { + // 登录信息过期或者未登录 + if (result.data === 14007 || result.data === 14006) { + db.del("userToken"); + uni.showToast({ + title: result.msg, + icon: 'none', + duration: 1000, + complete: function() { + setTimeout(function() { + uni.hideToast(); + // #ifdef H5 || APP-PLUS + uni.navigateTo({ + url: '/pages/login/login/index1' + }) + // #endif + // #ifdef MP-WEIXIN || MP-ALIPAY + uni.navigateTo({ + url: '/pages/login/choose/index', + animationType: 'pop-in', + animationDuration: 200 + }); + // #endif + }, 1000); + } + }); + } + } + callback(result); + }, + fail: (error) => { + uni.hideLoading(); + if (error && error.response) { + showError(error.response); + } + }, + complete: () => { + setTimeout(function() { + uni.hideLoading(); + }, 250); + } + }); + +} + +const get = (url, callback) => { + uni.showLoading({ + title: '加载中' + }); + uni.request({ + url: url, + header: { + 'Accept': 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded', //自定义请求头信息 + }, + method: 'GET', + success: (response) => { + uni.hideLoading(); + callback(response.data); + }, + fail: (error) => { + uni.hideLoading(); + if (error && error.response) { + showError(error.response); + } + }, + complete: () => { + setTimeout(function() { + uni.hideLoading(); + }, 250); + } + }); +} + +const showError = error => { + let errorMsg = '' + switch (error.status) { + case 400: + errorMsg = '请求参数错误' + break + case 401: + errorMsg = '未授权,请登录' + break + case 403: + errorMsg = '跨域拒绝访问' + break + case 404: + errorMsg = `请求地址出错: ${error.config.url}` + break + case 408: + errorMsg = '请求超时' + break + case 500: + errorMsg = '服务器内部错误' + break + case 501: + errorMsg = '服务未实现' + break + case 502: + errorMsg = '网关错误' + break + case 503: + errorMsg = '服务不可用' + break + case 504: + errorMsg = '网关超时' + break + case 505: + errorMsg = 'HTTP版本不受支持' + break + default: + errorMsg = error.msg + break + } + + uni.showToast({ + title: errorMsg, + icon: 'none', + duration: 1000, + complete: function() { + setTimeout(function() { + uni.hideToast(); + }, 1000); + } + }); +} + +// 文件上传 +export const uploadFiles = (callback) => { + uni.chooseImage({ + success: (chooseImageRes) => { + uni.showLoading({ + title: '上传中...' + }); + const tempFilePaths = chooseImageRes.tempFilePaths; + const uploadTask = uni.uploadFile({ + url: Api.BASEURI +'upload', //仅为示例,非真实的接口地址 + filePath: tempFilePaths[0], + fileType: 'image', + name: 'file', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'multipart/form-data', + }, + formData: { + 'method': 'images.upload', + 'upfile': tempFilePaths[0] + }, + success: (uploadFileRes) => { + callback(JSON.parse(uploadFileRes.data)); + }, + fail: (error) => { + if (error && error.response) { + showError(error.response); + } + }, + complete: () => { + setTimeout(function() { + uni.hideLoading(); + }, 250); + } + }); + // uploadTask.onProgressUpdate((res) => { + // console.log('上传进度' + res.progress); + // console.log('已经上传的数据长度' + res.totalBytesSent); + // console.log('预期需要上传的数据总长度' + res.totalBytesExpectedToSend); + // + // // 测试条件,取消上传任务。 + // if (res.progress > 50) { + // uploadTask.abort(); + // } + // }); + } + }); +} + +// 上传图片 +export const uploadImage = (num, callback) => { + uni.chooseImage({ + count: num, + success: (res) => { + uni.showLoading({ + title: '上传中...' + }); + let tempFilePaths = res.tempFilePaths + for (var i = 0; i < tempFilePaths.length; i++) { + uni.uploadFile({ + url: apiBaseUrl + 'api.html', + filePath: tempFilePaths[i], + fileType: 'image', + name: 'file', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'multipart/form-data', + }, + formData: { + 'method': 'images.upload', + 'upfile': tempFilePaths[i] + }, + success: (uploadFileRes) => { + callback(JSON.parse(uploadFileRes.data)); + }, + fail: (error) => { + if (error && error.response) { + showError(error.response); + } + }, + complete: () => { + setTimeout(function() { + uni.hideLoading(); + }, 250); + }, + }); + } + } + }); +} + diff --git a/mallplusui-uniapp-app2/config/baseUrl.js b/mallplusui-uniapp-app2/config/baseUrl.js new file mode 100644 index 0000000..45a2dda --- /dev/null +++ b/mallplusui-uniapp-app2/config/baseUrl.js @@ -0,0 +1,51 @@ +let baseUrl = ""; +let socketUrl = ""; +if (process.env.NODE_ENV === 'development') { + // 开发环境 + // baseUrl = "http://localhost:7001/"; + // socketUrl = "ws://localhost:8001/"; + // baseUrl = "http://26077a35f5.wicp.vip:43609/"; + baseUrl = "http://www.yyundong.com:8083/"; + socketUrl = "ws://8192.168.43.195:8083/"; +} else if (process.env.NODE_ENV === 'production') { + // 生产环境 + baseUrl = "http://www.yyundong.com:8083/"; + // baseUrl = "http://192.168.43.195:8083/"; + socketUrl = "ws://192.168.43.195:8083/"; +} +const courtConfig = { + //微信公众号APPID + publicAppId: "", + //请求接口 + baseUrl: baseUrl, + //webSocket地址 + socketUrl: socketUrl, + //平台名称 + platformName: "uniApp-案例", + //项目logo + logoUrl: "https://qn.kemean.cn/upload/201906/19/3f3b4751f3ed4a97be804450c3ec4c79", + //页面分享配置 + share: { + title: 'uniApp-案例', + // #ifdef MP-WEIXIN + path: '/pages/home/home', //小程序分享路径 + // #endif + // #ifdef H5 || APP-PLUS + //公众号||APP分享 + desc: "uniApp-案例", // 分享描述 + link: "https://www.kemean.com/sameCity/18031201/index.html", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 + imgUrl: "http://qn.kemean.cn/upload/201901/28/23bedfc34597482292ecd6dc107f6342", // 分享图标 + // #endif + } +}; +//手机号验证正则表达式 +const phoneRegular = /^1\d{10}$/; +//邮箱验证正则表达式 +const mailRegular = /^\w+@\w+(\.[a-zA-Z]{2,3}){1,2}$/; +//密码验证正则表达式 +const passwordRegular = /^[a-zA-Z0-9]{4,10}$/; +export default Object.assign({ + phoneRegular, + mailRegular, + passwordRegular +}, courtConfig); diff --git a/mallplusui-uniapp-app2/config/common.js b/mallplusui-uniapp-app2/config/common.js new file mode 100644 index 0000000..751fe66 --- /dev/null +++ b/mallplusui-uniapp-app2/config/common.js @@ -0,0 +1,485 @@ +import * as db from './db.js' //引入common +import store from './../store' +//把obj对象里的值覆盖到newobj里面 +function deepCopy(newobj, obj) { + if (typeof obj != 'object') { + return obj + } + for (var attr in obj) { + var a = {} + if (newobj[attr]) { + a = newobj[attr] + } + newobj[attr] = deepCopy(a, obj[attr]) + } + return newobj +} + +//跳转到登陆页面 +function jumpToLogin(method) { + var now_time = Date.parse(new Date()) + var value = db.get('jump_to_login') + if (!value) { + value = 0 + } + if (now_time - value > 3000) { + //db.set('jump_to_login',now_time); //暂时屏蔽登录时间查询 + // 将当前页面route存vuex中 登录注册后跳转 + let pages = getCurrentPages() + let page = pages[pages.length - 1] + // 获取页面参数信息 + let pagePath = '' + // #ifdef H5 || MP-WEIXIN || APP-PLUS || APP-PLUS-NVUE + if (page.route.indexOf('pages/goods/index/index') !== -1) { + //商品详情页 + if(page.goodsId) { + pagePath = '/' + page.route + '?id=' + page.goodsId; + }else{ + pagePath = '/pages/index/index'; + } + } + if (page.route.indexOf('pages/goods/index/group') !== -1) { + //团购秒杀详情页 + if(page.goodsId && page.groupId) { + pagePath = '/' + page.route + '?id=' + page.goodsId + '&group_id' + page.groupId; + }else{ + pagePath = '/pages/index/index'; + } + } + // #endif + + // #ifdef MP-ALIPAY + if (page.__proto__.route.indexOf('pages/goods/index/index') !== -1) + { + //商品详情页 + if(page.rootVM.goodsId) { + pagePath = '/' + page.__proto__.route + '?id=' + page.rootVM.goodsId; + }else{ + pagePath = '/pages/index/index'; + } + } + if (page.__proto__.route.indexOf('pages/goods/index/group') !== -1) { + //团购秒杀详情页 + if(page.rootVM.goodsId && page.rootVM.groupId) { + pagePath = '/' + page.__proto__.route + '?id=' + page.rootVM.goodsId + '&group_id' + page.rootVM.groupId; + }else{ + pagePath = '/pages/index/index'; + } + } + // #endif + if(pagePath){ + store.commit({ + type: 'redirect', + page: pagePath + }) + } + uni.showToast({ + title: '请先登录!', + icon: 'none', + duration: 1000, + success: function(res) { + // #ifdef H5 || APP-PLUS + setTimeout(() => { + uni.hideToast(); + uni.navigateTo({ + url: '/pages/public/index1' + }) + }, 1000) + // #endif + // #ifdef MP-WEIXIN || MP-ALIPAY + setTimeout(() => { + uni.hideToast(); + uni.navigateTo({ + url: '/pages/public/choose/index', + animationType: 'pop-in', + animationDuration: 200 + }) + }, 500) + // #endif + } + }) + } +} + +//当出错的时候,显示错误信息,并且跳转 弃用 +/* function errorToBack(msg = '出错了,请重试',delta=1){ + uni.showToast({ + title: msg, + icon: 'none', + duration: 2000, + }); + if(delta > 0){ + setTimeout(function () { + uni.navigateBack({ + delta: delta + }) + }, 1000); + } +} */ +//操作成功后,的提示信息 +function successToShow(msg = '保存成功', callback = function() {}) { + uni.showToast({ + title: msg, + icon: 'success', + duration: 1000 + }) + setTimeout(function() { + callback() + }, 500) +} + +//操作失败的提示信息 +function errorToShow(msg = '操作失败', callback = function() {}) { + uni.showToast({ + title: msg, + icon: 'none', + duration: 1500 + }) + setTimeout(function() { + callback() + }, 1500) +} + +//加载显示 +function loadToShow(msg = '加载中') { + uni.showToast({ + title: msg, + icon: 'loading' + }) +} + +//加载隐藏 +function loadToHide() { + uni.hideToast() +} + +// 提示框 +function modelShow( + title = '提示', + content = '确认执行此操作吗?', + callback = () => {}, + showCancel = true, + cancelText = '取消', + confirmText = '确定' +) { + uni.showModal({ + title: title, + content: content, + showCancel: showCancel, + cancelText: cancelText, + confirmText: confirmText, + cancelText: cancelText, + success: function(res) { + if (res.confirm) { + // 用户点击确定操作 + setTimeout(() => { + callback() + }, 500) + } else if (res.cancel) { + // 用户取消操作 + } + } + }) +} + +//时间戳转时间格式 +function timeToDate(date, flag = false) { + var date = new Date(date * 1000) //如果date为13位不需要乘1000 + var Y = date.getFullYear() + '-' + var M = + (date.getMonth() + 1 < 10 + ? '0' + (date.getMonth() + 1) + : date.getMonth() + 1) + '-' + var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ' + var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':' + var m = + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':' + var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + if(flag) + { + return Y + M + D + } + else + { + return Y + M + D + h + m + s + } +} + +function time2date(micro_second) { + var time = {} + // 总秒数 + var second = Math.floor(micro_second) + // 天数 + time.day = PrefixInteger(Math.floor(second / 3600 / 24), 2) + // 小时 + time.hour = PrefixInteger(Math.floor((second / 3600) % 24), 2) + // 分钟 + time.minute = PrefixInteger(Math.floor((second / 60) % 60), 2) + // 秒 + time.second = PrefixInteger(Math.floor(second % 60), 2) + + var newtime = '' + if (time.day > 0) { + newtime = + time.day + + '天' + + time.hour + + '小时' + + time.minute + + '分' + + time.second + + '秒' + } else { + if (time.hour != 0) { + newtime = time.hour + '小时' + time.minute + '分' + time.second + '秒' + } else { + newtime = time.minute + '分' + time.second + '秒' + } + } + return newtime +} + +function timeToDateObj(micro_second) { + var time = {} + // 总秒数 + var second = Math.floor(micro_second) + // 天数 + time.day = Math.floor(second / 3600 / 24) + // 小时 + time.hour = Math.floor((second / 3600) % 24) + // 分钟 + time.minute = Math.floor((second / 60) % 60) + // 秒 + time.second = Math.floor(second % 60) + + return time + +} + +//货币格式化 +function formatMoney(number, places, symbol, thousand, decimal) { + number = number || 0 + places = !isNaN((places = Math.abs(places))) ? places : 2 + symbol = symbol !== undefined ? symbol : '¥' + thousand = thousand || ',' + decimal = decimal || '.' + var negative = number < 0 ? '-' : '', + i = parseInt((number = Math.abs(+number || 0).toFixed(places)), 10) + '', + j = (j = i.length) > 3 ? j % 3 : 0 + return ( + symbol + + negative + + (j ? i.substr(0, j) + thousand : '') + + i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand) + + (places + ? decimal + + Math.abs(number - i) + .toFixed(places) + .slice(2) + : '') + ) +} +function throttle(fn, context, delay) { + clearTimeout(fn.timeoutId) + fn.timeoutId = setTimeout(function() { + fn.call(context) + }, delay) +} + +// 时间格式化输出,如11:03 25:19 每1s都会调用一次 +function dateformat(micro_second) { + var time = {} + // 总秒数 + var second = Math.floor(micro_second / 1000) // 天数 + time.day = PrefixInteger(Math.floor(second / 3600 / 24), 2) // 小时 + time.hour = PrefixInteger(Math.floor((second / 3600) % 24), 2) // 分钟 + time.minute = PrefixInteger(Math.floor((second / 60) % 60), 2) // 秒 + time.second = PrefixInteger(Math.floor(second % 60), 2) + return time +} + +//不足位数前面补0 +function PrefixInteger(num, length) { + return (Array(length).join('0') + num).slice(-length) +} + +//验证是否是手机号 +function isPhoneNumber(str) { + var myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/ + if (!myreg.test(str)) { + return false + } else { + return true + } +} + +/** + * + * 对象参数转为url参数 + * + */ +function builderUrlParams(url, data) { + if (typeof url == 'undefined' || url == null || url == '') { + return '' + } + if (typeof data == 'undefined' || data == null || typeof data != 'object') { + return '' + } + url += url.indexOf('?') != -1 ? '' : '?' + for (var k in data) { + url += (url.indexOf('=') != -1 ? '&' : '') + k + '=' + encodeURI(data[k]) + } + return url +} + +/** + * 使用循环的方式判断一个元素是否存在于一个数组中 + * @param {Object} arr 数组 + * @param {Object} value 元素值 + */ +function isInArray(arr, value) { + for (var i = 0; i < arr.length; i++) { + if (value === arr[i]) { + return true + } + } + return false +} +/** + * 统一跳转 + */ +function navigateTo(url) { + uni.navigateTo({ + url: url, + animationType: 'pop-in', + animationDuration: 300 + }) +} + +/** + * 关闭当前页面并跳转 + */ +function redirectTo(url) { + uni.redirectTo({ + url: url, + animationType: 'pop-in', + animationDuration: 300 + }) +} + +/** + * 获取url参数 + * + * @param {*} name + * @param {*} [url=window.location.serach] + * @returns + */ +function getQueryString(name, url) { + var url = url || window.location.href + var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i') + var r = url.substr(1).match(reg) + if (r != null) { + return r[2] + } + return null +} + +/** + * + * 判断是否在微信浏览器 true是 + */ +function isWeiXinBrowser() { + // #ifdef H5 + // window.navigator.userAgent属性包含了浏览器类型、版本、操作系统类型、浏览器引擎类型等信息,这个属性可以用来判断浏览器类型 + let ua = window.navigator.userAgent.toLowerCase() + // 通过正则表达式匹配ua中是否含有MicroMessenger字符串 + if (ua.match(/MicroMessenger/i) == 'micromessenger') { + return true + } else { + return false + } + // #endif + + return false +} + +/** + * 金额相加 + * @param {Object} value1 + * @param {Object} value2 + */ +function moneySum(value1,value2){ + return (parseFloat(value1)+parseFloat(value2)).toFixed(2); +} +/** + * 金额相减 + * @param {Object} value1 + * @param {Object} value2 + */ +function moneySub(value1,value2){ + let res = (parseFloat(value1)-parseFloat(value2)).toFixed(2); + return res>0?res:0; +} + + +/** + * 分享URL解压缩 + * @param {Object} url + */ +function shareParameterEncode(url){ + let urlArray = url.split('-'); + let newUrl = 'type=' + urlArray[0] + '&invite=' + urlArray[1] + '&id=' + urlArray[2] + '&team_id=' + urlArray[3] + '&id_type=' + urlArray[4] + '&page_code=' + urlArray[5] + '&group_id=' + urlArray[6]; + return newUrl; +} + + +/** + * 分享URL压缩 + * @param {Object} url + */ +function shareParameterDecode(url){ + var urlArray = url.split('&'); + var allParameter = { + 'type': '', + 'invite': '', + 'id': '', + 'team_id': '', + 'id_type': '', + 'page_code': '', + 'group_id': '', + }; + for(var i = 0; i < urlArray.length; i++) { + var parameter = urlArray[i].split('='); + allParameter[parameter[0]] = parameter[1]; + } + var newUrl = allParameter.type + '-' + allParameter.invite + '-' + allParameter.id + '-' + allParameter.team_id + '-' + allParameter.id_type + '-' + allParameter.page_code + '-' + allParameter.group_id; + return newUrl; +} + +export { + deepCopy, + jumpToLogin, + timeToDate, + formatMoney, + /* errorToBack, */ + successToShow, + throttle, + errorToShow, + time2date, + isPhoneNumber, + isInArray, + loadToShow, + loadToHide, + navigateTo, + redirectTo, + modelShow, + builderUrlParams, + isWeiXinBrowser, + dateformat, + getQueryString, + timeToDateObj, + moneySum, + moneySub, + shareParameterEncode, + shareParameterDecode +} diff --git a/mallplusui-uniapp-app2/config/config.js b/mallplusui-uniapp-app2/config/config.js new file mode 100644 index 0000000..91b81d5 --- /dev/null +++ b/mallplusui-uniapp-app2/config/config.js @@ -0,0 +1,14 @@ +// // export const apiBaseUrl = 'http://www.b2c.com/' +// export const apiBaseUrl = 'http://192.168.43.195:8081/' +export const apiBaseUrl = 'http://www.yyundong.com:8081/' +//export const apiBaseUrl = 'https://demo.jihainet.com/' +// #ifdef H5 +export const baseUrl=process.env.NODE_ENV === 'development'?window.location.origin+'/':apiBaseUrl +// #endif +export const paymentType = { + //支付单类型 + order: 1, //订单 + recharge: 2, //充值 + form_order: 5, //表单付款码 + form_pay: 6 //表单订单 +} \ No newline at end of file diff --git a/mallplusui-uniapp-app2/config/db.js b/mallplusui-uniapp-app2/config/db.js new file mode 100644 index 0000000..4a74ea7 --- /dev/null +++ b/mallplusui-uniapp-app2/config/db.js @@ -0,0 +1,84 @@ +import * as common from './common.js' //引入common + +//取值 +function get(key,sync = true) { + try { + if(sync){ + return uni.getStorageSync(key); + }else{ + let data = ''; + uni.getStorage({ + key:key, + success: function (res) { + data = res.data; + } + }); + return data; + } + } catch (e) { + return false; + } +} + +//赋值 +function set(key, value, sync = true) { + try { + if (sync) { + return uni.setStorageSync(key, value); + } else { + uni.setStorage({ + key: key, + data: value + }); + } + } catch (e) { + + } +} + +//移除 +function del(key, sync = true){ + try { + if (sync) { + return uni.removeStorageSync(key); + } else { + uni.removeStorage({ + key: key + }); + } + } catch (e) { + return false; + } +} + +//清空 +function clear(sync = true){ + try { + if (sync) { + return uni.clearStorageSync(); + } else { + uni.clearStorage(); + } + } catch (e) { + return false; + } +} + +//获取用户token,如果缓存有,直接返回,如果没有,就先微信登陆,然后服务器登陆,最后返回token +function userToken(callback) { + var token = get('userToken'); + if (token){ + callback(token); + }else{ + //如果没有登陆,就去登陆 + common.jumpToLogin(); + } +} + +export { + get, + set, + del, + clear, + userToken +} \ No newline at end of file diff --git a/mallplusui-uniapp-app2/config/mixins.js b/mallplusui-uniapp-app2/config/mixins.js new file mode 100644 index 0000000..4f1bca0 --- /dev/null +++ b/mallplusui-uniapp-app2/config/mixins.js @@ -0,0 +1,176 @@ +export const orders = { + mounted() {}, + methods: { + // 查看订单详情 + orderDetail(orderId) { + this.$common.navigateTo( + '/pages/member/order/orderdetail?order_id=' + orderId + ) + }, + // 取消订单 + + // 去支付 + toPay(orderId) { + this.$common.navigateTo( + '/pages/order/payment/index?order_id=' + orderId + '&type=1' + ) + }, + // 确认收货 + + // 去评价 + toEvaluate(orderId) { + this.$common.navigateTo( + '/pages/member/order/evaluate?order_id=' + orderId + ) + }, + // 申请售后 + + // 查看物流信息 + showExpress(code, no, address = '') { + let params = encodeURIComponent( + 'code=' + code + '&no=' + no + '&add=' + address + ) + + this.$common.navigateTo( + '/pages/member/order/express_delivery?params=' + params + ) + } + } +} + +/** + * 商品接口信息 + * + */ +export const goods = { + mounted() {}, + methods: { + // 查看商品详情 + goodsDetail(goodsId) { + this.$common.navigateTo('/pages/goods/index/index?id=' + goodsId) + }, + // 跳转商品列表页 + goodsList(obj = {}) { + let url = '/pages/classify/index' + if (Object.keys(obj).length) { + url = this.$common.builderUrlParams(url, obj) + } + this.$common.navigateTo(url) + }, + // 团购秒杀详情 + groupDetail(id, group_id) { + this.$common.navigateTo( + '/pages/goods/index/group?id=' + id + '&group_id=' + group_id + ) + }, + //拼团详情页 + pintuanDetail(id, team_id) { + if (team_id) { + this.$common.navigateTo( + '/pages/goods/index/pintuan?id=' + id + '&team_id=' + team_id + ) + } else { + this.$common.navigateTo('/pages/goods/index/pintuan?id=' + id) + } + } + } +} + +/** + * + * 返回操作处理 + * + */ +export const goBack = { + onBackPress(options) { + if (options.from === 'navigateBack') { + return false + } + let loginPages = ['/pages/cart/index/index', '/pages/member/index/index'] + let backPage = this.$store.state.redirectPage + if (loginPages.indexOf(backPage) > -1) { + this.$store.commit({ + type: 'redirect', + page: '' + }) + uni.switchTab({ + url: '/pages/index/index' + }) + return true + } + } +} + +/* Function Info + * Author: zhf + * CreateTime: 2019/7/12 下午12:10:00 + * LastEditor: zhf + * ModifyTime: 2019/7/12 下午12:10:00 + * Description: 登录成功统一跳转处理 + */ + +export const jumpBackPage = { + methods: { + handleBack() { + let redirect = this.$store.state.redirectPage + this.$store.commit({ + type: 'redirect', + page: '' + }) + let switchTabs = ['/pages/index/index', '/pages/member/index/index'] + if (switchTabs.indexOf(redirect) > -1) { + uni.switchTab({ + url: redirect + }) + } else if (redirect) { + uni.redirectTo({ + url: redirect + }) + } else { + uni.switchTab({ + url: '/pages/index/index' + }) + } + } + } +} + +/* Function Info + * Author: zhf + * CreateTime: 2019/7/12 下午12:10:28 + * LastEditor: zhf + * ModifyTime: 2019/7/12 下午12:10:28 + * Description: 操作判断登录处理 + */ + +export const checkLogin = { + methods: { + checkIsLogin() { + uni.showToast({ + title: '请先登录!', + icon: 'none', + duration: 800, + success: function(res) { + // #ifdef H5 || APP-PLUS + setTimeout(() => { + uni.hideToast() + uni.navigateTo({ + url: '/pages/public/index1' + }) + }, 800) + // #endif + // #ifdef MP-WEIXIN || MP-ALIPAY + setTimeout(() => { + uni.hideToast() + uni.navigateTo({ + url: '/pages/public/choose/index', + animationType: 'pop-in', + animationDuration: 200 + }) + }, 500) + // #endif + } + }) + } + } +} diff --git a/mallplusui-uniapp-app2/config/requestConfig.js b/mallplusui-uniapp-app2/config/requestConfig.js new file mode 100644 index 0000000..8271668 --- /dev/null +++ b/mallplusui-uniapp-app2/config/requestConfig.js @@ -0,0 +1,211 @@ +import request from "@/plugins/request"; +import store from '@/config/store'; +import base from '@/config/baseUrl'; +// #ifdef H5 +import { + h5Login +} from '@/config/html5Utils'; +// #endif +// #ifdef MP-WEIXIN +import { + onLogin +} from '@/config/login'; +// #endif +let version_code = ''; +// #ifdef APP-PLUS +import { getCurrentNo } from '@/plugins/APPUpdate'; +setTimeout(() => { + getCurrentNo(function(res){ + console.log("版本号",res); + version_code = res.versionCode; + }); +},200); +// #endif + +//可以new多个request来支持多个域名请求 +let $http = new request({ + //接口请求地址 + baseUrl: base.baseUrl, + //服务器本地上传文件地址 + fileUrl: base.baseUrl, + //设置请求头(如果使用报错跨域问题,可能是content-type请求类型和后台那边设置的不一致) + header: { + 'Content-Type': 'application/json;charset=UTF-8', + 'project_token': base.projectToken, //项目token(可删除) + } +}); +// 添加获取七牛云token的方法 +$http.getQnToken = function(callback){ + //该地址需要开发者自行配置(每个后台的接口风格都不一样) + $http.get("api/common/v1/qn_upload").then(data => { + /* + *接口返回参数: + *visitPrefix:访问文件的域名 + *token:七牛云上传token + *folderPath:上传的文件夹 + *region: 地区 默认为:SCN + */ + callback({ + visitPrefix: data.visitPrefix, + token: data.token, + folderPath: data.folderPath + }); + }); +} +//请求开始拦截器 +$http.requestStart = function(options) { + console.log("请求开始", options); + if (options.load) { + //打开加载动画 + store.commit("setLoadingShow", true); + } + // 图片上传大小限制 + if (options.method == "FILE" && options.maxSize) { + // 文件最大字节: options.maxSize 可以在调用方法的时候加入参数 + maxSize = options.maxSize; + for (let item of options.files) { + if (item.size > maxSize) { + setTimeout(() => { + uni.showToast({ + title: "图片过大,请重新上传", + icon: "none" + }); + }, 500); + return false; + } + } + } + // #ifdef APP-PLUS + // 添加当前版本号 + if(version_code){ + options.header['version_code'] = version_code; + } + // #endif + //请求前加入token + if (store.state.userInfo.token) { + options.header['user_token'] = store.state.userInfo.token; + }; + return options; +} +//请求结束 +$http.requestEnd = function(options, resolve) { + //判断当前接口是否需要加载动画 + if (options.load) { + // 关闭加载动画 + store.commit("setLoadingShow", false); + } + if (resolve.errMsg && resolve.statusCode && resolve.statusCode > 300) { + setTimeout(() => { + uni.showToast({ + title: "网络错误,请检查一下网络", + icon: "none" + }); + }, 500); + } +} +let loginPopupNum = 0; +//所有接口数据处理(此方法需要开发者根据各自的接口返回类型修改,以下只是模板) +$http.dataFactory = function(res) { + console.log("接口请求数据", { + url: res.url, + resolve: res.response, + header: res.header, + data: res.data, + method: res.method, + }); + if (res.response.statusCode && res.response.statusCode == 200) { + let httpData = res.response.data; + + /*********以下只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/ + + //判断数据是否请求成功 + if (httpData.success || httpData.code == 200) { + // 返回正确的结果(then接受数据) + res.resolve(httpData.data); + } else if (httpData.code == "1000" || httpData.code == "1001" || httpData.code == 1100) { + // 失败重发 + // $http.request({ + // url: res.url, + // data: res.data, + // method: res.method, + // header: res.header, + // isPrompt: res.isPrompt,//(默认 true 说明:本接口抛出的错误是否提示) + // load: res.load,//(默认 true 说明:本接口是否提示加载动画) + // isFactory: res.isFactory, //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数将失去作用) + // }).then(data => { + // res.resolve(data); + // }); + store.commit("emptyUserInfo"); + // #ifdef MP-WEIXIN + onLogin(); + // #endif + // #ifdef H5 + h5Login("force"); + // #endif + // #ifdef APP-PLUS + var content = '此时此刻需要您登录喔~'; + if (httpData.code == "1000") { + content = '此时此刻需要您登录喔'; + } + if (loginPopupNum <= 0) { + loginPopupNum++; + uni.showModal({ + title: '温馨提示', + content: content, + confirmText: "去登录", + cancelText: "再逛会", + success: function(res) { + loginPopupNum--; + if (res.confirm) { + uni.navigateTo({ + url: "/pages/user/login" + }); + } + } + }); + } + // #endif + // 返回错误的结果(catch接受数据) + res.reject(res.response); + } else if (httpData.code == "1004") { + if (loginPopupNum <= 0) { + loginPopupNum++; + uni.showModal({ + title: "提示", + content: "您还未绑定手机号,请先绑定~", + confirmText: "去绑定", + cancelText: "再逛会", + success: (res) => { + loginPopupNum--; + if (res.confirm) { + uni.navigateTo({ + url: '/pages/user/bindPhone' + }); + } + } + }); + } + // 返回错误的结果(catch接受数据) + res.reject(res.response); + } else { //其他错误提示 + if (res.isPrompt) { + setTimeout(function() { + uni.showToast({ + title: httpData.info || httpData.msg, + icon: "none", + duration: 3000 + }); + }, 500); + } + // 返回错误的结果(catch接受数据) + res.reject(res.response); + } + + /*********以上只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/ + + } else { + // 返回错误的结果(catch接受数据) + res.reject(res.response); + } +}; +export default $http; diff --git a/mallplusui-uniapp-app2/config/store.js b/mallplusui-uniapp-app2/config/store.js new file mode 100644 index 0000000..e549b60 --- /dev/null +++ b/mallplusui-uniapp-app2/config/store.js @@ -0,0 +1,124 @@ +import Vue from 'vue' +import Vuex from 'vuex' +Vue.use(Vuex); +//变量 +const state = { + //用户数据 + userInfo: {}, + //webView地址 + webViewUrl: "", + loadingShow: false, + //微信场景参数 + chatScenesInfo: {}, + //登录弹窗状态 + loginPopupShow: false, + //当前位置 + currentAddress: { + areaName: "请选择", + areaId: '' + }, +}; +//缓存浏览器的数据名称 +const cacheNameList = ["userInfo"]; +let clearTime; +const mutations = { + //取出缓存数据(打开APP就取出) + setCacheData(state) { + for (let name of cacheNameList) { + // #ifndef H5 + let data = uni.getStorageSync(name); + // #endif + // #ifdef H5 + let data = sessionStorage.getItem(name) || localStorage.getItem(name); + // #endif + if (data) { + // #ifdef H5 + try { + data = JSON.parse(data); + } catch (e) { + } + // #endif + state[name] = data; + } + } + }, + //储存用户信息 + setUserInfo(state, data) { + if (data) { + state.userInfo = Object.assign(state.userInfo,data); + // #ifdef H5 + window.sessionStorage.setItem('userInfo', JSON.stringify(state.userInfo)); + // #endif + // #ifndef H5 + uni.setStorageSync('userInfo', state.userInfo); + // #endif + } + }, + // 退出APP + emptyUserInfo(state) { + state.userInfo = {}; + // #ifdef H5 + window.sessionStorage.removeItem("userInfo"); + // #endif + // #ifndef H5 + uni.removeStorageSync("userInfo"); + // #endif + }, + //WebView地址 + setWebViewUrl(state, data) { + if (data) { + state.webViewUrl = data; + // #ifdef H5 + window.sessionStorage.setItem('webViewUrl', data); + // #endif + } + }, + //数据加载状态 + setLoadingShow(state, data) { + if(state.loadingShow){ + clearTime && clearTimeout(clearTime); + clearTime = setTimeout(function(){ + state.loadingShow = data; + },300); + } else { + state.loadingShow = data; + } + }, + //微信场景参数 + setChatScenesInfo(state, data) { + if (data) { + state.chatScenesInfo = data; + } + }, + //登录弹窗状态 + setLoginPopupShow(state, data) { + state.loginPopupShow = data; + }, + //当前地址 + setCurrentAddress(state, data) { + if (data) { + state.currentAddress = Object.assign(state.currentAddress, data); + let addressInfo = { + "provinceId": state.currentAddress.provinceId, + "provinceName": state.currentAddress.provinceName, + "cityId": state.currentAddress.cityId, + "cityName": state.currentAddress.cityName, + "areaId": state.currentAddress.areaId, + "areaName": state.currentAddress.areaName, + }; + // #ifdef H5 + window.sessionStorage.setItem('currentAddress', JSON.stringify(addressInfo)); + // #endif + // #ifndef H5 + uni.setStorageSync('currentAddress', addressInfo); + // #endif + } + } +}; +//异步处理 +const actions = {}; +export default new Vuex.Store({ + state, + mutations, + actions +}); diff --git a/mallplusui-uniapp-app2/main.js b/mallplusui-uniapp-app2/main.js new file mode 100644 index 0000000..d85e0d5 --- /dev/null +++ b/mallplusui-uniapp-app2/main.js @@ -0,0 +1,62 @@ +import Vue from 'vue' +import store from './store' +import App from './App' +import * as otherApi from './config/api.js' + + +import * as Common from './config/common.js' +import * as Db from './config/db.js' +import * as Config from './config/config.js' +import Json from './Json' //测试用数据 +/** + * 因工具函数属于公司资产, 所以直接在Vue实例挂载几个常用的函数 + * 所有测试用数据均存放于根目录json.js + * + * css部分使用了App.vue下的全局样式和iconfont图标,有需要图标库的可以留言。 + * 示例使用了uni.scss下的变量, 除变量外已尽量移除特有语法,可直接替换为其他预处理器使用 + */ +const msg = (title, duration=1500, mask=false, icon='none')=>{ + //统一提示方便全局修改 + if(Boolean(title) === false){ + return; + } + uni.showToast({ + title, + duration, + mask, + icon + }); +} +const json = type=>{ + //模拟异步请求数据 + return new Promise(resolve=>{ + setTimeout(()=>{ + resolve(Json[type]); + }, 500) + }) +} + +const prePage = ()=>{ + let pages = getCurrentPages(); + let prePage = pages[pages.length - 2]; + // #ifdef H5 + return prePage; + // #endif + + return prePage.$vm; +} +Vue.prototype.$otherApi = otherApi; +Vue.prototype.$common = Common; +Vue.prototype.$db = Db; +Vue.prototype.$config = Config; +Vue.config.productionTip = false +Vue.prototype.$fire = new Vue(); +Vue.prototype.$store = store; +Vue.prototype.$api = {msg, json, prePage}; + +App.mpType = 'app' + +const app = new Vue({ + ...App +}) +app.$mount() diff --git a/mallplusui-uniapp-app2/mallplus.keystore b/mallplusui-uniapp-app2/mallplus.keystore new file mode 100644 index 0000000000000000000000000000000000000000..70098af8c54766fcad494e53b131e4e4da70f73d GIT binary patch literal 2603 zcmY+Ec{CJ^8pdasAwviegDAyVhZr+s8$(Ss_GOX@Df=GT31b;q#xBXel_h)G_feLt z8B2VnvWC>yvZU+YbMN<^d*1V$_nhZ>-uKTRoCFbP05ZZ!Eb~k(l2O;A_D%ztfq5jB zF%XGm=)~@alfbV37lAE7B(V93O*oMe6YGDk*dRcLJQC;-P6F-0VN8(!*(cATAf7y) zHhQN~zVmP~0wwWXr6;54f-nOkpvM420`<|EjbaeY(2o6dvzWkU!bq!95Uy5Jv85$k zi-PFJVm7}qAo~J#y+T9Px<%YP%$xnF`--ylo3edX深圳市 ++ ++ 搜索目的地/职位等 +` zgB4Lo&K}3Lau*#T5&n+Q^X7(2nMRY!&z-^Rn$=D;#?P4Xh %P385HtS7UK<@DJJQm*kfn8sh>T9pj<$z(?o-G$r- 5L^x4|GBxEuiSP4bFYXza2v=!H}|yUc=V}1;i*D)_JybJ;2Hd> zXU-)rZDIsO)A250dojXf7O54dD~np_pOFM%{lK%`f{^QA)TNKBRWnmtW->X^uvw5k z-i`WbJX>QAQ7w?Uh&zWF4uS-W&{KS! e0(-T=iUmU z%TzI@O_=vQ*NzT3ClODOdKPniZbGgbvj^ua&0em GMf@0v!4O0pR=ZkBaA27_VL zVb4!_2Q(~=rgmtuYLq8qH`ro}|AR=M>d4a&-mfzpexW5-f!A&ywwVZnB MJE8#+K+$tixx-}pWW9Vo}AHthtx zuc_rwr4?Ri{L3K(pQi-^64GF@q|d!|~(W^j;QA2|A=a)`!V zUDNM)Xcyy>?1{VB3hh<7MSsu`9F8x5&>#BEmW{uSeBhAU3^iL)yym*i_oOQ%a50w5 zwW#B(X0I50DF9Xe@mx=aom@6>eJ%{AGr%`ewjlea8$lM1cXxmX@g9hGwqLbYx}_s> z)c@t+wN2q*cmk1fwdU^Sc;&S@?#P?MDb~Vc#++>y4sEPzX}{r?*R%F|wPlA`Mql+S zwEW7iy8W5oDUr$%H>?YJzB$M|>6B*EA)I@c#y*=m&A-Rgem0Q4S!kdHOmP?qoM5X! zR|jr^LDwHL+>_GoV4jZ2j|G7Bpt?6M;%-xb=lv7t`k16re|2wHQLasIXvW#3Z?;xt zmRk`0Is0pi%>8r?yGHXav{0Mf8n3Z-pRsRlNzN?F)S)I7DZfkiyH#EG*q6+{EU_c6 z4L|=kDp`2sxr8|Zt^jL*%gK10$Q$4V7yYMjR-OmMW#Z^+D 5%yh!kt0$Hw0}ybs(ElXB|D!C^zbRYU=p)ZjU MXyT6<@3mSN+_FPX=m*v( zkJ4S;i>yll-PD-{Mw5Ndo*Gor?=fLWW)WU~;t`#&bXu*l(VX}@o*x#7ZU9U6wZXo z o zTl2T1_#5tKZ>TTfN4U!Uh6URMW}_b{aEgh9+m{yK*H_J;%NK{)2rgsA9Gm>k#ru2u z*l!iHNp~?*5;M#;tJrhyYIq&Fe@%2q|3hI)>=s2|=YH|(?9o+S%Bpo^;a4pSiPpyS zXkDQZ1pja&plYNhmRWqcy@6*SMg(S3GrE6WkIQoC5^m=TlhqBkqZK3T1MMW(MN#!~ zBR%P&-f=3I(o9Ow%P;r>e`R%P6_;yDXEd;hlky?ud;af? a#f>rFeUz!()*Bir>Ud@7xmwiODWB);C0AvLRlx5DoMxa^g9!@+v{A*TqgYk_ zPe4&}-4yhUqqoBOTM7fNs;{L#h4VOn;9zu9Cu%gsD6qWl`n~^ paxgYw-U0s8DkJSvWBZ*U#b7T9eqS`BrK&sItb4Ft%cNwL)~B2SvkrVyr(nz4 zPV*B;k%zOY`nI+hW#he5_#~^N-OHyufXt7{O=oIL>ZO5C{AxV2y =~ky^?Ks6I%Aeniu6G|RN?4D-j3#8D~Q(`wmcD5Lt`yrU<5|x{R{s1v$g;L literal 0 HcmV?d00001 diff --git a/mallplusui-uniapp-app2/manifest.json b/mallplusui-uniapp-app2/manifest.json new file mode 100644 index 0000000..7a98152 --- /dev/null +++ b/mallplusui-uniapp-app2/manifest.json @@ -0,0 +1,172 @@ +{ + "name" : "汇融云链2", + "appid" : "__UNI__557CCCF", + "description" : "", + "versionName" : "4.0.0.0", + "versionCode" : 4000, + "transformPx" : false, + "app-plus" : { + "usingComponents" : true, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : false, + "autoclose" : true, + "delay" : 0 + }, + "modules" : { + "OAuth" : {}, + "Payment" : {}, + "Share" : {}, + "Contacts" : {}, + "iBeacon" : {}, + "Maps" : {} + }, + "distribute" : { + "android" : { + "permissions" : [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] + }, + "ios" : { + "dSYMs" : false + }, + "sdkConfigs" : { + "oauth" : { + "weixin" : { + "appid" : "wx04b09a8148e4875c", + "appsecret" : "3526ec2107c123f59b5c1cb7ff23a252", + "UniversalLinks" : "" + }, + "qq" : { + "appid" : "101390373" + } + }, + "payment" : { + "weixin" : { + "appid" : "wx04b09a8148e4875c", + "UniversalLinks" : "", + "__platform__" : [ "android" ] + }, + "alipay" : {} + }, + "push" : {}, + "maps" : { + "amap" : { + "appkey_ios" : "8f3a475e0c7c2136efe071f94efb1cae", + "appkey_android" : "6c0a5f6f649f14b4ec575612761f867c" + } + }, + "ad" : {}, + "share" : { + "weixin" : { + "appid" : "wx04b09a8148e4875c", + "UniversalLinks" : "" + }, + "qq" : { + "appid" : "101390373" + } + } + }, + "icons" : { + "ios" : { + "iphone" : { + "app@2x" : "unpackage/res/icons/120x120.png", + "app@3x" : "unpackage/res/icons/180x180.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "notification@3x" : "unpackage/res/icons/60x60.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "settings@3x" : "unpackage/res/icons/87x87.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png", + "spotlight@3x" : "unpackage/res/icons/120x120.png" + }, + "appstore" : "unpackage/res/icons/1024x1024.png", + "ipad" : { + "app" : "unpackage/res/icons/76x76.png", + "app@2x" : "unpackage/res/icons/152x152.png", + "notification" : "unpackage/res/icons/20x20.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "proapp@2x" : "unpackage/res/icons/167x167.png", + "settings" : "unpackage/res/icons/29x29.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "spotlight" : "unpackage/res/icons/40x40.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png" + } + }, + "android" : { + "hdpi" : "unpackage/res/icons/72x72.png", + "xhdpi" : "unpackage/res/icons/96x96.png", + "xxhdpi" : "unpackage/res/icons/144x144.png", + "xxxhdpi" : "unpackage/res/icons/192x192.png" + } + }, + "splashscreen" : { + "android" : { + "hdpi" : "", + "xhdpi" : "", + "xxhdpi" : "" + } + } + } + }, + "quickapp" : {}, + "mp-weixin" : { + "usingComponents" : true, + "appid" : "wx15d4269d3210863d", + "setting" : { + "urlCheck" : false + }, + "permission" : {} + }, + "h5" : { + "title" : "宇运动商城", + "domain" : "https://www.yyundong.com:8088/h5", + "router" : { + "base" : "" + }, + "devServer" : { + "https" : false, + "port" : 8088 + }, + "sdkConfigs" : { + "maps" : { + "qqmap" : { + "key" : "RLHBZ-WMPRP-Q3JDS-V2IQA-JNRFH-EJBHL" + } + } + } + }, + "mp-qq" : { + "appid" : "1109850600" + }, + "quickapp-webview" : { + "icon" : "static/logo.png" + } +} diff --git a/mallplusui-uniapp-app2/node_modules/jweixin-module/README.md b/mallplusui-uniapp-app2/node_modules/jweixin-module/README.md new file mode 100644 index 0000000..7c91d7b --- /dev/null +++ b/mallplusui-uniapp-app2/node_modules/jweixin-module/README.md @@ -0,0 +1,30 @@ +# jweixin-module + +微信JS-SDK + +## 安装 + +### NPM + +```shell +npm install jweixin-module --save +``` + +### UMD + +```http +https://unpkg.com/jweixin-module/out/index.js +``` + +## 使用 + +```js +var jweixin = require('jweixin-module') +jweixin.ready(function(){ + // TODO +}); +``` + +## 完整API + +>[微信JS-SDK说明文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115) diff --git a/mallplusui-uniapp-app2/node_modules/jweixin-module/lib/index.js b/mallplusui-uniapp-app2/node_modules/jweixin-module/lib/index.js new file mode 100644 index 0000000..1b5014b --- /dev/null +++ b/mallplusui-uniapp-app2/node_modules/jweixin-module/lib/index.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(window,function(o,e){if(!o.jWeixin){var n,c={config:"preVerifyJSAPI",onMenuShareTimeline:"menu:share:timeline",onMenuShareAppMessage:"menu:share:appmessage",onMenuShareQQ:"menu:share:qq",onMenuShareWeibo:"menu:share:weiboApp",onMenuShareQZone:"menu:share:QZone",previewImage:"imagePreview",getLocation:"geoLocation",openProductSpecificView:"openProductViewWithPid",addCard:"batchAddCard",openCard:"batchViewCard",chooseWXPay:"getBrandWCPayRequest",openEnterpriseRedPacket:"getRecevieBizHongBaoRequest",startSearchBeacons:"startMonitoringBeacons",stopSearchBeacons:"stopMonitoringBeacons",onSearchBeacons:"onBeaconsInRange",consumeAndShareCard:"consumedShareCard",openAddress:"editAddress"},a=function(){var e={};for(var n in c)e[c[n]]=n;return e}(),i=o.document,t=i.title,r=navigator.userAgent.toLowerCase(),s=navigator.platform.toLowerCase(),d=!(!s.match("mac")&&!s.match("win")),u=-1!=r.indexOf("wxdebugger"),l=-1!=r.indexOf("micromessenger"),p=-1!=r.indexOf("android"),f=-1!=r.indexOf("iphone")||-1!=r.indexOf("ipad"),m=(n=r.match(/micromessenger\/(\d+\.\d+\.\d+)/)||r.match(/micromessenger\/(\d+\.\d+)/))?n[1]:"",g={initStartTime:L(),initEndTime:0,preVerifyStartTime:0,preVerifyEndTime:0},h={version:1,appId:"",initTime:0,preVerifyTime:0,networkType:"",isPreVerifyOk:1,systemType:f?1:p?2:-1,clientVersion:m,url:encodeURIComponent(location.href)},v={},S={_completes:[]},y={state:0,data:{}};O(function(){g.initEndTime=L()});var I=!1,_=[],w={config:function(e){B("config",v=e);var t=!1!==v.check;O(function(){if(t)M(c.config,{verifyJsApiList:C(v.jsApiList),verifyOpenTagList:C(v.openTagList)},function(){S._complete=function(e){g.preVerifyEndTime=L(),y.state=1,y.data=e},S.success=function(e){h.isPreVerifyOk=0},S.fail=function(e){S._fail?S._fail(e):y.state=-1};var t=S._completes;return t.push(function(){!function(){if(!(d||u||v.debug||m<"6.0.2"||h.systemType<0)){var i=new Image;h.appId=v.appId,h.initTime=g.initEndTime-g.initStartTime,h.preVerifyTime=g.preVerifyEndTime-g.preVerifyStartTime,w.getNetworkType({isInnerInvoke:!0,success:function(e){h.networkType=e.networkType;var n="https://open.weixin.qq.com/sdk/report?v="+h.version+"&o="+h.isPreVerifyOk+"&s="+h.systemType+"&c="+h.clientVersion+"&a="+h.appId+"&n="+h.networkType+"&i="+h.initTime+"&p="+h.preVerifyTime+"&u="+h.url;i.src=n}})}}()}),S.complete=function(e){for(var n=0,i=t.length;n 0) { + var n = e.split("?")[0], + i = e.split("?")[1]; + return n += ".html", + void 0 !== i ? n + "?" + i: n + } + } + if (!e.jWeixin) { + var h = { + config: "preVerifyJSAPI", + onMenuShareTimeline: "menu:share:timeline", + onMenuShareAppMessage: "menu:share:appmessage", + onMenuShareQQ: "menu:share:qq", + onMenuShareWeibo: "menu:share:weiboApp", + onMenuShareQZone: "menu:share:QZone", + previewImage: "imagePreview", + getLocation: "geoLocation", + openProductSpecificView: "openProductViewWithPid", + addCard: "batchAddCard", + openCard: "batchViewCard", + chooseWXPay: "getBrandWCPayRequest", + openEnterpriseRedPacket: "getRecevieBizHongBaoRequest", + startSearchBeacons: "startMonitoringBeacons", + stopSearchBeacons: "stopMonitoringBeacons", + onSearchBeacons: "onBeaconsInRange", + consumeAndShareCard: "consumedShareCard", + openAddress: "editAddress" + }, + v = function() { + var e = {}; + for (var n in h) e[h[n]] = n; + return e + } (), + S = e.document, + I = S.title, + y = navigator.userAgent.toLowerCase(), + _ = navigator.platform.toLowerCase(), + k = !(!_.match("mac") && !_.match("win")), + w = -1 != y.indexOf("wxdebugger"), + T = -1 != y.indexOf("micromessenger"), + M = -1 != y.indexOf("android"), + P = -1 != y.indexOf("iphone") || -1 != y.indexOf("ipad"), + x = function() { + var e = y.match(/micromessenger\/(\d+\.\d+\.\d+)/) || y.match(/micromessenger\/(\d+\.\d+)/); + return e ? e[1] : "" + } (), + A = { + initStartTime: p(), + initEndTime: 0, + preVerifyStartTime: 0, + preVerifyEndTime: 0 + }, + V = { + version: 1, + appId: "", + initTime: 0, + preVerifyTime: 0, + networkType: "", + isPreVerifyOk: 1, + systemType: P ? 1 : M ? 2 : -1, + clientVersion: x, + url: encodeURIComponent(location.href) + }, + C = {}, + L = { + _completes: [] + }, + B = { + state: 0, + data: {} + }; + f(function() { + A.initEndTime = p() + }); + var O = !1, + E = [], + N = { + config: function(e) { + C = e, + u("config", e); + var n = !1 !== C.check; + f(function() { + if (n) i(h.config, { + verifyJsApiList: d(C.jsApiList) + }, + function() { + L._complete = function(e) { + A.preVerifyEndTime = p(), + B.state = 1, + B.data = e + }, + L.success = function(e) { + V.isPreVerifyOk = 0 + }, + L.fail = function(e) { + L._fail ? L._fail(e) : B.state = -1 + }; + var e = L._completes; + return e.push(function() { + l() + }), + L.complete = function(n) { + for (var i = 0, + t = e.length; i < t; ++i) e[i](); + L._completes = [] + }, + L + } ()), + A.preVerifyStartTime = p(); + else { + B.state = 1; + for (var e = L._completes, + t = 0, + o = e.length; t < o; ++t) e[t](); + L._completes = [] + } + }), + m() + }, + ready: function(e) { + 0 != B.state ? e() : (L._completes.push(e), !T && C.debug && e()) + }, + error: function(e) { + x < "6.0.2" || ( - 1 == B.state ? e(B.data) : L._fail = e) + }, + checkJsApi: function(e) { + var n = function(e) { + var n = e.checkResult; + for (var i in n) { + var t = v[i]; + t && (n[t] = n[i], delete n[i]) + } + return e + }; + i("checkJsApi", { + jsApiList: d(e.jsApiList) + }, + (e._complete = function(e) { + if (M) { + var i = e.checkResult; + i && (e.checkResult = JSON.parse(i)) + } + e = n(e) + }, + e)) + }, + onMenuShareTimeline: function(e) { + t(h.onMenuShareTimeline, { + complete: function() { + i("shareTimeline", { + title: e.title || I, + desc: e.title || I, + img_url: e.imgUrl || "", + link: e.link || location.href, + type: e.type || "link", + data_url: e.dataUrl || "" + }, + e) + } + }, + e) + }, + onMenuShareAppMessage: function(e) { + t(h.onMenuShareAppMessage, { + complete: function(n) { + "favorite" === n.scene ? i("sendAppMessage", { + title: e.title || I, + desc: e.desc || "", + link: e.link || location.href, + img_url: e.imgUrl || "", + type: e.type || "link", + data_url: e.dataUrl || "" + }) : i("sendAppMessage", { + title: e.title || I, + desc: e.desc || "", + link: e.link || location.href, + img_url: e.imgUrl || "", + type: e.type || "link", + data_url: e.dataUrl || "" + }, + e) + } + }, + e) + }, + onMenuShareQQ: function(e) { + t(h.onMenuShareQQ, { + complete: function() { + i("shareQQ", { + title: e.title || I, + desc: e.desc || "", + img_url: e.imgUrl || "", + link: e.link || location.href + }, + e) + } + }, + e) + }, + onMenuShareWeibo: function(e) { + t(h.onMenuShareWeibo, { + complete: function() { + i("shareWeiboApp", { + title: e.title || I, + desc: e.desc || "", + img_url: e.imgUrl || "", + link: e.link || location.href + }, + e) + } + }, + e) + }, + onMenuShareQZone: function(e) { + t(h.onMenuShareQZone, { + complete: function() { + i("shareQZone", { + title: e.title || I, + desc: e.desc || "", + img_url: e.imgUrl || "", + link: e.link || location.href + }, + e) + } + }, + e) + }, + updateTimelineShareData: function(e) { + i("updateTimelineShareData", { + title: e.title, + link: e.link, + imgUrl: e.imgUrl + }, + e) + }, + updateAppMessageShareData: function(e) { + i("updateAppMessageShareData", { + title: e.title, + desc: e.desc, + link: e.link, + imgUrl: e.imgUrl + }, + e) + }, + startRecord: function(e) { + i("startRecord", {}, + e) + }, + stopRecord: function(e) { + i("stopRecord", {}, + e) + }, + onVoiceRecordEnd: function(e) { + t("onVoiceRecordEnd", e) + }, + playVoice: function(e) { + i("playVoice", { + localId: e.localId + }, + e) + }, + pauseVoice: function(e) { + i("pauseVoice", { + localId: e.localId + }, + e) + }, + stopVoice: function(e) { + i("stopVoice", { + localId: e.localId + }, + e) + }, + onVoicePlayEnd: function(e) { + t("onVoicePlayEnd", e) + }, + uploadVoice: function(e) { + i("uploadVoice", { + localId: e.localId, + isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1 + }, + e) + }, + downloadVoice: function(e) { + i("downloadVoice", { + serverId: e.serverId, + isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1 + }, + e) + }, + translateVoice: function(e) { + i("translateVoice", { + localId: e.localId, + isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1 + }, + e) + }, + chooseImage: function(e) { + i("chooseImage", { + scene: "1|2", + count: e.count || 9, + sizeType: e.sizeType || ["original", "compressed"], + sourceType: e.sourceType || ["album", "camera"] + }, + (e._complete = function(e) { + if (M) { + var n = e.localIds; + try { + n && (e.localIds = JSON.parse(n)) + } catch(e) {} + } + }, + e)) + }, + getLocation: function(e) {}, + previewImage: function(e) { + i(h.previewImage, { + current: e.current, + urls: e.urls + }, + e) + }, + uploadImage: function(e) { + i("uploadImage", { + localId: e.localId, + isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1 + }, + e) + }, + downloadImage: function(e) { + i("downloadImage", { + serverId: e.serverId, + isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1 + }, + e) + }, + getLocalImgData: function(e) { ! 1 === O ? (O = !0, i("getLocalImgData", { + localId: e.localId + }, + (e._complete = function(e) { + if (O = !1, E.length > 0) { + var n = E.shift(); + wx.getLocalImgData(n) + } + }, + e))) : E.push(e) + }, + getNetworkType: function(e) { + var n = function(e) { + var n = e.errMsg; + e.errMsg = "getNetworkType:ok"; + var i = e.subtype; + if (delete e.subtype, i) e.networkType = i; + else { + var t = n.indexOf(":"), + o = n.substring(t + 1); + switch (o) { + case "wifi": + case "edge": + case "wwan": + e.networkType = o; + break; + default: + e.errMsg = "getNetworkType:fail" + } + } + return e + }; + i("getNetworkType", {}, + (e._complete = function(e) { + e = n(e) + }, + e)) + }, + openLocation: function(e) { + i("openLocation", { + latitude: e.latitude, + longitude: e.longitude, + name: e.name || "", + address: e.address || "", + scale: e.scale || 28, + infoUrl: e.infoUrl || "" + }, + e) + }, + getLocation: function(e) { + e = e || {}, + i(h.getLocation, { + type: e.type || "wgs84" + }, + (e._complete = function(e) { + delete e.type + }, + e)) + }, + hideOptionMenu: function(e) { + i("hideOptionMenu", {}, + e) + }, + showOptionMenu: function(e) { + i("showOptionMenu", {}, + e) + }, + closeWindow: function(e) { + i("closeWindow", {}, + e = e || {}) + }, + hideMenuItems: function(e) { + i("hideMenuItems", { + menuList: e.menuList + }, + e) + }, + showMenuItems: function(e) { + i("showMenuItems", { + menuList: e.menuList + }, + e) + }, + hideAllNonBaseMenuItem: function(e) { + i("hideAllNonBaseMenuItem", {}, + e) + }, + showAllNonBaseMenuItem: function(e) { + i("showAllNonBaseMenuItem", {}, + e) + }, + scanQRCode: function(e) { + i("scanQRCode", { + needResult: (e = e || {}).needResult || 0, + scanType: e.scanType || ["qrCode", "barCode"] + }, + (e._complete = function(e) { + if (P) { + var n = e.resultStr; + if (n) { + var i = JSON.parse(n); + e.resultStr = i && i.scan_code && i.scan_code.scan_result + } + } + }, + e)) + }, + openAddress: function(e) { + i(h.openAddress, {}, + (e._complete = function(e) { + e = a(e) + }, + e)) + }, + openProductSpecificView: function(e) { + i(h.openProductSpecificView, { + pid: e.productId, + view_type: e.viewType || 0, + ext_info: e.extInfo + }, + e) + }, + addCard: function(e) { + for (var n = e.cardList, + t = [], o = 0, r = n.length; o < r; ++o) { + var a = n[o], + c = { + card_id: a.cardId, + card_ext: a.cardExt + }; + t.push(c) + } + i(h.addCard, { + card_list: t + }, + (e._complete = function(e) { + var n = e.card_list; + if (n) { + for (var i = 0, + t = (n = JSON.parse(n)).length; i < t; ++i) { + var o = n[i]; + o.cardId = o.card_id, + o.cardExt = o.card_ext, + o.isSuccess = !!o.is_succ, + delete o.card_id, + delete o.card_ext, + delete o.is_succ + } + e.cardList = n, + delete e.card_list + } + }, + e)) + }, + chooseCard: function(e) { + i("chooseCard", { + app_id: C.appId, + location_id: e.shopId || "", + sign_type: e.signType || "SHA1", + card_id: e.cardId || "", + card_type: e.cardType || "", + card_sign: e.cardSign, + time_stamp: e.timestamp + "", + nonce_str: e.nonceStr + }, + (e._complete = function(e) { + e.cardList = e.choose_card_info, + delete e.choose_card_info + }, + e)) + }, + openCard: function(e) { + for (var n = e.cardList, + t = [], o = 0, r = n.length; o < r; ++o) { + var a = n[o], + c = { + card_id: a.cardId, + code: a.code + }; + t.push(c) + } + i(h.openCard, { + card_list: t + }, + e) + }, + consumeAndShareCard: function(e) { + i(h.consumeAndShareCard, { + consumedCardId: e.cardId, + consumedCode: e.code + }, + e) + }, + chooseWXPay: function(e) { + i(h.chooseWXPay, r(e), e) + }, + openEnterpriseRedPacket: function(e) { + i(h.openEnterpriseRedPacket, r(e), e) + }, + startSearchBeacons: function(e) { + i(h.startSearchBeacons, { + ticket: e.ticket + }, + e) + }, + stopSearchBeacons: function(e) { + i(h.stopSearchBeacons, {}, + e) + }, + onSearchBeacons: function(e) { + t(h.onSearchBeacons, e) + }, + openEnterpriseChat: function(e) { + i("openEnterpriseChat", { + useridlist: e.userIds, + chatname: e.groupName + }, + e) + }, + launchMiniProgram: function(e) { + i("launchMiniProgram", { + targetAppId: e.targetAppId, + path: g(e.path), + envVersion: e.envVersion + }, + e) + }, + miniProgram: { + navigateBack: function(e) { + e = e || {}, + f(function() { + i("invokeMiniProgramAPI", { + name: "navigateBack", + arg: { + delta: e.delta || 1 + } + }, + e) + }) + }, + navigateTo: function(e) { + f(function() { + i("invokeMiniProgramAPI", { + name: "navigateTo", + arg: { + url: e.url + } + }, + e) + }) + }, + redirectTo: function(e) { + f(function() { + i("invokeMiniProgramAPI", { + name: "redirectTo", + arg: { + url: e.url + } + }, + e) + }) + }, + switchTab: function(e) { + f(function() { + i("invokeMiniProgramAPI", { + name: "switchTab", + arg: { + url: e.url + } + }, + e) + }) + }, + reLaunch: function(e) { + f(function() { + i("invokeMiniProgramAPI", { + name: "reLaunch", + arg: { + url: e.url + } + }, + e) + }) + }, + postMessage: function(e) { + f(function() { + i("invokeMiniProgramAPI", { + name: "postMessage", + arg: e.data || {} + }, + e) + }) + }, + getEnv: function(n) { + f(function() { + n({ + miniprogram: "miniprogram" === e.__wxjs_environment + }) + }) + } + } + }, + b = 1, + R = {}; + return S.addEventListener("error", + function(e) { + if (!M) { + var n = e.target, + i = n.tagName, + t = n.src; + if (("IMG" == i || "VIDEO" == i || "AUDIO" == i || "SOURCE" == i) && -1 != t.indexOf("wxlocalresource://")) { + e.preventDefault(), + e.stopPropagation(); + var o = n["wx-id"]; + if (o || (o = b++, n["wx-id"] = o), R[o]) return; + R[o] = !0, + wx.ready(function() { + wx.getLocalImgData({ + localId: t, + success: function(e) { + n.src = e.localData + } + }) + }) + } + } + }, + !0), + S.addEventListener("load", + function(e) { + if (!M) { + var n = e.target, + i = n.tagName; + n.src; + if ("IMG" == i || "VIDEO" == i || "AUDIO" == i || "SOURCE" == i) { + var t = n["wx-id"]; + t && (R[t] = !1) + } + } + }, + !0), + n && (e.wx = e.jWeixin = N), + N + } +}); \ No newline at end of file diff --git a/mallplusui-uniapp-app2/node_modules/weixin-js-sdk/index.original.js b/mallplusui-uniapp-app2/node_modules/weixin-js-sdk/index.original.js new file mode 100644 index 0000000..9d66191 --- /dev/null +++ b/mallplusui-uniapp-app2/node_modules/weixin-js-sdk/index.original.js @@ -0,0 +1,2 @@ +// from http://res.wx.qq.com/open/js/jweixin-1.4.0.js +!function(e,n){"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(this,function(e,n){function i(n,i,t){e.WeixinJSBridge?WeixinJSBridge.invoke(n,o(i),function(e){c(n,e,t)}):u(n,t)}function t(n,i,t){e.WeixinJSBridge?WeixinJSBridge.on(n,function(e){t&&t.trigger&&t.trigger(e),c(n,e,i)}):t?u(n,t):u(n,i)}function o(e){return e=e||{},e.appId=C.appId,e.verifyAppId=C.appId,e.verifySignType="sha1",e.verifyTimestamp=C.timestamp+"",e.verifyNonceStr=C.nonceStr,e.verifySignature=C.signature,e}function r(e){return{timeStamp:e.timestamp+"",nonceStr:e.nonceStr,package:e.package,paySign:e.paySign,signType:e.signType||"SHA1"}}function a(e){return e.postalCode=e.addressPostalCode,delete e.addressPostalCode,e.provinceName=e.proviceFirstStageName,delete e.proviceFirstStageName,e.cityName=e.addressCitySecondStageName,delete e.addressCitySecondStageName,e.countryName=e.addressCountiesThirdStageName,delete e.addressCountiesThirdStageName,e.detailInfo=e.addressDetailInfo,delete e.addressDetailInfo,e}function c(e,n,i){"openEnterpriseChat"==e&&(n.errCode=n.err_code),delete n.err_code,delete n.err_desc,delete n.err_detail;var t=n.errMsg;t||(t=n.err_msg,delete n.err_msg,t=s(e,t),n.errMsg=t),(i=i||{})._complete&&(i._complete(n),delete i._complete),t=n.errMsg||"",C.debug&&!i.isInnerInvoke&&alert(JSON.stringify(n));var o=t.indexOf(":");switch(t.substring(o+1)){case"ok":i.success&&i.success(n);break;case"cancel":i.cancel&&i.cancel(n);break;default:i.fail&&i.fail(n)}i.complete&&i.complete(n)}function s(e,n){var i=e,t=v[i];t&&(i=t);var o="ok";if(n){var r=n.indexOf(":");"confirm"==(o=n.substring(r+1))&&(o="ok"),"failed"==o&&(o="fail"),-1!=o.indexOf("failed_")&&(o=o.substring(7)),-1!=o.indexOf("fail_")&&(o=o.substring(5)),"access denied"!=(o=(o=o.replace(/_/g," ")).toLowerCase())&&"no permission to execute"!=o||(o="permission denied"),"config"==i&&"function not exist"==o&&(o="ok"),""==o&&(o="fail")}return n=i+":"+o}function d(e){if(e){for(var n=0,i=e.length;n0){var n=e.split("?")[0],i=e.split("?")[1];return n+=".html",void 0!==i?n+"?"+i:n}}if(!e.jWeixin){var h={config:"preVerifyJSAPI",onMenuShareTimeline:"menu:share:timeline",onMenuShareAppMessage:"menu:share:appmessage",onMenuShareQQ:"menu:share:qq",onMenuShareWeibo:"menu:share:weiboApp",onMenuShareQZone:"menu:share:QZone",previewImage:"imagePreview",getLocation:"geoLocation",openProductSpecificView:"openProductViewWithPid",addCard:"batchAddCard",openCard:"batchViewCard",chooseWXPay:"getBrandWCPayRequest",openEnterpriseRedPacket:"getRecevieBizHongBaoRequest",startSearchBeacons:"startMonitoringBeacons",stopSearchBeacons:"stopMonitoringBeacons",onSearchBeacons:"onBeaconsInRange",consumeAndShareCard:"consumedShareCard",openAddress:"editAddress"},v=function(){var e={};for(var n in h)e[h[n]]=n;return e}(),S=e.document,I=S.title,y=navigator.userAgent.toLowerCase(),_=navigator.platform.toLowerCase(),k=!(!_.match("mac")&&!_.match("win")),w=-1!=y.indexOf("wxdebugger"),T=-1!=y.indexOf("micromessenger"),M=-1!=y.indexOf("android"),P=-1!=y.indexOf("iphone")||-1!=y.indexOf("ipad"),x=function(){var e=y.match(/micromessenger\/(\d+\.\d+\.\d+)/)||y.match(/micromessenger\/(\d+\.\d+)/);return e?e[1]:""}(),A={initStartTime:p(),initEndTime:0,preVerifyStartTime:0,preVerifyEndTime:0},V={version:1,appId:"",initTime:0,preVerifyTime:0,networkType:"",isPreVerifyOk:1,systemType:P?1:M?2:-1,clientVersion:x,url:encodeURIComponent(location.href)},C={},L={_completes:[]},B={state:0,data:{}};f(function(){A.initEndTime=p()});var O=!1,E=[],N={config:function(e){C=e,u("config",e);var n=!1!==C.check;f(function(){if(n)i(h.config,{verifyJsApiList:d(C.jsApiList)},function(){L._complete=function(e){A.preVerifyEndTime=p(),B.state=1,B.data=e},L.success=function(e){V.isPreVerifyOk=0},L.fail=function(e){L._fail?L._fail(e):B.state=-1};var e=L._completes;return e.push(function(){l()}),L.complete=function(n){for(var i=0,t=e.length;i 0){var n=E.shift();wx.getLocalImgData(n)}},e))):E.push(e)},getNetworkType:function(e){var n=function(e){var n=e.errMsg;e.errMsg="getNetworkType:ok";var i=e.subtype;if(delete e.subtype,i)e.networkType=i;else{var t=n.indexOf(":"),o=n.substring(t+1);switch(o){case"wifi":case"edge":case"wwan":e.networkType=o;break;default:e.errMsg="getNetworkType:fail"}}return e};i("getNetworkType",{},(e._complete=function(e){e=n(e)},e))},openLocation:function(e){i("openLocation",{latitude:e.latitude,longitude:e.longitude,name:e.name||"",address:e.address||"",scale:e.scale||28,infoUrl:e.infoUrl||""},e)},getLocation:function(e){e=e||{},i(h.getLocation,{type:e.type||"wgs84"},(e._complete=function(e){delete e.type},e))},hideOptionMenu:function(e){i("hideOptionMenu",{},e)},showOptionMenu:function(e){i("showOptionMenu",{},e)},closeWindow:function(e){i("closeWindow",{},e=e||{})},hideMenuItems:function(e){i("hideMenuItems",{menuList:e.menuList},e)},showMenuItems:function(e){i("showMenuItems",{menuList:e.menuList},e)},hideAllNonBaseMenuItem:function(e){i("hideAllNonBaseMenuItem",{},e)},showAllNonBaseMenuItem:function(e){i("showAllNonBaseMenuItem",{},e)},scanQRCode:function(e){i("scanQRCode",{needResult:(e=e||{}).needResult||0,scanType:e.scanType||["qrCode","barCode"]},(e._complete=function(e){if(P){var n=e.resultStr;if(n){var i=JSON.parse(n);e.resultStr=i&&i.scan_code&&i.scan_code.scan_result}}},e))},openAddress:function(e){i(h.openAddress,{},(e._complete=function(e){e=a(e)},e))},openProductSpecificView:function(e){i(h.openProductSpecificView,{pid:e.productId,view_type:e.viewType||0,ext_info:e.extInfo},e)},addCard:function(e){for(var n=e.cardList,t=[],o=0,r=n.length;o + + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/category/areaGoods.vue b/mallplusui-uniapp-app2/pages/category/areaGoods.vue new file mode 100644 index 0000000..ea8616e --- /dev/null +++ b/mallplusui-uniapp-app2/pages/category/areaGoods.vue @@ -0,0 +1,231 @@ + +购物车 + + ++ ++ + 空空如也 + +随便逛逛> + ++ 空空如也 + +去登陆> ++ + ++ + + ++ ++ ++ ++ + + +{{ item.productName }} +{{ item.productAttr }} +¥{{ item.price }} ++ + + + ++ ++ 清空 ++ + +¥{{ total }} ++ 已优惠 + +{{ promoteAmount }} + 元 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/category/category.vue b/mallplusui-uniapp-app2/pages/category/category.vue new file mode 100644 index 0000000..2056265 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/category/category.vue @@ -0,0 +1,243 @@ + ++ + +分类 ++ + + + + + + ++ + ++ +{{ item.name }} ++ ++ +{{ item.name }} ++ ++ ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/index/index.vue b/mallplusui-uniapp-app2/pages/index/index.vue new file mode 100644 index 0000000..7faee05 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/index/index.vue @@ -0,0 +1,1424 @@ + ++ + +分类 ++ + + + + + + ++ + ++ +{{ item.name }} ++ ++ +{{ item.name }} ++ ++ ++ {{titem.name}} ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/index/lease.vue b/mallplusui-uniapp-app2/pages/index/lease.vue new file mode 100644 index 0000000..33a6994 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/index/lease.vue @@ -0,0 +1,268 @@ + +汇融云链 ++ + + + + + + + ++ + + + ++ + + + + ++ ++ + +{{ swiperCurrent + 1 }} +/ +{{ swiperLength }} ++ ++ ++ 惠农套餐 ++ ++ 拼团特价 ++ ++ 税分兑换 ++ ++ 限时抢购 ++ ++ 农村社区 ++ + + ++ ++ 分销商品 ++ ++ 会员商品 ++ ++ 区域商品 ++ ++ 精选标签 ++ ++ 卖家中心 ++ + + + ++ ++ ++ {{ homeFlashPromotion.flashName }} ++ +{{ homeFlashPromotion.startTime || '18:00' }} +~ +{{ homeFlashPromotion.endTime || '24:00' }} ++ + ++ ++ ++ ++ {{ item.productName }} +¥{{ item.flashPromotionPrice }} ++ + + + ++ + +精品团购 ++ + + + ++ ++ ++ ++ + +{{ item.goods.title }} ++ +{{ item.groupPrice }} +¥{{ item.goods.price }} ++ ++ {{ item.maxPeople }}人成团 ++ ++ + +分类精选 ++ + + + ++ ++ + ++ ++ ++ {{ item.name }} +¥{{ item.price }} ++ +查看全部 +More+ ++ + ++ + +新品推荐 ++ + + ++ + ++ ++ {{ item.productName }} +¥{{ item.price }} + ++ + ++ + +人气推荐 ++ + + ++ + ++ ++ {{ item.name }} +¥{{ item.price }} + ++ + ++ + +新品上市 ++ + + ++ ++ ++ {{ item.name }} +¥{{ item.price }} +【{{ item.storeName }}】 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/index/nearbyBusiness.vue b/mallplusui-uniapp-app2/pages/index/nearbyBusiness.vue new file mode 100644 index 0000000..c6abf5f --- /dev/null +++ b/mallplusui-uniapp-app2/pages/index/nearbyBusiness.vue @@ -0,0 +1,561 @@ + ++ + ++ + ++ + ++ + + ++ ++ + ++ +{{item.title}} ++ + ++ +{{item.classify}} +{{item.browse_count}}浏览 ++ + + ++ ++ +{{item.title}} ++ + ++ ++ + ++ +{{item.classify}} +{{item.browse_count}}浏览 ++ + ++ ++ + ++ + +{{item.title}} ++ + ++ +{{item.classify}} +{{item.browse_count}}浏览 ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/index/secskill.vue b/mallplusui-uniapp-app2/pages/index/secskill.vue new file mode 100644 index 0000000..33cdfdf --- /dev/null +++ b/mallplusui-uniapp-app2/pages/index/secskill.vue @@ -0,0 +1,581 @@ + ++ + ++ + {{ addressData.province }}-{{ addressData.city }}-{{ addressData.region }} ++ + + ++ + ++ ++ + + ++ 全部商家 ++ ++ + ++ + + ++ ++ 全部分类 ++ + ++ 加载全部 ++ + + ++ + +暂无商家记录 ++ + ++ + +{{ item.name }} ++ ++ + + + + 收藏 {{ item.collect }} ++ + + +{{ item.distance.toFixed(4) }} ++ + ++ +请选择商家类别 ++ + ++ +{{ item.name }} ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/index/user.vue b/mallplusui-uniapp-app2/pages/index/user.vue new file mode 100644 index 0000000..b1709b6 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/index/user.vue @@ -0,0 +1,770 @@ + ++ + + + + + + ++ + + + + ++ ++ + +{{ swiperCurrent + 1 }} +/ +{{ swiperLength }} ++ + + + ++ ++ {{ item1.flashName }} ++ ++ +{{ item2.startTime }} +~ +{{ item2.endTime }} ++ ++ ++ ++ {{ item4.productName }} +秒杀价 ¥{{ item4.flashPromotionPrice }} +原价 ¥{{ item4.productPrice }} ++ + + + diff --git a/mallplusui-uniapp-app2/pages/integral/home/home.css b/mallplusui-uniapp-app2/pages/integral/home/home.css new file mode 100644 index 0000000..7b028b4 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/integral/home/home.css @@ -0,0 +1,115 @@ +.top {} + +.top-integral { + font-size: 60upx; +} + +.top-bot { + height: 100upx; + margin-top: 40upx; + background: rgba(255,255,255,0.12); +} + +.top-warn{ + width: 50upx; + height: 50upx; + position: relative; + left: 400upx; + bottom: 100upx; +} + +.level{ + border: 1px solid #FFCC00; + border-radius: 20upx; +} + +.bill { + width: 33%; + height: 100upx; +} + +.content-title{ + width: 100%; + height: 100upx; +} + + +.hot-goods-content { + width: 100%; + /* padding: 0 1.5% 25upx 1.5%; */ + padding: 0 1.5%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + padding-bottom: 20upx; + /* justify-content: center; */ +} + +.hot-goods-item { + margin: 20upx 2% 0 2%; + padding: 5upx 0; + width: 46%; + /* height: 430upx; */ + display: flex; + flex-direction: column; + box-sizing: border-box; + background: #ffffff; + border-bottom-right-radius: 8upx; + border-bottom-left-radius: 8upx; + box-shadow: 0upx 0px 15upx #FFEFDB; +} + +.hot-goods-item2 { + margin: 20upx 2% 0 2%; + width: 46%; + padding: 5upx 0; + /* height: 430upx; */ + height: 500upx; + display: flex; + flex-direction: column; + box-sizing: border-box; + background: #ffffff; + border-bottom-right-radius: 8upx; + border-bottom-left-radius: 8upx; + /* box-shadow: 0upx 0px 15upx #FFEFDB; */ +} + +.hot-goods-item:nth-child(2n-1) { + margin-right: auto; + +} + +.hot-goods-image { + width: 290upx; + height: 290upx; + margin-top: 3upx; +} + +.hot-goods-image-more { + width: 150upx; + height: 150upx; +} + +.hot-goods-name { + margin-top: 10upx; + font-size: 30upx; + width: 94%; + text-align: left; + /* height: 100upx; */ +} + +.hot-goods-more { + margin-top: 5upx; + margin-left: 10upx; + font-size: 30upx; + width: 94%; + text-align: center; +} + +.hot-goods-price { + margin: 20upx 10upx 0 0; + font-size: 30upx; + width: 100%; + text-align: left; +} \ No newline at end of file diff --git a/mallplusui-uniapp-app2/pages/integral/home/home.vue b/mallplusui-uniapp-app2/pages/integral/home/home.vue new file mode 100644 index 0000000..3c39b18 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/integral/home/home.vue @@ -0,0 +1,166 @@ + ++ + ++ + ++ + ++ + + + ++ {{ userDetailInfo.nickname || userDetailInfo.username }} ++ 卖家中心 + + + + + + + + + + + ++ 立即升级 ++ ++ {{ userDetailInfo.memberLevelName || '开通会员' }} + 汇融云链 +升级会员享受更多折扣 一测就上线 ++ ++ + + + ++ +{{ userDetailInfo.blance || 0 }} +余额 ++ +{{ couponList.length || 0 }} +优惠券 ++ +{{ userDetailInfo.integration || 0 }} +积分 ++ + ++ ++ 全部订单 ++ ++ 待付款 ++ + ++ 待收货 ++ ++ 退款/售后 ++ ++ ++ 浏览历史 ++ + ++ + + + + + + + + + + + + + + + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/money/pay.vue b/mallplusui-uniapp-app2/pages/money/pay.vue new file mode 100644 index 0000000..f0cd4a5 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/money/pay.vue @@ -0,0 +1,229 @@ + ++ + +{{integrals || 0}} ++ ++ 兑换余额 ++ ++ +积分明细 ++ +积分订单 ++ +积分等级 ++ ++ +积分兑换商品 ++ + + ++ ++ ++ ++ {{item.goodsName}} ++ +{{item.totalAmount}}积分 +{{item.levelName}} ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/money/paySuccess.vue b/mallplusui-uniapp-app2/pages/money/paySuccess.vue new file mode 100644 index 0000000..d93d14e --- /dev/null +++ b/mallplusui-uniapp-app2/pages/money/paySuccess.vue @@ -0,0 +1,78 @@ + ++ + +支付金额 +{{orderInfo.payAmount}} ++ + + ++ ++ + + +微信支付 +推荐使用微信支付 ++ ++ + + +支付宝支付 ++ ++ + + +预存款支付 +可用余额 ¥{{orderInfo.blance}} +确认支付 ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/createOrder.vue b/mallplusui-uniapp-app2/pages/order/createOrder.vue new file mode 100644 index 0000000..818a963 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/createOrder.vue @@ -0,0 +1,870 @@ + ++ 支付成功 ++ {{ paymentInfo.payAmount }} + ++ +查看订单 +返回首页 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/createOrder1.vue b/mallplusui-uniapp-app2/pages/order/createOrder1.vue new file mode 100644 index 0000000..53222e1 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/createOrder1.vue @@ -0,0 +1,771 @@ + ++ + ++ + ++ + ++ +{{ addressData.name }} +{{ addressData.phoneNumber }} +{{ addressData.province }}-{{ addressData.city }}-{{ addressData.region }}-{{ addressData.detailAddress }} ++ +请设置收货地址 + ++ + + ++ + +团购-{{groupActivity.name}} ++ ++ + +{{ item.productName }} +{{ item.productAttr }} ++ +¥{{ item.price }} +x {{ item.quantity }} ++ + ++ + {{ item1.name }} + ++ ++ ++ {{ item.name }} +¥{{ item.price }} ++ + ++ +券 +优惠券 +选择优惠券 ++ + +商家促销 +满{{coupon.minPoint}}减{{coupon.amount}} +暂无可用优惠 ++ + + ++ +商品金额 +¥{{ calcAmount.totalAmount }} ++ +活动金额 +¥{{ groupActivity.price }} ++ +优惠金额 +-¥{{ calcAmount.promotionAmount }} ++ + +优惠券抵扣 +-¥{{ coupon.amount }} ++ +运费 +{{calcAmount.freightAmount}} ++ +备注 + ++ + + ++ +实付款 +¥ +{{ calcAmount.payAmount-coupon.amount }} +提交订单 ++ + ++ + ++ ++ ++ +{{ item.coupon.name }} +有效期至{{item.coupon.endTime | formatCreateTime}} ++ + +{{ item.coupon.amount }} +满{{item.coupon.minPoint}}可用 ++ + 限新用户使用 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/createStoreOrder.vue b/mallplusui-uniapp-app2/pages/order/createStoreOrder.vue new file mode 100644 index 0000000..c5adb30 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/createStoreOrder.vue @@ -0,0 +1,806 @@ + ++ + ++ + ++ + ++ +{{ addressData.name }} +{{ addressData.phoneNumber }} +{{ addressData.detailAddress }} {{ addressData.region }} ++ + + + + ++ + ++ mallplus多租户商城 +团购-{{groupActivity.name}} ++ ++ + +{{ item.productName }} +{{ item.productAttr }} ++ +¥{{ item.price }} +x {{ item.quantity }} ++ + ++ +券 +优惠券 +选择优惠券 ++ + +商家促销 +满{{coupon.minPoint}}减{{coupon.amount}} +暂无可用优惠 ++ + + ++ +商品金额 +¥{{ calcAmount.totalAmount }} ++ +活动金额 +¥{{ groupActivity.price }} ++ +优惠金额 +-¥{{ calcAmount.promotionAmount }} ++ +运费 +{{calcAmount.freightAmount}} ++ +备注 + ++ + + ++ +实付款 +¥ +{{ calcAmount.payAmount-coupon.amount }} +提交订单 ++ + ++ + ++ ++ ++ +{{ item.name }} +有效期至{{item.coupon.endTime | formatCreateTime}} ++ + +{{ item.coupon.amount }} +满{{item.coupon.minPoint}}可用 ++ + 限新用户使用 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/createStoreOrder1.vue b/mallplusui-uniapp-app2/pages/order/createStoreOrder1.vue new file mode 100644 index 0000000..0c1c1f8 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/createStoreOrder1.vue @@ -0,0 +1,761 @@ + ++ + ++ + ++ + ++ +{{ addressData.name }} +{{ addressData.phoneNumber }} +{{ addressData.province }}-{{ addressData.city }}-{{ addressData.region }}-{{ addressData.detailAddress }} ++ +请设置收货地址 + ++ + + + + + + + ++ + ++ 共{{ item1.cartPromotionItemList.length }}件商品,店铺 【{{item1.storeName }}】 +团购-{{groupActivity.name}} ++ + ++ + +{{ item.productName }} +{{ item.productAttr }} ++ +¥{{ item.price }} +x {{ item.quantity }} ++ ++ + +商品金额 +¥{{ item1.calcAmount.totalAmount }} ++ + + +优惠金额 +-¥{{ item1.calcAmount.promotionAmount }} ++ +运费 +{{item1.calcAmount.freightAmount}} ++ +备注 + ++ + + ++ +实付款 +¥ +{{ totalPayAmount }} +提交订单 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/evaluate.vue b/mallplusui-uniapp-app2/pages/order/evaluate.vue new file mode 100644 index 0000000..f352358 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/evaluate.vue @@ -0,0 +1,291 @@ + ++ + ++ + ++ + ++ +{{orderInfo.address.user_name}} +{{orderInfo.address.user_phone}} ++ {{ orderInfo.address.area_province_name ? orderInfo.address.area_province_name : '' }} {{ orderInfo.address.area_city_name ? orderInfo.address.area_city_name : '' }}{{ orderInfo.address.area_county_name ? orderInfo.address.area_county_name : '' }}{{ orderInfo.address.area_town_name ? orderInfo.address.area_town_name : '' }}{{ orderInfo.address.area_village_name ? orderInfo.address.area_village_name : '' }}{{ orderInfo.address.address ? orderInfo.address.address : '' }} + + ++ + + + + ++ ++ + ++ {{item.shop_info.shop_name}} ++ ++ + +{{goodsItem.goods_info.goods_name}} +{{goodsItem.sku_info.sku_name==''?'标准版':goodsItem.sku_info.sku_name}} ++ +¥{{goodsItem.total_price}} ++ ++ + +此区域已售罄 ++ + + + ++ ++ 减 + +商家促销 +暂无优惠 ++ + + ++ +商品金额 +¥{{orderInfo.total_money}} ++ +金币抵扣 +-¥{{orderInfo.total_max_use_coin}} + ++ +运费 +{{orderInfo.shipping_money==0?'包邮':'¥'+orderInfo.shipping_money}} ++ +备注 + ++ + + ++ +实付款 +¥ +{{orderInfo.pay_money}} +提交订单 ++ + ++ + ++ ++ ++ +{{item.title}} +有效期至2019-06-30 ++ + +{{item.price}} +满30可用 ++ + 限新用户使用 ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/logistics.vue b/mallplusui-uniapp-app2/pages/order/logistics.vue new file mode 100644 index 0000000..adb498e --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/logistics.vue @@ -0,0 +1,230 @@ + ++ + ++ ++ ++ + ++ + ++ +{{ item.productName }} ++ + +商品评分 ++ ++ + + ++ + ++ ++ + + ++ 上传照片 ++ + ++ + ++ + + \ No newline at end of file diff --git a/mallplusui-uniapp-app2/pages/order/order.vue b/mallplusui-uniapp-app2/pages/order/order.vue new file mode 100644 index 0000000..99ff1e8 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/order.vue @@ -0,0 +1,671 @@ + +++++物流跟踪++++++++
+++- + + + {{item.AcceptStation}} + {{item.AcceptTime}} +
+- + + {{item.AcceptStation}} + {{item.AcceptTime}} +
+- + + + {{item.AcceptStation}} + {{item.AcceptTime}} +
++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/orderDetail.vue b/mallplusui-uniapp-app2/pages/order/orderDetail.vue new file mode 100644 index 0000000..59c9486 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/orderDetail.vue @@ -0,0 +1,590 @@ + ++ + +{{ item.text }} ++ ++ ++ + ++ + + + ++ + +{{ item.createTime }} +{{ item.id }}-- +{{ item.stateTip }} + ++ ++ ++
+ + ++
+ +{{ goodsItem.productName }} +{{ goodsItem.productAttr }} x {{ goodsItem.productQuantity }} +{{ goodsItem.productPrice }}
+{{ item.deliveryCompany }}:{{ item.deliverySn }} +{{ item.deliveryCompany }}:{{ item.deliverySn }} ++ 共 + +{{ item.orderItemList.length }} + 件商品 实付款 +{{ item.payAmount }} ++ +秒杀订单 +拼团订单 +团购订单 +砍价订单 +积分订单 + + + + + + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/payment/auth.vue b/mallplusui-uniapp-app2/pages/order/payment/auth.vue new file mode 100644 index 0000000..441a558 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/payment/auth.vue @@ -0,0 +1,159 @@ + ++ + ++ ++ + ++ ++ +{{ orderInfo.createTime }} +{{ orderInfo.id }}-- +{{ orderInfo.stateTip }} ++ + + +订单商品 ++ ++
+ +{{ goodsItem.productName }} +{{ goodsItem.productAttr }} x {{ goodsItem.productQuantity }} +{{ goodsItem.productPrice }} ++ +订单赠品 ++ ++
+ +{{ goodsItem.productName }} +{{ goodsItem.productAttr }} x {{ goodsItem.productQuantity }} +{{ goodsItem.productPrice }} ++ 共 + +{{ orderInfo.orderItemList.length }} + 件商品, 会员折扣 +{{ orderInfo.vipAmount }} + 优惠券抵扣 +{{ orderInfo.couponAmount }} ++ 积分抵扣 + +{{ orderInfo.integrationAmount }} + ,运费 +{{ orderInfo.freightAmount }} ++ + ,实付款 +活动金额 +¥{{ groupActivity.price }} +{{ orderInfo.payAmount }} ++ + + + + + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/payment/index.vue b/mallplusui-uniapp-app2/pages/order/payment/index.vue new file mode 100644 index 0000000..d152b9a --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/payment/index.vue @@ -0,0 +1,231 @@ + ++ + +信息加载中..... ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/payment/index1.vue b/mallplusui-uniapp-app2/pages/order/payment/index1.vue new file mode 100644 index 0000000..4a7b0a0 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/payment/index1.vue @@ -0,0 +1,210 @@ + ++ + + +支付金额 +{{orderInfo.payAmount}} ++ + + + + + + + + + + + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/order/payment/result.vue b/mallplusui-uniapp-app2/pages/order/payment/result.vue new file mode 100644 index 0000000..de47d65 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/order/payment/result.vue @@ -0,0 +1,75 @@ + ++ + + ++ ++ +订单类型 ++ +商品订单 +充值订单 +快捷下单 +付款码 ++ ++ ++ +订单编号 ++ +{{ orderId }} ++ ++ +订单金额 ++ +¥{{ orderInfo.payAmount }} ++ ++ ++ +充值金额 ++ +¥ {{ recharge }} ++ + + + + + + + + + + + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pages/public/index.vue b/mallplusui-uniapp-app2/pages/public/index.vue new file mode 100644 index 0000000..dd484bd --- /dev/null +++ b/mallplusui-uniapp-app2/pages/public/index.vue @@ -0,0 +1,373 @@ + ++ 支付成功 ++ {{ paymentInfo.payAmount }} + ++ +查看订单 +返回首页 ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/public/login.vue b/mallplusui-uniapp-app2/pages/public/login.vue new file mode 100644 index 0000000..3d3fbc6 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/public/login.vue @@ -0,0 +1,817 @@ + ++ ++ + ++ + ++ + + +发送验证码 +{{ timer }} 秒后重新获取 ++ + + ++ + ++ + + + + + + ++ ++ 密码登录 + ++ 注册 + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/public/loginCode.vue b/mallplusui-uniapp-app2/pages/public/loginCode.vue new file mode 100644 index 0000000..05562a8 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/public/loginCode.vue @@ -0,0 +1,371 @@ + ++ + + + + 欢迎回来!汇融云链 + ++ + + + ++ + ++ + + +免密登录 +账号登录 + ++ +手机号码 + ++ +密码 + ++ +验证码 ++ + +获取验证码 +{{ auth_time }}秒 ++ +忘记密码? + ++ 还没有账号? + +马上注册 +
+ + + + + + + ++ + + + ++ + + +免密登录 +账号登录 + ++ +手机号码 + ++ +密码 + ++ +验证码 ++ + +获取验证码 +{{ auth_time }}秒 ++ +忘记密码? + ++ 还没有账号? + +马上注册 +
+ + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pages/public/reg.vue b/mallplusui-uniapp-app2/pages/public/reg.vue new file mode 100644 index 0000000..7eaf664 --- /dev/null +++ b/mallplusui-uniapp-app2/pages/public/reg.vue @@ -0,0 +1,256 @@ + ++ + + + + +LOGIN +欢迎回来! ++ + ++ +手机号码 + ++ +验证码 ++ + +获取验证码 +{{ auth_time }}秒 +密码登录 ++ 还没有账号? + + +马上注册 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/search/search.vue b/mallplusui-uniapp-app2/pages/search/search.vue new file mode 100644 index 0000000..1f6ef8b --- /dev/null +++ b/mallplusui-uniapp-app2/pages/search/search.vue @@ -0,0 +1,378 @@ + ++ + + + + +注册 +欢迎回来! ++ + + ++ +手机号码 + ++ +密码 + ++ +确认密码 + ++ +邀请码 + +忘记密码? ++ 已经有账号? + + +马上登录 ++ + + + + diff --git a/mallplusui-uniapp-app2/pages/set/certification.vue b/mallplusui-uniapp-app2/pages/set/certification.vue new file mode 100644 index 0000000..1a6450c --- /dev/null +++ b/mallplusui-uniapp-app2/pages/set/certification.vue @@ -0,0 +1,707 @@ + ++ + ++ + + + ++ ++ ++ + + ++ ++ +历史搜索 ++ + +{{ keyword }} ++ ++ +热门搜索 ++ + + +{{ keyword }} ++ + ++ +搜索结果 ++ + +{{ item.name }} ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pages/set/set.vue b/mallplusui-uniapp-app2/pages/set/set.vue new file mode 100644 index 0000000..9ff541e --- /dev/null +++ b/mallplusui-uniapp-app2/pages/set/set.vue @@ -0,0 +1,149 @@ + ++ + + ++ + + 身份证号码有误 + +{{ time }} ++ +身份证照片(正面) ++ + ++ ++ 选择身份证照片 ++ ++ + 身份证照片(背面) ++ + ++ ++ 选择身份证照片 ++ ++ + + ++ ++ {{ Address }} + ++ + + ++ + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/after_sale/detail.vue b/mallplusui-uniapp-app2/pagesA/after_sale/detail.vue new file mode 100644 index 0000000..87cd0ec --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/after_sale/detail.vue @@ -0,0 +1,388 @@ + ++ +个人资料 ++ + +收货地址 ++ + + +实名认证 ++ + +消息推送 ++ + +清除缓存 ++ + +关于{{ sysInfo.name }} ++ + +检查更新 + ++ + + 退出登录 + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/after_sale/index.vue b/mallplusui-uniapp-app2/pagesA/after_sale/index.vue new file mode 100644 index 0000000..22e31df --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/after_sale/index.vue @@ -0,0 +1,382 @@ + ++ + ++ ++ ++ ++ +退款单状态 ++ +{{status_name}} {{refund_name}} {{reship_name}}... ++ + ++ ++ ++ 售后类型 + {{type_name}} + ++ 退款金额 + {{refund}}元 + ++ 图片凭证 + ++ ++ ++ + ++ ++ +问题描述 ++ +{{reason}} +暂无描述 ++ ++ ++ +退货邮寄信息 ++ ++ +收件人 ++ + ++ ++ +联系方式 ++ + ++ ++ +邮寄地址 ++ + ++ ++ ++ +快递公司 ++ + ++ ++ +物流单号 ++ + ++ ++ ++ +快递公司 ++ + ++ ++ +物流单号 ++ + ++ + ++ + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/after_sale/list.vue b/mallplusui-uniapp-app2/pagesA/after_sale/list.vue new file mode 100644 index 0000000..5e6dfa5 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/after_sale/list.vue @@ -0,0 +1,642 @@ + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/applyCommunity.vue b/mallplusui-uniapp-app2/pagesA/build/applyCommunity.vue new file mode 100644 index 0000000..7eca917 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/applyCommunity.vue @@ -0,0 +1,395 @@ + ++ + +{{ item.text }} ++ + ++ ++ + + ++ + + + ++ + +{{ item.createTime }} +{{ item.id }}-- +待审核 +退货中 +已完成 +审核拒绝 ++ ++ ++
+ + ++
+ +{{ goodsItem.productName }} +{{ goodsItem.productAttr }} x {{ goodsItem.productQuantity }} +{{ goodsItem.productPrice }} ++ 共 + + +{{ item.orderItemList.length }} + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/bindCommunity.vue b/mallplusui-uniapp-app2/pagesA/build/bindCommunity.vue new file mode 100644 index 0000000..bc3b607 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/bindCommunity.vue @@ -0,0 +1,397 @@ + ++ ++ +点击上传商家logo ++ ++ + + ++ +商家名称: ++ + ++ ++ +商家QQ: ++ + ++ ++ +商家手机号: ++ + ++ ++ +商家类别: ++ ++ + ++ + ++ +{{pickerText}} ++ ++ + ++ +{{addressName}} ++ ++ + + + + ++ +商家介绍: ++ + ++ + ++ +点击上传营业执照: ++ ++ + + + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/community.vue b/mallplusui-uniapp-app2/pagesA/build/community.vue new file mode 100644 index 0000000..9d3d019 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/community.vue @@ -0,0 +1,1088 @@ + ++ ++ +点击上传商家logo ++ ++ + + ++ +商家名称: ++ + ++ ++ +商家QQ: ++ + ++ ++ +商家手机号: ++ + ++ ++ +商家类别: ++ ++ + ++ + ++ +{{pickerText}} ++ ++ + ++ +{{addressName}} ++ ++ + + + + ++ +商家介绍: ++ + ++ + ++ +点击上传营业执照: ++ ++ + + + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/communityList.vue b/mallplusui-uniapp-app2/pagesA/build/communityList.vue new file mode 100644 index 0000000..0b65e86 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/communityList.vue @@ -0,0 +1,514 @@ + ++ + + + + + + + ++ + + + ++ + + + + ++ ++ + +{{ swiperCurrent + 1 }} +/ +{{ swiperLength }} ++ + ++ ++ 社区公告 ++ ++ 社区团购 ++ + ++ 社区特供 ++ ++ 农机租赁 ++ + + + ++ + +周边社区 ++ + + ++ + +社区团购 ++ + + + ++ + +社区特供 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/floorList.vue b/mallplusui-uniapp-app2/pagesA/build/floorList.vue new file mode 100644 index 0000000..d4e227a --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/floorList.vue @@ -0,0 +1,381 @@ + ++ + +综合排序 + + ++ + + ++ ++ ++ + ++ + +{{ item.name }} +地址:{{ item.details}} +电话:{{ item.phone}} ++ + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/groupList.vue b/mallplusui-uniapp-app2/pagesA/build/groupList.vue new file mode 100644 index 0000000..4eee316 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/groupList.vue @@ -0,0 +1,404 @@ + ++ +综合排序 + ++ +价格 ++ ++ + + + ++ ++ {{ item.name }} ++ +楼层{{ item.layerCount }} ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/groupProduct.vue b/mallplusui-uniapp-app2/pagesA/build/groupProduct.vue new file mode 100644 index 0000000..f18a28d --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/groupProduct.vue @@ -0,0 +1,997 @@ + ++ +综合排序 +销量优先 ++ +价格 ++ ++ + + + ++ ++ {{ item.name }} ++ +{{ item.price }} +已售 {{ item.sale }} ++ + + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/notice.vue b/mallplusui-uniapp-app2/pagesA/build/notice.vue new file mode 100644 index 0000000..3acc954 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/notice.vue @@ -0,0 +1,199 @@ + ++ + ++ ++ ++ + + + +{{ goods.name }} ++ +¥ +{{ goods.price }} +¥{{ goods.originalPrice }} ++ +销量: {{ goods.sale }} +库存: {{ goods.stock }} +浏览量: {{ goods.hit }} ++ + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + + ++ + + +购买类型 ++ +{{ sItem.name }} ++ + ++ ++
倒计时:{{ item.djs }}+ +已成团++ +服务 ++ +{{ item1 }} ++ + ++ +评价 +({{ consultCount.all }}) +好评 +({{ consultCount.goods }}) + +一般 +({{ consultCount.general }}) + +差评 +({{ consultCount.bad }}) +好评率 {{ consultCount.persent }}% ++ + ++ + +{{ item.memberName }} +{{ item.consultContent }} ++ +购买类型:{{ item.attr }} +{{ item.consultAddtime | formatCreateTime}} ++ + + ++ 图文详情 + + + + ++ + ++ 首页 ++ + ++ 收藏 ++ + + + ++ + ++ ++ + +¥{{ sku.price }} +库存:{{ sku.stock }}件 ++ 已选: + +{{ sItem.name }} ++ + +{{ item.name }} ++ ++ {{ childItem.name }} + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/build/repairOrder/repairOrder.vue b/mallplusui-uniapp-app2/pagesA/build/repairOrder/repairOrder.vue new file mode 100644 index 0000000..a2c7163 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/build/repairOrder/repairOrder.vue @@ -0,0 +1,389 @@ + ++ +{{ item.createTime }} ++ +{{ item.title }} ++ {{ item.content }} ++ +查看详情 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/categoryAttr.vue b/mallplusui-uniapp-app2/pagesA/product/categoryAttr.vue new file mode 100644 index 0000000..a1cd8bd --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/categoryAttr.vue @@ -0,0 +1,352 @@ + ++ + ++ ++ 发起报修 + ++ 报修历史 + + ++ ++ ++ ++ ++ +{{item.complaintId}} ++ ++ {{item.complaintName}} + + +{{item.createTime}} ++ + ++ +房屋信息 ++ + ++ ++ +楼栋 ++ +{{floorNum != ''?floorNum+'号楼':'请选择'}} ++ ++ +单元 ++ +{{unitNum != ''?unitNum+'单元':'请选择'}} ++ ++ +房屋 ++ +{{roomNum != ''?roomNum+'室':'请选择'}} ++ + + + +报修信息 ++ + + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/discountList.vue b/mallplusui-uniapp-app2/pagesA/product/discountList.vue new file mode 100644 index 0000000..b552d5a --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/discountList.vue @@ -0,0 +1,408 @@ + +分类 ++ + + + + ++ + + ++ + + ++ + ++ ++ {{ title.name || '分类' + (index + 1) }} + ++ ++ + ++ ++ + ++ + ++ ++ {{ p_item.name |formatLongText }} ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/giftList.vue b/mallplusui-uniapp-app2/pagesA/product/giftList.vue new file mode 100644 index 0000000..2c616d3 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/giftList.vue @@ -0,0 +1,406 @@ + ++ +综合排序 +销量优先 ++ +价格 ++ ++ + + + ++ ++ {{ item.name }} ++ +{{ item.price }} +已售 {{ item.clickCount }} ++ + + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/giftProduct.vue b/mallplusui-uniapp-app2/pagesA/product/giftProduct.vue new file mode 100644 index 0000000..2ce992f --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/giftProduct.vue @@ -0,0 +1,706 @@ + ++ +综合排序 + ++ +价格 ++ ++ + + + ++ ++ {{ item.title }} ++ +{{ item.price }} +已售 6 ++ + + + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/groupActivityDetail.vue b/mallplusui-uniapp-app2/pagesA/product/groupActivityDetail.vue new file mode 100644 index 0000000..7af0f83 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/groupActivityDetail.vue @@ -0,0 +1,1219 @@ + ++ + ++ + + + +{{ detailData.name }} ++ +¥ +{{ detailData.price }} ++ +销量: 6 +库存: {{ detailData.stock }} +浏览量: {{ detailData.hit }} ++ + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + ++ +服务 ++ +7天无理由退换货 · +假一赔十 · ++ + + ++ 图文详情 + + + + ++ + ++ 首页 ++ + ++ 收藏 ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/groupActivityList.vue b/mallplusui-uniapp-app2/pagesA/product/groupActivityList.vue new file mode 100644 index 0000000..24e9680 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/groupActivityList.vue @@ -0,0 +1,381 @@ + ++ + ++ ++ ++ + + + +{{ goods.name }} ++ +¥ +{{ (goods.price * goods.memberRate) / 10 }} +{{ goods.price }} +¥{{ goods.originalPrice }} +¥{{ goods.price }} +佣金 ¥{{ goods.fenxiaoPrice }} +会员折扣{{ goods.memberRate }}折 ++ +销量: {{ goods.sale }} +库存: {{ goods.stock }} +浏览量: {{ goods.hit }} ++ ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + + ++ ++
{{ item.name }} +¥{{ item.price }} + + +{{ groupActivity.name }} +原售价:¥{{ groupActivity.originprice }} +套装价:¥{{ groupActivity.price }} +节省价:¥{{ groupActivity.originprice - groupActivity.price }} +运费价:¥{{ groupActivity.transfee }} + ++ + + ++ + + +购买类型 ++ +{{ sItem.name }} ++ + +服务 ++ +{{ item1 }} ++ + ++ +评价 +({{ consultCount.all }}) +好评 +({{ consultCount.goods }}) + +一般 +({{ consultCount.general }}) + +差评 +({{ consultCount.bad }}) +好评率 {{ consultCount.persent }}% ++ + ++ + +{{ item.memberName }} +{{ item.consultContent }} ++ +购买类型:{{ item.attr }} +{{ item.consultAddtime | formatCreateTime}} ++ + + ++ 图文详情 + + + ++ ++ 首页 ++ ++ 购物车 ++ + ++ 收藏 ++ + + ++ + + ++ ++ ++ ++ +{{item.name}} +在{{item.endTime}}前有效。 可领{{item.perLimit}}张 + ++ +{{item.amount}} +满{{item.minPoint }}可减{{item.amount }} ++ + {{item.categoryTitle?'限' + item.categoryTitle + '可用': '全品类可用'}} ++ + + ++ + ++ ++ + +¥{{ sku.price }} +库存:{{ sku.stock }}件 ++ 已选: + +{{ sItem.name }} ++ + +{{ item.name }} ++ ++ {{ childItem.name }} + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/groupList.vue b/mallplusui-uniapp-app2/pagesA/product/groupList.vue new file mode 100644 index 0000000..e71e738 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/groupList.vue @@ -0,0 +1,407 @@ + ++ +综合排序 + ++ +价格 ++ ++ + + + ++ ++ {{ item.name }} ++ +{{ item.price }} +运费 {{item.transfee}} ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/groupProduct.vue b/mallplusui-uniapp-app2/pagesA/product/groupProduct.vue new file mode 100644 index 0000000..689f520 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/groupProduct.vue @@ -0,0 +1,1097 @@ + ++ +综合排序 +销量优先 ++ +价格 ++ ++ + + + + + ++ ++ {{ item.goods.name }} ++ +{{ item.groupPrice }} +原价 {{ item.goods.price }} ++ + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/list.vue b/mallplusui-uniapp-app2/pagesA/product/list.vue new file mode 100644 index 0000000..6909105 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/list.vue @@ -0,0 +1,528 @@ + ++ + ++ ++ ++ + + + +{{ goods.name }} ++ +¥ +{{ group.groupPrice }} +¥{{ goods.price }} ++ +销量: {{ goods.sale }} +库存: {{ goods.stock }} ++ + +距结束仅剩 ++ ++ + +即将开团 ++ ++ + + + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + + ++ + + +购买类型 ++ +{{ sItem.name }} ++ + ++ ++ +
已成团++ +服务 ++ +{{ item1 }} ++ + ++ +评价 +({{ consultCount.all }}) +好评 +({{ consultCount.goods }}) + +一般 +({{ consultCount.general }}) + +差评 +({{ consultCount.bad }}) +好评率 {{ consultCount.persent }}% ++ + ++ + +{{ item.memberName }} +{{ item.consultContent }} ++ +购买类型:{{ item.attr }} +{{ item.consultAddtime | formatCreateTime}} ++ + + ++ 图文详情 + + + + ++ + ++ 首页 ++ + ++ 收藏 ++ + + + ++ + ++ ++ + +¥{{ sku.price }} +库存:{{ sku.stock }}件 ++ 已选: + +{{ sItem.name }} ++ + +{{ item.name }} ++ ++ {{ childItem.name }} + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/paiMaiDetail.vue b/mallplusui-uniapp-app2/pagesA/product/paiMaiDetail.vue new file mode 100644 index 0000000..e291d60 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/paiMaiDetail.vue @@ -0,0 +1,726 @@ + ++ + +综合排序 +销量优先 ++ + +价格 ++ ++ + + + + + ++ ++ {{ item.name }} ++ +{{ item.price }} +佣金 ¥{{ item.fenxiaoPrice }} ++ +会员价{{ item.vipPrice }} +商品价 ¥{{ item.price }} ++ +{{ item.price }} +已售 {{ item.sale }} ++ + ++ ++ + ++ +{{ item.name }} ++ +{{ item.price }} +已售 {{ item.sale }} ++ + + + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/paiMaiList.vue b/mallplusui-uniapp-app2/pagesA/product/paiMaiList.vue new file mode 100644 index 0000000..d9afddf --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/paiMaiList.vue @@ -0,0 +1,406 @@ + ++ + ++ ++ ++ + +{{ detailData.name }} ++ +¥ +{{ detailData.price }} ++ +出价次数: {{buyCount}} + +浏览量: {{ detailData.hit }} ++ + +剩余: + ++ 已结束 +即将开团 + + ++ + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + ++ +服务 ++ +7天无理由退换货 · +假一赔十 · ++ + + ++ 图文详情 + + + + ++ + ++ 首页 ++ + ++ 收藏 ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/product.vue b/mallplusui-uniapp-app2/pagesA/product/product.vue new file mode 100644 index 0000000..5e46963 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/product.vue @@ -0,0 +1,1283 @@ + ++ +综合排序 +销量优先 ++ +价格 ++ ++ + + + ++ ++ {{ item.name }} ++ +{{ item.price }} +已售 {{ item.sale }} ++ + + + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/secskillDetail.vue b/mallplusui-uniapp-app2/pagesA/product/secskillDetail.vue new file mode 100644 index 0000000..29d7d7c --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/secskillDetail.vue @@ -0,0 +1,1030 @@ + ++ + ++ ++ ++ + +{{ goods.name }} ++ +¥ +{{ (goods.price * goods.memberRate) / 10 }} +{{ goods.price }} +¥{{ goods.originalPrice }} +¥{{ goods.price }} +佣金 ¥{{ goods.fenxiaoPrice }} +会员折扣{{ goods.memberRate }}折 ++ +销量: {{ goods.sale }} +库存: {{ goods.stock }} +浏览量: {{ goods.hit }} ++ + + ++ ++ 铺 + + + + 进入店铺 + ++ + + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + + ++ +规格 ++ +{{ sItem.name }} ++ + + +优惠券 +领取优惠券 ++ + +服务 ++ +{{ item1 }} ++ + ++ +评价 +({{ consultCount.all }}) +好评 +({{ consultCount.goods }}) + +一般 +({{ consultCount.general }}) + +差评 +({{ consultCount.bad }}) +好评率 {{ consultCount.persent }}% ++ + ++ + +{{ item.memberName }} +{{ item.consultContent }} ++ +购买类型:{{ item.attr }} +{{ item.consultAddtime }} ++ + + ++ 图文详情 + + + ++ ++ 首页 ++ ++ 购物车 ++ + ++ 收藏 ++ + + ++ + + ++ ++ ++ ++ +{{ item.name }} +在{{ item.endTime }}前有效。 可领{{ item.perLimit }}张 ++ +{{ item.amount }} +满{{ item.minPoint }}可减{{ item.amount }} ++ + {{ item.categoryTitle ? '限' + item.categoryTitle + '可用' : '全品类可用' }} ++ + + ++ + ++ ++ + +¥{{ (sku.price * goods.memberRate) / 10 }} 原价 ¥{{ sku.price }} +库存:{{ sku.stock }}件 ++ 已选: + +{{ sItem.name }} ++ + +{{ item.name }} ++ ++ {{ childItem.name }} + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesA/product/tag.vue b/mallplusui-uniapp-app2/pagesA/product/tag.vue new file mode 100644 index 0000000..7b1a853 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/tag.vue @@ -0,0 +1,205 @@ + ++ + ++ ++ ++ + + + +{{ goods.name }} ++ +¥ +{{ skillDetail.flashPromotionPrice }} +¥{{ goods.price }} + ++ +销量: {{ goods.sale }} +库存: {{ skillDetail.flashPromotionCount }} +浏览量: {{ goods.hit }} ++ + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + + + ++ + + +优惠券 +领取优惠券 ++ + +服务 ++ +7天无理由退换货 · +假一赔十 · ++ + ++ +评价 +({{ consultCount.all }}) +好评 +({{ consultCount.goods }}) + +一般 +({{ consultCount.general }}) + +差评 +({{ consultCount.bad }}) +好评率 {{ consultCount.persent }}% ++ + ++ + +{{ item.memberName }} +{{ item.consultContent }} ++ +购买类型:{{ item.attr }} +{{ item.consultAddtime | formatCreateTime}} ++ + + ++ 图文详情 + + + ++ ++ 首页 ++ ++ 购物车 ++ + ++ 收藏 ++ + + ++ + + + ++ ++ ++ ++ +{{item.name}} +在{{item.endTime | formatCreateTime}}前有效。 可领{{item.perLimit}}张 + ++ +{{item.amount}} +满{{item.minPoint }}可减{{item.amount }} ++ + {{item.categoryTitle?'限' + item.categoryTitle + '可用': '全品类可用'}} ++ + + + + + + + \ No newline at end of file diff --git a/mallplusui-uniapp-app2/pagesA/product/tagGoodslist.vue b/mallplusui-uniapp-app2/pagesA/product/tagGoodslist.vue new file mode 100644 index 0000000..1ef8f7e --- /dev/null +++ b/mallplusui-uniapp-app2/pagesA/product/tagGoodslist.vue @@ -0,0 +1,483 @@ + ++ + + ++ + ++ + + + ++ ++ + + + + ++ ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/caldar.vue b/mallplusui-uniapp-app2/pagesC/seller/caldar.vue new file mode 100644 index 0000000..beb9ffe --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/caldar.vue @@ -0,0 +1,114 @@ + ++ + +综合排序 +销量优先 ++ + +价格 ++ ++ + + + + + ++ ++ {{ item.name }} ++ +{{ item.price }} +佣金 ¥{{ item.fenxiaoPrice }} ++ +会员价{{ item.vipPrice }} +商品价 ¥{{ item.price }} ++ +{{ item.price }} +已售 {{ item.sale }} ++ ++ ++ + ++ +{{ item.name }} ++ +{{ item.price }} +已售 {{ item.sale }} ++ + + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++ + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/dayStatisc.vue b/mallplusui-uniapp-app2/pagesC/seller/dayStatisc.vue new file mode 100644 index 0000000..0f83336 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/dayStatisc.vue @@ -0,0 +1,180 @@ + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/evaluate.vue b/mallplusui-uniapp-app2/pagesC/seller/evaluate.vue new file mode 100644 index 0000000..a2fa628 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/evaluate.vue @@ -0,0 +1,302 @@ + ++ ++ + ++ +订单数量 +{{homedata.orderCount}}个 ++ ++ + + ++ +会员统计 +{{homedata.memberCount}}人 ++ ++ + + + + ++ +商品统计 +{{homedata.goodsCount}}个 ++ ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/goods.vue b/mallplusui-uniapp-app2/pagesC/seller/goods.vue new file mode 100644 index 0000000..a1cf6ac --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/goods.vue @@ -0,0 +1,649 @@ + ++ + ++ + ++ ++ + ++ + ++ +{{ item.productName }} ++ + +商品评分 ++ ++ + + ++ + ++ ++ ++ + + ++ 上传照片 ++ + + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/index.vue b/mallplusui-uniapp-app2/pagesC/seller/index.vue new file mode 100644 index 0000000..19cb01b --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/index.vue @@ -0,0 +1,947 @@ + ++ + +{{ item.text }} ++ ++ ++ + + ++ + + + ++ +{{ item.createTime }} +{{ item.id }} +删除 ++ + ++
+ +{{ item.name }} ++ {{ item.price }} ++ + + + + + + + + + + ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/login.vue b/mallplusui-uniapp-app2/pagesC/seller/login.vue new file mode 100644 index 0000000..66287f7 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/login.vue @@ -0,0 +1,239 @@ + ++ + + + + + + ++ + + + + ++ ++ + +{{ swiperCurrent + 1 }} +/ +{{ swiperLength }} ++ + ++ ++ 店铺 ++ ++ 商品 ++ ++ 订单 ++ ++ 会员 ++ ++ 营销 ++ ++ + ++ +今日订单 ++ +今日总额 ++ +昨日订单 ++ +昨日总额 ++ +待付款 ++ +待发货 ++ +申请退款 ++ +已关闭 ++ + ++ + ++ ++ +今日新增会员 ++ +昨日新增会员 ++ +当月新增会员 ++ +男会员 ++ +女会员 ++ + +所有会员 ++ + ++ + + ++ ++ +在售商品 ++ +仓库中 ++ +已售馨 ++ +今日新增商品 ++ +昨日新增商品 ++ + +所有商品 ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/member.vue b/mallplusui-uniapp-app2/pagesC/seller/member.vue new file mode 100644 index 0000000..a00ace6 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/member.vue @@ -0,0 +1,567 @@ + ++ + + + + +LOGIN +欢迎回来! ++ + ++ +手机号码 + ++ +密码 + +忘记密码? ++ 还没有账号? + + +马上注册 ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/monthStatisc.vue b/mallplusui-uniapp-app2/pagesC/seller/monthStatisc.vue new file mode 100644 index 0000000..3873e3d --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/monthStatisc.vue @@ -0,0 +1,178 @@ + ++ ++ +{{ item.createTime }} +{{ item.id }}-- +{{ item.username }} ++ + + ++
+ +余额{{ item.blance }} +积分{{ item.integration }} ++ + + + + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/order.vue b/mallplusui-uniapp-app2/pagesC/seller/order.vue new file mode 100644 index 0000000..4a4e60a --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/order.vue @@ -0,0 +1,648 @@ + ++ ++ + ++ +订单数量 +{{homedata.orderCount}}个 ++ ++ + + ++ +会员统计 +{{homedata.memberCount}}人 ++ ++ + + + + ++ +商品统计 +{{homedata.goodsCount}}个 ++ ++ + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/orderDetail.vue b/mallplusui-uniapp-app2/pagesC/seller/orderDetail.vue new file mode 100644 index 0000000..8b11e2d --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/orderDetail.vue @@ -0,0 +1,582 @@ + ++ + +{{ item.text }} ++ ++ ++ + + ++ + + + ++ + +{{ item.createTime }} +{{ item.id }}-- +{{ item.stateTip }} ++ + ++ ++
+ + ++
+ +{{ goodsItem.productName }} +{{ goodsItem.productAttr }} x {{ goodsItem.productQuantity }} +{{ goodsItem.productPrice }} ++ 共 + +{{ item.orderItemList.length }} + 件商品 实付款 +{{ item.payAmount }} ++ +秒杀订单 +拼团订单 +团购订单 +砍价订单 +积分订单 + + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/secskill.vue b/mallplusui-uniapp-app2/pagesC/seller/secskill.vue new file mode 100644 index 0000000..b818de5 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/secskill.vue @@ -0,0 +1,577 @@ + ++ ++ ++ + ++ ++ +{{ orderInfo.createTime }} +{{ orderInfo.id }}-- +{{ orderInfo.stateTip }} ++ + + +订单商品 ++ ++
+ +{{ goodsItem.productName }} +{{ goodsItem.productAttr }} x {{ goodsItem.productQuantity }} +{{ goodsItem.productPrice }} ++ +订单赠品 ++ ++
+ +{{ goodsItem.productName }} +{{ goodsItem.productAttr }} x {{ goodsItem.productQuantity }} +{{ goodsItem.productPrice }} ++ 共 + +{{ orderInfo.orderItemList.length }} + 件商品, 优惠金额 +{{ orderInfo.promotionAmount }} + ,运费 +{{ orderInfo.freightAmount }} ++ + ,实付款 +活动金额 +¥{{ groupActivity.price }} +{{ orderInfo.payAmount }} ++ + + + + + ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/stack.vue b/mallplusui-uniapp-app2/pagesC/seller/stack.vue new file mode 100644 index 0000000..beaf6b0 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/stack.vue @@ -0,0 +1,161 @@ + ++ + + + + + + ++ + + + + ++ ++ + +{{ swiperCurrent + 1 }} +/ +{{ swiperLength }} ++ + + + ++ ++ {{ item1.flashName }} ++ ++ +{{ item2.startTime }} +~ +{{ item2.endTime }} + ++ ++ ++ ++ {{ item.productName }} +秒杀价 ¥{{ item.flashPromotionPrice }} +原价 ¥{{ item.productPrice }} ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/seller/store.vue b/mallplusui-uniapp-app2/pagesC/seller/store.vue new file mode 100644 index 0000000..90f8b8e --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/seller/store.vue @@ -0,0 +1,722 @@ + ++ +页面地址 ++ + +pages/basic/column/stack ++ +堆叠柱状图 ++ + + + + + + + ++ +标准数据格式 ++ + +Tips:修改后点击更新图表 + + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/applyBusiness.vue b/mallplusui-uniapp-app2/pagesC/store/applyBusiness.vue new file mode 100644 index 0000000..d89ce5c --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/applyBusiness.vue @@ -0,0 +1,333 @@ + ++ + ++ + + + +{{ detailData.name }} + ++ +浏览量: {{ detailData.hit }} +收藏量: {{ detailData.collect }} +商品量: {{ detailData.goodsCount }} ++ + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + ++ +服务 ++ +7天无理由退换货 · +假一赔十 · ++ ++ +地址 ++ +{{detailData.addressProvince}} · +{{detailData.addressCity}} · +{{detailData.addressArea}} · +{{detailData.addressDetail}} · ++ + + ++ ++ + ++ ++ ++ {{ item.name }} +¥{{ item.price }} ++ +查看全部 +More+ ++ + + ++ + + ++ 首页 ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/businessDetails.vue b/mallplusui-uniapp-app2/pagesC/store/businessDetails.vue new file mode 100644 index 0000000..aef89d6 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/businessDetails.vue @@ -0,0 +1,1036 @@ + ++ ++ +点击上传商家logo ++ ++ + + ++ +商家名称: ++ + ++ ++ +商家QQ: ++ + ++ ++ +商家手机号: ++ + ++ + + ++ +商家类别: ++ ++ + ++ ++ +{{addressName}} ++ ++ + + + + ++ +商家介绍: ++ + ++ + ++ +点击上传营业执照: ++ ++ + + + + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/index.vue b/mallplusui-uniapp-app2/pagesC/store/index.vue new file mode 100644 index 0000000..f4bb841 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/index.vue @@ -0,0 +1,365 @@ + ++ + ++ ++ + ++ ++ + ++ {{name}} + ++ {{store.supportPhone}} + + + ++ ++ ++ + ++ + + ++ + ++ + ++ 商品 + ++ 分类 + ++ 评价({{pingjia.length}}) + ++ 评价(99+) + ++ 商家 + ++ 门店 + ++ + ++ ++ ++ ++ ++ {{item.name}} ++ +{{item.price}} +已售 {{item.sale}} ++ + ++ ++ + + ++ + {{item.name}} ++ + ++ ++ ++ + 店铺评价 ++ 全部评价({{pingjia.length}}) + + ++ + ++ + ++ + + ++ ++ {{item.name}} + +未设置昵称 ++ {{item.createTime |formatCreateTime}} + ++ {{item.memo}} + ++ 暂无评价 + + ++ + ++ ++ ++ {{store.addressDetail}} ++ + + ++ + + + + ++ ++ ++ + ++ + ++ + ++ + ++ + ++ + +暂无商家记录 ++ + ++ + + +{{ item.storeName }}【{{item.linkman}}】 ++ ++ + + + + {{ item.collect }} ++ + +{{ item.mobile }} ++ + ++ +识别二维码添加店家微信 ++ {{name}} +微信号{{store.contactQq}} +客服电话:{{store.supportPhone}} ++ + ++ + +请输入评价内容 + ++ ++ 取消 + ++ 确定 + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/list.vue b/mallplusui-uniapp-app2/pagesC/store/list.vue new file mode 100644 index 0000000..5c090e7 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/list.vue @@ -0,0 +1,279 @@ + ++ + + ++ ++ 订阅消息,及时获取订单最新动态 ++ +消息订阅 +× ++ + + + + + + + + + + + + + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/school.vue b/mallplusui-uniapp-app2/pagesC/store/school.vue new file mode 100644 index 0000000..f88035f --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/school.vue @@ -0,0 +1,742 @@ + ++ ++ ++ {{ item.name }} ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/schoolList.vue b/mallplusui-uniapp-app2/pagesC/store/schoolList.vue new file mode 100644 index 0000000..977cd64 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/schoolList.vue @@ -0,0 +1,386 @@ + ++ + ++ + + + +{{ detailData.name }} + ++ +销量: 6 +库存: {{ detailData.stock }} +浏览量: {{ detailData.hit }} ++ + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + ++ +服务 ++ +7天无理由退换货 · +假一赔十 · ++ + + ++ ++ ++ {{ item.name }} +¥{{ item.price }} ++ + + ++ + ++ 首页 ++ ++ 收藏 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/store.vue b/mallplusui-uniapp-app2/pagesC/store/store.vue new file mode 100644 index 0000000..074ed4b --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/store.vue @@ -0,0 +1,1039 @@ + ++ +综合排序 + ++ +热度 ++ ++ + + ++ ++ {{ item.name }} ++ + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/storeList.vue b/mallplusui-uniapp-app2/pagesC/store/storeList.vue new file mode 100644 index 0000000..0035613 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/storeList.vue @@ -0,0 +1,382 @@ + ++ + + + + + + + + + ++ + + + + ++ + +{{ swiperCurrent + 1 }} +/ +{{ swiperLength }} ++ ++ ++ {{ item1.name }} ++ + ++ ++ {{ item1.name }} ++ + ++ ++ 返 + 该商品分享可领49减10红包 ++ + 立即分享 + ++ + + ++ + +店铺推荐 +Guess You Like It ++ + + + ++ ++ {{ item.name }} +¥{{ item.price }} ++ + ++ + +新品上市 +Guess You Like It ++ + + ++ ++ {{ item.name }} +¥{{ item.price }} ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesC/store/storeResult.vue b/mallplusui-uniapp-app2/pagesC/store/storeResult.vue new file mode 100644 index 0000000..3e04f12 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesC/store/storeResult.vue @@ -0,0 +1,95 @@ + ++ +综合排序 + ++ +价格 ++ ++ + + + ++ ++ {{ item.name }} ++ +浏览{{ item.hit }} +收藏 {{item.collect}} ++ + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/address/address.vue b/mallplusui-uniapp-app2/pagesU/address/address.vue new file mode 100644 index 0000000..d70e754 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/address/address.vue @@ -0,0 +1,180 @@ + ++ {{orderInfo.name}} ++ 申请中---- + ++ 申请拒绝---- + ++ + +用户中心 +返回首页 ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/address/addressManage.vue b/mallplusui-uniapp-app2/pagesU/address/addressManage.vue new file mode 100644 index 0000000..656781e --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/address/addressManage.vue @@ -0,0 +1,220 @@ + ++ + + + + ++ ++ +{{ item.name }} +{{ item.phoneNumber }} ++ + +默认 +{{ item.province }}-{{ item.city }}-{{ item.region }}-{{ item.detailAddress }} ++ ++ ++ 编辑 ++ ++ 删除 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/address/addressManage1.vue b/mallplusui-uniapp-app2/pagesU/address/addressManage1.vue new file mode 100644 index 0000000..77669ff --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/address/addressManage1.vue @@ -0,0 +1,314 @@ + ++ +联系人 + ++ + +手机号 + ++ +城市 + ++ + + + +地图: + + + ++ + + + +详细 + ++ + +设为默认 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/marking/index.vue b/mallplusui-uniapp-app2/pagesU/marking/index.vue new file mode 100644 index 0000000..e69de29 diff --git a/mallplusui-uniapp-app2/pagesU/notice/notice.vue b/mallplusui-uniapp-app2/pagesU/notice/notice.vue new file mode 100644 index 0000000..febfcf1 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/notice/notice.vue @@ -0,0 +1,202 @@ + ++ +收货人: ++ + +手机号: ++ + +地区: ++ +{{ pickerText }} + ++ +地址定位: ++ + + ++ + + + +详细地址: ++ + ++ + + +设为默认收件地址: ++ + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/notice/notice1.vue b/mallplusui-uniapp-app2/pagesU/notice/notice1.vue new file mode 100644 index 0000000..3f87e0f --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/notice/notice1.vue @@ -0,0 +1,151 @@ + ++ + +{{ item.createTime |formatCreateTime}} ++ +{{ item.title }} ++ {{ item.description }} ++ +查看详情 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/notice/subjectDetail.vue b/mallplusui-uniapp-app2/pagesU/notice/subjectDetail.vue new file mode 100644 index 0000000..c30530b --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/notice/subjectDetail.vue @@ -0,0 +1,655 @@ + ++ +11:30 ++ +新品上市,全场满199减50 ++ ++ 虽然做了一件好事,但很有可能因此招来他人的无端猜测,例如被质疑是否藏有其他利己动机等,乃至谴责。即便如此,还是要做好事。 ++ +查看详情 ++ + +昨天 12:30 ++ +新品上市,全场满199减50 ++ ++ 活动结束 ++ +查看详情 ++ + +2019-07-26 12:30 ++ +新品上市,全场满199减50 ++ ++ 活动结束 +新品上市全场2折起,新品上市全场2折起,新品上市全场2折起,新品上市全场2折起,新品上市全场2折起 ++ +查看详情 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/notice/subjectList.vue b/mallplusui-uniapp-app2/pagesU/notice/subjectList.vue new file mode 100644 index 0000000..328a500 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/notice/subjectList.vue @@ -0,0 +1,371 @@ + ++ + ++ ++ ++ + + +{{ detailData.title }} + ++ +收藏量: {{ detailData.collectCount }} +评论量: {{ detailData.commentCount }} +浏览量: {{ detailData.readCount }} ++ + ++ ++ +{{ detailData.description }} ++ + + ++ 图文详情 + + + + ++ + ++ 首页 ++ ++ 收藏 ++ + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/README.md b/mallplusui-uniapp-app2/pagesU/user/README.md new file mode 100644 index 0000000..9149c99 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/README.md @@ -0,0 +1,100 @@ +## 使用说明: +| 属性名 | 类型 | 说明 | +| -------- | -----: | :----: | +| date | String | 当前日期,格式支持YYYY-MM | +| list | Array | 已经签到的时间列表,格式支持YYYY-MM-DD、MM-DD、DD | +| signin_fun | function | 当天签到时调用,返回签到的日期信息 | +| repair | Boolean | 是否开启补签 | +| rule | Boolean | 补签规则开关,默认false,没有补签规则 | +| repair_fun | function | 开启补签后,补签时调用,返回签到的日期信息 | +| choose_date | Boolean | 是否可以选择日期 | +| date_change | function | 当前日期改变时调用 | + +``` html ++ +{{item.name}} + ++ ++ ++ {{ item.title }} ++ +收藏量 {{ item.collectCount }} +浏览量 {{ item.readCount }} ++ + + + ++ ++ ++ +{{ item.name }} ++ {{ tItem.name }} + ++``` + +```javascript +data() { + return { + // 是否可以选择日期 + choose_date: false, + // 当前日期 + date: "2019-03", + // 签到成功列表 + list: ["2019-03-10", "03-15", "20"], + // 是否开启补签 + repair: false, + // 是否开启补签规则 + rule: false, + } +}, +methods: { + // 签到时触发 + signin_fun(res) { + console.log(res) + this.list.push(res.day) + uni.showToast({ + title: "签到成功", + icon: "none" + }) + }, + // 补签成功时触发 + repair_fun(res) { + console.log(res) + this.list.push(res.day) + uni.showToast({ + title: "补签成功", + icon: "none" + }) + }, + // 当月份改变时触发 + date_change(date) { + console.log(date); + // 更新当前日期 + this.date = date; + // 更新签到列表 + this.list = ["01", "02"]; + }, +} +``` + +Tips: + * 有啥问题和建议或者错误不足之处,还望各位大神指出,急的话+QQ:806834390。 + + +### 历史版本 +---- +#### V1.0.0 2019/03/22 +只有最简单的签到和补签功能。 +#### V1.1.0 2019/03/23 +经大神指点,新增签到按钮和提示,新增补签规则:只能从补签的第一个日期开始补签。 +#### V1.2.0 2019/03/24 +经大神反馈,修改后的新版本已兼容微信小程序。 +#### V1.3.0 2019/03/25 +新增补签规则开关rule。 +#### V1.4.0 2019/04/02 +修复一个重大BUG(日期的计算有问题),感谢那位发现问题的大神O(≧∇≦)O +#### V1.5.0 2019/04/06 +优化了部分代码,新增日期选择功能,现在可以查看上n月的签到信息了。 +#### V1.6.0 2019/04/10 +修复了一个BUG。 +#### V1.7.0 2019/04/11 +修复了一个样式上的问题,当窗口正好处于某些宽度时,星期天会因为宽度不够,被挤到下一行。感谢Tonybo通过QQ邮箱告诉我。 +#### V1.8.0 2019/04/11 +修复了一个渲染时判断不对的问题,啊——!还以为不会有问题了!!!咳咳,感谢那些告诉我问题的人。 +#### V1.9.0 2019/05/16 +我的错,虽然我已经不知道item.index是用来做什么用的了,删掉就行,不然小程序上会出现undefined,感谢安雨忻的反馈。 +#### V2.0.0 2019/05/27 +根据同事的反馈,所有事件都阻止了冒泡,防止触发其它的自定义事件。 +#### V2.1.0 2019/05/31 +修复了日期不能选择或出错的问题,顺便把代码重新看了一遍,感谢Await的反馈,也在这里向那些下载了插件的人说声“对不起”,是我没有做好。 diff --git a/mallplusui-uniapp-app2/pagesU/user/applyMember.vue b/mallplusui-uniapp-app2/pagesU/user/applyMember.vue new file mode 100644 index 0000000..32af21d --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/applyMember.vue @@ -0,0 +1,284 @@ + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/balance.vue b/mallplusui-uniapp-app2/pagesU/user/balance.vue new file mode 100644 index 0000000..f33ab31 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/balance.vue @@ -0,0 +1,102 @@ + ++ + ++ ++ 我的账户余额:{{money}} 元 + ++ ++ 会员等级 + ++ ++ ++ + ++ {{amount.price}}元 {{amount.name}} + ++ ++ 选择支付方式 + ++ ++ + ++ + ++ ++ + 支付宝支付 + ++ ++ + ++ ++ + 微信支付 + ++ ++ + ++ ++ + 余额支付 + ++ ++ + + +立即升级 + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/collect.vue b/mallplusui-uniapp-app2/pagesU/user/collect.vue new file mode 100644 index 0000000..af10f4b --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/collect.vue @@ -0,0 +1,557 @@ + ++ + ++ +¥{{totalMoney}} +账户余额 ++ ++ +充值 ++ +提现 ++ +说明 ++ ++ ++ +充值记录 ++ + ++ +提现记录 ++ + + ++ ++ +交易流水 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/coupon.vue b/mallplusui-uniapp-app2/pagesU/user/coupon.vue new file mode 100644 index 0000000..12a0353 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/coupon.vue @@ -0,0 +1,513 @@ + ++ + +{{ item.text }} ++ + ++ ++ + ++ + + + + ++ + +{{ item.addTime }} + ++ + ++ + +{{ item.name }} +{{ item.meno3 }} +{{ item.meno2 }} ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/deposit.vue b/mallplusui-uniapp-app2/pagesU/user/deposit.vue new file mode 100644 index 0000000..1a9b5c6 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/deposit.vue @@ -0,0 +1,869 @@ + ++ +可用({{couponValidList.length}}) 已失效({{couponinvalidList.length}}) ++ + + + + ++ +没有数据~ ++ + ++ + ++ + ++ ++ {{row.note}} + ++ 永久有效 + + ++ {{row.startTime|formatCreateTime}} ~ {{row.endTime |formatCreateTime}} + ++ + + ++ ++ + ++ + ++ {{row.amount}} 元 + ++ 去使用 + ++ +没有数据~ ++ + ++ + ++ + ++ ++ {{row.note}} + ++ 已失效 + + ++ {{row.startTime |formatCreateTime}} ~ {{row.endTime |formatCreateTime}} + ++ + ++ + + ++ ++ + ++ + ++ {{row.amount}}元 + + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/forget.vue b/mallplusui-uniapp-app2/pagesU/user/forget.vue new file mode 100644 index 0000000..c9d8356 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/forget.vue @@ -0,0 +1,488 @@ + ++ ++ + +我的账户 +交易明细 ++ ++ 我的账户余额:{{money}} 元 + ++ ++ 充值金额 + ++ ++ ++ ++ {{amount}}元 + ++ ++ 自定义充值金额 + ++ + ++ ++ 选择支付方式 + ++ ++ + ++ + ++ ++ + 支付宝支付 + ++ ++ + ++ ++ + 微信支付 + ++ ++ + +立即充值 + ++ +去提现 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/integral.vue b/mallplusui-uniapp-app2/pagesU/user/integral.vue new file mode 100644 index 0000000..562d3d0 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/integral.vue @@ -0,0 +1,190 @@ + ++ + + + + +LOGIN ++ 忘记密码! + ++ + + ++ +手机号码 + ++ +密码 + ++ +密码 + ++ + + ++ + +验证码 + ++ 已有账号? + +返回登录 ++ + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/invite.vue b/mallplusui-uniapp-app2/pagesU/user/invite.vue new file mode 100644 index 0000000..7519a6f --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/invite.vue @@ -0,0 +1,326 @@ + ++ + ++ + + ++ 库存积分 ++ ++ +0 +{{integral/100}} +可支配积分 ++ ++ +账单明细 ++ + +购买积分 ++ + +赠送积分 ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/inviteList.vue b/mallplusui-uniapp-app2/pagesU/user/inviteList.vue new file mode 100644 index 0000000..bde1a2b --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/inviteList.vue @@ -0,0 +1,162 @@ + ++ + ++ +我的专属邀请码 +{{code}} +快去分享您的邀请码吧,让更多的好友加入到【{{appTitle}}】,您也可以获得丰厚的奖励! ++ ++ ++ ¥{{money}}元 +邀请收益 ++ ++ {{number}}人 +邀请人数 ++ +谁推荐你的? + +提交 ++ + + + + + + + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/inviteMoney.vue b/mallplusui-uniapp-app2/pagesU/user/inviteMoney.vue new file mode 100644 index 0000000..4e988ca --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/inviteMoney.vue @@ -0,0 +1,416 @@ + ++ ++ ++ + ++ + + + + + + + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/myPurse.vue b/mallplusui-uniapp-app2/pagesU/user/myPurse.vue new file mode 100644 index 0000000..845db54 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/myPurse.vue @@ -0,0 +1,580 @@ + ++ + + + + ++ + + + ++ + + + +{{ item.createTime }} +订单编号:{{ item.orderId }} +商品编号:{{ item.goodsId }} +佣金:{{ item.money }} + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/profile.vue b/mallplusui-uniapp-app2/pagesU/user/profile.vue new file mode 100644 index 0000000..f5665ab --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/profile.vue @@ -0,0 +1,190 @@ + ++ ++ +{{money/100}} ++ +可提现金额 ++ +提现明细 ++ ++ + ++ +请输入提现金额 +¥ ++ + ++ + +请选择提现账户 ++ + ++ ++ +支付宝账号: ++ + ++ ++ +真实姓名: ++ + ++ + ++ + ++ ++ 支付宝 + ++ ++ 微信 + ++ + + + + + diff --git a/mallplusui-uniapp-app2/pagesU/user/reset_password.vue b/mallplusui-uniapp-app2/pagesU/user/reset_password.vue new file mode 100644 index 0000000..6f8cbb8 --- /dev/null +++ b/mallplusui-uniapp-app2/pagesU/user/reset_password.vue @@ -0,0 +1,127 @@ + ++ + +我的头像 ++ ++ + + +修改昵称:{{userInfos.nickname|| ''}} ++ + + +修改性别 ++ + + ++ ++ ++ + ++ + + + + + + diff --git a/mallplusui-uniapp-app2/plugins/APPUpdate/APPUpdate.md b/mallplusui-uniapp-app2/plugins/APPUpdate/APPUpdate.md new file mode 100644 index 0000000..b6dbc1d --- /dev/null +++ b/mallplusui-uniapp-app2/plugins/APPUpdate/APPUpdate.md @@ -0,0 +1,106 @@ +# APP版本更新、强制更新、漂亮的更新界面、IOS更新(跳转IOS store)、wgt更新 + +### QQ交流群(学习干货多多) 607391225 + + +### 常见问题 +1.安卓apk下载完成后没有更新APP? + +答:问题是因为没有添加APP安装应用的权限,解决方法在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限 +``` ++ + ++ ++ + + ++ ++ + +密码长度8~24位,必须包含数字/字母/符号至少2种以上元素 ++ + + ++ +``` +若还有问题请看[安装apk无法执行的解决方案](https://ask.dcloud.net.cn/article/35703 "安装apk无法执行的解决方案") + +2.APP更新后版本号没变,还是之前的版本号? + +答:可能是更新的安装包没有升级版本号,`manifest.json`文件里面基本设置`应用版本号`和`应用版本名称`需要升高 + +3.APP更新后没有覆盖之前的APP? + +答:可能是更新的安装包`包名`和APP的`包名`不一样 + +### 第一步配置APP更新接口 +在`APPUpdate.js`里面`getServerNo`函数方法配置更新接口 +``` +let httpData = { + version:version +}; +if (platform == "android") { + httpData.type = 1101; +} else { + httpData.type = 1102; +} +/* 接口入参说明 + * version: 应用当前版本号(已自动获取) + * type:平台(1101是安卓,1102是IOS) + */ +$http.get("api/kemean/aid/app_version", httpData).then(res => { + /*接口出参说明 (res数据说明) + * | 参数名称 | 一定返回 | 类型 | 描述 + * | -------------|--------- | --------- | ------------- | + * | versionCode | y | int | 版本号 | + * | versionName | y | String | 版本名称 | + * | versionInfo | y | String | 版本信息 \n 换行(例如:1.修改了bug1 \n 2.修改了bug2 \n 3.修改了bug3) | + * | forceUpdate | y | boolean | 是否强制更新 | + * | downloadUrl | y | String | 版本下载链接 `IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接` | + */ +}); +``` + +### 第二步 使用方法 +``` +// App.vue页面 + +// #ifdef APP-PLUS +import APPUpdate from "@/plugins/APPUpdate"; +// #endif + +onLaunch: function(e) { + // #ifdef APP-PLUS + APPUpdate(); + // #endif +} +``` + +### 第三步 添加APP安装应用的权限 +在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限 +``` + + +``` + +### 修改弹窗的主题色或弹窗图标 +在`APPUpdate.js`里面上面`$mainColor`常量中定义主题颜色,`$iconUrl`常量中定义图标地址 + +### 检查APP是否有新版本(一般在设置页面使用) +``` +// #ifdef APP-PLUS +import APPUpdate, { getCurrentNo } from "@/plugins/APPUpdate"; +// #endif +export default { + data() { + return { + version: "" // 版本号 + }; + }, + //第一次加载 + onLoad(e) { + // #ifdef APP-PLUS + getCurrentNo(res => { + // 进页面获取当前APP版本号(用于页面显示) + this.version = res.version; + }); + // #endif + }, + //方法 + methods: { + // 检查APP是否有新版本 + onAPPUpdate() { + // true 没有新版本的时候有提示,默认:false + APPUpdate(true); + } + } +} +``` \ No newline at end of file diff --git a/mallplusui-uniapp-app2/plugins/APPUpdate/index.js b/mallplusui-uniapp-app2/plugins/APPUpdate/index.js new file mode 100644 index 0000000..b66cda6 --- /dev/null +++ b/mallplusui-uniapp-app2/plugins/APPUpdate/index.js @@ -0,0 +1,816 @@ +// #ifdef APP-PLUS +import $api from '@/common/api'; +import $http from '@/config/requestConfig'; +const platform = uni.getSystemInfoSync().platform; +// 主颜色 +const $mainColor = "FF5B78"; +// 弹窗图标url +const $iconUrl = "/static/icon/ic_ar.png"; +// 获取当前应用的版本号 +export const getCurrentNo = function(callback) { + // 获取本地应用资源版本号 + plus.runtime.getProperty(plus.runtime.appid, function(inf) { + callback && callback({ + versionCode: inf.version.replace(/\./g, ""), + version: inf.version + }); + }); +} +// 发起ajax请求获取服务端版本号 +export const getServerNo = function(version, isPrompt = false, callback) { + let userInfos = uni.getStorageSync('userInfos'); + console.log(userInfos); + console.log(userInfos.username) + let userName = userInfos.username; + let httpData = { + version: version, + userName:userName + }; + console.log(userName) + if (platform == "android") { + httpData.type = 1101; + } else { + httpData.type = 1102; + } + /* 接口入参说明 + * version: 应用当前版本号(已自动获取) + * type:平台(1101是安卓,1102是IOS) + */ + $http.get("api/appVersion/versioninfo", httpData, { + isPrompt: isPrompt + }).then(res => { + /* res的数据说明 + * | 参数名称 | 一定返回 | 类型 | 描述 + * | -------------|--------- | --------- | ------------- | + * | versionCode | y | int | 版本号 | + * | versionName | y | String | 版本名称 | + * | versionInfo | y | String | 版本信息 | + * | forceUpdate | y | boolean | 是否强制更新 | + * | downloadUrl | y | String | 版本下载链接(IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接) | + */ + console.log(res) + console.log(JSON.parse(res)); + console.log(JSON.stringify(JSON.parse(res))) + console.log(JSON.parse(res).downloadUrl) + if (res && JSON.parse(res).downloadUrl && version < JSON.parse(res).versionCode) { + callback && callback(res); + } else if (isPrompt) { + uni.showToast({ + title: "暂无新版本", + icon: "none" + }); + } + }); +} +// 从服务器下载应用资源包 +export const getDownload = function(res) { + //let data = JSON.parse(res); + let data = res; + let popupData = { + progress: true, + buttonNum: 2 + }; + if (data.forceUpdate) { + popupData.buttonNum = 0; + } + let file = data.fileName + let dtask; + let lastProgressValue = 0; + downloadPopup(popupData, function(res) { + dtask = plus.downloader.createDownload(data.downloadUrl, { + // filename: '_doc/update/' + file + '/' + new Date().getTime() + '/' + filename: '_doc/update/' + new Date().getTime() + '/' + file + }, function(download, status) { + console.log("status=====:" + status) + if (status == 200) { + res.change({ + progressValue: 100, + progressTip: "正在安装文件...", + progress: true, + buttonNum: 0 + }); + console.log(download.filename) + plus.runtime.install(download.filename, { + force: false + }, function() { + // plus.runtime.restart();//下载后重启app + res.change({ + contentText: "应用资源更新完成!", + buttonNum: 1, + progress: false + }); + }, function(e) { + res.cancel(); + plus.nativeUI.alert("安装文件失败[" + e.code + "]:" + e.message); + }); + } else { + res.change({ + contentText: "文件下载失败...", + buttonNum: 1, + progress: false + }); + } + }); + dtask.start(); + dtask.addEventListener("statechanged", function(task, status) { + switch (task.state) { + case 1: // 开始 + res.change({ + progressValue: 0, + progressTip: "准备下载...", + progress: true + }); + break; + case 2: // 已连接到服务器 + res.change({ + progressValue: 0, + progressTip: "开始下载...", + progress: true + }); + break; + case 3: + const progress = parseInt(task.downloadedSize / task.totalSize * 100); + if (progress - lastProgressValue >= 2) { + lastProgressValue = progress; + res.change({ + progressValue: progress, + progressTip: "已下载" + progress + "%", + progress: true + }); + } + + break; + } + }); + }, function() { + // 取消下载 + dtask && dtask.abort(); + uni.showToast({ + title: "已取消下载", + icon: "none" + }); + }, + function() { + // 重启APP + plus.runtime.restart(); + }); +} +// 文字换行 +function drawtext(text, maxWidth) { + debugger + let textArr = text.split(" "); + let len = textArr.length; + // 上个节点 + let previousNode = 0; + // 记录节点宽度 + let nodeWidth = 0; + // 文本换行数组 + let rowText = []; + // 如果是字母,侧保存长度 + let letterWidth = 0; + // 汉字宽度 + let chineseWidth = 14; + // otherFont宽度 + let otherWidth = 7; + for (let i = 0; i < len; i++) { + if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) { + if (letterWidth > 0) { + if (nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i) + }); + previousNode = i; + nodeWidth = chineseWidth; + letterWidth = 0; + } else { + nodeWidth += chineseWidth + letterWidth * otherWidth; + letterWidth = 0; + } + } else { + if (nodeWidth + chineseWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i) + }); + previousNode = i; + nodeWidth = chineseWidth; + } else { + nodeWidth += chineseWidth; + } + } + } else { + if (/\n/g.test(textArr[i])) { + rowText.push({ + type: "break", + content: text.substring(previousNode, i) + }); + previousNode = i + 1; + nodeWidth = 0; + letterWidth = 0; + } else if (textArr[i] == "\\" && textArr[i + 1] == "n") { + rowText.push({ + type: "break", + content: text.substring(previousNode, i) + }); + previousNode = i + 2; + nodeWidth = 0; + letterWidth = 0; + } else if (/[a-zA-Z0-9]/g.test(textArr[i])) { + letterWidth += 1; + if (nodeWidth + letterWidth * otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i + 1 - letterWidth) + }); + previousNode = i + 1 - letterWidth; + nodeWidth = letterWidth * otherWidth; + letterWidth = 0; + } + } else { + if (nodeWidth + otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i) + }); + previousNode = i; + nodeWidth = otherWidth; + } else { + nodeWidth += otherWidth; + } + } + } + } + if (previousNode < len) { + rowText.push({ + type: "text", + // content: text.substring(previousNode, len) + content: text + }); + } + return rowText; +} +// 是否更新弹窗 +function updatePopup(res, callback) { + console.log(res); + //let data = JSON.parse(res); + let data = res; + console.log(data.versionInfo) + // 弹窗遮罩层 + let maskLayer = new plus.nativeObj.View("maskLayer", { //先创建遮罩层 + top: '0px', + left: '0px', + height: '100%', + width: '100%', + backgroundColor: 'rgba(0,0,0,0.5)' + }); + + // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 + const screenWidth = plus.screen.resolutionWidth; + const screenHeight = plus.screen.resolutionHeight; + //弹窗容器宽度 + const popupViewWidth = screenWidth * 0.7; + // 弹窗容器的Padding + const viewContentPadding = 20; + // 弹窗容器的宽度 + const viewContentWidth = parseInt(popupViewWidth - (viewContentPadding * 2)); + // 描述的列表 + const descriptionList = drawtext(data.versionInfo, viewContentWidth); + // 弹窗容器高度 + let popupViewHeight = 80 + 20 + 20 + 90 + 10; + let popupViewContentList = [{ + src: $iconUrl, + id: "logo", + tag: "img", + position: { + top: "0px", + left: (popupViewWidth - 124) / 2 + "px", + width: "124px", + height: "80px", + } + }, + { + tag: 'font', + id: 'title', + text: "发现新版本" + data.versionName, + textStyles: { + size: '18px', + color: "#333", + weight: "bold", + whiteSpace: "normal" + }, + position: { + top: '90px', + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "30px", + } + } + ]; + const textHeight = 18; + let contentTop = 130; + descriptionList.forEach((item, index) => { + if (index > 0) { + popupViewHeight += textHeight; + contentTop += textHeight; + } + popupViewContentList.push({ + tag: 'font', + id: 'content' + index + 1, + text: item.content, + textStyles: { + size: '14px', + color: "#666", + lineSpacing: "50%", + align: "left" + }, + position: { + top: contentTop + "px", + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: textHeight + "px", + } + }); + if (item.type == "break") { + contentTop += 10; + popupViewHeight += 10; + } + }); + // 弹窗内容 + let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单 + tag: "rect", + top: (screenHeight - popupViewHeight) / 2 + "px", + left: '15%', + height: popupViewHeight + "px", + width: "70%" + }); + // 绘制白色背景 + popupView.drawRect({ + color: "#FFFFFF", + radius: "8px" + }, { + top: "40px", + height: popupViewHeight - 40 + "px", + }); + // 绘制底边按钮 + popupView.drawRect({ + radius: "3px", + borderColor: "#f1f1f1", + borderWidth: "1px", + }, { + bottom: viewContentPadding + 'px', + left: viewContentPadding + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + }); + // 绘制底边按钮 + popupView.drawRect({ + radius: "3px", + color: $mainColor, + }, { + bottom: viewContentPadding + 'px', + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + }); + popupViewContentList.push({ + tag: 'font', + id: 'cancelText', + text: "暂不升级", + textStyles: { + size: '14px', + color: "#666", + lineSpacing: "0%", + whiteSpace: "normal" + }, + position: { + bottom: viewContentPadding + 'px', + left: viewContentPadding + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + } + }); + popupViewContentList.push({ + tag: 'font', + id: 'confirmText', + text: "立即升级", + textStyles: { + size: '14px', + color: "#FFF", + lineSpacing: "0%", + whiteSpace: "normal" + }, + position: { + bottom: viewContentPadding + 'px', + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + } + }); + popupView.draw(popupViewContentList); + popupView.addEventListener("click", function(e) { + let maxTop = popupViewHeight - viewContentPadding; + let maxLeft = popupViewWidth - viewContentPadding; + let buttonWidth = (viewContentWidth - viewContentPadding) / 2; + if (e.clientY > maxTop - 30 && e.clientY < maxTop) { + // 暂不升级 + if (e.clientX > viewContentPadding && e.clientX < maxLeft - buttonWidth - viewContentPadding) { + maskLayer.hide(); + popupView.hide(); + } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { + // 立即升级 + maskLayer.hide(); + popupView.hide(); + callback && callback(); + } + } + }); + // 点击遮罩层 + maskLayer.addEventListener("click", function() { //处理遮罩层点击 + maskLayer.hide(); + popupView.hide(); + }); + // 显示弹窗 + maskLayer.show(); + popupView.show(); +} +// 文件下载的弹窗绘图 +function downloadPopupDrawing(data) { + // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 + const screenWidth = plus.screen.resolutionWidth; + const screenHeight = plus.screen.resolutionHeight; + //弹窗容器宽度 + const popupViewWidth = screenWidth * 0.7; + // 弹窗容器的Padding + const viewContentPadding = 20; + // 弹窗容器的宽度 + const viewContentWidth = popupViewWidth - (viewContentPadding * 2); + // 弹窗容器高度 + let popupViewHeight = viewContentPadding * 3 + 60; + let progressTip = data.progressTip || "准备下载..."; + let contentText = data.contentText || "正在为您更新,请耐心等待"; + let elementList = [{ + tag: 'rect', //背景色 + color: '#FFFFFF', + rectStyles: { + radius: "8px" + } + }, + { + tag: 'font', + id: 'title', + text: "升级APP", + textStyles: { + size: '16px', + color: "#333", + weight: "bold", + verticalAlign: "middle", + whiteSpace: "normal" + }, + position: { + top: viewContentPadding + 'px', + height: "30px", + } + }, + { + tag: 'font', + id: 'content', + text: contentText, + textStyles: { + size: '14px', + color: "#333", + verticalAlign: "middle", + whiteSpace: "normal" + }, + position: { + top: viewContentPadding * 2 + 30 + 'px', + height: "20px", + } + } + ]; + // 是否有进度条 + if (data.progress) { + popupViewHeight += viewContentPadding + 40; + elementList = elementList.concat([{ + tag: 'font', + id: 'progressValue', + text: progressTip, + textStyles: { + size: '14px', + color: $mainColor, + whiteSpace: "normal" + }, + position: { + top: viewContentPadding * 4 + 20 + 'px', + height: "30px" + } + }, + { + tag: 'rect', //绘制进度条背景 + id: 'progressBg', + rectStyles: { + radius: "4px", + borderColor: "#f1f1f1", + borderWidth: "1px", + }, + position: { + top: viewContentPadding * 4 + 60 + 'px', + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "8px" + } + }, + ]); + } + if (data.buttonNum == 2) { + popupViewHeight += viewContentPadding + 30; + elementList = elementList.concat([{ + tag: 'rect', //绘制底边按钮 + rectStyles: { + radius: "3px", + borderColor: "#f1f1f1", + borderWidth: "1px", + }, + position: { + bottom: viewContentPadding + 'px', + left: viewContentPadding + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px" + } + }, + { + tag: 'rect', //绘制底边按钮 + rectStyles: { + radius: "3px", + color: $mainColor + }, + position: { + bottom: viewContentPadding + 'px', + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px" + } + }, + { + tag: 'font', + id: 'cancelText', + text: "取消下载", + textStyles: { + size: '14px', + color: "#666", + lineSpacing: "0%", + whiteSpace: "normal" + }, + position: { + bottom: viewContentPadding + 'px', + left: viewContentPadding + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + } + }, + { + tag: 'font', + id: 'confirmText', + text: "后台下载", + textStyles: { + size: '14px', + color: "#FFF", + lineSpacing: "0%", + whiteSpace: "normal" + }, + position: { + bottom: viewContentPadding + 'px', + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + } + } + ]); + } + if (data.buttonNum == 1) { + popupViewHeight += viewContentPadding + 40; + elementList = elementList.concat([{ + tag: 'rect', //绘制底边按钮 + rectStyles: { + radius: "6px", + color: $mainColor + }, + position: { + bottom: viewContentPadding + 'px', + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "40px" + } + }, + { + tag: 'font', + id: 'confirmText', + text: "关闭", + textStyles: { + size: '14px', + color: "#FFF", + lineSpacing: "0%", + }, + position: { + bottom: viewContentPadding + 'px', + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "40px" + } + } + ]); + } + return { + popupViewHeight: popupViewHeight, + popupViewWidth: popupViewWidth, + screenHeight: screenHeight, + viewContentWidth: viewContentWidth, + viewContentPadding: viewContentPadding, + elementList: elementList + }; +} +// 文件下载的弹窗 +function downloadPopup(data, callback, cancelCallback, rebootCallback) { + // 弹窗遮罩层 + let maskLayer = new plus.nativeObj.View("maskLayer", { //先创建遮罩层 + top: '0px', + left: '0px', + height: '100%', + width: '100%', + backgroundColor: 'rgba(0,0,0,0.5)' + }); + let popupViewData = downloadPopupDrawing(data); + // 弹窗内容 + let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单 + tag: "rect", + top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px", + left: '15%', + height: popupViewData.popupViewHeight + "px", + width: "70%", + }); + let progressValue = 0; + let progressTip = 0; + let contentText = 0; + let buttonNum = 2; + if (data.buttonNum >= 0) { + buttonNum = data.buttonNum; + } + popupView.draw(popupViewData.elementList); + popupView.addEventListener("click", function(e) { + let maxTop = popupViewData.popupViewHeight - popupViewData.viewContentPadding; + let maxLeft = popupViewData.popupViewWidth - popupViewData.viewContentPadding; + if (e.clientY > maxTop - 40 && e.clientY < maxTop) { + if (buttonNum == 1) { + // 单按钮 + if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft) { + maskLayer.hide(); + popupView.hide(); + rebootCallback && rebootCallback(); + } + } else if (buttonNum == 2) { + // 双按钮 + let buttonWidth = (popupViewData.viewContentWidth - popupViewData.viewContentPadding) / 2; + if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding) { + maskLayer.hide(); + popupView.hide(); + cancelCallback && cancelCallback(); + } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { + maskLayer.hide(); + popupView.hide(); + } + } + } + }); + // 显示弹窗 + maskLayer.show(); + popupView.show(); + // 改变进度条 + callback({ + change: function(res) { + let progressElement = []; + if (res.progressValue) { + progressValue = res.progressValue; + // 绘制进度条 + progressElement.push({ + tag: 'rect', //绘制进度条背景 + id: 'progressValueBg', + rectStyles: { + radius: "4px", + color: $mainColor + }, + position: { + top: popupViewData.viewContentPadding * 4 + 60 + 'px', + left: popupViewData.viewContentPadding + "px", + width: popupViewData.viewContentWidth * (res.progressValue / 100) + "px", + height: "8px" + } + }); + } + if (res.progressTip) { + progressTip = res.progressTip; + progressElement.push({ + tag: 'font', + id: 'progressValue', + text: res.progressTip, + textStyles: { + size: '14px', + color: $mainColor, + whiteSpace: "normal" + }, + position: { + top: popupViewData.viewContentPadding * 4 + 20 + 'px', + height: "30px" + } + }); + } + if (res.contentText) { + contentText = res.contentText; + progressElement.push({ + tag: 'font', + id: 'content', + text: res.contentText, + textStyles: { + size: '16px', + color: "#333", + whiteSpace: "normal" + }, + position: { + top: popupViewData.viewContentPadding * 2 + 30 + 'px', + height: "30px", + } + }); + } + if (res.buttonNum >= 0 && buttonNum != res.buttonNum) { + buttonNum = res.buttonNum; + popupView.reset(); + popupViewData = downloadPopupDrawing(Object.assign({ + progressValue: progressValue, + progressTip: progressTip, + contentText: contentText, + }, res)); + let newElement = []; + popupViewData.elementList.map((item, index) => { + let have = false; + progressElement.forEach((childItem, childIndex) => { + if (item.id == childItem.id) { + have = true; + } + }); + if (!have) { + newElement.push(item); + } + }); + progressElement = newElement.concat(progressElement); + popupView.setStyle({ + tag: "rect", + top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px", + left: '15%', + height: popupViewData.popupViewHeight + "px", + width: "70%", + }); + popupView.draw(progressElement); + } else { + popupView.draw(progressElement); + } + }, + cancel: function() { + maskLayer.hide(); + popupView.hide(); + } + }); +} +export default function(isPrompt = false) { + getCurrentNo(version => { + getServerNo(version.versionCode, isPrompt, data => { + let res = JSON.parse(data); + if (res.forceUpdate) { + if (/\.wgt$/i.test(res.downloadUrl)) { + getDownload(res); + } else if (/\.apk$/i.test(res.downloadUrl)) { + plus.runtime.openURL(res.downloadUrl); + } else { + if (platform == "android") { + getDownload(res); + } else { + plus.runtime.openURL(res.downloadUrl); + } + } + } else { + updatePopup(res, function() { + if (/\.wgt$/i.test(res.downloadUrl)) { + getDownload(res); + } else if (/\.html$/i.test(res.downloadUrl)) { + plus.runtime.openURL(res.downloadUrl); + } else { + if (platform == "android") { + getDownload(res); + } else { + plus.runtime.openURL(res.downloadUrl); + } + } + }); + } + }); + }); +} +// #endif diff --git a/mallplusui-uniapp-app2/plugins/request/fileUpload.js b/mallplusui-uniapp-app2/plugins/request/fileUpload.js new file mode 100644 index 0000000..e1fc1c1 --- /dev/null +++ b/mallplusui-uniapp-app2/plugins/request/fileUpload.js @@ -0,0 +1,390 @@ +import request from "./request.js"; +const qiniuUploader = require("./qiniuUploader"); +export default class fileUpload extends request { + constructor(props) { + // 调用实现父类的构造函数 + super(props); + } + //七牛云上传图片 + qnImgUpload(data = {}, options = {}) { + const _this = this; + return new Promise((resolve, reject) => { + uni.chooseImage({ + count: data.count || 9, //默认9 + sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有 + sourceType: data.sourceType || ['album', 'camera'], //从相册选择 + success: function(res) { + _this.qnFileUpload({ + files: res.tempFiles, + ...data + }, options).then(resolve, reject); + } + }); + }); + } + //七牛云上传文件命名 + randomChar(l, url = "") { + const x = "0123456789qwertyuioplkjhgfdsazxcvbnm"; + let tmp = ""; + let time = new Date(); + for (let i = 0; i < l; i++) { + tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length); + } + return ( + "file/" + + url + + time.getTime() + + tmp + ); + } + //七牛云文件上传(支持多张上传) + qnFileUpload(data = {}, options = {}) { + const _this = this; + let requestInfo = { + ...data, + ...this.config, + ...options, + header: {}, + method: "FILE" + }; + return new Promise((resolve, reject) => { + //请求前回调 + if (_this.requestStart) { + let requestStart = _this.requestStart(requestInfo); + if (typeof requestStart == "object") { + requestInfo.load = requestStart.load; + requestInfo.files = requestStart.files; + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + reject({ + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + return; + } + } + if (Array.isArray(requestInfo.files)) { + let len = requestInfo.files.length; + let imageList = new Array; + if(_this.getQnToken){ + _this.getQnToken(qnRes => { + /* + *接口返回参数: + *visitPrefix:访问文件的域名 + *token:七牛云上传token + *folderPath:上传的文件夹 + *region: 地区 默认为:SCN + */ + uploadFile(0); + function uploadFile(i) { + let fileData = { + fileIndex: i, + files: requestInfo.files, + size: requestInfo.files[i].size + }; + // #ifdef H5 + fileData.name = requestInfo.files[i].name; + fileData.type = requestInfo.files[i].type; + // #endif + // 交给七牛上传 + qiniuUploader.upload(requestInfo.files[i].path, (res) => { + fileData.url = res.imageURL; + requestInfo.onEachUpdate && requestInfo.onEachUpdate({ + url: res.imageURL, + ...fileData + }); + imageList.push(res.imageURL); + if (len - 1 > i) { + uploadFile(i + 1); + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "request:ok", + statusCode: 200, + data: imageList + }); + resolve(imageList); + } + }, (error) => { + console.log('error: ' + error); + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, error); + reject(error) + }, { + region: qnRes.region || 'SCN', //地区 + domain: qnRes.visitPrefix, // bucket 域名,下载资源时用到。 + key: _this.randomChar(8, qnRes.folderPath), + uptoken: qnRes.token, // 由其他程序生成七牛 uptoken + uptokenURL: 'UpTokenURL.com/uptoken' // 上传地址 + }, (res) => { + console.log(requestInfo); + requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res)); + // console.log('上传进度', res.progress) + // console.log('已经上传的数据长度', res.totalBytesSent) + // console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend) + }); + } + }); + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "请添加七牛云回调方法:getQnToken", + statusCode: 0 + }); + reject({ + errMsg: "请添加七牛云回调方法:getQnToken", + statusCode: 0 + }); + return; + } + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "files 必须是数组类型", + statusCode: 0 + }); + reject({ + errMsg: "files 必须是数组类型", + statusCode: 0 + }); + }; + }); + + } + //本地服务器图片上传 + urlImgUpload(url = '', data = {}, options = {}) { + const _this = this; + return new Promise((resolve, reject) => { + uni.chooseImage({ + count: data.count || 9, //默认9 + sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有 + sourceType: data.sourceType || ['album', 'camera'], //从相册选择 + success: function(res) { + _this.urlFileUpload(url, { + ...data, + files: res.tempFiles + }, options).then(resolve, reject); + } + }); + }); + } + //本地服务器文件上传方法 + urlFileUpload(url = '', data = {}, options = {}) { + let requestInfo = this.getDefault({ + ...data, + url: url, + method: "FILE" + }, options); + const _this = this; + return new Promise((resolve, reject) => { + //请求前回调 + if (_this.requestStart) { + let requestStart = _this.requestStart(requestInfo); + if (typeof requestStart == "object") { + requestInfo.data = requestStart.data; + requestInfo.header = requestStart.header; + requestInfo.isPrompt = requestStart.isPrompt; + requestInfo.load = requestStart.load; + requestInfo.isFactory = requestStart.isFactory; + requestInfo.files = requestStart.files; + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + reject({ + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + return; + } + } + // 本地文件上传去掉默认Content-Type + if(requestInfo.header['Content-Type']){ + delete requestInfo.header['Content-Type']; + } + if (Array.isArray(requestInfo.files)) { + // #ifdef APP-PLUS || H5 + let files = []; + let fileData = { + files: requestInfo.files, + name: requestInfo.name || "file" + }; + requestInfo.files.forEach(item => { + files.push({ + uri: item.path, + name: requestInfo.name || "file" + }); + }); + let config = { + url: requestInfo.url, + files: files, + header: requestInfo.header, //加入请求头 + success: (response) => { + if (typeof(response.data) == "string") { + response.data = JSON.parse(response.data); + } + //是否用外部的数据处理方法 + if (requestInfo.isFactory && _this.dataFactory) { + //数据处理 + _this.dataFactory({ + ...requestInfo, + response: response, + resolve: function(data) { + requestInfo.onEachUpdate && requestInfo.onEachUpdate({ + data: data, + ...fileData + }); + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "request:ok", + statusCode: 200, + data: data + }); + resolve(data); + }, + reject: function(err) { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "数据工厂返回错误", + statusCode: 0, + data: err + }); + reject(err); + } + }); + } else { + requestInfo.onEachUpdate && requestInfo.onEachUpdate({ + data: response, + ...fileData + }); + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, response); + resolve(response); + } + }, + fail: (err) => { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, err); + reject(err); + } + }; + if (requestInfo.data) { + config.formData = requestInfo.data; + } + const uploadTask = uni.uploadFile(config); + uploadTask.onProgressUpdate(res => { + requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res)); + }); + // #endif + // #ifdef MP + const len = requestInfo.files.length - 1; + let fileList = new Array; + fileUpload(0); + + function fileUpload(i) { + let fileData = { + fileIndex: i, + files: requestInfo.files, + size: requestInfo.files[i].size + }; + // #ifdef H5 + fileData.name = requestInfo.files[i].name; + fileData.type = requestInfo.files[i].type; + // #endif + let config = { + url: requestInfo.url, + filePath: requestInfo.files[i].path, + header: requestInfo.header, //加入请求头 + name: requestInfo.name || "file", + success: (response) => { + if (typeof(response.data) == "string") { + response.data = JSON.parse(response.data); + } + //是否用外部的数据处理方法 + if (requestInfo.isFactory && _this.dataFactory) { + //数据处理 + _this.dataFactory({ + ...requestInfo, + response: response, + resolve: function(data) { + requestInfo.onEachUpdate && requestInfo.onEachUpdate({ + data: data, + ...fileData + }); + fileList.push(data); + if (len <= i) { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "request:ok", + statusCode: 200, + data: fileList + }); + resolve(fileList); + } else { + fileUpload(i + 1); + } + }, + reject: function(err) { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "数据工厂返回错误", + statusCode: 0, + data: err + }); + reject(err); + } + }); + } else { + requestInfo.onEachUpdate && requestInfo.onEachUpdate({ + data: response, + ...fileData + }); + fileList.push(response); + if (len <= i) { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "request:ok", + statusCode: 200, + data: fileList + }); + resolve(fileList); + } else { + fileUpload(i + 1); + } + } + }, + fail: (err) => { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, err); + reject(err); + } + }; + if (requestInfo.data) { + config.formData = requestInfo.data; + } + const uploadTask = uni.uploadFile(config); + uploadTask.onProgressUpdate(res => { + requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res)); + }); + } + // #endif + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "files 必须是数组类型", + statusCode: 0 + }); + reject({ + errMsg: "files 必须是数组类型", + statusCode: 0 + }) + } + }); + } +} diff --git a/mallplusui-uniapp-app2/plugins/request/index.js b/mallplusui-uniapp-app2/plugins/request/index.js new file mode 100644 index 0000000..8884f51 --- /dev/null +++ b/mallplusui-uniapp-app2/plugins/request/index.js @@ -0,0 +1,7 @@ +/***************纯粹的数据请求(如果使用这种可以删除掉fileUpload.js)******************/ +// import request from "./request.js"; +// export default request; + +/********数据请求同时继承了文件上传(包括七牛云上传)************/ +import fileUpload from "./fileUpload.js"; +export default fileUpload; \ No newline at end of file diff --git a/mallplusui-uniapp-app2/plugins/request/qiniuUploader.js b/mallplusui-uniapp-app2/plugins/request/qiniuUploader.js new file mode 100644 index 0000000..138c80e --- /dev/null +++ b/mallplusui-uniapp-app2/plugins/request/qiniuUploader.js @@ -0,0 +1,169 @@ +// created by gpake +(function () { + + var config = { + qiniuRegion: '', + qiniuImageURLPrefix: '', + qiniuUploadToken: '', + qiniuUploadTokenURL: '', + qiniuUploadTokenFunction: null, + qiniuShouldUseQiniuFileName: false + } + + module.exports = { + init: init, + upload: upload, + } + + // 在整个程序生命周期中,只需要 init 一次即可 + // 如果需要变更参数,再调用 init 即可 + function init(options) { + config = { + qiniuRegion: '', + qiniuImageURLPrefix: '', + qiniuUploadToken: '', + qiniuUploadTokenURL: '', + qiniuUploadTokenFunction: null, + qiniuShouldUseQiniuFileName: false + }; + updateConfigWithOptions(options); + } + + function updateConfigWithOptions(options) { + if (options.region) { + config.qiniuRegion = options.region; + } else { + console.error('qiniu uploader need your bucket region'); + } + if (options.uptoken) { + config.qiniuUploadToken = options.uptoken; + } else if (options.uptokenURL) { + config.qiniuUploadTokenURL = options.uptokenURL; + } else if (options.uptokenFunc) { + config.qiniuUploadTokenFunction = options.uptokenFunc; + } + if (options.domain) { + config.qiniuImageURLPrefix = options.domain; + } + config.qiniuShouldUseQiniuFileName = options.shouldUseQiniuFileName + } + + function upload(filePath, success, fail, options, progress, cancelTask) { + if (null == filePath) { + console.error('qiniu uploader need filePath to upload'); + return; + } + if (options) { + updateConfigWithOptions(options); + } + if (config.qiniuUploadToken) { + doUpload(filePath, success, fail, options, progress, cancelTask); + } else if (config.qiniuUploadTokenURL) { + getQiniuToken(function () { + doUpload(filePath, success, fail, options, progress, cancelTask); + }); + } else if (config.qiniuUploadTokenFunction) { + config.qiniuUploadToken = config.qiniuUploadTokenFunction(); + if (null == config.qiniuUploadToken && config.qiniuUploadToken.length > 0) { + console.error('qiniu UploadTokenFunction result is null, please check the return value'); + return + } + doUpload(filePath, success, fail, options, progress, cancelTask); + } else { + console.error('qiniu uploader need one of [uptoken, uptokenURL, uptokenFunc]'); + return; + } + } + + function doUpload(filePath, success, fail, options, progress, cancelTask) { + if (null == config.qiniuUploadToken && config.qiniuUploadToken.length > 0) { + console.error('qiniu UploadToken is null, please check the init config or networking'); + return + } + var url = uploadURLFromRegionCode(config.qiniuRegion); + var fileName = filePath.split('//')[1]; + if (options && options.key) { + fileName = options.key; + } + var formData = { + 'token': config.qiniuUploadToken + }; + if (!config.qiniuShouldUseQiniuFileName) { + formData['key'] = fileName + } + var uploadTask = wx.uploadFile({ + url: url, + filePath: filePath, + name: 'file', + formData: formData, + success: function (res) { + var dataString = res.data + if (res.data.hasOwnProperty('type') && res.data.type === 'Buffer') { + dataString = String.fromCharCode.apply(null, res.data.data) + } + try { + var dataObject = JSON.parse(dataString); + //do something + var imageUrl = config.qiniuImageURLPrefix + '/' + dataObject.key; + dataObject.imageURL = imageUrl; + if (success) { + success(dataObject); + } + } catch (e) { + console.log('parse JSON failed, origin String is: ' + dataString) + if (fail) { + fail(e); + } + } + }, + fail: function (error) { + console.error(error); + if (fail) { + fail(error); + } + } + }) + + uploadTask.onProgressUpdate((res) => { + progress && progress(res) + }) + + cancelTask && cancelTask(() => { + uploadTask.abort() + }) + } + + function getQiniuToken(callback) { + wx.request({ + url: config.qiniuUploadTokenURL, + success: function (res) { + var token = res.data.uptoken; + if (token && token.length > 0) { + config.qiniuUploadToken = token; + if (callback) { + callback(); + } + } else { + console.error('qiniuUploader cannot get your token, please check the uptokenURL or server') + } + }, + fail: function (error) { + console.error('qiniu UploadToken is null, please check the init config or networking: ' + error); + } + }) + } + + function uploadURLFromRegionCode(code) { + var uploadURL = null; + switch (code) { + case 'ECN': uploadURL = 'https://up.qbox.me'; break; + case 'NCN': uploadURL = 'https://up-z1.qbox.me'; break; + case 'SCN': uploadURL = 'https://up-z2.qbox.me'; break; + case 'NA': uploadURL = 'https://up-na0.qbox.me'; break; + case 'ASG': uploadURL = 'https://up-as0.qbox.me'; break; + default: console.error('please make the region is with one of [ECN, SCN, NCN, NA, ASG]'); + } + return uploadURL; + } + +})(); \ No newline at end of file diff --git a/mallplusui-uniapp-app2/plugins/request/request.js b/mallplusui-uniapp-app2/plugins/request/request.js new file mode 100644 index 0000000..1b2877b --- /dev/null +++ b/mallplusui-uniapp-app2/plugins/request/request.js @@ -0,0 +1,225 @@ +export default class request { + constructor(options) { + //请求公共地址 + this.baseUrl = options.baseUrl || ""; + //公共文件上传请求地址 + this.fileUrl = options.fileUrl || ""; + //默认请求头 + this.header = options.header || {}; + //默认配置 + this.config = { + isPrompt: options.isPrompt === false ? false : true, + load: options.load === false ? false : true, + isFactory: options.isFactory === false ? false : true, + loadMore: options.loadMore === false ? false : true + }; + } + + // 获取默认信息 + getDefault(data, options = {}) { + //判断url是不是链接 + let urlType = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$/.test(data.url); + let config = Object.assign({}, this.config, options, data); + if (data.method == "FILE") { + config.url = urlType ? data.url : this.fileUrl + data.url; + } else { + config.url = urlType ? data.url : this.baseUrl + data.url; + } + //请求头 + if (options.header) { + config.header = Object.assign({}, this.header, options.header); + } else if (data.header) { + config.header = Object.assign({}, this.header, data.header); + } else { + config.header = this.header; + } + return config; + } + + //post请求 + post(url = '', data = {}, options = {}) { + return this.request({ + method: "POST", + data: data, + url: url, + ...options + }); + } + + //get请求 + get(url = '', data = {}, options = {}) { + return this.request({ + method: "GET", + data: data, + url: url, + ...options + }); + } + + //put请求 + put(url = '', data = {}, options = {}) { + return this.request({ + method: "PUT", + data: data, + url: url, + ...options + }); + } + + //delete请求 + delete(url = '', data = {}, options = {}) { + return this.request({ + method: "DELETE", + data: data, + url: url, + ...options + }); + } + + //接口请求方法 + request(data) { + return new Promise((resolve, reject) => { + if (!data.url) { + console.log("request缺失数据url"); + reject({ + errMsg: "缺失数据url", + statusCode: 0 + }); + return; + } + let requestInfo = this.getDefault(data); + //请求前回调 + if (this.requestStart) { + let requestStart = this.requestStart(requestInfo); + if (typeof requestStart == "object") { + requestInfo.data = requestStart.data; + requestInfo.header = requestStart.header; + requestInfo.isPrompt = requestStart.isPrompt; + requestInfo.load = requestStart.load; + requestInfo.isFactory = requestStart.isFactory; + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + reject({ + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + return; + } + } + let requestData = { + url: requestInfo.url, + header: requestInfo.header, //加入请求头 + success: (res) => { + //请求完成回调 + this.requestEnd && this.requestEnd(requestInfo, res); + //是否用外部的数据处理方法 + if (requestInfo.isFactory && this.dataFactory) { + //数据处理 + this.dataFactory({ + ...requestInfo, + response: res, + resolve: resolve, + reject: reject + }); + } else { + resolve(res); + } + }, + fail: (err) => { + console.log("err"); + //请求完成回调 + this.requestEnd && this.requestEnd(requestInfo, err); + reject(err); + } + }; + //请求类型 + if (requestInfo.method) { + requestData.method = requestInfo.method; + } + if (requestInfo.data) { + requestData.data = requestInfo.data; + } + // #ifdef MP-WEIXIN || MP-ALIPAY + if (requestInfo.timeout) { + requestData.timeout = requestInfo.timeout; + } + // #endif + if (requestInfo.dataType) { + requestData.dataType = requestInfo.dataType; + } + // #ifndef APP-PLUS || MP-ALIPAY + if (requestInfo.responseType) { + requestData.responseType = requestInfo.responseType; + } + // #endif + // #ifdef H5 + if (requestInfo.withCredentials) { + requestData.withCredentials = requestInfo.withCredentials; + } + // #endif + uni.request(requestData); + }); + } + //jsonp请求(只限于H5使用) + jsonp(url = '', data = {}, options = {}) { + let requestInfo = this.getDefault({ + method: "JSONP", + data: data, + url: url, + }, options); + let dataStr = ''; + Object.keys(data).forEach(key => { + dataStr += key + '=' + data[key] + '&'; + }); + //匹配最后一个&并去除 + if (dataStr !== '') { + dataStr = dataStr.substr(0, dataStr.lastIndexOf('&')); + } + requestInfo.url = requestInfo.url + '?' + dataStr; + const _this = this; + return new Promise((resolve, reject) => { + let callbackName = "callback" + Math.ceil(Math.random() * 1000000); + if (_this.requestStart) { + requestInfo.data = data; + let requestStart = _this.requestStart(requestInfo); + if (typeof requestStart == "object") { + requestInfo.data = requestStart.data; + requestInfo.header = requestStart.header; + requestInfo.isPrompt = requestStart.isPrompt; + requestInfo.load = requestStart.load; + requestInfo.isFactory = requestStart.isFactory; + } else { + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + reject({ + errMsg: "请求开始拦截器未通过", + statusCode: 0 + }); + return; + } + } + // #ifdef H5 + window[callbackName] = function(data) { + resolve(data); + } + let script = document.createElement("script"); + script.src = requestInfo.url + "&callback=" + callbackName; + document.head.appendChild(script); + // 及时删除,防止加载过多的JS + document.head.removeChild(script); + // #endif + //请求完成回调 + _this.requestEnd && _this.requestEnd(requestInfo, { + errMsg: "request:ok", + statusCode: 200 + }); + }); + } +} diff --git a/mallplusui-uniapp-app2/plugins/request/request.md b/mallplusui-uniapp-app2/plugins/request/request.md new file mode 100644 index 0000000..2d59e5b --- /dev/null +++ b/mallplusui-uniapp-app2/plugins/request/request.md @@ -0,0 +1,229 @@ +# request请求、配置简单、批量上传图片、超强适应性(很方便的支持多域名请求) +1. 配置简单、源码清晰注释多、适用于一项目多域名请求、第三方请求、七牛云图片上传、本地服务器图片上传等等 +2. 支持请求`get`、`post`、`put`、`delete` +3. 自动显示请求加载动画(可单个接口关闭) +4. 全局`api`数据处理函数,只回调请求正确的数据(可单个接口关闭) +5. 未登录或登录失效自动拦截并调用登录方法(可单个接口关闭) +6. 全局自动提示接口抛出的错误信息(可单个接口关闭) +7. 支持 Promise +8. 支持拦截器 +9. 支持七牛云文件(图片)批量上传 +10. 支持本地服务器文件(图片)批量上传 +11. 支持上传文件拦截过滤 +12. 支持上传文件进度监听 +13. 支持上传文件单张成功回调 + +### QQ交流群(学习干货多多) 607391225 + + +### 常见问题 +1.接口请求成功了,没有返回数据或者数据是走的catch回调 + +答:`requestConfig.js` 请求配置文件里面,有一个`$http.dataFactory`方法,里面写的只是参考示例,`此方法需要开发者根据各自的接口返回类型修改` + +2.官方的方法有数据,本插件方法请求报错跨域问题 + +答:`requestConfig.js` 请求配置文件里面,`header`请求头设置的`content-type`请求类型需求和后台保持一致 + +3.登录后用户`token`怎么设置? + +答:`requestConfig.js` 请求配置文件里面,`$http.requestStart`请求开始拦截器里面设置 + +4.怎么判断上传的文件(图片)太大?怎么过滤掉太大的文件(图片)? + +答:`requestConfig.js` 请求配置文件里面,`$http.requestStart`请求开始拦截器里面设置 + +### 本次更新注意事项 +1. 所有的headers都改成了header(和官方统一) +2. 七牛云的获取token等信息提取到了`requestConfig.js`文件,参考如下 + +``` +// 添加获取七牛云token的方法 +$http.getQnToken = function(callback){ + //该地址需要开发者自行配置(每个后台的接口风格都不一样) + $http.get("api/kemean/aid/qn_upload").then(data => { + /* + *接口返回参数: + *visitPrefix:访问文件的域名 + *token:七牛云上传token + *folderPath:上传的文件夹 + */ + callback({ + visitPrefix: data.visitPrefix, + token: data.token, + folderPath: data.folderPath + }); + }); +} +``` + +### 文件说明 +1. `request => request.js` 请求方法的源码文件 +2. `request => fileUpload.js` 七牛云上传和服务器上传的源码文件 +3. `request => index.js` 输出方法的文件 +4. `request => qiniuUploader.js` 七牛云官方上传文件 +5. `requestConfig.js` 请求配置文件(具体看代码) + +### 在main.js引入并挂在Vue上 +``` +import $http from '@/zhouWei-request/requestConfig'; +Vue.prototype.$http = $http; +``` + +### 通用请求方法(此方法不支持文件上传和JSONP) +``` +this.$http.request({ + url: 'aid/region', + method: "GET", // POST、GET、PUT、DELETE,具体说明查看官方文档 + data: {pid:0}, + timeout: 30000, // 默认 30000 说明:超时时间,单位 ms,具体说明查看官方文档 + dataType: "json", // 默认 json 说明:如果设为 json,会尝试对返回的数据做一次 JSON.parse,具体说明查看官方文档 + responseType: "text", // 默认 text 说明:设置响应的数据类型。合法值:text、arraybuffer,具体说明查看官方文档 + withCredentials: false, // 默认 false 说明:跨域请求时是否携带凭证(cookies),具体说明查看官方文档 + isPrompt: true,//(默认 true 说明:本接口抛出的错误是否提示) + load: true,//(默认 true 说明:本接口是否提示加载动画) + header: { //默认 无 说明:请求头 + 'Content-Type': 'application/json' + }, + isFactory: true, //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数将失去作用) +}).then(function (response) { + //这里只会在接口是成功状态返回 +}).catch(function (error) { + //这里只会在接口是失败状态返回,不需要去处理错误提示 + console.log(error); +}); +``` + +### get请求 正常写法 +``` +this.$http.get('aid/region',{pid:0}). +then(function (response) { + //这里只会在接口是成功状态返回 +}).catch(function (error) { + //这里只会在接口是失败状态返回,不需要去处理错误提示 + console.log(error); +}); +``` + +### post请求 async写法 +``` +async request(){ + let data = await this.$http.post('aid/region',{pid:0}); + console.log(data); +} +``` + +### 其他功能配置项 +``` +let data = await this.$http.post( + 'http://www.aaa.com/aid/region', //可以直接放链接(将不启用全局定义域名) + { + pid:0 + }, + { + isPrompt: true,//(默认 true 说明:本接口抛出的错误是否提示) + load: true,//(默认 true 说明:本接口是否提示加载动画) + header: { //默认 无 说明:请求头 + 'Content-Type': 'application/json' + }, + isFactory: true //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数将失去作用) + } +); +``` + +### 本地服务器图片上传(支持多张上传) +``` +this.$http.urlImgUpload('flie/upload',{ + name:"后台接受文件key名称", //默认 file + count:"最大选择数",//默认 9 + sizeType:"选择压缩图原图,默认两个都选",//默认 ['original', 'compressed'] + sourceType:"选择相机拍照或相册上传 默认两个都选",//默认 ['album','camera'] + data:"而外参数" //可不填, + onEachUpdate: res => { + console.log("单张上传成功返回:",res); + }, + onProgressUpdate: res => { + console.log("上传进度返回:",res); + } +},{ + isPrompt: true,//(默认 true 说明:本接口抛出的错误是否提示) + load: true,//(默认 true 说明:本接口是否提示加载动画) + header: { //默认 无 说明:请求头 + 'Content-Type': 'application/json' + }, + isFactory: true, //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数奖失去作用) + maxSize: 300000 //(默认 无 说明:上传的文件最大字节数限制,默认不限制) +}).then(res => { + console.log("全部上传完返回结果:",res); +}); +``` +### 本地服务器文件上传(支持多张上传) +``` +this.$http.urlFileUpload("flie/upload",{ + files:[], // 必填 临时文件路径 + data:"向服务器传递的参数", //可不填 + name:"后台接受文件key名称", //默认 file + onEachUpdate: res => { + console.log("单张上传成功返回:",res); + }, + onProgressUpdate: res => { + console.log("上传进度返回:",res); + } + }, + { + isPrompt: true,//(默认 true 说明:本接口抛出的错误是否提示) + load: true,//(默认 true 说明:本接口是否提示加载动画) + header: { //默认 无 说明:请求头 + 'Content-Type': 'application/json' + }, + isFactory: true, //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数奖失去作用) + maxSize: 300000 //(默认 无 说明:上传的文件最大字节数限制,默认不限制) + }).then(res => { + console.log("全部上传完返回结果:",res); + }); +``` + +### 七牛云图片上传(支持多张上传) +``` +this.$http.qnImgUpload({ + count:"最大选择数", // 默认 9 + sizeType:"选择压缩图原图,默认两个都选", // 默认 ['original', 'compressed'] + sourceType:"选择相机拍照或相册上传 默认两个都选", // 默认 ['album','camera'] + onEachUpdate: res => { + console.log("单张上传成功返回:",res); + }, + onProgressUpdate: res => { + console.log("上传进度返回:",res); + } + }, + { + load: true, //(默认 true 说明:本接口是否提示加载动画) + maxSize: 300000 //(默认 无 说明:上传的文件最大字节数限制,默认不限制) + }).then(res => { + console.log("全部上传完返回结果:",res); + }); +``` + +### 七牛云文件上传(支持多张上传) +``` +this.$http.qnFileUpload( + { + files:[], // 必填 临时文件路径 + onEachUpdate: res => { + console.log("单张上传成功返回:",res); + }, + onProgressUpdate: res => { + console.log("上传进度返回:",res); + } + }, + { + load: true, //(默认 true 说明:本接口是否提示加载动画) + maxSize: 300000 //(默认 无 说明:上传的文件最大字节数限制,默认不限制) + }).then(res => { + console.log("全部上传完返回结果:",res); + }); +``` +### jsonp 跨域请求(只支持H5) +``` +let data = await this.$http.jsonp('http://www.aaa.com/aid/region',{pid:0}); +``` diff --git a/mallplusui-uniapp-app2/root.txt b/mallplusui-uniapp-app2/root.txt new file mode 100644 index 0000000..e69de29 diff --git a/mallplusui-uniapp-app2/static/address.png b/mallplusui-uniapp-app2/static/address.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bb507dfdb405682eea74add3b11379d8206808 GIT binary patch literal 125015 zcmXtfWl$X7(>3lEf&_QBu)#IB1_%&XB#SK)Jh;0AcV}@84#C|aSa241cXyus{oi`G zYHDld)AYUfobEn-CQMC54jY3M0}c)jTR~o09S#ou8V(L29t{EZr0k*t74`@3s4gc7 zS2<380J}jlm-r$92Uin=`D}y?yGOT|*Kve{!^HpZf}dLPd4_{~D^!q{&~yVGx1%PK z_qX4APdtpfj<=tAilcsB 0+>l|2~~`BKzDC|l8Nx>R3GyJx^j2r^u7VJ6e CTw08w{5(+y3c4xbx zvq8%
~$wtDsEXn;zXvO%_g1n-w{-4zy)NO1WrcoalA`p3 z7Y7krIS8U#&)V$eejLH2)qb~{V%L7da{YKjCHD5*dD`^Cy pidU{iN!9dE_|JeBb8i`&M_w`7l;h^)O9!)^;){ciOf!*?RW4MByrewc@(=URC5` zA_e4uYH;)VWZ-??ou?}Py#qXa9!~i4d3i{l6H-ZpQE%N40AUiA{l-3vAyXSUFm)l# znD)2Olp%0BgNrSgwZYs0$|Gozr>ru*`w1{Uwx9hViPM9@SF5eW6D|-F9&jZ;;f-R> zRW+pC>?M? ZyZlI2ICZ!L_7OwT)j)B_2YhNV5qtw-f+%VKV%mIq zHJs(Z1I1i~CS2@6u_v#|&NYuWsJVgX_2iyy=S!|t<->@bkK<07`Rn2Rmao@-F4J-A z**niu_o4N55T$Bo??xkVS(l@6WL!4C+vZ;@b$MzeC3`(-P5z3%a|ATBP=!qb*r >^zT%D{{Vn=KGeYp(6OS?C9&c5v;B6d6I4Sa7A&q z`ZTmg>H8Q=4DvmDiAmug3-32oN2|#zkyXqg2=CH_N6pKT)~t2llk!(NuOPrI#CRpF z$x<#h4r5NH7H%-18>dvE9si(0d=H|I3mw{_2HK$&vPp-}qFYAq9*q NvhbZ~{R9(oCQ(2WZF`r2_&KI))#A_h;!jGk?hzQ qX2=@YUog2@pI6ACNS8iiQd3q#*ZI6*0 z`OoJVAE#4fVtub(Y*&%Xp)~{d9SBzkFj+Cl-cMiwP#QF&m;})GP*h>k03-vr57Vr1 zn1b7|`x!uA=!YMqy-PHIe`dz~x)wIL)!S<|$T=v`r;2fBR$8+af^kPd|KV>&N`fpV zX{tQj@;&uEP8>>_WIaNpwiQ$vJ|LfqnGo%$#=`O>9SuwDy(d|w*j$pAJM@ybs^jrC zihtE-H?0%y{T*~~{o(5F@XUZY+$TRSgIDQk<;>+z{Q)*gXzvD5klzIVzQZm2a^x;w zSqwJ?TF7Td>s)2jRw=wdVST}cC +RLuErn~Tl61CXE2 z>gT(~#kP*wUhT)GCqz0eE^4LmdAKAUWLdN=nfI#W75Av;KFTztlnKn9pI!*Cw_#n4 zV<@SKWduX0+L<4m+LMZEOdWXh+`mUr&}ufFp>+dXMjTcwZvw9o`#j!XcYO`GEP#G^ z{glK;WJ%JD7c(5@#+bnZNR&Fz6a&ORdkp`*TYI`MWy)^fytImbe7$(_#w5q7>fhw~ z;Fc4M&e@dTixsV;KD2{@7;WDtayBU3t(Y*04Bw4Ze*3xC_!Cm#&;lCI7B<#& N z=O^yBRkhxkEi1B~!L(|eiRiU{j1F?~?tf>A9>X}lR)BHzGl-IWWDkkZW7<}Uc@Cml zvW0*cjngaHgcZX-u!o1VgXEt0mP~iz=R WukDZMT2-28{BErcq7Le`Z2SD2D$v_u(na~XSq z)dRM!*+mhEc<^c|WyDH`6q>;w25G#I&QNX8d2ZrCOp?G*n?aXf(3227bB>SLO ` z3_B^7U EoPT+EJ||~)8En%$mk9S;ilM! z_cP>hgsRu;>$QNlF9t#PD|VGayCqbdsg2o7P%G}{79s0&l~xI+g$hs{t^|;KipbHj zM&Ss9cfNYG{70~1B44oQ7^AWO1#4zK2sJhS4i@lVa{f;%*5B7Xt9uNilFVRh@VIls z0ram9h^e-V?Gy9D6CeB)L)Z|leW7z}1KgYlIggV~!0Gcr>p`tS#M4?R-XBC?tI)z# z1Q7hFer6s$cA*jx`}@&)=HMP$_XPssn?bx?zKS)87CcGWdpm8=JM-B)i7}q!8UGlr z%AOW6n5KPcdQLHqK**9 7YCj{(_{N|YG`tsWz^fc@j?QL`xjY#Ew_0Y5G zX#aQ#A}^$G*dD}zyuGx6j7w8F=3CguqF94K^8yt03#PdmWZ%s(;HGHg%tCZb_1!uH z8XFw oKBSA-gld;DY8C-&7C=SP-WGC0w>(t0Mn zbIS5*E*iTcUPK4Srn251!R3;R 8zz7tb)p?gO=-;5``C%H(x*SoFu0YFbwoFLcU=ZK$tSd zre^X6TnPW$y`e-lMZOf}k)L4eayntUJvrKUkEvJ(D?^VhhUm(E>v3^NZ8W{8sjoNj zgsLL1qqExIUH56^CLndKy{A)0)_f64+lXzw=G@KYjM*#ro7P6FtB6L(NR4Sn%-PK0 z)!6tYjo(U5@65C$GWx9=Jt+97`k*hFE0}`Tl!^H$?G!~mcPqCN!RW-M!<&Q-x<=Z+ z^=W5W^u-pti+~kc66aoGn0@n>gyr<{?+V~=r4iI{nm+w4R%g)~t=rBUxFz^s5Fg7; z7~+0mV^@%nko0J!{&aKv*sjj_oiNFZA%z1TFOmSNd~wn!)^sqSr}{RT=6T$~HQ{b{ zl1F1d`SUy;*rUD3PWf@j78x3*VAlm%U&2rS+GJOv3v2_`dwI26KHPiEUS8Y`S)T*P zD90)B9&8oRuAnGp@wE@ 2 zQI+x^3jewu4P=K6&Vz?E_* G`pS=tEzMvr^&BPiu5Bc_&{v^79l?2#-M zB1~T9l!|f?iSI+U-S@{Qt2^k?$Ld~7m)_J*(bWU+9~2V0(R1{^hy~95;PznXnCBSt zSLHuw=Kz~Gcze2@zOq;ab{cFy+8h5Q{n @e59C{uOdAE zy#$4w#rp610)N(*>$tr3yP1;NLH(pQe|Icd8JH3j2oB37P?YFV=BRtwy=dbMOJ$-? zSpIwCI7J4-rMS=^h-La}hxwoipxE aG5_-_KHC>svZ)T|47;|g(P``Z zv?!@;zb|&@l_D_IWYXxj1w>yObzTy~S=+|0&Nk6YpY5srl7muTT#_8)TX+6S Y{ z@NQiAPWwOX)fSemZw`0iDsn>@5fgF?Le0$s7pRR0B4pG$vh-oBC>i|ZLTT-VA8>=v z{3YD$bxPcz^E$o^S8RVj$G6%h`Nu6MBd{~;->KN0ev?C!%*P( 2gH7Y(m|=C0w^i; }_jyjZa0t zg_essQCuDF0$fCCD?rr3l@aS`y%}UT_;|QQPwkFs`91Z$vl0sH1iLw$!BfO`Qr(eL zE#3_^?O*J;F)??~evU&s-R^TcISd+Fw90aCQEIhW3E8`y=y9t-5)Uv~5W`>*4?HX3 znnv@=h*ycrax64H`47z3@ocyv>-H%#6$gI~dB|CBRBBKWQsA8;-f4+qF`@B%0{gLR zy|*^O%P|6?t{E-3ds2b^3UQ4yVzfB+C~%t12xre2DEj?_puruRH&LoZAtts&0t& zGkm?Wt1$SY%+$|1BjCK eKHZO|zc zby<5GEY7~U)jO*KwG+uw8nXn^<4+lMFp$3NbkZ!8MY#e>YwCkA?l>rU0&9%iGElb0 zru|#a0bcw8?MbT$Ba=qoG-;ER&9{LfI;`4d^}2k;;9B>^>wuf7blzc9 zO1H!PeBb?xYci}n6*eFTsIknqcXB$QIYf80f$kTiv6P)ZgAs&w+=T@7md&qzdky{W z`%;nZRSRT^MbapZrx^_ip>yEVU?z;~s(n!Ih&Af IoCzmC8Npu%U)?_Bv#aW2NjS?u;14Uk*F}Vy} zpj3NUr*s(Y9*}A9wZQ)S)Z^SSbau6RsiCtBD}bP|P`Q}F8;SYza~M;WUNfKv#Yh%E zoawz)=)ANsouCY7+yzeUq=ja(=|{*)1FT^QlU7b1&bQyHSrzGMBh`~Bv0vN#+IYx; zFbEytu;)rvqV}Xs0}1m0MDQ6-MT_C~)2!i%V9Af;d&6VL6P4IS0ac4=w@%%)2c%^7 z7j-NBZF44Kmyjn$C&NV9q6Cj;a@w9`cb8Xa@7kQ%A82MMmCy2yw*FOria{@4H3k(q zB9=7ZOO{6EtfkCn@vO*x{PHNu#42IeqMyICH#!J||J%+Apt&ybvUa&Xc4#m;kab>t zNbv#R#Dh=!zix6|_^jvkH5dXZg18*=d>{weWosOoO67cP9Irl2eALm>uFo$O{*%ER z^u 5Yuq+|}| zgVSti@MW`sBBQd(U@4s%Gm?`3Ek@sffYiabqY h^I8z4@hZ}|LW#-*#7|32D6vJK;|;y)rStl?}LNt3LR-#r}N`5i%A z)v}i**Ll~T?+TTXEACt$Gb1L^)k4!dn0cQ`HxyD5ES*byG&J?`j6Jk$5#F>O4{8I3 zQ%a^(d$y|2q!0FYb3=fPH;izmt67}KD^>cu1*)=|PR)kns7ctO?Kl<&sIw4_{P77h zR0;~eso;dY!G(p3s0k^qYx#6Tx;{GLwpYjPFp~kSWsV9A^c+n$JwB}U6nV*87?Z^< zR;D5Y5Hmus?J$jycOm{Ag1u#nKerQ6PUa{B$IW@%C~iNhBTS)}!|97i RW(=mVD+z6$N8LX{mB?)0BRp>VXq>({Z9;n*iR1+)_uPv5!{(s8=gv9W4N(*sRE7YDNp%7QMn%( zoa(fIf6;UROA6x!`CM%!O1B+N0W8!%YG^d1X$;jYI^6(La7rhZ*5k0EIXGXFmHNdT z00y6^mui;9#bxD9x|ISGrtQy6x3fFNZ+hb7$nEMBWkow}oA`Go=9EWPa})_@5=GL# zsj^m}7uBtp@d>q``oxq~mG#bvEj3MmLiOGIu}3;6qazETA15F5c>(dtjPldiAIC$= zB@`<)S;M4h)0DN!W<4CVO+LYd4i54-d87^$O1b1Z>p30<16gchWiIB~c>~YAC%G)Y z-!)^K4hkz^#VM^?sr P?^ +>OaC0;KpdnCLEwK3Rv1 z>Nf;oA(m4)Z{v1cRYXVgMa+v*U#<-4a+bOxKy%U4T*#Nnnst*{OIRSv5?TqW_CXYL zITB1l)~{-Y9fPw~^Or){X>~h(FCD%U-($+ZL&_5^82}?z&Tgq#%Cc-ZJIDKpsvpm8 zwkrqBun14}1VTb&e-o-VeqpHVM>ue~9i4tdnrjteM |66i0uu$+2TH0qswzIaEN%X vh@h z9u&7<+p^M%sWu9t H!Q`{2NAYxa*A7d*e$CE0$s3zBlu@!r2j8Q{KCmwHt5&0m zrt>UHxb eL@E{h1A){9503LiR_(&bDO7K4(`u<1T3EOvkV>C{hUbxpnBKyC>lx zi@hK?Hi`?ksje9WF^*Xiw%`$9HygYdd|9vX?F{{EQKR;SL8nexiAc>PAr#~8W}roV zdjU~yEWYl*p NG8yx4?0} zk{P%y#AgOa7~5X?EW0WQigLB3je2WN&g(yv5|jJ3Vtl Z7?t1NP~DC%bFTWi+g{ ze+z07KkqRc$X) ZL*e%PRR@e{ia?jC7U#G7gz8c!lixluGk1fThi8fv`! z>_M+G z2u=onw#!H$ygk&S6;~SdfG~%NioZSd8~8MnDzt0 zZSsT9Z6Wb9aL~n%a_ORYcDq-}dXA|r$RkYYco4s;hj8lBF9+{v;q>SDO$(}@-Pg}I zRD~2nY=_Q#HYpWl(>zw@- CqN2Kd7w}zMaanPl zM}Fc+?bP-?tAvS>jGPx)r~h(>P|u-$cGMsC2U{fU2DyyG3?5Eh7tPP|=6_TWC4hN_ z54LA$6h2Q*ZN+=kNdDHj^&4_EfuJ8@-4P`$l{n@ukcoaWc|RJy?AM1YSpXdqqyFib z`K+HJ(0CK{zNYLW<&jByZUbkB9*4x&eb?6A#d4Yo+2gaNtMoFv?=3t5V5%syIh_73 z*FrV;wW}dk!Qk;}NJ#v!8*38WGPI=UMwyTEj=Pk57M4lkCNb_Z zeyh zFL9RdNxk;l%d2O$&ntA3Awru&r){&0E5*cn_V3W|q~7-_+1@SNWBjY`y9d5vSJ#+a zo!3>`AfGFkYTS93h581Q612a&pHy)+-H&Ex-Sukth8ryVc1pp7q}D2P{w6m~G?&*( zoWsLv9c2MTA0ZCjQl75Me9~@9vJ#SYH_=L;Oe%8XXkuhCMXngfSbxg;_jTRoQ%^K? zG@p;Xu1YCgUk?a>7 U7c8{EOzTLs5Za!TUoJ Lq~tb!RTMH(e`$*iVAqb&g*%ydsr zXTB~M{n~eTXAM{59#I1uH(2q4?`1>Xe;88eHS8~NMG|B4cJiRFp~tawOSs399${?) zjSyx?IS7ICR_>qwog8D|@4BtL7}6eDb(1Q zB(6wFh6BT@NiFl>h5kgohek2U_ZU|}IIQh#XZZ=dOw zXX 5xgJMw2RzoMqWjK3W;Kdx3%IP}5 z{Yk(YmjC}b>3*%D=0(p4t@Et0&bE 25%*cMCwRJXI_wveKF@pOwL(rr+^XQ1_ivC ziG-ya@EJXmm(RFAXNwxII)AKSdZGPv74c5|awcKodByJ4e#zj}_h!d6nUf?O%iK6l zUnE_%&oQVDE!HoZ14OMMulW@|d~irwVi*Y+iwwPbKp+cGRs)R}#Y4e>G0>Q4M7ZRD zey=AZCmkKSR}9v2!8VYGFlyjJ#~O8P>nFi dlG9DLXL!QNzP2(JNJHvOZL~j zZ0{EspjtK_^(MrQo}2XxGm^kqDCKbUpZc=4UmgL#V}sVfro`frL9+65;MqhKjS) z7vj8br@Yn4k(tX^jxt*X^7ZEG$ &>wmhdU2BvL;*Zz8?kbS0^}uH4bP@TveLu zYnZ{30Fuzpx5i)Lp)|4&KYvdkA^eYY!~!K2kzks{vU)R7R3U*Te_6dY=w)8j=kilR z*xCL^J$BoeVyYi27Kx*bjbpl A{ z)8PO5tpnxIC3b_f!v9<}2AwhNNCU#o`pDFR{O;*`!*c5 j>U zpCabW$7GK0FME2YUEQzi1=F{yM}DhWf-1x2JOYbL*DBm#?#b?ea@$N2t^2q+G6$^; zPSmf{-z++W^ca?H=J2dr`;P-{?wa=GX(QW+$0=-O%jyv?w95Y6t*&|QZw%HotMh61 zJ)r)r(;<1K&_*XFnXgu7iOTazJjO2N-cj2Si=xKMmi}XvpZRsJJc>RZ=_1bJaDdE? zihTK`b?pQ|iX43vX3U={Z1oH4{wpez HS=@xB7S&nnQU%M2*94OrhN8uGD7= zG~4V(r$uKT4p;9x7~eB0yc&9@=Dcz3S1 7*zweMwQkZPL{U R*G<(B31l>5s6(>sGpMqc5 z$%c|t-u NMktPV|^(Je0MLFlJLj2F3L&CJDMZke{{Ka_C92?V7#_VpxNwX z>LDRJ^I;>Dss<4MEfKg8HI+zM<1WKVP^U;kXO4e!RXjid6P`T+nj27-6_hw2bRX)i z84QZh=uRpwfP85~^Q`s7**@+QqMdhZZ|#`p{C2AypN%|QP1$+*@gGxl9eT|0j|^f6 z&mk*M2-K+?2ngr+sR+a !|sRG-WJV7_%hZ?$10>;KKlK79SC^WGTx-Br|WfMoBa z{f@@JE2n?+`1p^LGjzj?p=NOBIFNY2dGbgaqSbYS(8o}No1$L!j`ur)-|5|$T`a|- z?)rG2L-#&lS+v-uVc-aT#o@|^c{{dFZ61DiWAm#G!kQ8TJ(*zE2ZcftU{$slZxJ5r z@;q4qZ_ZZ+IqH{g7k`7%>X8Fu_H_6;V(;cdCh=FnDK>zSiL9a *|VGdpg3=r` i872?sC_?=(&venXi&j z(KyC4dO}G^!{v|g=UbHJv ;+?$beQW?8TeFwHX!^wCB#}~mn|ku6 zV3~*%@w?}d&X<#&COnUJ?_!8hYs=_1&Bn#uc8xUpi33h`85S>{&ynAgz=H_l@dHXs z*`V1^!NM+v&Q4ayU&IRmCaZazt(kRc(;=8%piV68X{iiT>8hAyMTLixsR^*B@(~ZX zh`!LF%Z7Y1&vvI#MSTYBBN sMH?7*`e-?t|zoc0i=xE?irLRlN6w^kl(T4JY^bB-= zWiFBQDVYSbV(Xe|$3>2x<>?=KBC0_5M-i@TCI PI&Q?@EY;NGw#(nrJNzdj{_x=C1 z*wUY3n6oZRghviUS_2;^h+mx-Xa>7o;g0-T2WQt-2hhE;mw4x`FOU9khC)6&di`Bx z4SL4KL-UH!I2^=>uI9M@Xc0(ZV^>_wS`{qLeB45PecYc{(ym>7EOo-k`HI1Sb_ytt zy-_cWWc{Rq{(BTp 8Y#A={zqWm&M#{G@;D5yP;r=! z7S^PkD4)bCV-2(Y9bi%Duw}C)h6_x%7k-Fhn8S%$XRVgaU@)k1yU4DBxNWMstevRE zelL6X^PT9ape?ccY4!^1V6d${)sY_6aw~_dIE4e}P}U4#Q|wo+h6%pgyHk&e72KWL z?KIv@s<~@^KpqZ78$1j@?GnFdj~iG|vgK-FZ1Q&~IKszO=AXDlWBeo%GUvWCZdah& z^3}Djopz|kHtI`9u*kd>H>%(L WUfp?WUN7AO`3P$47bfP85z8KCiD zl~ndQ4n}YnBa($ThzQS#=OQN9+%yTZ08otVPIvjJ(3lG_Fwyu?7E|PCha>C1LrV$K z&$r|tWqEliou3f8YV>aR+)!_5gu `$Flsz+P7BBtQyr+LYJZMmxl~33E^Ss^XaVAx=#NI%=x?KK}zCQCjw_x^zAQ6rg zSm5U|HxsHCV!8?&exAm0%_I%nhFCcfI5)O;4zt{(-{KtM6iD@DY;4$j`Um@!vKu-r ziE55iU7mW?tU~~v(B)8q9n3NrBM$0G%^D+=NQ4c6mQ6xDTs|^n_ZrNon60lIQMCR@ z;r$2^14?^D2izPB_L`NAM~ZNe^Ybt>kN_J)c0$6C>4cTO-oR80&uRq6@B-w2`CaVE z@HPNHWE=m%1Jw=d{0^kQ37fpxR%pc3Rf$_aWs-lCsT4N2eA&GiG!Qun6~_!E-u$au z@#l^;beou#0%)_1^Dn6H J~9#7HHzzrSu6MLsxu0= z84XpjiAUo&xq!j(-=s(Agr{in7jSg9aL8`blopz3b!fTFld*B@NwFyo50` 35 |K zwZUN4yQ8(|j{IH=9*m%4q*Hc|O18;~wgD4JSQi8!nsekJ$@d9sQa{E~ESb*{&vwZ8 zx(8e0`W7y9+2@c&y!oZU6V^h>)G6{3MablTo%$gaWy89DzQf}##E!@x&n0#LiIT4I zF@+uUx^6%vdY5Uyp4! 5V+25t4)bX@6eN;(Oqyp7i=&t2x=OyBM)oukIevrNw$5-|Vs7 zRR?<}n1hFJYof$Mb`axEAh=`l=j?DS$Px9f?J}H9?8ylofbJ<0f72U?9zZ6Et}RYs zX-!8n%_s$QV;{D`6B>uFq)(3Y=r?|-o9JlTN$w UP+Izg>zeJFrNZ{31*v$33!~kyb$I{aXl1L}+yG`q zpH<|bR5cExqaX>3=PcL?nDtC`SytNs#V8gA6vWcMlXJ L=G#3DRtW{Ol3K9FSC@v(**`3 zCPKhiReED7DXaZqHIs}m5pSW$`gO!>yd$HqGK_zLe#7AO8lTBLhKbj$eyX>9k(jcx zx2Mh%#=z}690wQi1LXBX^Di!4qHQAT@9<&@8#GdN7qi@(>O4D%9`AXy7CvJNRjd<8 z5gRx?oU4&T0dxt%Q$VABy_d*Hx>gKVUW>l13r)o$DRiQmXfMg%o)1&VosW u4YQ3=uWmeTu$aGW9cYKl zF(!)qNEkC!8kR 3W!$g0E}dOdK^|bH7lS$>NlPm5Ix&FUy;MHLOuAw4t2v;6i!K#ZmXs*T z7#DfGZf2elfihNu@Gk+xuLHP1OO57 pm;qa?~AKvIk=43ZYP>VC@B|M|cRtF2Q%e1kz_pdSE+;)QzZ^aApHK@?8 z5sywz80&N#ntS*%<_+=88}NmkqnLz)h115yQEM}>0<=tOmipWsU4_q 7rV@f-^St*`!A~W%{V>mc zNcZnK*^u}A`fqy=S1xB3{O2NRAipoSxJ{0ks_{KU5uO@Mr_Mjf=j4V}_Qd0zbgk?r zGL?LM`}eXrXr1u@vV6@3;iFh1A-aOg HN(Sx??bV}|cmug+oCWV6Qj(qRUgWBjMM z7QcIsE0el`p$_zEaY#=XR-vD>{~7$8(FRQ;PiW&EFw!RjY6lRoA)0^@Pm{|Rk(9!% znD{Q5vM~U?i$D{ieGM>RM%Bvcym>Ot^T1+Du;6C4EKgkQg*+jyZYh&eTeV&M$xL DHD+gT2qsk@%_$ (BApHX(b3@N=wI? z{?2T+q09OWphkh2XkXHery;c(TR7MO8N@+#onsC&1*Cym84+qfm4Vn}cO&@M+|FR? znMA6sv)-6(>LzziqcNnE_hKwjjYG!9$>{^AQ{pVZ_W=EDgTQmWBKFQruB(I?Hf(O? zT;6N!Yz9N8X4!wH47dI4E9!0;b{P4r6cs7Tnsh9z6$!fVKrocJ?{MhXO-81rJJ7Rj z@q~@54tT(nju~TNf6JI3znUX2>o6GtFs>~g%|p@|7f;9FTxWDnl0TYbPQP}**G=|A zUqG&QAOF4WlATdwQX6RWneXd|vB)}hK}6E!1O2lo9&Raw$(MB|KF(-O{{VC{#5>cf zXtC}rI=;D` TzH7>vJ@)6d4Y+5Nevoed9$0;7mO!j@PBH#V?C*x(H{u7s z*<&73a@Y*b@8-?xp5&IQ=jUXrIh}mBHGP$GQCw6pCvQWAMYGqDMm}{FT^6$YOoAv} zurB-5)FST%nO&33gecBGi!V6iEQ+AAZ?!;aKS~g#?5gq4>D)I3U5cBt+_8VTaLS>M z<}ve^x3;abFkj=S?ANNgi_D`APb%XCXzhWRBDl{BKu;hgaz8#ae)`$^uBNveVg$Ki z7}^_RA3!b)M|v5OQk}?dbzNeAUwvBrAmIWqj&!d>XxACys6GTvI-%QN42fU=z|oW` zY=8UcnCiwk~~4)762DGBn{ z_fXKj3zLowm(Mrl>EFHKOtF-*%6DCMUkeEKd|i8csT@8=3*GA(I PYMiik@jrvv zFH2`6i>$$j+x11;B*_e5?#D3{D(lvDn5Q;pY?GTz0h9F@2hVp4+gGAUrP$#cfUQdM ziHA-&wj92Q4$h-q$LuN6vYt;wxdnyxgwvn_g-x;Jwpe`i`0Bd5&hhs1KXKK02GTz& zRaQ7y2)uOIU*s*Fxm_n_E~j`3=LNsW;#v!{i&RJJ2XT0`Q)6^ojf=h|#B>@0WBT#w z=t_LzD?6Ag@pc?YN(H|ZC6CuJrrTj{S`2W_E;Qt!FO%i!Rv?r`SW?Bq|MmmcKAnew z%_cWZ=fC?p+O1_mZAe3VPcE)W4>Zqa+Uiu;jbgp8x>hVN-;Kx!UBxm0*w4DAa8*&> zq7^HkeQ(d^ohrpc+XG=uk?BIUh$HU=bo_)b`*8q7W6=w{IGzZ0@gwnKofoNI(876n zNjxy|174)x@H!axqL(`7u(5C*rzqnK2uvB{i8Hjyw}jG1<+2b4n;?3yCL#3IL`oZD z?N^_mfmM+3ZRsec2W{sG3vPwdW?+#JPEWr-BGxNS{5=ckH()1 J&Rs zB?%O?)2b;~iZt)TDv_a9yqZW#@+OmR>`CKrr-cq2q)Pv(I>iu|WM&jZ|7LK5lMtU@ z*By
QW zDWFKRI&(;!D}&J}u7&EAGP3dK$5vW{u#bPjguRPLEL~a(D9fNLvqpC Ar-r#CyY$~krr(P;sNoNuqR(zUzrGio8ccpcw4YBHE zD)g#yq}}ni&a#S(qUk>(0qru8yD+EhMvi^ Z;{#-hU*DQm%RFbAh|7L0V*|*P0{# zt fPKv#FxGjzm@(i%M+& z&TvY>7`tBF^t@}~E>5TzJQv{K 5=|X|AyUj9wQe-HVJHjlE5V$e22fhEBPy+QQ8KNt};DucM4!o$s%`hy`N>**x zEtczo9>HXZNzYQxVBS9%$rY-f#Dy9x*sbM%&F9Hz xeM; zHN?hTDI+cNq5pRR_0#y;tlLUEzrOF$BJa;zH3j_PkI7vdewR7`D+sBjb;Aee)A#Ej zmiYyHWxC!{&r=WZn>Q|#6qz%$rFAb&Sp^d9D)1bDhp nFh#HGy+vxtjSiP6x$x zQDN)qX4U0M6sljNUeS;L^FLILSZ9r5Wh$Ecy*d;oE1Q06viru3a%~2GBqb$9Eu1PK zA`)4cM?mGXZzn3+3KNthZtd?*Kb}D-$mNQ|vt!xKfFBP=tI4oIfvdfzVn+Pr)wfyz zq T=K@