diff --git a/colorui/animation.css b/colorui/animation.css
new file mode 100755
index 0000000..931bb51
--- /dev/null
+++ b/colorui/animation.css
@@ -0,0 +1,184 @@
+/*
+ Animation 微动画
+ 基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28
+ */
+
+/* css 滤镜 控制黑白底色gif的 */
+.gif-black{
+ mix-blend-mode: screen;
+}
+.gif-white{
+ mix-blend-mode: multiply;
+}
+
+
+/* Animation css */
+[class*=animation-] {
+ animation-duration: .5s;
+ animation-timing-function: ease-out;
+ animation-fill-mode: both
+}
+
+.animation-fade {
+ animation-name: fade;
+ animation-duration: .8s;
+ animation-timing-function: linear
+}
+
+.animation-scale-up {
+ animation-name: scale-up
+}
+
+.animation-scale-down {
+ animation-name: scale-down
+}
+
+.animation-slide-top {
+ animation-name: slide-top
+}
+
+.animation-slide-bottom {
+ animation-name: slide-bottom
+}
+
+.animation-slide-left {
+ animation-name: slide-left
+}
+
+.animation-slide-right {
+ animation-name: slide-right
+}
+
+.animation-shake {
+ animation-name: shake
+}
+
+.animation-reverse {
+ animation-direction: reverse
+}
+
+@keyframes fade {
+ 0% {
+ opacity: 0
+ }
+
+ 100% {
+ opacity: 1
+ }
+}
+
+@keyframes scale-up {
+ 0% {
+ opacity: 0;
+ transform: scale(.2)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: scale(1)
+ }
+}
+
+@keyframes scale-down {
+ 0% {
+ opacity: 0;
+ transform: scale(1.8)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: scale(1)
+ }
+}
+
+@keyframes slide-top {
+ 0% {
+ opacity: 0;
+ transform: translateY(-100%)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0)
+ }
+}
+
+@keyframes slide-bottom {
+ 0% {
+ opacity: 0;
+ transform: translateY(100%)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0)
+ }
+}
+
+@keyframes shake {
+
+ 0%,
+ 100% {
+ transform: translateX(0)
+ }
+
+ 10% {
+ transform: translateX(-9px)
+ }
+
+ 20% {
+ transform: translateX(8px)
+ }
+
+ 30% {
+ transform: translateX(-7px)
+ }
+
+ 40% {
+ transform: translateX(6px)
+ }
+
+ 50% {
+ transform: translateX(-5px)
+ }
+
+ 60% {
+ transform: translateX(4px)
+ }
+
+ 70% {
+ transform: translateX(-3px)
+ }
+
+ 80% {
+ transform: translateX(2px)
+ }
+
+ 90% {
+ transform: translateX(-1px)
+ }
+}
+
+@keyframes slide-left {
+ 0% {
+ opacity: 0;
+ transform: translateX(-100%)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0)
+ }
+}
+
+@keyframes slide-right {
+ 0% {
+ opacity: 0;
+ transform: translateX(100%)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0)
+ }
+}
\ No newline at end of file
diff --git a/colorui/components/cu-custom.vue b/colorui/components/cu-custom.vue
new file mode 100755
index 0000000..a4e1773
--- /dev/null
+++ b/colorui/components/cu-custom.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/colorui/icon.css b/colorui/icon.css
new file mode 100755
index 0000000..16ed121
--- /dev/null
+++ b/colorui/icon.css
@@ -0,0 +1,1226 @@
+@keyframes cuIcon-spin {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+
+.cuIconfont-spin {
+ -webkit-animation: cuIcon-spin 2s infinite linear;
+ animation: cuIcon-spin 2s infinite linear;
+ display: inline-block;
+}
+
+.cuIconfont-pulse {
+ -webkit-animation: cuIcon-spin 1s infinite steps(8);
+ animation: cuIcon-spin 1s infinite steps(8);
+ display: inline-block;
+}
+
+[class*="cuIcon-"] {
+ font-family: "cuIcon";
+ font-size: inherit;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: "cuIcon";
+ src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831');
+ /* IE9*/
+ src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'),
+ /* IE6-IE8 */
+ url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
+ url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'),
+ /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#cuIconfont') format('svg');
+ /* iOS 4.1- */
+}
+
+.cuIcon-appreciate:before {
+ content: "\e644";
+}
+
+.cuIcon-check:before {
+ content: "\e645";
+}
+
+.cuIcon-close:before {
+ content: "\e646";
+}
+
+.cuIcon-edit:before {
+ content: "\e649";
+}
+
+.cuIcon-emoji:before {
+ content: "\e64a";
+}
+
+.cuIcon-favorfill:before {
+ content: "\e64b";
+}
+
+.cuIcon-favor:before {
+ content: "\e64c";
+}
+
+.cuIcon-loading:before {
+ content: "\e64f";
+}
+
+.cuIcon-locationfill:before {
+ content: "\e650";
+}
+
+.cuIcon-location:before {
+ content: "\e651";
+}
+
+.cuIcon-phone:before {
+ content: "\e652";
+}
+
+.cuIcon-roundcheckfill:before {
+ content: "\e656";
+}
+
+.cuIcon-roundcheck:before {
+ content: "\e657";
+}
+
+.cuIcon-roundclosefill:before {
+ content: "\e658";
+}
+
+.cuIcon-roundclose:before {
+ content: "\e659";
+}
+
+.cuIcon-roundrightfill:before {
+ content: "\e65a";
+}
+
+.cuIcon-roundright:before {
+ content: "\e65b";
+}
+
+.cuIcon-search:before {
+ content: "\e65c";
+}
+
+.cuIcon-taxi:before {
+ content: "\e65d";
+}
+
+.cuIcon-timefill:before {
+ content: "\e65e";
+}
+
+.cuIcon-time:before {
+ content: "\e65f";
+}
+
+.cuIcon-unfold:before {
+ content: "\e661";
+}
+
+.cuIcon-warnfill:before {
+ content: "\e662";
+}
+
+.cuIcon-warn:before {
+ content: "\e663";
+}
+
+.cuIcon-camerafill:before {
+ content: "\e664";
+}
+
+.cuIcon-camera:before {
+ content: "\e665";
+}
+
+.cuIcon-commentfill:before {
+ content: "\e666";
+}
+
+.cuIcon-comment:before {
+ content: "\e667";
+}
+
+.cuIcon-likefill:before {
+ content: "\e668";
+}
+
+.cuIcon-like:before {
+ content: "\e669";
+}
+
+.cuIcon-notificationfill:before {
+ content: "\e66a";
+}
+
+.cuIcon-notification:before {
+ content: "\e66b";
+}
+
+.cuIcon-order:before {
+ content: "\e66c";
+}
+
+.cuIcon-samefill:before {
+ content: "\e66d";
+}
+
+.cuIcon-same:before {
+ content: "\e66e";
+}
+
+.cuIcon-deliver:before {
+ content: "\e671";
+}
+
+.cuIcon-evaluate:before {
+ content: "\e672";
+}
+
+.cuIcon-pay:before {
+ content: "\e673";
+}
+
+.cuIcon-send:before {
+ content: "\e675";
+}
+
+.cuIcon-shop:before {
+ content: "\e676";
+}
+
+.cuIcon-ticket:before {
+ content: "\e677";
+}
+
+.cuIcon-back:before {
+ content: "\e679";
+}
+
+.cuIcon-cascades:before {
+ content: "\e67c";
+}
+
+.cuIcon-discover:before {
+ content: "\e67e";
+}
+
+.cuIcon-list:before {
+ content: "\e682";
+}
+
+.cuIcon-more:before {
+ content: "\e684";
+}
+
+.cuIcon-scan:before {
+ content: "\e689";
+}
+
+.cuIcon-settings:before {
+ content: "\e68a";
+}
+
+.cuIcon-questionfill:before {
+ content: "\e690";
+}
+
+.cuIcon-question:before {
+ content: "\e691";
+}
+
+.cuIcon-shopfill:before {
+ content: "\e697";
+}
+
+.cuIcon-form:before {
+ content: "\e699";
+}
+
+.cuIcon-pic:before {
+ content: "\e69b";
+}
+
+.cuIcon-filter:before {
+ content: "\e69c";
+}
+
+.cuIcon-footprint:before {
+ content: "\e69d";
+}
+
+.cuIcon-top:before {
+ content: "\e69e";
+}
+
+.cuIcon-pulldown:before {
+ content: "\e69f";
+}
+
+.cuIcon-pullup:before {
+ content: "\e6a0";
+}
+
+.cuIcon-right:before {
+ content: "\e6a3";
+}
+
+.cuIcon-refresh:before {
+ content: "\e6a4";
+}
+
+.cuIcon-moreandroid:before {
+ content: "\e6a5";
+}
+
+.cuIcon-deletefill:before {
+ content: "\e6a6";
+}
+
+.cuIcon-refund:before {
+ content: "\e6ac";
+}
+
+.cuIcon-cart:before {
+ content: "\e6af";
+}
+
+.cuIcon-qrcode:before {
+ content: "\e6b0";
+}
+
+.cuIcon-remind:before {
+ content: "\e6b2";
+}
+
+.cuIcon-delete:before {
+ content: "\e6b4";
+}
+
+.cuIcon-profile:before {
+ content: "\e6b7";
+}
+
+.cuIcon-home:before {
+ content: "\e6b8";
+}
+
+.cuIcon-cartfill:before {
+ content: "\e6b9";
+}
+
+.cuIcon-discoverfill:before {
+ content: "\e6ba";
+}
+
+.cuIcon-homefill:before {
+ content: "\e6bb";
+}
+
+.cuIcon-message:before {
+ content: "\e6bc";
+}
+
+.cuIcon-addressbook:before {
+ content: "\e6bd";
+}
+
+.cuIcon-link:before {
+ content: "\e6bf";
+}
+
+.cuIcon-lock:before {
+ content: "\e6c0";
+}
+
+.cuIcon-unlock:before {
+ content: "\e6c2";
+}
+
+.cuIcon-vip:before {
+ content: "\e6c3";
+}
+
+.cuIcon-weibo:before {
+ content: "\e6c4";
+}
+
+.cuIcon-activity:before {
+ content: "\e6c5";
+}
+
+.cuIcon-friendaddfill:before {
+ content: "\e6c9";
+}
+
+.cuIcon-friendadd:before {
+ content: "\e6ca";
+}
+
+.cuIcon-friendfamous:before {
+ content: "\e6cb";
+}
+
+.cuIcon-friend:before {
+ content: "\e6cc";
+}
+
+.cuIcon-goods:before {
+ content: "\e6cd";
+}
+
+.cuIcon-selection:before {
+ content: "\e6ce";
+}
+
+.cuIcon-explore:before {
+ content: "\e6d2";
+}
+
+.cuIcon-present:before {
+ content: "\e6d3";
+}
+
+.cuIcon-squarecheckfill:before {
+ content: "\e6d4";
+}
+
+.cuIcon-square:before {
+ content: "\e6d5";
+}
+
+.cuIcon-squarecheck:before {
+ content: "\e6d6";
+}
+
+.cuIcon-round:before {
+ content: "\e6d7";
+}
+
+.cuIcon-roundaddfill:before {
+ content: "\e6d8";
+}
+
+.cuIcon-roundadd:before {
+ content: "\e6d9";
+}
+
+.cuIcon-add:before {
+ content: "\e6da";
+}
+
+.cuIcon-notificationforbidfill:before {
+ content: "\e6db";
+}
+
+.cuIcon-explorefill:before {
+ content: "\e6dd";
+}
+
+.cuIcon-fold:before {
+ content: "\e6de";
+}
+
+.cuIcon-game:before {
+ content: "\e6df";
+}
+
+.cuIcon-redpacket:before {
+ content: "\e6e0";
+}
+
+.cuIcon-selectionfill:before {
+ content: "\e6e1";
+}
+
+.cuIcon-similar:before {
+ content: "\e6e2";
+}
+
+.cuIcon-appreciatefill:before {
+ content: "\e6e3";
+}
+
+.cuIcon-infofill:before {
+ content: "\e6e4";
+}
+
+.cuIcon-info:before {
+ content: "\e6e5";
+}
+
+.cuIcon-forwardfill:before {
+ content: "\e6ea";
+}
+
+.cuIcon-forward:before {
+ content: "\e6eb";
+}
+
+.cuIcon-rechargefill:before {
+ content: "\e6ec";
+}
+
+.cuIcon-recharge:before {
+ content: "\e6ed";
+}
+
+.cuIcon-vipcard:before {
+ content: "\e6ee";
+}
+
+.cuIcon-voice:before {
+ content: "\e6ef";
+}
+
+.cuIcon-voicefill:before {
+ content: "\e6f0";
+}
+
+.cuIcon-friendfavor:before {
+ content: "\e6f1";
+}
+
+.cuIcon-wifi:before {
+ content: "\e6f2";
+}
+
+.cuIcon-share:before {
+ content: "\e6f3";
+}
+
+.cuIcon-wefill:before {
+ content: "\e6f4";
+}
+
+.cuIcon-we:before {
+ content: "\e6f5";
+}
+
+.cuIcon-lightauto:before {
+ content: "\e6f6";
+}
+
+.cuIcon-lightforbid:before {
+ content: "\e6f7";
+}
+
+.cuIcon-lightfill:before {
+ content: "\e6f8";
+}
+
+.cuIcon-camerarotate:before {
+ content: "\e6f9";
+}
+
+.cuIcon-light:before {
+ content: "\e6fa";
+}
+
+.cuIcon-barcode:before {
+ content: "\e6fb";
+}
+
+.cuIcon-flashlightclose:before {
+ content: "\e6fc";
+}
+
+.cuIcon-flashlightopen:before {
+ content: "\e6fd";
+}
+
+.cuIcon-searchlist:before {
+ content: "\e6fe";
+}
+
+.cuIcon-service:before {
+ content: "\e6ff";
+}
+
+.cuIcon-sort:before {
+ content: "\e700";
+}
+
+.cuIcon-down:before {
+ content: "\e703";
+}
+
+.cuIcon-mobile:before {
+ content: "\e704";
+}
+
+.cuIcon-mobilefill:before {
+ content: "\e705";
+}
+
+.cuIcon-copy:before {
+ content: "\e706";
+}
+
+.cuIcon-countdownfill:before {
+ content: "\e707";
+}
+
+.cuIcon-countdown:before {
+ content: "\e708";
+}
+
+.cuIcon-noticefill:before {
+ content: "\e709";
+}
+
+.cuIcon-notice:before {
+ content: "\e70a";
+}
+
+.cuIcon-upstagefill:before {
+ content: "\e70e";
+}
+
+.cuIcon-upstage:before {
+ content: "\e70f";
+}
+
+.cuIcon-babyfill:before {
+ content: "\e710";
+}
+
+.cuIcon-baby:before {
+ content: "\e711";
+}
+
+.cuIcon-brandfill:before {
+ content: "\e712";
+}
+
+.cuIcon-brand:before {
+ content: "\e713";
+}
+
+.cuIcon-choicenessfill:before {
+ content: "\e714";
+}
+
+.cuIcon-choiceness:before {
+ content: "\e715";
+}
+
+.cuIcon-clothesfill:before {
+ content: "\e716";
+}
+
+.cuIcon-clothes:before {
+ content: "\e717";
+}
+
+.cuIcon-creativefill:before {
+ content: "\e718";
+}
+
+.cuIcon-creative:before {
+ content: "\e719";
+}
+
+.cuIcon-female:before {
+ content: "\e71a";
+}
+
+.cuIcon-keyboard:before {
+ content: "\e71b";
+}
+
+.cuIcon-male:before {
+ content: "\e71c";
+}
+
+.cuIcon-newfill:before {
+ content: "\e71d";
+}
+
+.cuIcon-new:before {
+ content: "\e71e";
+}
+
+.cuIcon-pullleft:before {
+ content: "\e71f";
+}
+
+.cuIcon-pullright:before {
+ content: "\e720";
+}
+
+.cuIcon-rankfill:before {
+ content: "\e721";
+}
+
+.cuIcon-rank:before {
+ content: "\e722";
+}
+
+.cuIcon-bad:before {
+ content: "\e723";
+}
+
+.cuIcon-cameraadd:before {
+ content: "\e724";
+}
+
+.cuIcon-focus:before {
+ content: "\e725";
+}
+
+.cuIcon-friendfill:before {
+ content: "\e726";
+}
+
+.cuIcon-cameraaddfill:before {
+ content: "\e727";
+}
+
+.cuIcon-apps:before {
+ content: "\e729";
+}
+
+.cuIcon-paintfill:before {
+ content: "\e72a";
+}
+
+.cuIcon-paint:before {
+ content: "\e72b";
+}
+
+.cuIcon-picfill:before {
+ content: "\e72c";
+}
+
+.cuIcon-refresharrow:before {
+ content: "\e72d";
+}
+
+.cuIcon-colorlens:before {
+ content: "\e6e6";
+}
+
+.cuIcon-markfill:before {
+ content: "\e730";
+}
+
+.cuIcon-mark:before {
+ content: "\e731";
+}
+
+.cuIcon-presentfill:before {
+ content: "\e732";
+}
+
+.cuIcon-repeal:before {
+ content: "\e733";
+}
+
+.cuIcon-album:before {
+ content: "\e734";
+}
+
+.cuIcon-peoplefill:before {
+ content: "\e735";
+}
+
+.cuIcon-people:before {
+ content: "\e736";
+}
+
+.cuIcon-servicefill:before {
+ content: "\e737";
+}
+
+.cuIcon-repair:before {
+ content: "\e738";
+}
+
+.cuIcon-file:before {
+ content: "\e739";
+}
+
+.cuIcon-repairfill:before {
+ content: "\e73a";
+}
+
+.cuIcon-taoxiaopu:before {
+ content: "\e73b";
+}
+
+.cuIcon-weixin:before {
+ content: "\e612";
+}
+
+.cuIcon-attentionfill:before {
+ content: "\e73c";
+}
+
+.cuIcon-attention:before {
+ content: "\e73d";
+}
+
+.cuIcon-commandfill:before {
+ content: "\e73e";
+}
+
+.cuIcon-command:before {
+ content: "\e73f";
+}
+
+.cuIcon-communityfill:before {
+ content: "\e740";
+}
+
+.cuIcon-community:before {
+ content: "\e741";
+}
+
+.cuIcon-read:before {
+ content: "\e742";
+}
+
+.cuIcon-calendar:before {
+ content: "\e74a";
+}
+
+.cuIcon-cut:before {
+ content: "\e74b";
+}
+
+.cuIcon-magic:before {
+ content: "\e74c";
+}
+
+.cuIcon-backwardfill:before {
+ content: "\e74d";
+}
+
+.cuIcon-playfill:before {
+ content: "\e74f";
+}
+
+.cuIcon-stop:before {
+ content: "\e750";
+}
+
+.cuIcon-tagfill:before {
+ content: "\e751";
+}
+
+.cuIcon-tag:before {
+ content: "\e752";
+}
+
+.cuIcon-group:before {
+ content: "\e753";
+}
+
+.cuIcon-all:before {
+ content: "\e755";
+}
+
+.cuIcon-backdelete:before {
+ content: "\e756";
+}
+
+.cuIcon-hotfill:before {
+ content: "\e757";
+}
+
+.cuIcon-hot:before {
+ content: "\e758";
+}
+
+.cuIcon-post:before {
+ content: "\e759";
+}
+
+.cuIcon-radiobox:before {
+ content: "\e75b";
+}
+
+.cuIcon-rounddown:before {
+ content: "\e75c";
+}
+
+.cuIcon-upload:before {
+ content: "\e75d";
+}
+
+.cuIcon-writefill:before {
+ content: "\e760";
+}
+
+.cuIcon-write:before {
+ content: "\e761";
+}
+
+.cuIcon-radioboxfill:before {
+ content: "\e763";
+}
+
+.cuIcon-punch:before {
+ content: "\e764";
+}
+
+.cuIcon-shake:before {
+ content: "\e765";
+}
+
+.cuIcon-move:before {
+ content: "\e768";
+}
+
+.cuIcon-safe:before {
+ content: "\e769";
+}
+
+.cuIcon-activityfill:before {
+ content: "\e775";
+}
+
+.cuIcon-crownfill:before {
+ content: "\e776";
+}
+
+.cuIcon-crown:before {
+ content: "\e777";
+}
+
+.cuIcon-goodsfill:before {
+ content: "\e778";
+}
+
+.cuIcon-messagefill:before {
+ content: "\e779";
+}
+
+.cuIcon-profilefill:before {
+ content: "\e77a";
+}
+
+.cuIcon-sound:before {
+ content: "\e77b";
+}
+
+.cuIcon-sponsorfill:before {
+ content: "\e77c";
+}
+
+.cuIcon-sponsor:before {
+ content: "\e77d";
+}
+
+.cuIcon-upblock:before {
+ content: "\e77e";
+}
+
+.cuIcon-weblock:before {
+ content: "\e77f";
+}
+
+.cuIcon-weunblock:before {
+ content: "\e780";
+}
+
+.cuIcon-my:before {
+ content: "\e78b";
+}
+
+.cuIcon-myfill:before {
+ content: "\e78c";
+}
+
+.cuIcon-emojifill:before {
+ content: "\e78d";
+}
+
+.cuIcon-emojiflashfill:before {
+ content: "\e78e";
+}
+
+.cuIcon-flashbuyfill:before {
+ content: "\e78f";
+}
+
+.cuIcon-text:before {
+ content: "\e791";
+}
+
+.cuIcon-goodsfavor:before {
+ content: "\e794";
+}
+
+.cuIcon-musicfill:before {
+ content: "\e795";
+}
+
+.cuIcon-musicforbidfill:before {
+ content: "\e796";
+}
+
+.cuIcon-card:before {
+ content: "\e624";
+}
+
+.cuIcon-triangledownfill:before {
+ content: "\e79b";
+}
+
+.cuIcon-triangleupfill:before {
+ content: "\e79c";
+}
+
+.cuIcon-roundleftfill-copy:before {
+ content: "\e79e";
+}
+
+.cuIcon-font:before {
+ content: "\e76a";
+}
+
+.cuIcon-title:before {
+ content: "\e82f";
+}
+
+.cuIcon-recordfill:before {
+ content: "\e7a4";
+}
+
+.cuIcon-record:before {
+ content: "\e7a6";
+}
+
+.cuIcon-cardboardfill:before {
+ content: "\e7a9";
+}
+
+.cuIcon-cardboard:before {
+ content: "\e7aa";
+}
+
+.cuIcon-formfill:before {
+ content: "\e7ab";
+}
+
+.cuIcon-coin:before {
+ content: "\e7ac";
+}
+
+.cuIcon-cardboardforbid:before {
+ content: "\e7af";
+}
+
+.cuIcon-circlefill:before {
+ content: "\e7b0";
+}
+
+.cuIcon-circle:before {
+ content: "\e7b1";
+}
+
+.cuIcon-attentionforbid:before {
+ content: "\e7b2";
+}
+
+.cuIcon-attentionforbidfill:before {
+ content: "\e7b3";
+}
+
+.cuIcon-attentionfavorfill:before {
+ content: "\e7b4";
+}
+
+.cuIcon-attentionfavor:before {
+ content: "\e7b5";
+}
+
+.cuIcon-titles:before {
+ content: "\e701";
+}
+
+.cuIcon-icloading:before {
+ content: "\e67a";
+}
+
+.cuIcon-full:before {
+ content: "\e7bc";
+}
+
+.cuIcon-mail:before {
+ content: "\e7bd";
+}
+
+.cuIcon-peoplelist:before {
+ content: "\e7be";
+}
+
+.cuIcon-goodsnewfill:before {
+ content: "\e7bf";
+}
+
+.cuIcon-goodsnew:before {
+ content: "\e7c0";
+}
+
+.cuIcon-medalfill:before {
+ content: "\e7c1";
+}
+
+.cuIcon-medal:before {
+ content: "\e7c2";
+}
+
+.cuIcon-newsfill:before {
+ content: "\e7c3";
+}
+
+.cuIcon-newshotfill:before {
+ content: "\e7c4";
+}
+
+.cuIcon-newshot:before {
+ content: "\e7c5";
+}
+
+.cuIcon-news:before {
+ content: "\e7c6";
+}
+
+.cuIcon-videofill:before {
+ content: "\e7c7";
+}
+
+.cuIcon-video:before {
+ content: "\e7c8";
+}
+
+.cuIcon-exit:before {
+ content: "\e7cb";
+}
+
+.cuIcon-skinfill:before {
+ content: "\e7cc";
+}
+
+.cuIcon-skin:before {
+ content: "\e7cd";
+}
+
+.cuIcon-moneybagfill:before {
+ content: "\e7ce";
+}
+
+.cuIcon-usefullfill:before {
+ content: "\e7cf";
+}
+
+.cuIcon-usefull:before {
+ content: "\e7d0";
+}
+
+.cuIcon-moneybag:before {
+ content: "\e7d1";
+}
+
+.cuIcon-redpacket_fill:before {
+ content: "\e7d3";
+}
+
+.cuIcon-subscription:before {
+ content: "\e7d4";
+}
+
+.cuIcon-loading1:before {
+ content: "\e633";
+}
+
+.cuIcon-github:before {
+ content: "\e692";
+}
+
+.cuIcon-global:before {
+ content: "\e7eb";
+}
+
+.cuIcon-settingsfill:before {
+ content: "\e6ab";
+}
+
+.cuIcon-back_android:before {
+ content: "\e7ed";
+}
+
+.cuIcon-expressman:before {
+ content: "\e7ef";
+}
+
+.cuIcon-evaluate_fill:before {
+ content: "\e7f0";
+}
+
+.cuIcon-group_fill:before {
+ content: "\e7f5";
+}
+
+.cuIcon-play_forward_fill:before {
+ content: "\e7f6";
+}
+
+.cuIcon-deliver_fill:before {
+ content: "\e7f7";
+}
+
+.cuIcon-notice_forbid_fill:before {
+ content: "\e7f8";
+}
+
+.cuIcon-fork:before {
+ content: "\e60c";
+}
+
+.cuIcon-pick:before {
+ content: "\e7fa";
+}
+
+.cuIcon-wenzi:before {
+ content: "\e6a7";
+}
+
+.cuIcon-ellipse:before {
+ content: "\e600";
+}
+
+.cuIcon-qr_code:before {
+ content: "\e61b";
+}
+
+.cuIcon-dianhua:before {
+ content: "\e64d";
+}
+
+.cuIcon-cuIcon:before {
+ content: "\e602";
+}
+
+.cuIcon-loading2:before {
+ content: "\e7f1";
+}
+
+.cuIcon-btn:before {
+ content: "\e601";
+}
diff --git a/colorui/main.css b/colorui/main.css
new file mode 100755
index 0000000..fade3b2
--- /dev/null
+++ b/colorui/main.css
@@ -0,0 +1,3912 @@
+/*
+ ColorUi for uniApp v2.1.6 | by 文晓港 2019-05-31 10:44:24
+ 仅供学习交流,如作它用所承受的法律责任一概与作者无关
+
+ *使用ColorUi开发扩展与插件时,请注明基于ColorUi开发
+
+ (QQ交流群:240787041)
+*/
+
+/* ==================
+ 初始化
+ ==================== */
+body {
+ background-color: #f1f1f1;
+ font-size: 28upx;
+ color: #333333;
+ font-family: Helvetica Neue, Helvetica, sans-serif;
+}
+
+view,
+scroll-view,
+swiper,
+button,
+input,
+textarea,
+label,
+navigator,
+image {
+ box-sizing: border-box;
+}
+
+.round {
+ border-radius: 5000upx;
+}
+
+.radius {
+ border-radius: 6upx;
+}
+
+/* ==================
+ 图片
+ ==================== */
+
+image {
+ max-width: 100%;
+ display: inline-block;
+ position: relative;
+ z-index: 0;
+}
+
+image.loading::before {
+ content: "";
+ background-color: #f5f5f5;
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ z-index: -2;
+}
+
+image.loading::after {
+ content: "\e7f1";
+ font-family: "cuIcon";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 32upx;
+ height: 32upx;
+ line-height: 32upx;
+ right: 0;
+ bottom: 0;
+ z-index: -1;
+ font-size: 32upx;
+ margin: auto;
+ color: #ccc;
+ -webkit-animation: cuIcon-spin 2s infinite linear;
+ animation: cuIcon-spin 2s infinite linear;
+ display: block;
+}
+
+.response {
+ width: 100%;
+}
+
+/* ==================
+ 开关
+ ==================== */
+
+switch,
+checkbox,
+radio {
+ position: relative;
+}
+
+switch::after,
+switch::before {
+ font-family: "cuIcon";
+ content: "\e645";
+ position: absolute;
+ color: #ffffff !important;
+ top: 0%;
+ left: 0upx;
+ font-size: 26upx;
+ line-height: 26px;
+ width: 50%;
+ text-align: center;
+ pointer-events: none;
+ transform: scale(0, 0);
+ transition: all 0.3s ease-in-out 0s;
+ z-index: 9;
+ bottom: 0;
+ height: 26px;
+ margin: auto;
+}
+
+switch::before {
+ content: "\e646";
+ right: 0;
+ transform: scale(1, 1);
+ left: auto;
+}
+
+switch[checked]::after,
+switch.checked::after {
+ transform: scale(1, 1);
+}
+
+switch[checked]::before,
+switch.checked::before {
+ transform: scale(0, 0);
+}
+
+/* #ifndef MP-ALIPAY */
+radio::before,
+checkbox::before {
+ font-family: "cuIcon";
+ content: "\e645";
+ position: absolute;
+ color: #ffffff !important;
+ top: 50%;
+ margin-top: -8px;
+ right: 5px;
+ font-size: 32upx;
+ line-height: 16px;
+ pointer-events: none;
+ transform: scale(1, 1);
+ transition: all 0.3s ease-in-out 0s;
+ z-index: 9;
+}
+
+radio .wx-radio-input,
+checkbox .wx-checkbox-input,
+radio .uni-radio-input,
+checkbox .uni-checkbox-input {
+ margin: 0;
+ width: 24px;
+ height: 24px;
+}
+
+checkbox.round .wx-checkbox-input,
+checkbox.round .uni-checkbox-input {
+ border-radius: 100upx;
+}
+
+/* #endif */
+
+switch[checked]::before {
+ transform: scale(0, 0);
+}
+
+switch .wx-switch-input,
+switch .uni-switch-input {
+ border: none;
+ padding: 0 24px;
+ width: 48px;
+ height: 26px;
+ margin: 0;
+ border-radius: 100upx;
+}
+
+switch .wx-switch-input:not([class*="bg-"]),
+switch .uni-switch-input:not([class*="bg-"]) {
+ background: #8799a3 !important;
+}
+
+switch .wx-switch-input::after,
+switch .uni-switch-input::after {
+ margin: auto;
+ width: 26px;
+ height: 26px;
+ border-radius: 100upx;
+ left: 0upx;
+ top: 0upx;
+ bottom: 0upx;
+ position: absolute;
+ transform: scale(0.9, 0.9);
+ transition: all 0.1s ease-in-out 0s;
+}
+
+switch .wx-switch-input.wx-switch-input-checked::after,
+switch .uni-switch-input.uni-switch-input-checked::after {
+ margin: auto;
+ left: 22px;
+ box-shadow: none;
+ transform: scale(0.9, 0.9);
+}
+
+radio-group {
+ display: inline-block;
+}
+
+
+
+switch.radius .wx-switch-input::after,
+switch.radius .wx-switch-input,
+switch.radius .wx-switch-input::before,
+switch.radius .uni-switch-input::after,
+switch.radius .uni-switch-input,
+switch.radius .uni-switch-input::before {
+ border-radius: 10upx;
+}
+
+switch .wx-switch-input::before,
+radio.radio::before,
+checkbox .wx-checkbox-input::before,
+radio .wx-radio-input::before,
+switch .uni-switch-input::before,
+radio.radio::before,
+checkbox .uni-checkbox-input::before,
+radio .uni-radio-input::before {
+ display: none;
+}
+
+radio.radio[checked]::after,
+radio.radio .uni-radio-input-checked::after {
+ content: "";
+ background-color: transparent;
+ display: block;
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ z-index: 999;
+ top: 0upx;
+ left: 0upx;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ border-radius: 200upx;
+ /* #ifndef MP */
+ border: 7px solid #ffffff !important;
+ /* #endif */
+
+ /* #ifdef MP */
+ border: 8px solid #ffffff !important;
+ /* #endif */
+}
+
+.switch-sex::after {
+ content: "\e71c";
+}
+
+.switch-sex::before {
+ content: "\e71a";
+}
+
+.switch-sex .wx-switch-input,
+.switch-sex .uni-switch-input {
+ background: #e54d42 !important;
+ border-color: #e54d42 !important;
+}
+
+.switch-sex[checked] .wx-switch-input,
+.switch-sex.checked .uni-switch-input {
+ background: #0081ff !important;
+ border-color: #0081ff !important;
+}
+
+switch.red[checked] .wx-switch-input.wx-switch-input-checked,
+checkbox.red[checked] .wx-checkbox-input,
+radio.red[checked] .wx-radio-input,
+switch.red.checked .uni-switch-input.uni-switch-input-checked,
+checkbox.red.checked .uni-checkbox-input,
+radio.red.checked .uni-radio-input {
+ background-color: #e54d42 !important;
+ border-color: #e54d42 !important;
+ color: #ffffff !important;
+}
+
+switch.orange[checked] .wx-switch-input,
+checkbox.orange[checked] .wx-checkbox-input,
+radio.orange[checked] .wx-radio-input,
+switch.orange.checked .uni-switch-input,
+checkbox.orange.checked .uni-checkbox-input,
+radio.orange.checked .uni-radio-input {
+ background-color: #f37b1d !important;
+ border-color: #f37b1d !important;
+ color: #ffffff !important;
+}
+
+switch.yellow[checked] .wx-switch-input,
+checkbox.yellow[checked] .wx-checkbox-input,
+radio.yellow[checked] .wx-radio-input,
+switch.yellow.checked .uni-switch-input,
+checkbox.yellow.checked .uni-checkbox-input,
+radio.yellow.checked .uni-radio-input {
+ background-color: #fbbd08 !important;
+ border-color: #fbbd08 !important;
+ color: #333333 !important;
+}
+
+switch.olive[checked] .wx-switch-input,
+checkbox.olive[checked] .wx-checkbox-input,
+radio.olive[checked] .wx-radio-input,
+switch.olive.checked .uni-switch-input,
+checkbox.olive.checked .uni-checkbox-input,
+radio.olive.checked .uni-radio-input {
+ background-color: #8dc63f !important;
+ border-color: #8dc63f !important;
+ color: #ffffff !important;
+}
+
+switch.green[checked] .wx-switch-input,
+switch[checked] .wx-switch-input,
+checkbox.green[checked] .wx-checkbox-input,
+checkbox[checked] .wx-checkbox-input,
+radio.green[checked] .wx-radio-input,
+radio[checked] .wx-radio-input,
+switch.green.checked .uni-switch-input,
+switch.checked .uni-switch-input,
+checkbox.green.checked .uni-checkbox-input,
+checkbox.checked .uni-checkbox-input,
+radio.green.checked .uni-radio-input,
+radio.checked .uni-radio-input {
+ background-color: #39b54a !important;
+ border-color: #39b54a !important;
+ color: #ffffff !important;
+ border-color: #39B54A !important;
+}
+
+switch.cyan[checked] .wx-switch-input,
+checkbox.cyan[checked] .wx-checkbox-input,
+radio.cyan[checked] .wx-radio-input,
+switch.cyan.checked .uni-switch-input,
+checkbox.cyan.checked .uni-checkbox-input,
+radio.cyan.checked .uni-radio-input {
+ background-color: #1cbbb4 !important;
+ border-color: #1cbbb4 !important;
+ color: #ffffff !important;
+}
+
+switch.blue[checked] .wx-switch-input,
+checkbox.blue[checked] .wx-checkbox-input,
+radio.blue[checked] .wx-radio-input,
+switch.blue.checked .uni-switch-input,
+checkbox.blue.checked .uni-checkbox-input,
+radio.blue.checked .uni-radio-input {
+ background-color: #0081ff !important;
+ border-color: #0081ff !important;
+ color: #ffffff !important;
+}
+
+switch.purple[checked] .wx-switch-input,
+checkbox.purple[checked] .wx-checkbox-input,
+radio.purple[checked] .wx-radio-input,
+switch.purple.checked .uni-switch-input,
+checkbox.purple.checked .uni-checkbox-input,
+radio.purple.checked .uni-radio-input {
+ background-color: #6739b6 !important;
+ border-color: #6739b6 !important;
+ color: #ffffff !important;
+}
+
+switch.mauve[checked] .wx-switch-input,
+checkbox.mauve[checked] .wx-checkbox-input,
+radio.mauve[checked] .wx-radio-input,
+switch.mauve.checked .uni-switch-input,
+checkbox.mauve.checked .uni-checkbox-input,
+radio.mauve.checked .uni-radio-input {
+ background-color: #9c26b0 !important;
+ border-color: #9c26b0 !important;
+ color: #ffffff !important;
+}
+
+switch.pink[checked] .wx-switch-input,
+checkbox.pink[checked] .wx-checkbox-input,
+radio.pink[checked] .wx-radio-input,
+switch.pink.checked .uni-switch-input,
+checkbox.pink.checked .uni-checkbox-input,
+radio.pink.checked .uni-radio-input {
+ background-color: #e03997 !important;
+ border-color: #e03997 !important;
+ color: #ffffff !important;
+}
+
+switch.brown[checked] .wx-switch-input,
+checkbox.brown[checked] .wx-checkbox-input,
+radio.brown[checked] .wx-radio-input,
+switch.brown.checked .uni-switch-input,
+checkbox.brown.checked .uni-checkbox-input,
+radio.brown.checked .uni-radio-input {
+ background-color: #a5673f !important;
+ border-color: #a5673f !important;
+ color: #ffffff !important;
+}
+
+switch.grey[checked] .wx-switch-input,
+checkbox.grey[checked] .wx-checkbox-input,
+radio.grey[checked] .wx-radio-input,
+switch.grey.checked .uni-switch-input,
+checkbox.grey.checked .uni-checkbox-input,
+radio.grey.checked .uni-radio-input {
+ background-color: #8799a3 !important;
+ border-color: #8799a3 !important;
+ color: #ffffff !important;
+}
+
+switch.gray[checked] .wx-switch-input,
+checkbox.gray[checked] .wx-checkbox-input,
+radio.gray[checked] .wx-radio-input,
+switch.gray.checked .uni-switch-input,
+checkbox.gray.checked .uni-checkbox-input,
+radio.gray.checked .uni-radio-input {
+ background-color: #f0f0f0 !important;
+ border-color: #f0f0f0 !important;
+ color: #333333 !important;
+}
+
+switch.black[checked] .wx-switch-input,
+checkbox.black[checked] .wx-checkbox-input,
+radio.black[checked] .wx-radio-input,
+switch.black.checked .uni-switch-input,
+checkbox.black.checked .uni-checkbox-input,
+radio.black.checked .uni-radio-input {
+ background-color: #333333 !important;
+ border-color: #333333 !important;
+ color: #ffffff !important;
+}
+
+switch.white[checked] .wx-switch-input,
+checkbox.white[checked] .wx-checkbox-input,
+radio.white[checked] .wx-radio-input,
+switch.white.checked .uni-switch-input,
+checkbox.white.checked .uni-checkbox-input,
+radio.white.checked .uni-radio-input {
+ background-color: #ffffff !important;
+ border-color: #ffffff !important;
+ color: #333333 !important;
+}
+
+/* ==================
+ 边框
+ ==================== */
+
+/* -- 实线 -- */
+
+.solid,
+.solid-top,
+.solid-right,
+.solid-bottom,
+.solid-left,
+.solids,
+.solids-top,
+.solids-right,
+.solids-bottom,
+.solids-left,
+.dashed,
+.dashed-top,
+.dashed-right,
+.dashed-bottom,
+.dashed-left {
+ position: relative;
+}
+
+.solid::after,
+.solid-top::after,
+.solid-right::after,
+.solid-bottom::after,
+.solid-left::after,
+.solids::after,
+.solids-top::after,
+.solids-right::after,
+.solids-bottom::after,
+.solids-left::after,
+.dashed::after,
+.dashed-top::after,
+.dashed-right::after,
+.dashed-bottom::after,
+.dashed-left::after {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border-radius: inherit;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ pointer-events: none;
+ box-sizing: border-box;
+}
+
+.solid::after {
+ border: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-top::after {
+ border-top: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-right::after {
+ border-right: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-bottom::after {
+ border-bottom: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-left::after {
+ border-left: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solids::after {
+ border: 8upx solid #eee;
+}
+
+.solids-top::after {
+ border-top: 8upx solid #eee;
+}
+
+.solids-right::after {
+ border-right: 8upx solid #eee;
+}
+
+.solids-bottom::after {
+ border-bottom: 8upx solid #eee;
+}
+
+.solids-left::after {
+ border-left: 8upx solid #eee;
+}
+
+/* -- 虚线 -- */
+
+.dashed::after {
+ border: 1upx dashed #ddd;
+}
+
+.dashed-top::after {
+ border-top: 1upx dashed #ddd;
+}
+
+.dashed-right::after {
+ border-right: 1upx dashed #ddd;
+}
+
+.dashed-bottom::after {
+ border-bottom: 1upx dashed #ddd;
+}
+
+.dashed-left::after {
+ border-left: 1upx dashed #ddd;
+}
+
+/* -- 阴影 -- */
+
+.shadow[class*='white'] {
+ --ShadowSize: 0 1upx 6upx;
+}
+
+.shadow-lg {
+ --ShadowSize: 0upx 40upx 100upx 0upx;
+}
+
+.shadow-warp {
+ position: relative;
+ box-shadow: 0 0 10upx rgba(0, 0, 0, 0.1);
+}
+
+.shadow-warp:before,
+.shadow-warp:after {
+ position: absolute;
+ content: "";
+ top: 20upx;
+ bottom: 30upx;
+ left: 20upx;
+ width: 50%;
+ box-shadow: 0 30upx 20upx rgba(0, 0, 0, 0.2);
+ transform: rotate(-3deg);
+ z-index: -1;
+}
+
+.shadow-warp:after {
+ right: 20upx;
+ left: auto;
+ transform: rotate(3deg);
+}
+
+.shadow-blur {
+ position: relative;
+}
+
+.shadow-blur::before {
+ content: "";
+ display: block;
+ background: inherit;
+ filter: blur(10upx);
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 10upx;
+ left: 10upx;
+ z-index: -1;
+ opacity: 0.4;
+ transform-origin: 0 0;
+ border-radius: inherit;
+ transform: scale(1, 1);
+}
+
+/* ==================
+ 按钮
+ ==================== */
+
+.cu-btn {
+ position: relative;
+ border: 0upx;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 0 30upx;
+ font-size: 28upx;
+ height: 64upx;
+ line-height: 1;
+ text-align: center;
+ text-decoration: none;
+ overflow: visible;
+ margin-left: initial;
+ transform: translate(0upx, 0upx);
+ margin-right: initial;
+}
+
+.cu-btn::after {
+ display: none;
+}
+
+.cu-btn:not([class*="bg-"]) {
+ background-color: #f0f0f0;
+}
+
+.cu-btn[class*="line"] {
+ background-color: transparent;
+}
+
+.cu-btn[class*="line"]::after {
+ content: " ";
+ display: block;
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 1upx solid currentColor;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ box-sizing: border-box;
+ border-radius: 12upx;
+ z-index: 1;
+ pointer-events: none;
+}
+
+.cu-btn.round[class*="line"]::after {
+ border-radius: 1000upx;
+}
+
+.cu-btn[class*="lines"]::after {
+ border: 6upx solid currentColor;
+}
+
+.cu-btn[class*="bg-"]::after {
+ display: none;
+}
+
+.cu-btn.sm {
+ padding: 0 20upx;
+ font-size: 20upx;
+ height: 48upx;
+}
+
+.cu-btn.lg {
+ padding: 0 40upx;
+ font-size: 32upx;
+ height: 80upx;
+}
+
+.cu-btn.cuIcon.sm {
+ width: 48upx;
+ height: 48upx;
+}
+
+.cu-btn.cuIcon {
+ width: 64upx;
+ height: 64upx;
+ border-radius: 500upx;
+ padding: 0;
+}
+
+button.cuIcon.lg {
+ width: 80upx;
+ height: 80upx;
+}
+
+.cu-btn.shadow-blur::before {
+ top: 4upx;
+ left: 4upx;
+ filter: blur(6upx);
+ opacity: 0.6;
+}
+
+.cu-btn.button-hover {
+ transform: translate(1upx, 1upx);
+}
+
+.block {
+ display: block;
+}
+
+.cu-btn.block {
+ display: flex;
+}
+
+.cu-btn[disabled] {
+ opacity: 0.6;
+ color: #ffffff;
+}
+
+/* ==================
+ 徽章
+ ==================== */
+
+.cu-tag {
+ font-size: 24upx;
+ vertical-align: middle;
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 0upx 16upx;
+ height: 48upx;
+ font-family: Helvetica Neue, Helvetica, sans-serif;
+ white-space: nowrap;
+}
+
+.cu-tag:not([class*="bg"]):not([class*="line"]) {
+ background-color: #f1f1f1;
+}
+
+.cu-tag[class*="line-"]::after {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 1upx solid currentColor;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ box-sizing: border-box;
+ border-radius: inherit;
+ z-index: 1;
+ pointer-events: none;
+}
+
+.cu-tag.radius[class*="line"]::after {
+ border-radius: 12upx;
+}
+
+.cu-tag.round[class*="line"]::after {
+ border-radius: 1000upx;
+}
+
+.cu-tag[class*="line-"]::after {
+ border-radius: 0;
+}
+
+.cu-tag+.cu-tag {
+ margin-left: 10upx;
+}
+
+.cu-tag.sm {
+ font-size: 20upx;
+ padding: 0upx 12upx;
+ height: 32upx;
+}
+
+.cu-capsule {
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.cu-capsule+.cu-capsule {
+ margin-left: 10upx;
+}
+
+.cu-capsule .cu-tag {
+ margin: 0;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:last-child::after {
+ border-left: 0upx solid transparent;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:first-child::after {
+ border-right: 0upx solid transparent;
+}
+
+.cu-capsule.radius .cu-tag:first-child {
+ border-top-left-radius: 6upx;
+ border-bottom-left-radius: 6upx;
+}
+
+.cu-capsule.radius .cu-tag:last-child::after,
+.cu-capsule.radius .cu-tag[class*="line-"] {
+ border-top-right-radius: 12upx;
+ border-bottom-right-radius: 12upx;
+}
+
+.cu-capsule.round .cu-tag:first-child {
+ border-top-left-radius: 200upx;
+ border-bottom-left-radius: 200upx;
+ text-indent: 4upx;
+}
+
+.cu-capsule.round .cu-tag:last-child::after,
+.cu-capsule.round .cu-tag:last-child {
+ border-top-right-radius: 200upx;
+ border-bottom-right-radius: 200upx;
+ text-indent: -4upx;
+}
+
+.cu-tag.badge {
+ border-radius: 200upx;
+ position: absolute;
+ top: -10upx;
+ right: -10upx;
+ font-size: 20upx;
+ padding: 0upx 10upx;
+ height: 28upx;
+ color: #ffffff;
+}
+
+.cu-tag.badge:not([class*="bg-"]) {
+ background-color: #dd514c;
+}
+
+.cu-tag:empty:not([class*="cuIcon-"]) {
+ padding: 0upx;
+ width: 16upx;
+ height: 16upx;
+ top: -4upx;
+ right: -4upx;
+}
+
+.cu-tag[class*="cuIcon-"] {
+ width: 32upx;
+ height: 32upx;
+ top: -4upx;
+ right: -4upx;
+}
+
+/* ==================
+ 头像
+ ==================== */
+
+.cu-avatar {
+ font-variant: small-caps;
+ margin: 0;
+ padding: 0;
+ display: inline-flex;
+ text-align: center;
+ justify-content: center;
+ align-items: center;
+ background-color: #ccc;
+ color: #ffffff;
+ white-space: nowrap;
+ position: relative;
+ width: 64upx;
+ height: 64upx;
+ background-size: cover;
+ background-position: center;
+ vertical-align: middle;
+ font-size: 1.5em;
+}
+
+.cu-avatar.sm {
+ width: 48upx;
+ height: 48upx;
+ font-size: 1em;
+}
+
+.cu-avatar.lg {
+ width: 96upx;
+ height: 96upx;
+ font-size: 2em;
+}
+
+.cu-avatar.xl {
+ width: 128upx;
+ height: 128upx;
+ font-size: 2.5em;
+}
+
+.cu-avatar .avatar-text {
+ font-size: 0.4em;
+}
+
+.cu-avatar-group {
+ direction: rtl;
+ unicode-bidi: bidi-override;
+ padding: 0 10upx 0 40upx;
+ display: inline-block;
+}
+
+.cu-avatar-group .cu-avatar {
+ margin-left: -30upx;
+ border: 4upx solid #f1f1f1;
+ vertical-align: middle;
+}
+
+.cu-avatar-group .cu-avatar.sm {
+ margin-left: -20upx;
+ border: 1upx solid #f1f1f1;
+}
+
+/* ==================
+ 进度条
+ ==================== */
+
+.cu-progress {
+ overflow: hidden;
+ height: 28upx;
+ background-color: #ebeef5;
+ display: inline-flex;
+ align-items: center;
+ width: 100%;
+}
+
+.cu-progress+view,
+.cu-progress+text {
+ line-height: 1;
+}
+
+.cu-progress.xs {
+ height: 10upx;
+}
+
+.cu-progress.sm {
+ height: 20upx;
+}
+
+.cu-progress view {
+ width: 0;
+ height: 100%;
+ align-items: center;
+ display: flex;
+ justify-items: flex-end;
+ justify-content: space-around;
+ font-size: 20upx;
+ color: #ffffff;
+ transition: width 0.6s ease;
+}
+
+.cu-progress text {
+ align-items: center;
+ display: flex;
+ font-size: 20upx;
+ color: #333333;
+ text-indent: 10upx;
+}
+
+.cu-progress.text-progress {
+ padding-right: 60upx;
+}
+
+.cu-progress.striped view {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 72upx 72upx;
+}
+
+.cu-progress.active view {
+ animation: progress-stripes 2s linear infinite;
+}
+
+@keyframes progress-stripes {
+ from {
+ background-position: 72upx 0;
+ }
+
+ to {
+ background-position: 0 0;
+ }
+}
+
+/* ==================
+ 加载
+ ==================== */
+
+.cu-load {
+ display: block;
+ line-height: 3em;
+ text-align: center;
+}
+
+.cu-load::before {
+ font-family: "cuIcon";
+ display: inline-block;
+ margin-right: 6upx;
+}
+
+.cu-load.loading::before {
+ content: "\e67a";
+ animation: cuIcon-spin 2s infinite linear;
+}
+
+.cu-load.loading::after {
+ content: "加载中...";
+}
+
+.cu-load.over::before {
+ content: "\e64a";
+}
+
+.cu-load.over::after {
+ content: "没有更多了";
+}
+
+.cu-load.erro::before {
+ content: "\e658";
+}
+
+.cu-load.erro::after {
+ content: "加载失败";
+}
+
+.cu-load.load-cuIcon::before {
+ font-size: 32upx;
+}
+
+.cu-load.load-cuIcon::after {
+ display: none;
+}
+
+.cu-load.load-cuIcon.over {
+ display: none;
+}
+
+.cu-load.load-modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 140upx;
+ left: 0;
+ margin: auto;
+ width: 260upx;
+ height: 260upx;
+ background-color: #ffffff;
+ border-radius: 10upx;
+ box-shadow: 0 0 0upx 2000upx rgba(0, 0, 0, 0.5);
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ justify-content: center;
+ font-size: 28upx;
+ z-index: 9999;
+ line-height: 2.4em;
+}
+
+.cu-load.load-modal [class*="cuIcon-"] {
+ font-size: 60upx;
+}
+
+.cu-load.load-modal image {
+ width: 70upx;
+ height: 70upx;
+}
+
+.cu-load.load-modal::after {
+ content: "";
+ position: absolute;
+ background-color: #ffffff;
+ border-radius: 50%;
+ width: 200upx;
+ height: 200upx;
+ font-size: 10px;
+ border-top: 6upx solid rgba(0, 0, 0, 0.05);
+ border-right: 6upx solid rgba(0, 0, 0, 0.05);
+ border-bottom: 6upx solid rgba(0, 0, 0, 0.05);
+ border-left: 6upx solid #f37b1d;
+ animation: cuIcon-spin 1s infinite linear;
+ z-index: -1;
+}
+
+.load-progress {
+ pointer-events: none;
+ top: 0;
+ position: fixed;
+ width: 100%;
+ left: 0;
+ z-index: 2000;
+}
+
+.load-progress.hide {
+ display: none;
+}
+
+.load-progress .load-progress-bar {
+ position: relative;
+ width: 100%;
+ height: 4upx;
+ overflow: hidden;
+ transition: all 200ms ease 0s;
+}
+
+.load-progress .load-progress-spinner {
+ position: absolute;
+ top: 10upx;
+ right: 10upx;
+ z-index: 2000;
+ display: block;
+}
+
+.load-progress .load-progress-spinner::after {
+ content: "";
+ display: block;
+ width: 24upx;
+ height: 24upx;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: solid 4upx transparent;
+ border-top-color: inherit;
+ border-left-color: inherit;
+ border-radius: 50%;
+ -webkit-animation: load-progress-spinner 0.4s linear infinite;
+ animation: load-progress-spinner 0.4s linear infinite;
+}
+
+@-webkit-keyframes load-progress-spinner {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes load-progress-spinner {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+/* ==================
+ 列表
+ ==================== */
+.grayscale {
+ filter: grayscale(1);
+}
+
+.cu-list+.cu-list {
+ margin-top: 30upx
+}
+
+.cu-list>.cu-item {
+ transition: all .6s ease-in-out 0s;
+ transform: translateX(0upx)
+}
+
+.cu-list>.cu-item.move-cur {
+ transform: translateX(-260upx)
+}
+
+.cu-list>.cu-item .move {
+ position: absolute;
+ right: 0;
+ display: flex;
+ width: 260upx;
+ height: 100%;
+ transform: translateX(100%)
+}
+
+.cu-list>.cu-item .move view {
+ display: flex;
+ flex: 1;
+ justify-content: center;
+ align-items: center
+}
+
+.cu-list.menu-avatar {
+ overflow: hidden;
+}
+
+.cu-list.menu-avatar>.cu-item {
+ position: relative;
+ display: flex;
+ padding-right: 10upx;
+ height: 140upx;
+ background-color: #ffffff;
+ justify-content: flex-end;
+ align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item>.cu-avatar {
+ position: absolute;
+ left: 30upx
+}
+
+.cu-list.menu-avatar>.cu-item .flex .text-cut {
+ max-width: 510upx
+}
+
+.cu-list.menu-avatar>.cu-item .content {
+ position: absolute;
+ left: 146upx;
+ width: calc(100% - 96upx - 60upx - 120upx - 20upx);
+ line-height: 1.6em;
+}
+
+.cu-list.menu-avatar>.cu-item .content.flex-sub {
+ width: calc(100% - 96upx - 60upx - 20upx);
+}
+
+.cu-list.menu-avatar>.cu-item .content>view:first-child {
+ font-size: 30upx;
+ display: flex;
+ align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item .content .cu-tag.sm {
+ display: inline-block;
+ margin-left: 10upx;
+ height: 28upx;
+ font-size: 16upx;
+ line-height: 32upx
+}
+
+.cu-list.menu-avatar>.cu-item .action {
+ width: 100upx;
+ text-align: center
+}
+
+.cu-list.menu-avatar>.cu-item .action view+view {
+ margin-top: 10upx
+}
+
+.cu-list.menu-avatar.comment>.cu-item .content {
+ position: relative;
+ left: 0;
+ width: auto;
+ flex: 1;
+}
+
+.cu-list.menu-avatar.comment>.cu-item {
+ padding: 30upx 30upx 30upx 120upx;
+ height: auto
+}
+
+.cu-list.menu-avatar.comment .cu-avatar {
+ align-self: flex-start
+}
+
+.cu-list.menu>.cu-item {
+ position: relative;
+ display: flex;
+ padding: 0 30upx;
+ min-height: 100upx;
+ background-color: #ffffff;
+ justify-content: space-between;
+ align-items: center
+}
+
+.cu-list.menu>.cu-item:last-child:after {
+ border: none
+}
+
+.cu-list.menu-avatar>.cu-item:after,
+.cu-list.menu>.cu-item:after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ box-sizing: border-box;
+ width: 200%;
+ height: 200%;
+ border-bottom: 1upx solid #ddd;
+ border-radius: inherit;
+ content: " ";
+ transform: scale(.5);
+ transform-origin: 0 0;
+ pointer-events: none
+}
+
+.cu-list.menu>.cu-item.grayscale {
+ background-color: #f5f5f5
+}
+
+.cu-list.menu>.cu-item.cur {
+ background-color: #fcf7e9
+}
+
+.cu-list.menu>.cu-item.arrow {
+ padding-right: 90upx
+}
+
+.cu-list.menu>.cu-item.arrow:before {
+ position: absolute;
+ top: 0;
+ right: 30upx;
+ bottom: 0;
+ display: block;
+ margin: auto;
+ width: 30upx;
+ height: 30upx;
+ color: #8799a3;
+ content: "\e6a3";
+ text-align: center;
+ font-size: 34upx;
+ font-family: cuIcon;
+ line-height: 30upx
+}
+
+.cu-list.menu>.cu-item button.content {
+ padding: 0;
+ background-color: transparent;
+ justify-content: flex-start
+}
+
+.cu-list.menu>.cu-item button.content:after {
+ display: none
+}
+
+.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar {
+ border-color: #ffffff
+}
+
+.cu-list.menu>.cu-item .content>view:first-child {
+ display: flex;
+ align-items: center
+}
+
+.cu-list.menu>.cu-item .content>text[class*=cuIcon] {
+ display: inline-block;
+ margin-right: 10upx;
+ width: 1.6em;
+ text-align: center
+}
+
+.cu-list.menu>.cu-item .content>image {
+ display: inline-block;
+ margin-right: 10upx;
+ width: 1.6em;
+ height: 1.6em;
+ vertical-align: middle
+}
+
+.cu-list.menu>.cu-item .content {
+ font-size: 30upx;
+ line-height: 1.6em;
+ flex: 1
+}
+
+.cu-list.menu>.cu-item .content .cu-tag.sm {
+ display: inline-block;
+ margin-left: 10upx;
+ height: 28upx;
+ font-size: 16upx;
+ line-height: 32upx
+}
+
+.cu-list.menu>.cu-item .action .cu-tag:empty {
+ right: 10upx
+}
+
+.cu-list.menu {
+ display: block;
+ overflow: hidden
+}
+
+.cu-list.menu.sm-border>.cu-item:after {
+ left: 30upx;
+ width: calc(200% - 120upx)
+}
+
+.cu-list.grid>.cu-item {
+ position: relative;
+ display: flex;
+ padding: 20upx 0 30upx;
+ transition-duration: 0s;
+ flex-direction: column
+}
+
+.cu-list.grid>.cu-item:after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ box-sizing: border-box;
+ width: 200%;
+ height: 200%;
+ border-right: 1px solid rgba(0, 0, 0, .1);
+ border-bottom: 1px solid rgba(0, 0, 0, .1);
+ border-radius: inherit;
+ content: " ";
+ transform: scale(.5);
+ transform-origin: 0 0;
+ pointer-events: none
+}
+
+.cu-list.grid>.cu-item text {
+ display: block;
+ margin-top: 10upx;
+ color: #888;
+ font-size: 26upx;
+ line-height: 40upx
+}
+
+.cu-list.grid>.cu-item [class*=cuIcon] {
+ position: relative;
+ display: block;
+ margin-top: 20upx;
+ width: 100%;
+ font-size: 48upx
+}
+
+.cu-list.grid>.cu-item .cu-tag {
+ right: auto;
+ left: 50%;
+ margin-left: 20upx
+}
+
+.cu-list.grid {
+ background-color: #ffffff;
+ text-align: center
+}
+
+.cu-list.grid.no-border>.cu-item {
+ padding-top: 10upx;
+ padding-bottom: 20upx
+}
+
+.cu-list.grid.no-border>.cu-item:after {
+ border: none
+}
+
+.cu-list.grid.no-border {
+ padding: 20upx 10upx
+}
+
+.cu-list.grid.col-3>.cu-item:nth-child(3n):after,
+.cu-list.grid.col-4>.cu-item:nth-child(4n):after,
+.cu-list.grid.col-5>.cu-item:nth-child(5n):after {
+ border-right-width: 0
+}
+
+.cu-list.card-menu {
+ overflow: hidden;
+ margin-right: 30upx;
+ margin-left: 30upx;
+ border-radius: 20upx
+}
+
+
+/* ==================
+ 操作条
+ ==================== */
+
+.cu-bar {
+ display: flex;
+ position: relative;
+ align-items: center;
+ min-height: 100upx;
+ justify-content: space-between;
+}
+
+.cu-bar .action {
+ display: flex;
+ align-items: center;
+ height: 100%;
+ justify-content: center;
+ max-width: 100%;
+}
+
+.cu-bar .action.border-title {
+ position: relative;
+ top: -10upx;
+}
+
+.cu-bar .action.border-title text[class*="bg-"]:last-child {
+ position: absolute;
+ bottom: -0.5rem;
+ min-width: 2rem;
+ height: 6upx;
+ left: 0;
+}
+
+.cu-bar .action.sub-title {
+ position: relative;
+ top: -0.2rem;
+}
+
+.cu-bar .action.sub-title text {
+ position: relative;
+ z-index: 1;
+}
+
+.cu-bar .action.sub-title text[class*="bg-"]:last-child {
+ position: absolute;
+ display: inline-block;
+ bottom: -0.2rem;
+ border-radius: 6upx;
+ width: 100%;
+ height: 0.6rem;
+ left: 0.6rem;
+ opacity: 0.3;
+ z-index: 0;
+}
+
+.cu-bar .action.sub-title text[class*="text-"]:last-child {
+ position: absolute;
+ display: inline-block;
+ bottom: -0.7rem;
+ left: 0.5rem;
+ opacity: 0.2;
+ z-index: 0;
+ text-align: right;
+ font-weight: 900;
+ font-size: 36upx;
+}
+
+.cu-bar.justify-center .action.border-title text:last-child,
+.cu-bar.justify-center .action.sub-title text:last-child {
+ left: 0;
+ right: 0;
+ margin: auto;
+ text-align: center;
+}
+
+.cu-bar .action:first-child {
+ margin-left: 30upx;
+ font-size: 30upx;
+}
+
+.cu-bar .action text.text-cut {
+ text-align: left;
+ width: 100%;
+}
+
+.cu-bar .cu-avatar:first-child {
+ margin-left: 20upx;
+}
+
+.cu-bar .action:first-child>text[class*="cuIcon-"] {
+ margin-left: -0.3em;
+ margin-right: 0.3em;
+}
+
+.cu-bar .action:last-child {
+ margin-right: 30upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"],
+.cu-bar .action>view[class*="cuIcon-"] {
+ font-size: 36upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] {
+ margin-left: 0.5em;
+}
+
+.cu-bar .content {
+ position: absolute;
+ text-align: center;
+ width: calc(100% - 340upx);
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ margin: auto;
+ height: 60upx;
+ font-size: 32upx;
+ line-height: 60upx;
+ cursor: none;
+ pointer-events: none;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.cu-bar.ios .content {
+ bottom: 7px;
+ height: 30px;
+ font-size: 32upx;
+ line-height: 30px;
+}
+
+.cu-bar.btn-group {
+ justify-content: space-around;
+}
+
+.cu-bar.btn-group button {
+ padding: 20upx 32upx;
+}
+
+.cu-bar.btn-group button {
+ flex: 1;
+ margin: 0 20upx;
+ max-width: 50%;
+}
+
+.cu-bar .search-form {
+ background-color: #f5f5f5;
+ line-height: 64upx;
+ height: 64upx;
+ font-size: 24upx;
+ color: #333333;
+ flex: 1;
+ display: flex;
+ align-items: center;
+ margin: 0 30upx;
+}
+
+.cu-bar .search-form+.action {
+ margin-right: 30upx;
+}
+
+.cu-bar .search-form input {
+ flex: 1;
+ padding-right: 30upx;
+ height: 64upx;
+ line-height: 64upx;
+ font-size: 26upx;
+ background-color: transparent;
+}
+
+.cu-bar .search-form [class*="cuIcon-"] {
+ margin: 0 0.5em 0 0.8em;
+}
+
+.cu-bar .search-form [class*="cuIcon-"]::before {
+ top: 0upx;
+}
+
+.cu-bar.fixed,
+.nav.fixed {
+ position: fixed;
+ width: 100%;
+ top: 0;
+ z-index: 1024;
+ box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.foot {
+ position: fixed;
+ width: 100%;
+ bottom: 0;
+ z-index: 1024;
+ box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar {
+ padding: 0;
+ height: calc(100upx + env(safe-area-inset-bottom) / 2);
+ padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+}
+
+.cu-tabbar-height {
+ min-height: 100upx;
+ height: calc(100upx + env(safe-area-inset-bottom) / 2);
+}
+
+.cu-bar.tabbar.shadow {
+ box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar .action {
+ font-size: 22upx;
+ position: relative;
+ flex: 1;
+ text-align: center;
+ padding: 0;
+ display: block;
+ height: auto;
+ line-height: 1;
+ margin: 0;
+ background-color: inherit;
+ overflow: initial;
+}
+
+.cu-bar.tabbar.shop .action {
+ width: 140upx;
+ flex: initial;
+}
+
+.cu-bar.tabbar .action.add-action {
+ position: relative;
+ z-index: 2;
+ padding-top: 50upx;
+}
+
+.cu-bar.tabbar .action.add-action [class*="cuIcon-"] {
+ position: absolute;
+ width: 70upx;
+ z-index: 2;
+ height: 70upx;
+ border-radius: 50%;
+ line-height: 70upx;
+ font-size: 50upx;
+ top: -35upx;
+ left: 0;
+ right: 0;
+ margin: auto;
+ padding: 0;
+}
+
+.cu-bar.tabbar .action.add-action::after {
+ content: "";
+ position: absolute;
+ width: 100upx;
+ height: 100upx;
+ top: -50upx;
+ left: 0;
+ right: 0;
+ margin: auto;
+ box-shadow: 0 -3upx 8upx rgba(0, 0, 0, 0.08);
+ border-radius: 50upx;
+ background-color: inherit;
+ z-index: 0;
+}
+
+.cu-bar.tabbar .action.add-action::before {
+ content: "";
+ position: absolute;
+ width: 100upx;
+ height: 30upx;
+ bottom: 30upx;
+ left: 0;
+ right: 0;
+ margin: auto;
+ background-color: inherit;
+ z-index: 1;
+}
+
+.cu-bar.tabbar .btn-group {
+ flex: 1;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ padding: 0 10upx;
+}
+
+.cu-bar.tabbar button.action::after {
+ border: 0;
+}
+
+.cu-bar.tabbar .action [class*="cuIcon-"] {
+ width: 100upx;
+ position: relative;
+ display: block;
+ height: auto;
+ margin: 0 auto 10upx;
+ text-align: center;
+ font-size: 40upx;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image {
+ margin: 0 auto;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image image {
+ width: 50upx;
+ height: 50upx;
+ display: inline-block;
+}
+
+.cu-bar.tabbar .submit {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ text-align: center;
+ position: relative;
+ flex: 2;
+ align-self: stretch;
+}
+
+.cu-bar.tabbar .submit:last-child {
+ flex: 2.6;
+}
+
+.cu-bar.tabbar .submit+.submit {
+ flex: 2;
+}
+
+.cu-bar.tabbar.border .action::before {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ border-right: 1upx solid rgba(0, 0, 0, 0.1);
+ z-index: 3;
+}
+
+.cu-bar.tabbar.border .action:last-child:before {
+ display: none;
+}
+
+.cu-bar.input {
+ padding-right: 20upx;
+ background-color: #ffffff;
+}
+
+.cu-bar.input input {
+ overflow: initial;
+ line-height: 64upx;
+ height: 64upx;
+ min-height: 64upx;
+ flex: 1;
+ font-size: 30upx;
+ margin: 0 20upx;
+}
+
+.cu-bar.input .action {
+ margin-left: 20upx;
+}
+
+.cu-bar.input .action [class*="cuIcon-"] {
+ font-size: 48upx;
+}
+
+.cu-bar.input input+.action {
+ margin-right: 20upx;
+ margin-left: 0upx;
+}
+
+.cu-bar.input .action:first-child [class*="cuIcon-"] {
+ margin-left: 0upx;
+}
+
+.cu-custom {
+ display: block;
+ position: relative;
+}
+
+.cu-custom .cu-bar .content {
+ width: calc(100% - 440upx);
+}
+
+/* #ifdef MP-ALIPAY */
+.cu-custom .cu-bar .action .cuIcon-back {
+ opacity: 0;
+}
+
+/* #endif */
+
+.cu-custom .cu-bar .content image {
+ height: 60upx;
+ width: 240upx;
+}
+
+.cu-custom .cu-bar {
+ min-height: 0px;
+ /* #ifdef MP-WEIXIN */
+ padding-right: 220upx;
+ /* #endif */
+ /* #ifdef MP-ALIPAY */
+ padding-right: 150upx;
+ /* #endif */
+ box-shadow: 0upx 0upx 0upx;
+ z-index: 9999;
+}
+
+.cu-custom .cu-bar .border-custom {
+ position: relative;
+ background: rgba(0, 0, 0, 0.15);
+ border-radius: 1000upx;
+ height: 30px;
+}
+
+.cu-custom .cu-bar .border-custom::after {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border-radius: inherit;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ pointer-events: none;
+ box-sizing: border-box;
+ border: 1upx solid #ffffff;
+ opacity: 0.5;
+}
+
+.cu-custom .cu-bar .border-custom::before {
+ content: " ";
+ width: 1upx;
+ height: 110%;
+ position: absolute;
+ top: 22.5%;
+ left: 0;
+ right: 0;
+ margin: auto;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ pointer-events: none;
+ box-sizing: border-box;
+ opacity: 0.6;
+ background-color: #ffffff;
+}
+
+.cu-custom .cu-bar .border-custom text {
+ display: block;
+ flex: 1;
+ margin: auto !important;
+ text-align: center;
+ font-size: 34upx;
+}
+
+/* ==================
+ 导航栏
+ ==================== */
+
+.nav {
+ white-space: nowrap;
+}
+
+::-webkit-scrollbar {
+ display: none;
+}
+
+.nav .cu-item {
+ height: 90upx;
+ display: inline-block;
+ line-height: 90upx;
+ margin: 0 10upx;
+ padding: 0 20upx;
+}
+
+.nav .cu-item.cur {
+ border-bottom: 4upx solid;
+}
+
+/* ==================
+ 时间轴
+ ==================== */
+
+.cu-timeline {
+ display: block;
+ background-color: #ffffff;
+}
+
+.cu-timeline .cu-time {
+ width: 120upx;
+ text-align: center;
+ padding: 20upx 0;
+ font-size: 26upx;
+ color: #888;
+ display: block;
+}
+
+.cu-timeline>.cu-item {
+ padding: 30upx 30upx 30upx 120upx;
+ position: relative;
+ display: block;
+ z-index: 0;
+}
+
+.cu-timeline>.cu-item:not([class*="text-"]) {
+ color: #ccc;
+}
+
+.cu-timeline>.cu-item::after {
+ content: "";
+ display: block;
+ position: absolute;
+ width: 1upx;
+ background-color: #ddd;
+ left: 60upx;
+ height: 100%;
+ top: 0;
+ z-index: 8;
+}
+
+.cu-timeline>.cu-item::before {
+ font-family: "cuIcon";
+ display: block;
+ position: absolute;
+ top: 36upx;
+ z-index: 9;
+ background-color: #ffffff;
+ width: 50upx;
+ height: 50upx;
+ text-align: center;
+ border: none;
+ line-height: 50upx;
+ left: 36upx;
+}
+
+.cu-timeline>.cu-item:not([class*="cuIcon-"])::before {
+ content: "\e763";
+}
+
+.cu-timeline>.cu-item[class*="cuIcon-"]::before {
+ background-color: #ffffff;
+ width: 50upx;
+ height: 50upx;
+ text-align: center;
+ border: none;
+ line-height: 50upx;
+ left: 36upx;
+}
+
+.cu-timeline>.cu-item>.content {
+ padding: 30upx;
+ border-radius: 6upx;
+ display: block;
+ line-height: 1.6;
+}
+
+.cu-timeline>.cu-item>.content:not([class*="bg-"]) {
+ background-color: #f1f1f1;
+ color: #333333;
+}
+
+.cu-timeline>.cu-item>.content+.content {
+ margin-top: 20upx;
+}
+
+/* ==================
+ 聊天
+ ==================== */
+
+.cu-chat {
+ display: flex;
+ flex-direction: column;
+}
+
+.cu-chat .cu-item {
+ display: flex;
+ padding: 30upx 30upx 70upx;
+ position: relative;
+}
+
+.cu-chat .cu-item>.cu-avatar {
+ width: 80upx;
+ height: 80upx;
+}
+
+.cu-chat .cu-item>.main {
+ max-width: calc(100% - 260upx);
+ margin: 0 40upx;
+ display: flex;
+ align-items: center;
+}
+
+.cu-chat .cu-item>image {
+ height: 320upx;
+}
+
+.cu-chat .cu-item>.main .content {
+ padding: 20upx;
+ border-radius: 6upx;
+ display: inline-flex;
+ max-width: 100%;
+ align-items: center;
+ font-size: 30upx;
+ position: relative;
+ min-height: 80upx;
+ line-height: 40upx;
+ text-align: left;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"]) {
+ background-color: #ffffff;
+ color: #333333;
+}
+
+.cu-chat .cu-item .date {
+ position: absolute;
+ font-size: 24upx;
+ color: #8799a3;
+ width: calc(100% - 320upx);
+ bottom: 20upx;
+ left: 160upx;
+}
+
+.cu-chat .cu-item .action {
+ padding: 0 30upx;
+ display: flex;
+ align-items: center;
+}
+
+.cu-chat .cu-item>.main .content::after {
+ content: "";
+ top: 27upx;
+ transform: rotate(45deg);
+ position: absolute;
+ z-index: 100;
+ display: inline-block;
+ overflow: hidden;
+ width: 24upx;
+ height: 24upx;
+ left: -12upx;
+ right: initial;
+ background-color: inherit;
+}
+
+.cu-chat .cu-item.self>.main .content::after {
+ left: auto;
+ right: -12upx;
+}
+
+.cu-chat .cu-item>.main .content::before {
+ content: "";
+ top: 30upx;
+ transform: rotate(45deg);
+ position: absolute;
+ z-index: -1;
+ display: inline-block;
+ overflow: hidden;
+ width: 24upx;
+ height: 24upx;
+ left: -12upx;
+ right: initial;
+ background-color: inherit;
+ filter: blur(5upx);
+ opacity: 0.3;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"])::before {
+ background-color: #333333;
+ opacity: 0.1;
+}
+
+.cu-chat .cu-item.self>.main .content::before {
+ left: auto;
+ right: -12upx;
+}
+
+.cu-chat .cu-item.self {
+ justify-content: flex-end;
+ text-align: right;
+}
+
+.cu-chat .cu-info {
+ display: inline-block;
+ margin: 20upx auto;
+ font-size: 24upx;
+ padding: 8upx 12upx;
+ background-color: rgba(0, 0, 0, 0.2);
+ border-radius: 6upx;
+ color: #ffffff;
+ max-width: 400upx;
+ line-height: 1.4;
+}
+
+/* ==================
+ 卡片
+ ==================== */
+
+.cu-card {
+ display: block;
+ overflow: hidden;
+}
+
+.cu-card>.cu-item {
+ display: block;
+ background-color: #ffffff;
+ overflow: hidden;
+ border-radius: 10upx;
+ margin: 30upx;
+}
+
+.cu-card>.cu-item.shadow-blur {
+ overflow: initial;
+}
+
+.cu-card.no-card>.cu-item {
+ margin: 0upx;
+ border-radius: 0upx;
+}
+
+.cu-card .grid.grid-square {
+ margin-bottom: -20upx;
+}
+
+.cu-card.case .image {
+ position: relative;
+}
+
+.cu-card.case .image image {
+ width: 100%;
+}
+
+.cu-card.case .image .cu-tag {
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+.cu-card.case .image .cu-bar {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ background-color: transparent;
+ padding: 0upx 30upx;
+}
+
+.cu-card.case.no-card .image {
+ margin: 30upx 30upx 0;
+ overflow: hidden;
+ border-radius: 10upx;
+}
+
+.cu-card.dynamic {
+ display: block;
+}
+
+.cu-card.dynamic>.cu-item {
+ display: block;
+ background-color: #ffffff;
+ overflow: hidden;
+}
+
+.cu-card.dynamic>.cu-item>.text-content {
+ padding: 0 30upx 0;
+ max-height: 6.4em;
+ overflow: hidden;
+ font-size: 30upx;
+ margin-bottom: 20upx;
+}
+
+.cu-card.dynamic>.cu-item .square-img {
+ width: 100%;
+ height: 200upx;
+ border-radius: 6upx;
+}
+
+.cu-card.dynamic>.cu-item .only-img {
+ width: 100%;
+ height: 320upx;
+ border-radius: 6upx;
+}
+
+/* card.dynamic>.cu-item .comment {
+ padding: 20upx;
+ background-color: #f1f1f1;
+ margin: 0 30upx 30upx;
+ border-radius: 6upx;
+} */
+
+.cu-card.article {
+ display: block;
+}
+
+.cu-card.article>.cu-item {
+ padding-bottom: 30upx;
+}
+
+.cu-card.article>.cu-item .title {
+ font-size: 30upx;
+ font-weight: 900;
+ color: #333333;
+ line-height: 100upx;
+ padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content {
+ display: flex;
+ padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content>image {
+ width: 240upx;
+ height: 6.4em;
+ margin-right: 20upx;
+ border-radius: 6upx;
+}
+
+.cu-card.article>.cu-item .content .desc {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+.cu-card.article>.cu-item .content .text-content {
+ font-size: 28upx;
+ color: #888;
+ height: 4.8em;
+ overflow: hidden;
+}
+
+/* ==================
+ 表单
+ ==================== */
+
+.cu-form-group {
+ background-color: #ffffff;
+ padding: 1upx 30upx;
+ display: flex;
+ align-items: center;
+ min-height: 100upx;
+ justify-content: space-between;
+}
+
+.cu-form-group+.cu-form-group {
+ border-top: 1upx solid #eee;
+}
+
+.cu-form-group .title {
+ text-align: justify;
+ padding-right: 30upx;
+ font-size: 30upx;
+ position: relative;
+ height: 60upx;
+ line-height: 60upx;
+}
+
+.cu-form-group input {
+ flex: 1;
+ font-size: 30upx;
+ color: #555;
+ padding-right: 20upx;
+}
+
+.cu-form-group>text[class*="cuIcon-"] {
+ font-size: 36upx;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+.cu-form-group textarea {
+ margin: 32upx 0 30upx;
+ height: 4.6em;
+ width: 100%;
+ line-height: 1.2em;
+ flex: 1;
+ font-size: 28upx;
+ padding: 0;
+}
+
+.cu-form-group.align-start .title {
+ height: 1em;
+ margin-top: 32upx;
+ line-height: 1em;
+}
+
+.cu-form-group picker {
+ flex: 1;
+ padding-right: 40upx;
+ overflow: hidden;
+ position: relative;
+}
+
+.cu-form-group picker .picker {
+ line-height: 100upx;
+ font-size: 28upx;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ width: 100%;
+ text-align: right;
+}
+
+.cu-form-group picker::after {
+ font-family: cuIcon;
+ display: block;
+ content: "\e6a3";
+ position: absolute;
+ font-size: 34upx;
+ color: #8799a3;
+ line-height: 100upx;
+ width: 60upx;
+ text-align: center;
+ top: 0;
+ bottom: 0;
+ right: -20upx;
+ margin: auto;
+}
+
+.cu-form-group textarea[disabled],
+.cu-form-group textarea[disabled] .placeholder {
+ color: transparent;
+}
+
+/* ==================
+ 模态窗口
+ ==================== */
+
+.cu-modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1110;
+ opacity: 0;
+ outline: 0;
+ text-align: center;
+ -ms-transform: scale(1.185);
+ transform: scale(1.185);
+ backface-visibility: hidden;
+ perspective: 2000upx;
+ background: rgba(0, 0, 0, 0.6);
+ transition: all 0.3s ease-in-out 0s;
+ pointer-events: none;
+}
+
+.cu-modal::before {
+ content: "\200B";
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+}
+
+.cu-modal.show {
+ opacity: 1;
+ transition-duration: 0.3s;
+ -ms-transform: scale(1);
+ transform: scale(1);
+ overflow-x: hidden;
+ overflow-y: auto;
+ pointer-events: auto;
+}
+
+.cu-dialog {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: auto;
+ margin-right: auto;
+ width: 680upx;
+ max-width: 100%;
+ background-color: #f8f8f8;
+ border-radius: 10upx;
+ overflow: hidden;
+}
+
+.cu-modal.bottom-modal::before {
+ vertical-align: bottom;
+}
+
+.cu-modal.bottom-modal .cu-dialog {
+ width: 100%;
+ border-radius: 0;
+}
+
+.cu-modal.bottom-modal {
+ margin-bottom: -1000upx;
+}
+
+.cu-modal.bottom-modal.show {
+ margin-bottom: 0;
+}
+
+.cu-modal.drawer-modal {
+ transform: scale(1);
+ display: flex;
+}
+
+.cu-modal.drawer-modal .cu-dialog {
+ height: 100%;
+ min-width: 200upx;
+ border-radius: 0;
+ margin: initial;
+ transition-duration: 0.3s;
+}
+
+.cu-modal.drawer-modal.justify-start .cu-dialog {
+ transform: translateX(-100%);
+}
+
+.cu-modal.drawer-modal.justify-end .cu-dialog {
+ transform: translateX(100%);
+}
+
+.cu-modal.drawer-modal.show .cu-dialog {
+ transform: translateX(0%);
+}
+.cu-modal .cu-dialog>.cu-bar:first-child .action{
+ min-width: 100rpx;
+ margin-right: 0;
+ min-height: 100rpx;
+}
+/* ==================
+ 轮播
+ ==================== */
+swiper .a-swiper-dot {
+ display: inline-block;
+ width: 16upx;
+ height: 16upx;
+ background: rgba(0, 0, 0, .3);
+ border-radius: 50%;
+ vertical-align: middle;
+}
+
+swiper[class*="-dot"] .wx-swiper-dots,
+swiper[class*="-dot"] .a-swiper-dots,
+swiper[class*="-dot"] .uni-swiper-dots {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ justify-content: center;
+}
+
+swiper.square-dot .wx-swiper-dot,
+swiper.square-dot .a-swiper-dot,
+swiper.square-dot .uni-swiper-dot {
+ background-color: #ffffff;
+ opacity: 0.4;
+ width: 10upx;
+ height: 10upx;
+ border-radius: 20upx;
+ margin: 0 8upx !important;
+}
+
+swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.square-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.square-dot .uni-swiper-dot.uni-swiper-dot-active {
+ opacity: 1;
+ width: 30upx;
+}
+
+swiper.round-dot .wx-swiper-dot,
+swiper.round-dot .a-swiper-dot,
+swiper.round-dot .uni-swiper-dot {
+ width: 10upx;
+ height: 10upx;
+ position: relative;
+ margin: 4upx 8upx !important;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active::after,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active::after {
+ content: "";
+ position: absolute;
+ width: 10upx;
+ height: 10upx;
+ top: 0upx;
+ left: 0upx;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ background-color: #ffffff;
+ border-radius: 20upx;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active {
+ width: 18upx;
+ height: 18upx;
+}
+
+.screen-swiper {
+ min-height: 375upx;
+}
+
+.screen-swiper image,
+.screen-swiper video,
+.swiper-item image,
+.swiper-item video {
+ width: 100%;
+ display: block;
+ height: 100%;
+ margin: 0;
+ pointer-events: none;
+}
+
+.card-swiper {
+ height: 420upx !important;
+}
+
+.card-swiper swiper-item {
+ width: 610upx !important;
+ left: 70upx;
+ box-sizing: border-box;
+ padding: 40upx 0upx 70upx;
+ overflow: initial;
+}
+
+.card-swiper swiper-item .swiper-item {
+ width: 100%;
+ display: block;
+ height: 100%;
+ border-radius: 10upx;
+ transform: scale(0.9);
+ transition: all 0.2s ease-in 0s;
+ overflow: hidden;
+}
+
+.card-swiper swiper-item.cur .swiper-item {
+ transform: none;
+ transition: all 0.2s ease-in 0s;
+}
+
+
+.tower-swiper {
+ height: 420upx;
+ position: relative;
+ max-width: 750upx;
+ overflow: hidden;
+}
+
+.tower-swiper .tower-item {
+ position: absolute;
+ width: 300upx;
+ height: 380upx;
+ top: 0;
+ bottom: 0;
+ left: 50%;
+ margin: auto;
+ transition: all 0.2s ease-in 0s;
+ opacity: 1;
+}
+
+.tower-swiper .tower-item.none {
+ opacity: 0;
+}
+
+.tower-swiper .tower-item .swiper-item {
+ width: 100%;
+ height: 100%;
+ border-radius: 6upx;
+ overflow: hidden;
+}
+
+/* ==================
+ 步骤条
+ ==================== */
+
+.cu-steps {
+ display: flex;
+}
+
+scroll-view.cu-steps {
+ display: block;
+ white-space: nowrap;
+}
+
+scroll-view.cu-steps .cu-item {
+ display: inline-block;
+}
+
+.cu-steps .cu-item {
+ flex: 1;
+ text-align: center;
+ position: relative;
+ min-width: 100upx;
+}
+
+.cu-steps .cu-item:not([class*="text-"]) {
+ color: #8799a3;
+}
+
+.cu-steps .cu-item [class*="cuIcon-"],
+.cu-steps .cu-item .num {
+ display: block;
+ font-size: 40upx;
+ line-height: 80upx;
+}
+
+.cu-steps .cu-item::before,
+.cu-steps .cu-item::after,
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+ content: "";
+ display: block;
+ position: absolute;
+ height: 0px;
+ width: calc(100% - 80upx);
+ border-bottom: 1px solid #ccc;
+ left: calc(0px - (100% - 80upx) / 2);
+ top: 40upx;
+ z-index: 0;
+}
+
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+ content: "\e6a3";
+ font-family: 'cuIcon';
+ height: 30upx;
+ border-bottom-width: 0px;
+ line-height: 30upx;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ color: #ccc;
+}
+
+.cu-steps.steps-bottom .cu-item::before,
+.cu-steps.steps-bottom .cu-item::after {
+ bottom: 40upx;
+ top: initial;
+}
+
+.cu-steps .cu-item::after {
+ border-bottom: 1px solid currentColor;
+ width: 0px;
+ transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"]::after {
+ width: calc(100% - 80upx);
+ color: currentColor;
+}
+
+.cu-steps .cu-item:first-child::before,
+.cu-steps .cu-item:first-child::after {
+ display: none;
+}
+
+.cu-steps .cu-item .num {
+ width: 40upx;
+ height: 40upx;
+ border-radius: 50%;
+ line-height: 40upx;
+ margin: 20upx auto;
+ font-size: 24upx;
+ border: 1px solid currentColor;
+ position: relative;
+ overflow: hidden;
+}
+
+.cu-steps .cu-item[class*="text-"] .num {
+ background-color: currentColor;
+}
+
+.cu-steps .cu-item .num::before,
+.cu-steps .cu-item .num::after {
+ content: attr(data-index);
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ transition: all 0.3s ease-in-out 0s;
+ transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num::before {
+ transform: translateY(-40upx);
+ color: #ffffff;
+}
+
+.cu-steps .cu-item .num::after {
+ transform: translateY(40upx);
+ color: #ffffff;
+ transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"] .num::after {
+ content: "\e645";
+ font-family: 'cuIcon';
+ color: #ffffff;
+ transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num.err::after {
+ content: "\e646";
+}
+
+/* ==================
+ 布局
+ ==================== */
+
+/* -- flex弹性布局 -- */
+
+.flex {
+ display: flex;
+}
+
+.basis-xs {
+ flex-basis: 20%;
+}
+
+.basis-sm {
+ flex-basis: 40%;
+}
+
+.basis-df {
+ flex-basis: 50%;
+}
+
+.basis-lg {
+ flex-basis: 60%;
+}
+
+.basis-xl {
+ flex-basis: 80%;
+}
+
+.flex-sub {
+ flex: 1;
+}
+
+.flex-twice {
+ flex: 2;
+}
+
+.flex-treble {
+ flex: 3;
+}
+
+.flex-direction {
+ flex-direction: column;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.align-start {
+ align-items: flex-start;
+}
+
+.align-end {
+ align-items: flex-end;
+}
+
+.align-center {
+ align-items: center;
+}
+
+.align-stretch {
+ align-items: stretch;
+}
+
+.self-start {
+ align-self: flex-start;
+}
+
+.self-center {
+ align-self: flex-center;
+}
+
+.self-end {
+ align-self: flex-end;
+}
+
+.self-stretch {
+ align-self: stretch;
+}
+
+.align-stretch {
+ align-items: stretch;
+}
+
+.justify-start {
+ justify-content: flex-start;
+}
+
+.justify-end {
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.justify-around {
+ justify-content: space-around;
+}
+
+/* grid布局 */
+
+.grid {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.grid.grid-square {
+ overflow: hidden;
+}
+
+.grid.grid-square .cu-tag {
+ position: absolute;
+ right: 0;
+ top: 0;
+ border-bottom-left-radius: 6upx;
+ padding: 6upx 12upx;
+ height: auto;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+
+.grid.grid-square>view>text[class*="cuIcon-"] {
+ font-size: 52upx;
+ position: absolute;
+ color: #8799a3;
+ margin: auto;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+}
+
+.grid.grid-square>view {
+ margin-right: 20upx;
+ margin-bottom: 20upx;
+ border-radius: 6upx;
+ position: relative;
+ overflow: hidden;
+}
+.grid.grid-square>view.bg-img image {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+}
+.grid.col-1.grid-square>view {
+ padding-bottom: 100%;
+ height: 0;
+ margin-right: 0;
+}
+
+.grid.col-2.grid-square>view {
+ padding-bottom: calc((100% - 20upx)/2);
+ height: 0;
+ width: calc((100% - 20upx)/2);
+}
+
+.grid.col-3.grid-square>view {
+ padding-bottom: calc((100% - 40upx)/3);
+ height: 0;
+ width: calc((100% - 40upx)/3);
+}
+
+.grid.col-4.grid-square>view {
+ padding-bottom: calc((100% - 60upx)/4);
+ height: 0;
+ width: calc((100% - 60upx)/4);
+}
+
+.grid.col-5.grid-square>view {
+ padding-bottom: calc((100% - 80upx)/5);
+ height: 0;
+ width: calc((100% - 80upx)/5);
+}
+
+.grid.col-2.grid-square>view:nth-child(2n),
+.grid.col-3.grid-square>view:nth-child(3n),
+.grid.col-4.grid-square>view:nth-child(4n),
+.grid.col-5.grid-square>view:nth-child(5n) {
+ margin-right: 0;
+}
+
+.grid.col-1>view {
+ width: 100%;
+}
+
+.grid.col-2>view {
+ width: 50%;
+}
+
+.grid.col-3>view {
+ width: 33.33%;
+}
+
+.grid.col-4>view {
+ width: 25%;
+}
+
+.grid.col-5>view {
+ width: 20%;
+}
+
+/* -- 内外边距 -- */
+
+.margin-0 {
+ margin: 0;
+}
+
+.margin-xs {
+ margin: 10upx;
+}
+
+.margin-sm {
+ margin: 20upx;
+}
+
+.margin {
+ margin: 30upx;
+}
+
+.margin-lg {
+ margin: 40upx;
+}
+
+.margin-xl {
+ margin: 50upx;
+}
+
+.margin-top-xs {
+ margin-top: 10upx;
+}
+
+.margin-top-sm {
+ margin-top: 20upx;
+}
+
+.margin-top {
+ margin-top: 30upx;
+}
+
+.margin-top-lg {
+ margin-top: 40upx;
+}
+
+.margin-top-xl {
+ margin-top: 50upx;
+}
+
+.margin-right-xs {
+ margin-right: 10upx;
+}
+
+.margin-right-sm {
+ margin-right: 20upx;
+}
+
+.margin-right {
+ margin-right: 30upx;
+}
+
+.margin-right-lg {
+ margin-right: 40upx;
+}
+
+.margin-right-xl {
+ margin-right: 50upx;
+}
+
+.margin-bottom-xs {
+ margin-bottom: 10upx;
+}
+
+.margin-bottom-sm {
+ margin-bottom: 20upx;
+}
+
+.margin-bottom {
+ margin-bottom: 30upx;
+}
+
+.margin-bottom-lg {
+ margin-bottom: 40upx;
+}
+
+.margin-bottom-xl {
+ margin-bottom: 50upx;
+}
+
+.margin-left-xs {
+ margin-left: 10upx;
+}
+
+.margin-left-sm {
+ margin-left: 20upx;
+}
+
+.margin-left {
+ margin-left: 30upx;
+}
+
+.margin-left-lg {
+ margin-left: 40upx;
+}
+
+.margin-left-xl {
+ margin-left: 50upx;
+}
+
+.margin-lr-xs {
+ margin-left: 10upx;
+ margin-right: 10upx;
+}
+
+.margin-lr-sm {
+ margin-left: 20upx;
+ margin-right: 20upx;
+}
+
+.margin-lr {
+ margin-left: 30upx;
+ margin-right: 30upx;
+}
+
+.margin-lr-lg {
+ margin-left: 40upx;
+ margin-right: 40upx;
+}
+
+.margin-lr-xl {
+ margin-left: 50upx;
+ margin-right: 50upx;
+}
+
+.margin-tb-xs {
+ margin-top: 10upx;
+ margin-bottom: 10upx;
+}
+
+.margin-tb-sm {
+ margin-top: 20upx;
+ margin-bottom: 20upx;
+}
+
+.margin-tb {
+ margin-top: 30upx;
+ margin-bottom: 30upx;
+}
+
+.margin-tb-lg {
+ margin-top: 40upx;
+ margin-bottom: 40upx;
+}
+
+.margin-tb-xl {
+ margin-top: 50upx;
+ margin-bottom: 50upx;
+}
+
+.padding-0 {
+ padding: 0;
+}
+
+.padding-xs {
+ padding: 10upx;
+}
+
+.padding-sm {
+ padding: 20upx;
+}
+
+.padding {
+ padding: 30upx;
+}
+
+.padding-lg {
+ padding: 40upx;
+}
+
+.padding-xl {
+ padding: 50upx;
+}
+
+.padding-top-xs {
+ padding-top: 10upx;
+}
+
+.padding-top-sm {
+ padding-top: 20upx;
+}
+
+.padding-top {
+ padding-top: 30upx;
+}
+
+.padding-top-lg {
+ padding-top: 40upx;
+}
+
+.padding-top-xl {
+ padding-top: 50upx;
+}
+
+.padding-right-xs {
+ padding-right: 10upx;
+}
+
+.padding-right-sm {
+ padding-right: 20upx;
+}
+
+.padding-right {
+ padding-right: 30upx;
+}
+
+.padding-right-lg {
+ padding-right: 40upx;
+}
+
+.padding-right-xl {
+ padding-right: 50upx;
+}
+
+.padding-bottom-xs {
+ padding-bottom: 10upx;
+}
+
+.padding-bottom-sm {
+ padding-bottom: 20upx;
+}
+
+.padding-bottom {
+ padding-bottom: 30upx;
+}
+
+.padding-bottom-lg {
+ padding-bottom: 40upx;
+}
+
+.padding-bottom-xl {
+ padding-bottom: 50upx;
+}
+
+.padding-left-xs {
+ padding-left: 10upx;
+}
+
+.padding-left-sm {
+ padding-left: 20upx;
+}
+
+.padding-left {
+ padding-left: 30upx;
+}
+
+.padding-left-lg {
+ padding-left: 40upx;
+}
+
+.padding-left-xl {
+ padding-left: 50upx;
+}
+
+.padding-lr-xs {
+ padding-left: 10upx;
+ padding-right: 10upx;
+}
+
+.padding-lr-sm {
+ padding-left: 20upx;
+ padding-right: 20upx;
+}
+
+.padding-lr {
+ padding-left: 30upx;
+ padding-right: 30upx;
+}
+
+.padding-lr-lg {
+ padding-left: 40upx;
+ padding-right: 40upx;
+}
+
+.padding-lr-xl {
+ padding-left: 50upx;
+ padding-right: 50upx;
+}
+
+.padding-tb-xs {
+ padding-top: 10upx;
+ padding-bottom: 10upx;
+}
+
+.padding-tb-sm {
+ padding-top: 20upx;
+ padding-bottom: 20upx;
+}
+
+.padding-tb {
+ padding-top: 30upx;
+ padding-bottom: 30upx;
+}
+
+.padding-tb-lg {
+ padding-top: 40upx;
+ padding-bottom: 40upx;
+}
+
+.padding-tb-xl {
+ padding-top: 50upx;
+ padding-bottom: 50upx;
+}
+
+/* -- 浮动 -- */
+
+.cf::after,
+.cf::before {
+ content: " ";
+ display: table;
+}
+
+.cf::after {
+ clear: both;
+}
+
+.fl {
+ float: left;
+}
+
+.fr {
+ float: right;
+}
+
+/* ==================
+ 背景
+ ==================== */
+
+.line-red::after,
+.lines-red::after {
+ border-color: #e54d42;
+}
+
+.line-orange::after,
+.lines-orange::after {
+ border-color: #f37b1d;
+}
+
+.line-yellow::after,
+.lines-yellow::after {
+ border-color: #fbbd08;
+}
+
+.line-olive::after,
+.lines-olive::after {
+ border-color: #8dc63f;
+}
+
+.line-green::after,
+.lines-green::after {
+ border-color: #39b54a;
+}
+
+.line-cyan::after,
+.lines-cyan::after {
+ border-color: #1cbbb4;
+}
+
+.line-blue::after,
+.lines-blue::after {
+ border-color: #0081ff;
+}
+
+.line-purple::after,
+.lines-purple::after {
+ border-color: #6739b6;
+}
+
+.line-mauve::after,
+.lines-mauve::after {
+ border-color: #9c26b0;
+}
+
+.line-pink::after,
+.lines-pink::after {
+ border-color: #e03997;
+}
+
+.line-brown::after,
+.lines-brown::after {
+ border-color: #a5673f;
+}
+
+.line-grey::after,
+.lines-grey::after {
+ border-color: #8799a3;
+}
+
+.line-gray::after,
+.lines-gray::after {
+ border-color: #aaaaaa;
+}
+
+.line-black::after,
+.lines-black::after {
+ border-color: #333333;
+}
+
+.line-white::after,
+.lines-white::after {
+ border-color: #ffffff;
+}
+
+.bg-red {
+ background-color: #e54d42;
+ color: #ffffff;
+}
+
+.bg-orange {
+ background-color: #f37b1d;
+ color: #ffffff;
+}
+
+.bg-yellow {
+ background-color: #fbbd08;
+ color: #333333;
+}
+
+.bg-olive {
+ background-color: #8dc63f;
+ color: #ffffff;
+}
+
+.bg-green {
+ background-color: #39b54a;
+ color: #ffffff;
+}
+
+.bg-cyan {
+ background-color: #1cbbb4;
+ color: #ffffff;
+}
+
+.bg-blue {
+ background-color: #0081ff;
+ color: #ffffff;
+}
+
+.bg-purple {
+ background-color: #6739b6;
+ color: #ffffff;
+}
+
+.bg-mauve {
+ background-color: #9c26b0;
+ color: #ffffff;
+}
+
+.bg-pink {
+ background-color: #e03997;
+ color: #ffffff;
+}
+
+.bg-brown {
+ background-color: #a5673f;
+ color: #ffffff;
+}
+
+.bg-grey {
+ background-color: #8799a3;
+ color: #ffffff;
+}
+
+.bg-gray {
+ background-color: #f0f0f0;
+ color: #333333;
+}
+
+.bg-black {
+ background-color: #333333;
+ color: #ffffff;
+}
+
+.bg-white {
+ background-color: #ffffff;
+ color: #666666;
+}
+
+.bg-shadeTop {
+ background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01));
+ color: #ffffff;
+}
+
+.bg-shadeBottom {
+ background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1));
+ color: #ffffff;
+}
+
+.bg-red.light {
+ color: #e54d42;
+ background-color: #fadbd9;
+}
+
+.bg-orange.light {
+ color: #f37b1d;
+ background-color: #fde6d2;
+}
+
+.bg-yellow.light {
+ color: #fbbd08;
+ background-color: #fef2ced2;
+}
+
+.bg-olive.light {
+ color: #8dc63f;
+ background-color: #e8f4d9;
+}
+
+.bg-green.light {
+ color: #39b54a;
+ background-color: #d7f0dbff;
+}
+
+.bg-cyan.light {
+ color: #1cbbb4;
+ background-color: #d2f1f0;
+}
+
+.bg-blue.light {
+ color: #0081ff;
+ background-color: #cce6ff;
+}
+
+.bg-purple.light {
+ color: #6739b6;
+ background-color: #e1d7f0;
+}
+
+.bg-mauve.light {
+ color: #9c26b0;
+ background-color: #ebd4ef;
+}
+
+.bg-pink.light {
+ color: #e03997;
+ background-color: #f9d7ea;
+}
+
+.bg-brown.light {
+ color: #a5673f;
+ background-color: #ede1d9;
+}
+
+.bg-grey.light {
+ color: #8799a3;
+ background-color: #e7ebed;
+}
+
+.bg-gradual-red {
+ background-image: linear-gradient(45deg, #f43f3b, #ec008c);
+ color: #ffffff;
+}
+
+.bg-gradual-orange {
+ background-image: linear-gradient(45deg, #ff9700, #ed1c24);
+ color: #ffffff;
+}
+
+.bg-gradual-green {
+ background-image: linear-gradient(45deg, #39b54a, #8dc63f);
+ color: #ffffff;
+}
+
+.bg-gradual-purple {
+ background-image: linear-gradient(45deg, #9000ff, #5e00ff);
+ color: #ffffff;
+}
+
+.bg-gradual-pink {
+ background-image: linear-gradient(45deg, #ec008c, #6739b6);
+ color: #ffffff;
+}
+
+.bg-gradual-blue {
+ background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
+ color: #ffffff;
+}
+
+.shadow[class*="-red"] {
+ box-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.shadow[class*="-orange"] {
+ box-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.shadow[class*="-yellow"] {
+ box-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.shadow[class*="-olive"] {
+ box-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.shadow[class*="-green"] {
+ box-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.shadow[class*="-cyan"] {
+ box-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.shadow[class*="-blue"] {
+ box-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.shadow[class*="-purple"] {
+ box-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.shadow[class*="-mauve"] {
+ box-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.shadow[class*="-pink"] {
+ box-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.shadow[class*="-brown"] {
+ box-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.shadow[class*="-grey"] {
+ box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-gray"] {
+ box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-black"] {
+ box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.shadow[class*="-white"] {
+ box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.text-shadow[class*="-red"] {
+ text-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.text-shadow[class*="-orange"] {
+ text-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.text-shadow[class*="-yellow"] {
+ text-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.text-shadow[class*="-olive"] {
+ text-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.text-shadow[class*="-green"] {
+ text-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.text-shadow[class*="-cyan"] {
+ text-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.text-shadow[class*="-blue"] {
+ text-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.text-shadow[class*="-purple"] {
+ text-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.text-shadow[class*="-mauve"] {
+ text-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.text-shadow[class*="-pink"] {
+ text-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.text-shadow[class*="-brown"] {
+ text-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.text-shadow[class*="-grey"] {
+ text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-gray"] {
+ text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-black"] {
+ text-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.bg-img {
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.bg-mask {
+ background-color: #333333;
+ position: relative;
+}
+
+.bg-mask::after {
+ content: "";
+ border-radius: inherit;
+ width: 100%;
+ height: 100%;
+ display: block;
+ background-color: rgba(0, 0, 0, 0.4);
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+}
+
+.bg-mask view,
+.bg-mask cover-view {
+ z-index: 5;
+ position: relative;
+}
+
+.bg-video {
+ position: relative;
+}
+
+.bg-video video {
+ display: block;
+ height: 100%;
+ width: 100%;
+ -o-object-fit: cover;
+ object-fit: cover;
+ position: absolute;
+ top: 0;
+ z-index: 0;
+ pointer-events: none;
+}
+
+/* ==================
+ 文本
+ ==================== */
+
+.text-xs {
+ font-size: 20upx;
+}
+
+.text-sm {
+ font-size: 24upx;
+}
+
+.text-df {
+ font-size: 28upx;
+}
+
+.text-lg {
+ font-size: 32upx;
+}
+
+.text-xl {
+ font-size: 36upx;
+}
+
+.text-xxl {
+ font-size: 44upx;
+}
+
+.text-sl {
+ font-size: 80upx;
+}
+
+.text-xsl {
+ font-size: 120upx;
+}
+
+.text-Abc {
+ text-transform: Capitalize;
+}
+
+.text-ABC {
+ text-transform: Uppercase;
+}
+
+.text-abc {
+ text-transform: Lowercase;
+}
+
+.text-price::before {
+ content: "¥";
+ font-size: 80%;
+ margin-right: 4upx;
+}
+
+.text-cut {
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.text-bold {
+ font-weight: bold;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-content {
+ line-height: 1.6;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-red,
+.line-red,
+.lines-red {
+ color: #e54d42;
+}
+
+.text-orange,
+.line-orange,
+.lines-orange {
+ color: #f37b1d;
+}
+
+.text-yellow,
+.line-yellow,
+.lines-yellow {
+ color: #fbbd08;
+}
+
+.text-olive,
+.line-olive,
+.lines-olive {
+ color: #8dc63f;
+}
+
+.text-green,
+.line-green,
+.lines-green {
+ color: #39b54a;
+}
+
+.text-cyan,
+.line-cyan,
+.lines-cyan {
+ color: #1cbbb4;
+}
+
+.text-blue,
+.line-blue,
+.lines-blue {
+ color: #0081ff;
+}
+
+.text-purple,
+.line-purple,
+.lines-purple {
+ color: #6739b6;
+}
+
+.text-mauve,
+.line-mauve,
+.lines-mauve {
+ color: #9c26b0;
+}
+
+.text-pink,
+.line-pink,
+.lines-pink {
+ color: #e03997;
+}
+
+.text-brown,
+.line-brown,
+.lines-brown {
+ color: #a5673f;
+}
+
+.text-grey,
+.line-grey,
+.lines-grey {
+ color: #8799a3;
+}
+
+.text-gray,
+.line-gray,
+.lines-gray {
+ color: #aaaaaa;
+}
+
+.text-black,
+.line-black,
+.lines-black {
+ color: #333333;
+}
+
+.text-white,
+.line-white,
+.lines-white {
+ color: #ffffff;
+}
diff --git a/libs/components/demo-title.vue b/libs/components/demo-title.vue
new file mode 100644
index 0000000..1386ff8
--- /dev/null
+++ b/libs/components/demo-title.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+ {{ title }}
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/components/dynamic-demo-template.vue b/libs/components/dynamic-demo-template.vue
new file mode 100644
index 0000000..525e316
--- /dev/null
+++ b/libs/components/dynamic-demo-template.vue
@@ -0,0 +1,689 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+ {{ section_btn }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/components/multiple-options-demo.vue b/libs/components/multiple-options-demo.vue
new file mode 100644
index 0000000..f3644b6
--- /dev/null
+++ b/libs/components/multiple-options-demo.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/components/nav-index-button.vue b/libs/components/nav-index-button.vue
new file mode 100644
index 0000000..d626df0
--- /dev/null
+++ b/libs/components/nav-index-button.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/mixin/dynamic_demo_mixin.js b/libs/mixin/dynamic_demo_mixin.js
new file mode 100644
index 0000000..66ff992
--- /dev/null
+++ b/libs/mixin/dynamic_demo_mixin.js
@@ -0,0 +1,52 @@
+/**
+ * 动态参数演示mixin
+ */
+module.exports = {
+ data() {
+ return {
+ // 效果显示框top的值
+ contentContainerTop: '0px',
+ contentContainerIsTop: false,
+
+ // 参数显示框top的值
+ sectionContainerTop: '0px'
+ }
+ },
+ onReady() {
+ this.updateSectionContainerTop()
+ },
+ methods: {
+ // 处理演示效果框的位置
+ async _handleContentConatinerPosition() {
+ // 获取效果演示框的节点信息
+ const contentContainer = await this._tGetRect('#content_container')
+ // 获取参数框的节点信息
+ this._tGetRect('#section_container').then((res) => {
+ // 判断参数框是否在移动,如果是则更新效果框的位置
+ // 如果效果框的顶部已经触控到顶部导航栏就停止跟随
+ if (res.top - contentContainer.bottom != 15) {
+ const newTop = res.top - (contentContainer.height + uni.upx2px(20))
+ const minTop = this.vuex_custom_bar_height + 1
+ if (newTop < minTop) {
+ this.contentContainerTop = minTop + 'px'
+ this.contentContainerIsTop = true
+ } else {
+ this.contentContainerTop = newTop + 'px'
+ this.contentContainerIsTop = false
+ }
+ }
+ })
+ },
+ // 更新状态切换栏位置信息
+ updateSectionContainerTop() {
+ this._tGetRect('#content_container').then((res) => {
+ this.contentContainerTop = (this.vuex_custom_bar_height + 148) + 'px'
+ this.sectionContainerTop = (res.height + 20) + 'px'
+ })
+ }
+ },
+ // 监听页面滚动
+ onPageScroll() {
+ this._handleContentConatinerPosition()
+ }
+}
diff --git a/libs/mixin/template_page_mixin.js b/libs/mixin/template_page_mixin.js
new file mode 100644
index 0000000..2314549
--- /dev/null
+++ b/libs/mixin/template_page_mixin.js
@@ -0,0 +1,60 @@
+/**
+ * 演示页面mixin
+ */
+module.exports = {
+ data() {
+ return {
+
+ }
+ },
+ onLoad() {
+ // 更新顶部导航栏信息
+ this.updateCustomBarInfo()
+ },
+ methods: {
+ // 点击左上角返回按钮时触发事件
+ goBack() {
+ // 通过判断当前页面的页面栈信息,是否有上一页进行返回,如果没有则跳转到首页
+ const pages = getCurrentPages()
+ if (pages && pages.length > 0) {
+ const firstPage = pages[0]
+ if (pages.length == 1 && (!firstPage.route || firstPage.route != 'pages/index/index')) {
+ uni.reLaunch({
+ url: '/pages/index/index'
+ })
+ } else {
+ uni.navigateBack({
+ delta: 1
+ })
+ }
+ } else {
+ uni.reLaunch({
+ url: '/pages/index/index'
+ })
+ }
+ },
+ // 更新顶部导航栏信息
+ async updateCustomBarInfo() {
+ // 获取vuex中的自定义顶栏的高度
+ let customBarHeight = this.vuex_custom_bar_height
+ let statusBarHeight = this.vuex_status_bar_height
+ // 如果获取失败则重新获取
+ if (!customBarHeight) {
+ try {
+ const navBarInfo = await this.$tn.updateCustomBar()
+ customBarHeight = navBarInfo.customBarHeight
+ statusBarHeight = navBarInfo.statusBarHeight
+ } catch(e) {
+ setTimeout(() => {
+ this.updateCustomBarInfo()
+ }, 10)
+ return
+ }
+ }
+
+ // 更新vuex中的导航栏信息
+ this.$tn.vuex('vuex_status_bar_height', statusBarHeight)
+ this.$tn.vuex('vuex_custom_bar_height', customBarHeight)
+ }
+ }
+}
\ No newline at end of file
diff --git a/main.js b/main.js
index 8c94a5d..67fec41 100644
--- a/main.js
+++ b/main.js
@@ -6,16 +6,21 @@ import plugins from './plugins' // plugins
import './permission' // permission
import { getDicts } from "@/api/system/dict/data"
import "./utils/uni.css";
-
-
+// 引入全局TuniaoUI
+import TuniaoUI from 'tuniao-ui'
+// 引入TuniaoUI提供的vuex简写方法
+let vuexStore = require('@/store/$tn.mixin.js')
Vue.use(plugins)
Vue.config.productionTip = false
Vue.prototype.$store = store
Vue.prototype.getDicts = getDicts
+Vue.use(TuniaoUI)
+Vue.mixin(vuexStore)
App.mpType = 'app'
const app = new Vue({
+ store,
...App
})
diff --git a/pages.json b/pages.json
index 92f8ccf..1dcfd82 100644
--- a/pages.json
+++ b/pages.json
@@ -1,4 +1,7 @@
{
+ "easycom": {
+ "^tn-(.*)": "@/tuniao-ui/components/tn-$1/tn-$1.vue"
+ },
"pages": [{
"path": "pages/login",
"style": {
diff --git a/static/css/components/demo_page_common.scss b/static/css/components/demo_page_common.scss
new file mode 100644
index 0000000..f40b136
--- /dev/null
+++ b/static/css/components/demo_page_common.scss
@@ -0,0 +1,193 @@
+/* 顶部 start */
+.header {
+ padding: 80rpx 60rpx 40rpx 60rpx;
+
+ .title {
+ font-size: 36rpx;
+ color: $tn-font-color;
+ font-weight: bold;
+ }
+
+ .sub-title {
+ font-size: 28rpx;
+ color: $tn-content-color;
+ padding-top: 18rpx;
+ }
+
+ .tips-title {
+ font-size: 24rpx;
+ color: $tn-font-sub-color;
+ padding-top: 5rpx;
+ }
+}
+/* 顶部 end */
+
+/* 展示内容容器 start */
+.show-content-container {
+
+ /* 标题容器 start */
+ .title-container {
+ display: flex;
+ position: relative;
+ align-items: center;
+ justify-content: space-between;
+ min-height: 100rpx;
+
+ // 标题样式
+ .title {
+ height: 100%;
+ max-width: 100%;
+ margin: 0 20rpx;
+ font-size: 30rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ // 标题前面小点
+ &:before {
+ content: " ";
+ background-color: $tn-main-color;
+ width: 15rpx;
+ height: 15rpx;
+ border-radius: 10rpx;
+ margin-right: 18rpx;
+ }
+ }
+ }
+ /* 标题容器 end */
+
+ /* 内容 start */
+ .content {
+ padding: 20rpx;
+ }
+ /* 内容 end */
+
+}
+/* 展示内容容器 end */
+
+/* 内容容器 start */
+.demo-content-container {
+ border: 1rpx dashed $tn-main-color;
+ margin: 20rpx;
+ margin-top: 0rpx;
+
+ position: fixed;
+ width: 95%;
+ z-index: 10;
+
+ transition: all 0.15s ease-out;
+
+ &.top {
+ width: 100%;
+ margin: 0;
+ }
+
+ &.no-fixed {
+ position: relative !important;
+ }
+
+ /* 标题容器 start */
+ .title-container {
+ display: flex;
+ position: relative;
+ align-items: center;
+ justify-content: center;
+ min-height: 100rpx;
+
+ // 标题样式
+ .title {
+ height: 100%;
+ max-width: 100%;
+ margin: 0 30rpx;
+ font-size: 30rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ }
+ /* 标题容器 end */
+
+ /* 内容 start */
+ .content {
+ padding: 30rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ /* 内容 end */
+
+}
+/* 内容容器 end */
+
+/* 可选项内容容器 start */
+.demo-section-container {
+ margin: 20rpx;
+ height: 100%;
+
+ /* 标题容器 start */
+ .title-container {
+ display: flex;
+ position: relative;
+ align-items: center;
+ justify-content: center;
+ min-height: 100rpx;
+ margin-bottom: 10rpx;
+
+ // 标题样式
+ .title {
+ height: 100%;
+ max-width: 100%;
+ margin: 0 30rpx;
+ font-size: 30rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ &::after {
+ content: " ";
+ box-sizing: border-box;
+ width: 90%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ border-bottom: 1rpx solid $tn-border-solid-color;
+ }
+ }
+ /* 标题容器 end */
+
+ /* 参数内容 start*/
+ .content {
+ padding: 0 20rpx 10rpx 20rpx;
+
+ // 标题样式
+ .title {
+ padding-left: 20rpx;
+ height: 100%;
+ position: relative;
+
+ &::before {
+ content: " ";
+ position: absolute;
+ top: 50%;
+ left: 0;
+ width: 4rpx;
+ height: 90%;
+ background-color: $tn-main-color;
+ border-radius: 6rpx;
+ transform: translateY(-50%);
+ }
+ }
+
+ // 参数样式
+ .section {
+ margin-top: 15rpx;
+ margin-bottom: 20rpx;
+ }
+ }
+ /* 参数内容 end*/
+
+}
+/* 可选项内容容器 end */
\ No newline at end of file
diff --git a/static/css/templatePage/custom_nav_bar.scss b/static/css/templatePage/custom_nav_bar.scss
new file mode 100644
index 0000000..7cc0960
--- /dev/null
+++ b/static/css/templatePage/custom_nav_bar.scss
@@ -0,0 +1,38 @@
+.tn-custom-nav-bar__back {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ display: flex;
+ justify-content: space-evenly;
+ align-items: center;
+ box-sizing: border-box;
+ background-color: rgba(0, 0, 0, 0.15);
+ border-radius: 1000rpx;
+ border: 1rpx solid rgba(255, 255, 255, 0.5);
+ color: #FFFFFF;
+ font-size: 18px;
+
+ .icon {
+ display: block;
+ flex: 1;
+ margin: auto;
+ text-align: center;
+ }
+
+ &:before {
+ content: " ";
+ width: 1rpx;
+ height: 110%;
+ position: absolute;
+ top: 22.5%;
+ left: 0;
+ right: 0;
+ margin: auto;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ pointer-events: none;
+ box-sizing: border-box;
+ opacity: 0.7;
+ background-color: #FFFFFF;
+ }
+}
\ No newline at end of file
diff --git a/store/$tn.mixin.js b/store/$tn.mixin.js
new file mode 100644
index 0000000..ab7689b
--- /dev/null
+++ b/store/$tn.mixin.js
@@ -0,0 +1,28 @@
+import { mapState } from 'vuex'
+import store from '@/store'
+
+// 尝试将用户在根目录中的store/index.js的vuex的state变量加载到全局变量中
+let $tStoreKey = []
+try {
+ $tStoreKey = store.state ? Object.keys(store.state) : []
+} catch(e) {
+
+}
+
+module.exports = {
+ beforeCreate() {
+ // 将vuex方法挂在在$t中
+ // 使用方法:
+ // 修改vuex的state中的user.name变量为图鸟小菜 => this.$tn.vuex('user.name', '图鸟小菜')
+ // 修改vuexde state中的version变量为1.0.1 => this.$tn.vuex('version', 1.0.1)
+ this.$tn.vuex = (name, value) => {
+ this.$store.commit('$tStore', {
+ name, value
+ })
+ }
+ },
+ computed: {
+ // 将vuex的state中的变量结构到全局混入mixin中
+ ...mapState($tStoreKey)
+ }
+}
\ No newline at end of file
diff --git a/store/index.js b/store/index.js
index 83a9db5..6ec3877 100644
--- a/store/index.js
+++ b/store/index.js
@@ -5,11 +5,77 @@ import getters from './getters'
Vue.use(Vuex)
+let lifeData = {}
+
+// 尝试获取本地是否存在lifeData变量,第一次启动时不存在
+try {
+ lifeData = uni.getStorageSync('lifeData')
+} catch(e) {
+
+}
+
+// 标记需要永久存储的变量,在每次启动时取出,在state中的变量名
+let saveStateKeys = ['vuex_user']
+
+// 保存变量到本地存储
+const saveLifeData = function(key, value) {
+ // 判断变量是否在存储数组中
+ if (saveStateKeys.indexOf(key) != -1) {
+ // 获取本地存储的lifeData对象,将变量添加到对象中
+ let tmpLifeData = uni.getStorageSync('lifeData')
+ // 第一次启动时不存在,则放一个空对象
+ tmpLifeData = tmpLifeData ? tmpLifeData : {},
+ tmpLifeData[key] = value
+ // 将变量再次放回本地存储中
+ uni.setStorageSync('lifeData', tmpLifeData)
+ }
+}
+
const store = new Vuex.Store({
modules: {
user
},
- getters
+ getters,
+ state: {
+ // 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量
+ // 加上vuex_前缀,是防止变量名冲突,也让人一目了然
+ vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {name: '图鸟'},
+
+ // 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式
+ // app版本
+ vuex_version: "1.0.0",
+ // 是否使用自定义导航栏
+ vuex_custom_nav_bar: true,
+ // 状态栏高度
+ vuex_status_bar_height: 0,
+ // 自定义导航栏的高度
+ vuex_custom_bar_height: 0
+ },
+ mutations: {
+ $tStore(state, payload) {
+ // 判断是否多层调用,state中为对象存在的情况,例如user.info.score = 1
+ let nameArr = payload.name.split('.')
+ let saveKey = ''
+ let len = nameArr.length
+ if (len >= 2) {
+ let obj = state[nameArr[0]]
+ for (let i= 1; i < len - 1; i++) {
+ obj = obj[nameArr[i]]
+ }
+ obj[nameArr[len - 1]] = payload.value
+ saveKey = nameArr[0]
+ } else {
+ // 单层级变量
+ state[payload.name] = payload.value
+ saveKey = payload.name
+ }
+
+ // 保存变量到本地中
+ saveLifeData(saveKey, state[saveKey])
+ }
+ },
+ actions: {
+ }
})
export default store
diff --git a/tuniao-ui/README.md b/tuniao-ui/README.md
new file mode 100644
index 0000000..ccb9fcb
--- /dev/null
+++ b/tuniao-ui/README.md
@@ -0,0 +1,4 @@
+TuniaoUi for uniApp v1.0.0 | by 图鸟 2021-09-01
+仅供开发,如作它用所承受的法律责任一概与作者无关
+
+*使用TuniaoUi开发扩展与插件时,请注明基于tuniao字眼
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-action-sheet/tn-action-sheet.vue b/tuniao-ui/components/tn-action-sheet/tn-action-sheet.vue
new file mode 100644
index 0000000..85ffe40
--- /dev/null
+++ b/tuniao-ui/components/tn-action-sheet/tn-action-sheet.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+ {{tips.text}}
+
+
+
+
+ {{item.text}}
+ {{item.subText}}
+
+
+
+
+
+
+ {{cancelText}}
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-avatar-group/tn-avatar-group.vue b/tuniao-ui/components/tn-avatar-group/tn-avatar-group.vue
new file mode 100644
index 0000000..4a7f11c
--- /dev/null
+++ b/tuniao-ui/components/tn-avatar-group/tn-avatar-group.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-avatar/tn-avatar.vue b/tuniao-ui/components/tn-avatar/tn-avatar.vue
new file mode 100644
index 0000000..656d1bc
--- /dev/null
+++ b/tuniao-ui/components/tn-avatar/tn-avatar.vue
@@ -0,0 +1,306 @@
+
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
+
+
+ {{ badgeText }}
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-badge/tn-badge.vue b/tuniao-ui/components/tn-badge/tn-badge.vue
new file mode 100644
index 0000000..d92f5f6
--- /dev/null
+++ b/tuniao-ui/components/tn-badge/tn-badge.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-button/tn-button.vue b/tuniao-ui/components/tn-button/tn-button.vue
new file mode 100644
index 0000000..793f343
--- /dev/null
+++ b/tuniao-ui/components/tn-button/tn-button.vue
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-calendar/tn-calendar.vue b/tuniao-ui/components/tn-calendar/tn-calendar.vue
new file mode 100644
index 0000000..c5d11ab
--- /dev/null
+++ b/tuniao-ui/components/tn-calendar/tn-calendar.vue
@@ -0,0 +1,711 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dateTitle }}
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.day }}
+
+
+ {{ item.bottomInfo }}
+
+
+
+ {{ month }}
+
+
+
+
+
+ {{ mode === 'date' ? activeDate : startDate }}
+ 至{{ endDate }}
+
+
+ 确定
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-car-keyboard/tn-car-keyboard.vue b/tuniao-ui/components/tn-car-keyboard/tn-car-keyboard.vue
new file mode 100644
index 0000000..2e4c6cc
--- /dev/null
+++ b/tuniao-ui/components/tn-car-keyboard/tn-car-keyboard.vue
@@ -0,0 +1,320 @@
+
+ {}">
+
+
+
+
+ {{ sub_data }}
+
+
+
+
+
+
+
+
+ 中
+ /
+ 英
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-cascade-selection/tn-cascade-selection.vue b/tuniao-ui/components/tn-cascade-selection/tn-cascade-selection.vue
new file mode 100644
index 0000000..02ac406
--- /dev/null
+++ b/tuniao-ui/components/tn-cascade-selection/tn-cascade-selection.vue
@@ -0,0 +1,654 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ subItem.text }}
+
+
+ {{ subItem.subText }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-checkbox-group/tn-checkbox-group.vue b/tuniao-ui/components/tn-checkbox-group/tn-checkbox-group.vue
new file mode 100644
index 0000000..5472ad5
--- /dev/null
+++ b/tuniao-ui/components/tn-checkbox-group/tn-checkbox-group.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-checkbox/tn-checkbox.vue b/tuniao-ui/components/tn-checkbox/tn-checkbox.vue
new file mode 100644
index 0000000..0ad3a3f
--- /dev/null
+++ b/tuniao-ui/components/tn-checkbox/tn-checkbox.vue
@@ -0,0 +1,328 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-circle-progress/tn-circle-progress.vue b/tuniao-ui/components/tn-circle-progress/tn-circle-progress.vue
new file mode 100644
index 0000000..31c1a38
--- /dev/null
+++ b/tuniao-ui/components/tn-circle-progress/tn-circle-progress.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+ {{ percent + '%' }}
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-collapse-item/tn-collapse-item.vue b/tuniao-ui/components/tn-collapse-item/tn-collapse-item.vue
new file mode 100644
index 0000000..998879f
--- /dev/null
+++ b/tuniao-ui/components/tn-collapse-item/tn-collapse-item.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-collapse/tn-collapse.vue b/tuniao-ui/components/tn-collapse/tn-collapse.vue
new file mode 100644
index 0000000..00ec9a2
--- /dev/null
+++ b/tuniao-ui/components/tn-collapse/tn-collapse.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-color-icon/tn-color-icon.vue b/tuniao-ui/components/tn-color-icon/tn-color-icon.vue
new file mode 100644
index 0000000..c7ad83b
--- /dev/null
+++ b/tuniao-ui/components/tn-color-icon/tn-color-icon.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-column-notice/tn-column-notice.vue b/tuniao-ui/components/tn-column-notice/tn-column-notice.vue
new file mode 100644
index 0000000..d5d795b
--- /dev/null
+++ b/tuniao-ui/components/tn-column-notice/tn-column-notice.vue
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-count-down/tn-count-down.vue b/tuniao-ui/components/tn-count-down/tn-count-down.vue
new file mode 100644
index 0000000..414deba
--- /dev/null
+++ b/tuniao-ui/components/tn-count-down/tn-count-down.vue
@@ -0,0 +1,318 @@
+
+
+
+
+ {{ d }}
+
+
+ {{ separator === 'en' ? (showHours || showMinutes || showSeconds ? ':' : '') : '天'}}
+
+
+
+
+
+
+ {{ h }}
+
+
+ {{ separator === 'en' ? ':' : '时'}}
+
+
+
+
+
+
+ {{ m }}
+
+
+ {{ separator === 'en' ? ':' : '分'}}
+
+
+
+
+
+
+ {{ s }}
+
+
+ {{ separator === 'en' ? '' : '秒'}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-count-scroll/tn-count-scroll.vue b/tuniao-ui/components/tn-count-scroll/tn-count-scroll.vue
new file mode 100644
index 0000000..b9c2eef
--- /dev/null
+++ b/tuniao-ui/components/tn-count-scroll/tn-count-scroll.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+ {{ value }}
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-count-to/tn-count-to.vue b/tuniao-ui/components/tn-count-to/tn-count-to.vue
new file mode 100644
index 0000000..c3d8854
--- /dev/null
+++ b/tuniao-ui/components/tn-count-to/tn-count-to.vue
@@ -0,0 +1,231 @@
+
+
+ {{ displayValue }}
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-cropper/index.wxs b/tuniao-ui/components/tn-cropper/index.wxs
new file mode 100644
index 0000000..a9c824c
--- /dev/null
+++ b/tuniao-ui/components/tn-cropper/index.wxs
@@ -0,0 +1,332 @@
+var cropper = {
+ // 画布x轴起点
+ cutX: 0,
+ // 画布y轴起点
+ cutY: 0,
+ // 触摸点信息(手指与图片中心点的相对位置)
+ touchRelactive: [{
+ x: 0,
+ y: 0
+ }],
+ // 双指触摸时斜边的长度
+ hypotenuseLength:0,
+ // 是否结束触摸
+ touchEndFlag: false,
+ // 画布宽高
+ canvasWidth: 0,
+ canvasHeight: 0,
+ // 图片宽高
+ imgWidth: 0,
+ imgHeight: 0,
+ // 图片缩放比例
+ scale: 1,
+ // 图片旋转角度
+ angle: 0,
+ // 图片上边距
+ imgTop: 0,
+ // 图片左边距
+ imgLeft: 0,
+ // 窗口宽高
+ windowWidth: 0,
+ windowHeight: 0,
+ init: true
+}
+
+function bool(str) {
+ return str === 'true' || str === true
+}
+
+function propChange(prop, oldProp, ownerInstance, instance) {
+ if (prop && prop !== 'null') {
+ var params = prop.split(',')
+ var type = +params[0]
+ var dataset = instance.getDataset()
+ if (cropper.init || type == 4) {
+ cropper.canvasWidth = +dataset.width
+ cropper.canvasHeight = +dataset.height
+ cropper.imgTop = +dataset.windowheight / 2
+ cropper.imgLeft = +dataset.windowwidth / 2
+ cropper.imgWidth = +dataset.width
+ cropper.imgHeight = +dataset.height
+ cropper.windowHeight = +dataset.windowheight
+ cropper.windowWidth = +dataset.windowwidth
+ cropper.init = false
+ } else if (type == 2 || type == 3) {
+ cropper.imgWidth = +dataset.imgwidth
+ cropper.imgHeight = +dataset.imgheight
+ }
+ cropper.angle = +dataset.angle
+ if (type == 3) {
+ imgTransform(ownerInstance)
+ }
+ switch(type) {
+ case 1:
+ setCutCenter(ownerInstance)
+ // // 设置裁剪框大小
+ computeCutSize(ownerInstance)
+ // // 检查裁剪框是否在范围内
+ cutDetectionPosition(ownerInstance)
+ break
+ case 2:
+ setCutCenter(ownerInstance)
+ break
+ case 3:
+ imgMarginDetectionScale(ownerInstance)
+ break
+ case 4:
+ imageReset(ownerInstance)
+ break
+ case 5:
+ setCutCenter(ownerInstance)
+ break
+ default:
+ break
+ }
+ }
+}
+
+function touchStart(event, ownerInstance) {
+ var touch = event.touches || event.changedTouches
+ cropper.touchEndFlag = false
+ if (touch.length === 1) {
+ cropper.touchRelactive[0] = {
+ x: touch[0].pageX - cropper.imgLeft,
+ y: touch[0].pageY - cropper.imgTop
+ }
+ } else {
+ var width = Math.abs(touch[0].pageX - touch[1].pageX)
+ var height = Math.abs(touch[0].pageY - touch[1].pageY)
+ cropper.touchRelactive = [{
+ x: touch[0].pageX - cropper.imgLeft,
+ y: touch[0].pageY - cropper.imgTop
+ },{
+ x: touch[1].pageX - cropper.imgLeft,
+ y: touch[1].pageY - cropper.imgTop
+ }]
+ cropper.hypotenuseLength = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2))
+ }
+}
+
+function touchMove(event, ownerInstance) {
+ var touch = event.touches || event.changedTouches
+ if (cropper.touchEndFlag) return
+ moveDuring(ownerInstance)
+ if (event.touches.length === 1) {
+ var left = touch[0].pageX - cropper.touchRelactive[0].x,
+ top = touch[0].pageY - cropper.touchRelactive[0].y;
+ cropper.imgLeft = left
+ cropper.imgTop = top
+ imgTransform(ownerInstance)
+ imgMarginDetectionPosition(ownerInstance)
+ } else {
+ var dataset = event.instance.getDataset()
+ var minScale = +dataset.minscale
+ var maxScale = +dataset.maxscale
+ var width = Math.abs(touch[0].pageX - touch[1].pageX),
+ height = Math.abs(touch[0].pageY - touch[1].pageY),
+ hypotenuse = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)),
+ scale = cropper.scale * (hypotenuse / cropper.hypotenuseLength),
+ current_deg = 0;
+ scale = scale <= minScale ? minScale : scale
+ scale = scale >= maxScale ? maxScale : scale
+ cropper.scale = scale
+ imgMarginDetectionScale(ownerInstance, true)
+ var touchRelative = [{
+ x: touch[0].pageX - cropper.imgLeft,
+ y: touch[0].pageY - cropper.imgTop
+ }, {
+ x: touch[1].pageX - cropper.imgLeft,
+ y: touch[1].pageY - cropper.imgTop
+ }]
+ cropper.touchRelactive = touchRelative
+ cropper.hypotenuseLength = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2))
+ // 更新视图
+ cropper.angle = cropper.angle + current_deg
+ imgTransform(ownerInstance)
+ }
+}
+
+function touchEnd(event, ownerInstance) {
+ cropper.touchEndFlag = true
+ moveStop(ownerInstance)
+ updateData(ownerInstance)
+}
+
+function moveDuring(ownerInstance) {
+ if (!ownerInstance) return
+ ownerInstance.callMethod('moveDuring')
+}
+
+function moveStop(ownerInstance) {
+ if (!ownerInstance) return
+ ownerInstance.callMethod('moveStop')
+}
+
+function setCutCenter(ownerInstance) {
+ var cutX = (cropper.windowWidth - cropper.canvasWidth) * 0.5
+ var cutY = (cropper.windowHeight - cropper.canvasHeight) * 0.5
+
+ cropper.imgTop = cropper.imgTop - cropper.cutY + cutY
+ cropper.cutY = cutY
+ cropper.imgLeft = cropper.imgLeft - cropper.cutX + cutX
+ cropper.cutX = cutX
+ cutDetectionPosition(ownerInstance)
+ imgTransform(ownerInstance)
+ updateData(ownerInstance)
+}
+
+// 检测剪裁框位置是否在允许的范围内(屏幕内)
+function cutDetectionPosition(ownerInstance) {
+ var windowHeight = cropper.windowHeight,
+ windowWidth = cropper.windowWidth;
+
+ // 检测上边距是否在范围内
+ var cutDetectionPositionTop = function() {
+ if (cropper.cutY < 0) {
+ cropper.cutY = 0
+ }
+ if (cropper.cutY > windowHeight - cropper.canvasHeight) {
+ cropper.cutY = windowHeight - cropper.canvasHeight
+ }
+ }
+
+ // 检测左边距是否在范围内
+ var cutDetectionPositionLeft = function() {
+ if (cropper.cutX < 0) {
+ cropper.cutX = 0
+ }
+ if (cropper.cutX > windowWidth - cropper.canvasWidth) {
+ cropper.cutX = windowWidth - cropper.canvasWidth
+ }
+ }
+
+ // 裁剪框坐标处理(如果只写一个参数则另一个默认为0,都不写默认为居中)
+ if (cropper.cutX === null && cropper.cutY === null) {
+ var cutX = (windowWidth - cropper.canvasWidth) * 0.5,
+ cutY = (windowHeight - cropper.canvasHeight) * 0.5;
+ cropper.cutX = cutX
+ cropper.cutY = cutY
+ } else if (cropper.cutX !== null && cropper.cutX !== null) {
+ cutDetectionPositionTop()
+ cutDetectionPositionLeft()
+ } else if (cropper.cutX !== null && cropper.cutY === null) {
+ cutDetectionPositionLeft()
+ cropper.cutY = (windowHeight - cropper.canvasHeight) / 2
+ } else if (cropper.cutX === null && cropper.cutY !== null) {
+ cutDetectionPositionTop()
+ cropper.cutX = (windowWidth - cropper.canvasWidth) / 2
+ }
+}
+
+// 图片边缘检测-缩放
+function imgMarginDetectionScale(ownerInstance, delay) {
+ var scale = cropper.scale,
+ imgWidth = cropper.imgWidth,
+ imgHeight = cropper.imgHeight;
+ if ((cropper.angle / 90) % 2) {
+ imgWidth = cropper.imgHeight
+ imgHeight = cropper.imgWidth
+ }
+ if (imgWidth * scale < cropper.canvasWidth) {
+ scale = cropper.canvasWidth / imgWidth
+ }
+ if (imgHeight * scale < cropper.canvasHeight) {
+ scale = Math.max(scale, cropper.canvasHeight / imgHeight)
+ }
+ imgMarginDetectionPosition(ownerInstance, scale, delay)
+}
+
+// 图片边缘检测-位置
+function imgMarginDetectionPosition(ownerInstance, scale, delay) {
+ var left = cropper.imgLeft,
+ top = cropper.imgTop,
+ imgWidth = cropper.imgWidth,
+ imgHeight = cropper.imgHeight;
+ scale = scale || cropper.scale
+ if ((cropper.angle / 90) % 2) {
+ imgWidth = cropper.imgHeight
+ imgHeight = cropper.imgWidth
+ }
+
+ left = cropper.cutX + (imgWidth * scale) / 2 >= left ? left : cropper.cutX + (imgWidth * scale) / 2
+ left = cropper.cutX + cropper.canvasWidth - (imgWidth * scale) / 2 <= left ? left : cropper.cutX + cropper.canvasWidth - (imgWidth * scale) / 2
+ top = cropper.cutY + (imgHeight * scale) / 2 >= top ? top : cropper.cutY + (imgHeight * scale) / 2
+ top = cropper.cutY + cropper.canvasHeight - (imgHeight * scale) / 2 <= top ? top : cropper.cutY + cropper.canvasHeight - (imgHeight * scale) / 2
+
+ cropper.imgLeft = left
+ cropper.imgTop = top
+ cropper.scale = scale
+ if (!delay || delay === 'null') {
+ imgTransform(ownerInstance)
+ }
+}
+
+// 改变截取值大小
+function computeCutSize(ownerInstance) {
+ if (cropper.canvasWidth > cropper.windowWidth) {
+ cropper.canvasWidth = cropper.windowWidth
+ } else if (cropper.canvasWidth + cropper.cutX > cropper.windowWidth) {
+ cropper.cutX = cropper.windowWidth - cropper.cutX
+ }
+ if (cropper.canvasHeight > cropper.windowHeight) {
+ cropper.canvasHeight = cropper.windowHeight
+ } else if (cropper.canvasHeight + cropper.cutY > cropper.windowHeight) {
+ cropper.cutY = cropper.windowHeight - cropper.cutY
+ }
+}
+
+// 图片动画
+function imgTransform(ownerInstance) {
+ try {
+ var image = ownerInstance.selectComponent('.tn-cropper__image')
+ if (!image) return
+ var x = cropper.imgLeft - cropper.imgWidth / 2,
+ y = cropper.imgTop - cropper.imgHeight / 2;
+ image.setStyle({
+ 'transform': 'translate3d('+ x + 'px,' + y + 'px,0) scale(' + cropper.scale +') rotate(' + cropper.angle + 'deg)'
+ })
+ } catch(e) {
+
+ }
+}
+
+// 图片重置
+function imageReset(ownerInstance) {
+ cropper.scale = 1
+ cropper.angle = 0
+ imgTransform(ownerInstance)
+}
+
+// 高度变化
+function canvasHeight(ownerInstance) {
+ if (!ownerInstance) return
+ computeCutSize(ownerInstance)
+}
+
+// 宽度变化
+function canvasWidth(ownerInstance) {
+ if (!ownerInstance) return
+ computeCutSize(ownerInstance)
+}
+
+// 更新数据
+function updateData(ownerInstance) {
+ if (!ownerInstance) return
+ ownerInstance.callMethod('change', {
+ cutX: cropper.cutX,
+ cutY: cropper.cutY,
+ imgWidth: cropper.imgWidth,
+ imgHeight: cropper.imgHeight,
+ scale: cropper.scale,
+ angle: cropper.angle,
+ imgTop: cropper.imgTop,
+ imgLeft: cropper.imgLeft
+ })
+}
+
+module.exports = {
+ touchStart: touchStart,
+ touchMove: touchMove,
+ touchEnd: touchEnd,
+ propChange: propChange
+}
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-cropper/tn-cropper.vue b/tuniao-ui/components/tn-cropper/tn-cropper.vue
new file mode 100644
index 0000000..6d22d6f
--- /dev/null
+++ b/tuniao-ui/components/tn-cropper/tn-cropper.vue
@@ -0,0 +1,574 @@
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+ 完成
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-custom-swiper-item/index.wxs b/tuniao-ui/components/tn-custom-swiper-item/index.wxs
new file mode 100644
index 0000000..a6c12b7
--- /dev/null
+++ b/tuniao-ui/components/tn-custom-swiper-item/index.wxs
@@ -0,0 +1,288 @@
+
+function setTimeout(instance, cb, time) {
+ if (time > 0) {
+ var s = getDate().getTime()
+ var fn = function () {
+ if (getDate().getTime() - s > time) {
+ cb && cb()
+ } else
+ instance.requestAnimationFrame(fn)
+ }
+ fn()
+ }
+ else
+ cb && cb()
+}
+
+// 判断触摸的移动方向
+function decideSwiperDirection(startTouches, currentTouches, vertical) {
+ // 震动偏移容差
+ var toleranceShake = 150
+ // 移动容差
+ var toleranceTranslate = 10
+
+ if (!vertical) {
+ // 水平方向移动
+ if (Math.abs(currentTouches.y - startTouches.y) <= toleranceShake) {
+ // console.log(currentTouches.x, startTouches.x);
+ if (Math.abs(currentTouches.x - startTouches.x) > toleranceTranslate) {
+ if (currentTouches.x - startTouches.x > 0) {
+ return 'right'
+ } else if (currentTouches.x - startTouches.x < 0) {
+ return 'left'
+ }
+ }
+ }
+ } else {
+ // 垂直方向移动
+ if (Math.abs(currentTouches.x - startTouches.x) <= toleranceShake) {
+ // console.log(currentTouches.x, startTouches.x);
+ if (Math.abs(currentTouches.y - startTouches.y) > toleranceTranslate) {
+ if (currentTouches.y - startTouches.y > 0) {
+ return 'down'
+ } else if (currentTouches.y - startTouches.y < 0) {
+ return 'up'
+ }
+ }
+ }
+ }
+ return ''
+}
+
+// swiperItem参数数据更新
+var itemDataObserver = function(newVal, oldVal, ownerInstance, instance) {
+ if (!newVal || newVal === 'undefined') return
+ var state = ownerInstance.getState()
+ state.itemData = newVal
+}
+
+// swiperIndex数据更新
+var currentIndexObserver = function(newVal, oldVal, ownerInstance, instance) {
+ if ((!newVal && newVal != 0) || newVal === 'undefined') return
+ var state = ownerInstance.getState()
+ state.currentIndex = newVal
+}
+
+// containerData数据更新
+var containerDataObserver = function(newVal, oldVal, ownerInstance, instance) {
+ if (!newVal || newVal === 'undefined') return
+ var state = ownerInstance.getState()
+ state.containerData = newVal
+}
+
+// 开始触摸
+var touchStart = function(event, ownerInstance) {
+ console.log('touchStart');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+ var containerData = state.containerData
+
+ // 由于当前SwiperIndex初始为0,可能会导致swiperIndex数据没有更新
+ if (!state.currentIndex || state.currentIndex === 'undefined') {
+ state.currentIndex = 0
+ }
+
+ if (!containerData || containerData.circular === 'undefined') {
+ containerData.circular = false
+ }
+ state.containerData = containerData
+
+ // 如果当前切换动画还没执行结束,再次触摸会重新加载对应的swiperContainer的信息
+ // console.log(containerData.animationFinish);
+ if (!containerData.animationFinish) {
+ ownerInstance.callMethod('changeParentSwiperContainerStyleStatus',{
+ status: 'reload'
+ })
+ }
+
+ // 判断是否为为当前显示的SwiperItem
+ if (itemData.index != state.currentIndex) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 标记滑动开始时间
+ state.touchStartTime = getDate().getTime()
+
+ // 记录当前滑动开始的x,y坐标
+ state.touchRelactive = {
+ x: touches.pageX,
+ y: touches.pageY
+ }
+ // 记录触摸id,用于处理多指的情况
+ state.touchId = touches.identifier
+
+ // 标记开始触摸
+ state.touching = true
+ ownerInstance.callMethod('updateTouchingStatus', {
+ status: true
+ })
+}
+
+// 正在移动
+var touchMove = function(event, ownerInstance) {
+ console.log('touchMove');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+ var containerData = state.containerData
+
+ // 判断是否为为当前显示的SwiperItem
+ if (itemData.index != state.currentIndex) return
+
+ // 判断是否开始触摸
+ if (!state.touching) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+ // 判断是否为同一个触摸点
+ if (state.touchId != touches.identifier) return
+
+ var currentTouchRelactive = {
+ x: touches.pageX,
+ y: touches.pageY
+ }
+
+ // 计算相对位移比例
+ if (containerData.vertical) {
+ var touchDistance = currentTouchRelactive.y - state.touchRelactive.y
+ var itemHeight = itemData.itemHeight
+ var distanceRate = touchDistance / itemHeight
+ // console.log(currentTouchRelactive.y, touchDistance, itemHeight, distanceRate);
+
+ // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向下滑、当前为最后一个swiperItem并且向上滑时不进行操作
+ if (!containerData.circular &&
+ ((state.currentIndex === 0 && touchDistance > 0) || (state.currentIndex === containerData.swiperItemLength - 1 && touchDistance < 0))
+ ) {
+ return
+ }
+
+ // 如果超出了距离则不进行操作
+ if((Math.abs(touchDistance) > (itemData.itemTop + itemData.itemHeight))) {
+ ownerInstance.callMethod('updateParentSwiperContainerStyle', {
+ value: distanceRate < 0 ? -1 : 1
+ })
+ return
+ }
+ } else {
+ var touchDistance = currentTouchRelactive.x - state.touchRelactive.x
+ var itemWidth = itemData.itemWidth
+ var distanceRate = touchDistance / itemWidth
+ // console.log(currentTouchRelactive.x, touchDistance, itemWidth, distanceRate);
+
+ // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向右滑、当前为最后一个swiperItem并且向左滑时不进行操作
+ if (!containerData.circular &&
+ ((state.currentIndex === 0 && touchDistance > 0) || (state.currentIndex === containerData.swiperItemLength - 1 && touchDistance < 0))
+ ) {
+ return
+ }
+
+ // 如果超出了距离则不进行操作
+ if((Math.abs(touchDistance) > (itemData.itemLeft + itemData.itemWidth))) {
+ ownerInstance.callMethod('updateParentSwiperContainerStyle', {
+ value: distanceRate < 0 ? -1 : 1
+ })
+ return
+ }
+ }
+
+ ownerInstance.callMethod('updateParentSwiperContainerStyle', {
+ value: distanceRate
+ })
+}
+
+// 移动结束
+var touchEnd = function(event, ownerInstance) {
+ console.log('touchEnd');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+ var containerData = state.containerData
+
+ // 判断是否为为当前显示的SwiperItem
+ if (itemData.index != state.currentIndex) return
+
+ // 判断是否开始触摸
+ if (!state.touching) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+ // 判断是否为同一个触摸点
+ if (state.touchId != touches.identifier) return
+
+
+ var currentTime = getDate().getTime()
+ var currentTouchRelactive = {
+ x: touches.pageX,
+ y: touches.pageY
+ }
+
+ if (containerData.vertical) {
+ // 判断触摸移动方向
+ var direction = decideSwiperDirection(state.touchRelactive, currentTouchRelactive, true)
+ // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向下滑、当前为最后一个swiperItem并且向上滑时不进行操作
+ if (containerData.circular ||
+ !((state.currentIndex === 0 && direction === 'down') || (state.currentIndex === containerData.swiperItemLength - 1 && direction === 'up'))
+ ) {
+ // 判断触摸的时间和移动的距离是否超过了当前itemHeight的一半,如果是则执行切换操作
+ // console.log(currentTime - state.touchStartTime, Math.abs(currentTouchRelactive.y - state.touchRelactive.y));
+ if ((currentTime - state.touchStartTime) > 200 && Math.abs(currentTouchRelactive.y - state.touchRelactive.y) < itemData.itemHeight / 2) {
+ ownerInstance.callMethod('changeParentSwiperContainerStyleStatus',{
+ status: 'reset'
+ })
+ } else {
+ // console.log(direction, state.touchRelactive.y, currentTouchRelactive.y);
+
+ ownerInstance.callMethod('updateParentSwiperContainerStyleWithDirection', {
+ direction: direction
+ })
+ }
+ }
+ } else {
+ // 判断触摸移动方向
+ var direction = decideSwiperDirection(state.touchRelactive, currentTouchRelactive, false)
+ // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向右滑、当前为最后一个swiperItem并且向左滑时不进行操作
+ if (containerData.circular ||
+ !((state.currentIndex === 0 && direction === 'right') || (state.currentIndex === containerData.swiperItemLength - 1 && direction === 'left'))
+ ) {
+ // 判断触摸的时间和移动的距离是否超过了当前itemWidth的一半,如果是则执行切换操作
+ // console.log(currentTime - state.touchStartTime, Math.abs(currentTouchRelactive.x - state.touchRelactive.x));
+ if ((currentTime - state.touchStartTime) > 200 && Math.abs(currentTouchRelactive.x - state.touchRelactive.x) < itemData.itemWidth / 2) {
+ ownerInstance.callMethod('changeParentSwiperContainerStyleStatus',{
+ status: 'reset'
+ })
+ } else {
+ // console.log(direction, state.touchRelactive.x, currentTouchRelactive.x);
+
+ ownerInstance.callMethod('updateParentSwiperContainerStyleWithDirection', {
+ direction: direction
+ })
+ }
+ }
+ }
+
+ // 清除标记
+ state.touchId = null
+ state.touchRelactive = null
+ state.touchStartTime = 0
+
+
+ // 标记停止触摸
+ state.touching = true
+ ownerInstance.callMethod('updateTouchingStatus', {
+ status: false
+ })
+}
+
+module.exports = {
+ itemDataObserver: itemDataObserver,
+ currentIndexObserver: currentIndexObserver,
+ containerDataObserver: containerDataObserver,
+ touchStart: touchStart,
+ touchMove: touchMove,
+ touchEnd: touchEnd
+}
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-custom-swiper-item/tn-custom-swiper-item.vue b/tuniao-ui/components/tn-custom-swiper-item/tn-custom-swiper-item.vue
new file mode 100644
index 0000000..5fd3c5b
--- /dev/null
+++ b/tuniao-ui/components/tn-custom-swiper-item/tn-custom-swiper-item.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-custom-swiper/tn-custom-swiper.vue b/tuniao-ui/components/tn-custom-swiper/tn-custom-swiper.vue
new file mode 100644
index 0000000..2094fe6
--- /dev/null
+++ b/tuniao-ui/components/tn-custom-swiper/tn-custom-swiper.vue
@@ -0,0 +1,535 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentIndex + 1 }}/{{ children.length }}
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-drag/index.wxs b/tuniao-ui/components/tn-drag/index.wxs
new file mode 100644
index 0000000..6df1e84
--- /dev/null
+++ b/tuniao-ui/components/tn-drag/index.wxs
@@ -0,0 +1,265 @@
+// 判断是否出界
+var isOutRange = function(x1, y1, x2, y2, x3, y3) {
+ return x1 < 0 || x1 >= y1 || x2 < 0 || x2 >= y2 || x3 < 0 || x3 >= y3
+}
+var edit = false
+
+function bool(str) {
+ return str === 'true' || str === true
+}
+/**
+ * 排序核心
+ * @param {Object} startKey 开始时位置
+ * @param {Object} endKey 结束时位置
+ * @param {Object} instance wxs内的局部变量快照
+ */
+var sortCore = function(startKey, endKey, state) {
+ var basedata = state.basedata
+ var excludeFix = function(sortKey, type) {
+ // fixed 元素位置不会变化, 这里直接用 sortKey 获取,更加便捷
+ if (state.list[sortKey].fixed) {
+ var _sortKey = type ? --sortKey : ++sortKey
+ return excludeFix(sortKey, type)
+ }
+ return sortKey
+ }
+
+ // 先获取到 endKey 对应的 realKey, 防止下面排序过程中该 realKey 被修改
+ var endRealKey = -1
+ state.list.forEach(function(item) {
+ if (item.sortKey === endKey) endRealKey = item.realKey
+ })
+
+ return state.list.map(function(item) {
+ if (item.fixed) return item
+ var sortKey = item.sortKey
+ var realKey = item.realKey
+
+ if (startKey < endKey) {
+ // 正序拖动
+ if (sortKey > startKey && sortKey <= endKey) {
+ --realKey
+ sortKey = excludeFix(--sortKey, true)
+ } else if (sortKey === startKey) {
+ realKey = endRealKey
+ sortKey = endKey
+ }
+ } else if (startKey > endKey) {
+ // 倒序拖动
+ if (sortKey >= endKey && sortKey < startKey) {
+ ++realKey
+ sortKey = excludeFix(++sortKey, false)
+ } else if (sortKey === startKey) {
+ realKey = endRealKey
+ sortKey = endKey
+ }
+ }
+
+ if (item.sortKey != sortKey) {
+ item.translateX = (sortKey % basedata.columns) * 100 + '%'
+ item.translateY = Math.floor(sortKey / basedata.columns) * 100 + '%'
+ item.sortKey = sortKey
+ item.realKey = realKey
+ }
+ return item
+ })
+}
+
+var triggerCustomEvent = function(list, type, instance) {
+ if (!instance) return
+ var _list = [],
+ listData = [];
+
+ list.forEach(function(item) {
+ _list[item.sortKey] = item
+ })
+ _list.forEach(function(item) {
+ listData.push(item.data)
+ })
+
+ // 编译到小程序 funcName作为参数传递导致事件不执行
+ switch(type) {
+ case 'change':
+ instance.callMethod('change', {data: listData})
+ break
+ case 'sortEnd':
+ instance.callMethod('sortEnd', {data: listData})
+ break
+ }
+}
+
+var listObserver = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ state.itemsInstance = ownerInstance.selectAllComponents('.tn-drag__item')
+
+ state.list = newVal || []
+
+ state.list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + ',' + item.translateY +', 0)'
+ })
+ if (item.fixed) itemInstance.addClass('tn-drag__fixed')
+ }
+ })
+}
+
+var baseDataObserver = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ state.basedata = newVal
+}
+
+var longPress = function(event, ownerInstance) {
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+
+ edit = bool(dataset.edit)
+ if (!edit) return
+ if (!state.basedata || state.basedata === 'undefined') {
+ state.basedata = JSON.parse(dataset.basedata)
+ }
+ var basedata = state.basedata
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ state.current = +dataset.index
+
+ // 初始项是固定项则返回
+ var item = state.list[state.current]
+ if (item && item.fixed) return
+
+ // 如果已经在 drag 中则返回, 防止多指触发 drag 动作, touchstart 事件中有效果
+ if (state.dragging) return
+
+ ownerInstance.callMethod("drag", {
+ dragging: true
+ })
+
+ // 计算X, Y轴初始位移,使item中心移动到点击处,单列的时候X轴初始不做位移
+ state.translateX = basedata.columns === 1 ? 0 : touches.pageX - (basedata.itemWidth / 2 + basedata.left)
+ state.translateY = touches.pageY - (basedata.itemHeight / 2 + basedata.top)
+ state.touchId = touches.identifier
+
+ instance.setStyle({
+ 'transform': 'translate3d(' + state.translateX + 'px,' + state.translateY +'px, 0)'
+ })
+ state.itemsInstance.forEach(function(item, index) {
+ item.removeClass("tn-drag__transition").removeClass("tn-drag__current")
+ item.addClass(index === state.current ? "tn-drag__current" : "tn-drag__transition")
+ })
+
+ ownerInstance.callMethod("vibrate")
+ state.dragging = true
+}
+
+var touchStart = function(event, ownerInstance) {
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ edit = bool(dataset.edit)
+}
+
+var touchMove = function(event, ownerInstance) {
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var basedata = state.basedata
+
+ if (!state.dragging || !edit) return
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 如果不是同一个触发点则返回
+ if (state.touchId !== touches.identifier) return
+
+ // 计算X,Y轴位移, 单列时候X轴初始不做位移
+ var translateX = basedata.columns === 1 ? 0 : touches.pageX - (basedata.itemWidth / 2 + basedata.left)
+ var translateY = touches.pageY - (basedata.itemHeight / 2 + basedata.top)
+
+ // 到顶到低自动滑动
+ if (touches.clientY > basedata.windowHeight - basedata.itemHeight - basedata.realBottomSize) {
+ // 当前触摸点pageY + item高度 - (屏幕高度 - 底部固定区域高度)
+ ownerInstance.callMethod('pageScroll', {
+ scrollTop: touches.pageY + basedata.itemHeight - (basedata.windowHeight - basedata.realBottomSize)
+ })
+ } else if (touches.clientY < basedata.itemHeight + basedata.realTopSize) {
+ // 当前触摸点pageY - item高度 - 顶部固定区域高
+ ownerInstance.callMethod('pageScroll', {
+ scrollTop: touches.pageY - basedata.itemHeight - basedata.realTopSize
+ })
+ }
+
+ // 设置当前激活元素的偏移量
+ instance.setStyle({
+ 'transform': 'translate3d('+ translateX + 'px,' + translateY + 'px, 0)'
+ })
+
+ var startKey = state.list[state.current].sortKey
+ var currentX = Math.round(translateX / basedata.itemWidth)
+ var currentY = Math.round(translateY / basedata.itemHeight)
+ var endKey = currentX + basedata.columns * currentY
+
+ // 目标项时固定项则返回
+ var item = state.list[endKey]
+ if (item && item.fixed) return
+
+ // X轴或者Y轴超出范围则返回
+ if (isOutRange(currentX, basedata.columns, currentY, basedata.rows, endKey, state.list.length)) return
+
+ // 防止拖拽过程中发生乱序问题
+ if (startKey === endKey || startKey === state.preStartKey) return
+ state.preStartKey = startKey
+
+ var list = sortCore(startKey, endKey, state)
+ state.itemsInstance.forEach(function(itemInstance, index) {
+ var item = list[index]
+ if (index !== state.current) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + ',' + item.translateY +', 0)'
+ })
+ }
+ })
+
+ // ownerInstance.callMethod('vibrate')
+ ownerInstance.callMethod('listDataChange', {
+ data: list
+ })
+ triggerCustomEvent(list, "change", ownerInstance)
+}
+
+var touchEnd = function(event, ownerInstance) {
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var basedata = state.basedata
+
+ if (!state.dragging || !edit) return
+ triggerCustomEvent(state.list, "sortEnd", ownerInstance)
+
+ instance.addClass('tn-drag__transition')
+ instance.setStyle({
+ 'transform': 'translate3d('+ state.list[state.current].translateX + ',' + state.list[state.current].translateY + ', 0)'
+ })
+ state.itemsInstance.forEach(function(item, index) {
+ item.removeClass('tn-drag__transition')
+ })
+
+ state.preStartKey = -1
+ state.dragging = false
+ ownerInstance.callMethod('drag', {
+ dragging: false
+ })
+ state.current = -1
+ state.translateX = 0
+ state.translateY = 0
+}
+
+module.exports = {
+ longPress: longPress,
+ touchStart: touchStart,
+ touchMove: touchMove,
+ touchEnd: touchEnd,
+ baseDataObserver: baseDataObserver,
+ listObserver: listObserver
+}
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-drag/tn-drag.vue b/tuniao-ui/components/tn-drag/tn-drag.vue
new file mode 100644
index 0000000..17d269d
--- /dev/null
+++ b/tuniao-ui/components/tn-drag/tn-drag.vue
@@ -0,0 +1,278 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-empty/tn-empty.vue b/tuniao-ui/components/tn-empty/tn-empty.vue
new file mode 100644
index 0000000..3a85b15
--- /dev/null
+++ b/tuniao-ui/components/tn-empty/tn-empty.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+ {{ text ? text : icons[mode]}}
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-fab/tn-fab.vue b/tuniao-ui/components/tn-fab/tn-fab.vue
new file mode 100644
index 0000000..9ce0cde
--- /dev/null
+++ b/tuniao-ui/components/tn-fab/tn-fab.vue
@@ -0,0 +1,523 @@
+
+
+
+
+
+
+ {{ item.text || '' }}
+
+
+
+
+ {{ item.text || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-form-item/tn-form-item.vue b/tuniao-ui/components/tn-form-item/tn-form-item.vue
new file mode 100644
index 0000000..f60dbec
--- /dev/null
+++ b/tuniao-ui/components/tn-form-item/tn-form-item.vue
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{label}}
+
+ *
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{validateMessage}}
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-form/tn-form.vue b/tuniao-ui/components/tn-form/tn-form.vue
new file mode 100644
index 0000000..6a2524f
--- /dev/null
+++ b/tuniao-ui/components/tn-form/tn-form.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-goods-nav/tn-goods-nav.vue b/tuniao-ui/components/tn-goods-nav/tn-goods-nav.vue
new file mode 100644
index 0000000..b3d3a60
--- /dev/null
+++ b/tuniao-ui/components/tn-goods-nav/tn-goods-nav.vue
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+
+ {{ item.count }}
+
+ {{ item.text }}
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-grid-item/tn-grid-item.vue b/tuniao-ui/components/tn-grid-item/tn-grid-item.vue
new file mode 100644
index 0000000..2837bc2
--- /dev/null
+++ b/tuniao-ui/components/tn-grid-item/tn-grid-item.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-grid/tn-grid.vue b/tuniao-ui/components/tn-grid/tn-grid.vue
new file mode 100644
index 0000000..f5487c6
--- /dev/null
+++ b/tuniao-ui/components/tn-grid/tn-grid.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-image-upload-drag/tn-image-upload-drag.vue b/tuniao-ui/components/tn-image-upload-drag/tn-image-upload-drag.vue
new file mode 100644
index 0000000..2194dba
--- /dev/null
+++ b/tuniao-ui/components/tn-image-upload-drag/tn-image-upload-drag.vue
@@ -0,0 +1,1020 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击重试
+
+
+
+
+
+
+
+
+
+
+
+ {{ uploadText }}
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-image-upload/tn-image-upload.vue b/tuniao-ui/components/tn-image-upload/tn-image-upload.vue
new file mode 100644
index 0000000..e7e9418
--- /dev/null
+++ b/tuniao-ui/components/tn-image-upload/tn-image-upload.vue
@@ -0,0 +1,695 @@
+
+
+
+
+
+
+
+
+
+
+
+ 点击重试
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ uploadText }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-index-anchor/tn-index-anchor.vue b/tuniao-ui/components/tn-index-anchor/tn-index-anchor.vue
new file mode 100644
index 0000000..435597d
--- /dev/null
+++ b/tuniao-ui/components/tn-index-anchor/tn-index-anchor.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+ {{ index }}
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-index-list/tn-index-list.vue b/tuniao-ui/components/tn-index-list/tn-index-list.vue
new file mode 100644
index 0000000..5187896
--- /dev/null
+++ b/tuniao-ui/components/tn-index-list/tn-index-list.vue
@@ -0,0 +1,361 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ indexList[touchMoveIndex] }}
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-input/tn-input.vue b/tuniao-ui/components/tn-input/tn-input.vue
new file mode 100644
index 0000000..2d1f513
--- /dev/null
+++ b/tuniao-ui/components/tn-input/tn-input.vue
@@ -0,0 +1,522 @@
+
+
+
+
+
+
+
+
+
+ {{defaultValue == undefined || defaultValue == '' ? placeholder : defaultValue }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-keyboard/tn-keyboard.vue b/tuniao-ui/components/tn-keyboard/tn-keyboard.vue
new file mode 100644
index 0000000..8844421
--- /dev/null
+++ b/tuniao-ui/components/tn-keyboard/tn-keyboard.vue
@@ -0,0 +1,220 @@
+
+
+
+
+
+
+
+
+
+
+ {{ cancelBtn ? cancelText : ''}}
+
+
+ {{ tips ? tips : mode === 'number' ? '数字键盘' : mode === 'card' ? '身份证键盘' : '车牌号码键盘'}}
+
+
+ {{ confirmBtn ? confirmText : ''}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-landscape/tn-landscape.vue b/tuniao-ui/components/tn-landscape/tn-landscape.vue
new file mode 100644
index 0000000..114c1f7
--- /dev/null
+++ b/tuniao-ui/components/tn-landscape/tn-landscape.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-lazy-load/tn-lazy-load.vue b/tuniao-ui/components/tn-lazy-load/tn-lazy-load.vue
new file mode 100644
index 0000000..90fb876
--- /dev/null
+++ b/tuniao-ui/components/tn-lazy-load/tn-lazy-load.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-line-progress/tn-line-progress.vue b/tuniao-ui/components/tn-line-progress/tn-line-progress.vue
new file mode 100644
index 0000000..7e4af3e
--- /dev/null
+++ b/tuniao-ui/components/tn-line-progress/tn-line-progress.vue
@@ -0,0 +1,143 @@
+
+
+
+
+ {{ percent + '%' }}
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-list-cell/tn-list-cell.vue b/tuniao-ui/components/tn-list-cell/tn-list-cell.vue
new file mode 100644
index 0000000..514ebb5
--- /dev/null
+++ b/tuniao-ui/components/tn-list-cell/tn-list-cell.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-list-view/tn-list-view.vue b/tuniao-ui/components/tn-list-view/tn-list-view.vue
new file mode 100644
index 0000000..810e335
--- /dev/null
+++ b/tuniao-ui/components/tn-list-view/tn-list-view.vue
@@ -0,0 +1,184 @@
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-load-more/tn-load-more.vue b/tuniao-ui/components/tn-load-more/tn-load-more.vue
new file mode 100644
index 0000000..22b6fd2
--- /dev/null
+++ b/tuniao-ui/components/tn-load-more/tn-load-more.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+ {{ showText }}
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-loading/tn-loading.vue b/tuniao-ui/components/tn-loading/tn-loading.vue
new file mode 100644
index 0000000..f623c93
--- /dev/null
+++ b/tuniao-ui/components/tn-loading/tn-loading.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-modal/tn-modal.vue b/tuniao-ui/components/tn-modal/tn-modal.vue
new file mode 100644
index 0000000..ddcf234
--- /dev/null
+++ b/tuniao-ui/components/tn-modal/tn-modal.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+ {{ title }}
+ {{ content }}
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-nav-bar/tn-nav-bar.vue b/tuniao-ui/components/tn-nav-bar/tn-nav-bar.vue
new file mode 100644
index 0000000..48f7173
--- /dev/null
+++ b/tuniao-ui/components/tn-nav-bar/tn-nav-bar.vue
@@ -0,0 +1,355 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ backTitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-notice-bar/tn-notice-bar.vue b/tuniao-ui/components/tn-notice-bar/tn-notice-bar.vue
new file mode 100644
index 0000000..fb853d7
--- /dev/null
+++ b/tuniao-ui/components/tn-notice-bar/tn-notice-bar.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-number-box/tn-number-box.vue b/tuniao-ui/components/tn-number-box/tn-number-box.vue
new file mode 100644
index 0000000..63b2a52
--- /dev/null
+++ b/tuniao-ui/components/tn-number-box/tn-number-box.vue
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-number-keyboard/tn-number-keyboard.vue b/tuniao-ui/components/tn-number-keyboard/tn-number-keyboard.vue
new file mode 100644
index 0000000..9d3201a
--- /dev/null
+++ b/tuniao-ui/components/tn-number-keyboard/tn-number-keyboard.vue
@@ -0,0 +1,182 @@
+
+ {}">
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-picker/tn-picker.vue b/tuniao-ui/components/tn-picker/tn-picker.vue
new file mode 100644
index 0000000..26308de
--- /dev/null
+++ b/tuniao-ui/components/tn-picker/tn-picker.vue
@@ -0,0 +1,727 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+ {{ item.label }}
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+ {{ item }}
+ 年
+
+
+
+
+ {{ formatNumber(item) }}
+ 月
+
+
+
+
+ {{ formatNumber(item) }}
+ 日
+
+
+
+
+ {{ formatNumber(item) }}
+ 时
+
+
+
+
+ {{ formatNumber(item) }}
+ 分
+
+
+
+
+ {{ formatNumber(item) }}
+ 秒
+
+
+
+
+
+
+
+ {{ getItemValue(item, 'selector') }}
+
+
+
+
+
+
+
+ {{ getItemValue(sub_item, 'multiSelector') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-popup/tn-popup.vue b/tuniao-ui/components/tn-popup/tn-popup.vue
new file mode 100644
index 0000000..ddbb83e
--- /dev/null
+++ b/tuniao-ui/components/tn-popup/tn-popup.vue
@@ -0,0 +1,492 @@
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-radio-group/tn-radio-group.vue b/tuniao-ui/components/tn-radio-group/tn-radio-group.vue
new file mode 100644
index 0000000..8d4f135
--- /dev/null
+++ b/tuniao-ui/components/tn-radio-group/tn-radio-group.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-radio/tn-radio.vue b/tuniao-ui/components/tn-radio/tn-radio.vue
new file mode 100644
index 0000000..dd2fc43
--- /dev/null
+++ b/tuniao-ui/components/tn-radio/tn-radio.vue
@@ -0,0 +1,276 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-rate/tn-rate.vue b/tuniao-ui/components/tn-rate/tn-rate.vue
new file mode 100644
index 0000000..77b4724
--- /dev/null
+++ b/tuniao-ui/components/tn-rate/tn-rate.vue
@@ -0,0 +1,325 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-read-more/tn-read-more.vue b/tuniao-ui/components/tn-read-more/tn-read-more.vue
new file mode 100644
index 0000000..da012f1
--- /dev/null
+++ b/tuniao-ui/components/tn-read-more/tn-read-more.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+
+
+
+ {{ showMore ? closeText : openText }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-row-notice/tn-row-notice.vue b/tuniao-ui/components/tn-row-notice/tn-row-notice.vue
new file mode 100644
index 0000000..9cc965e
--- /dev/null
+++ b/tuniao-ui/components/tn-row-notice/tn-row-notice.vue
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ showText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-scroll-list/tn-scroll-list.vue b/tuniao-ui/components/tn-scroll-list/tn-scroll-list.vue
new file mode 100644
index 0000000..1dd86eb
--- /dev/null
+++ b/tuniao-ui/components/tn-scroll-list/tn-scroll-list.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-scroll-view/tn-scroll-view.vue b/tuniao-ui/components/tn-scroll-view/tn-scroll-view.vue
new file mode 100644
index 0000000..5fef53e
--- /dev/null
+++ b/tuniao-ui/components/tn-scroll-view/tn-scroll-view.vue
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+
+
+ {{ refreshStateText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-select/tn-select.vue b/tuniao-ui/components/tn-select/tn-select.vue
new file mode 100644
index 0000000..9675f98
--- /dev/null
+++ b/tuniao-ui/components/tn-select/tn-select.vue
@@ -0,0 +1,448 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ sub_item[labelName] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-sign-board/tn-sign-board.vue b/tuniao-ui/components/tn-sign-board/tn-sign-board.vue
new file mode 100644
index 0000000..1b3929c
--- /dev/null
+++ b/tuniao-ui/components/tn-sign-board/tn-sign-board.vue
@@ -0,0 +1,690 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 清除
+ 保存
+ 预览
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-skeleton/tn-skeleton.vue b/tuniao-ui/components/tn-skeleton/tn-skeleton.vue
new file mode 100644
index 0000000..cb3fc7b
--- /dev/null
+++ b/tuniao-ui/components/tn-skeleton/tn-skeleton.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-slider/tn-slider.vue b/tuniao-ui/components/tn-slider/tn-slider.vue
new file mode 100644
index 0000000..c49fb21
--- /dev/null
+++ b/tuniao-ui/components/tn-slider/tn-slider.vue
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-stack-swiper/index-h5.wxs b/tuniao-ui/components/tn-stack-swiper/index-h5.wxs
new file mode 100644
index 0000000..92b8627
--- /dev/null
+++ b/tuniao-ui/components/tn-stack-swiper/index-h5.wxs
@@ -0,0 +1,657 @@
+
+function setTimeout(instance, cb, time) {
+ if (time > 0) {
+ var s = getDate().getTime()
+ var fn = function () {
+ if (getDate().getTime() - s > time) {
+ cb && cb()
+ } else
+ instance.requestAnimationFrame(fn)
+ }
+ fn()
+ }
+ else
+ cb && cb()
+}
+
+// 判断触摸的移动方向
+function decideSwiperDirection(startTouches, currentTouches, direction) {
+ // 震动偏移容差
+ var toleranceShake = 30
+ // 移动容差
+ var toleranceTranslate = 10
+
+ if (direction === 'horizontal') {
+ // 水平方向移动
+ if (Math.abs(currentTouches.y - startTouches.y) <= toleranceShake) {
+ // console.log(currentTouches.x, startTouches.x);
+ if (Math.abs(currentTouches.x - startTouches.x) > toleranceTranslate) {
+ if (currentTouches.x - startTouches.x > 0) {
+ return 'right'
+ } else if (currentTouches.x - startTouches.x < 0) {
+ return 'left'
+ }
+ }
+ }
+ } else if (direction === 'vertical') {
+ // 垂直方向移动
+ if (Math.abs(currentTouches.x - startTouches.x) <= toleranceShake) {
+ // console.log(currentTouches.x, startTouches.x);
+ if (Math.abs(currentTouches.y - startTouches.y) > toleranceTranslate) {
+ if (currentTouches.y - startTouches.y > 0) {
+ return 'down'
+ } else if (currentTouches.y - startTouches.y < 0) {
+ return 'up'
+ }
+ }
+ }
+ }
+ return ''
+}
+
+// 更新轮播样式信息
+function updateSwiperStyle(currentTouches, instance, state) {
+ var itemData = state.itemData
+ var itemsInstance = state.itemsInstance
+ var list = state.list
+ var currentIndex = state.currentIndex
+ var touchRelactive = state.touchRelactive
+ // console.log(itemAnimationWidth);
+
+ if (itemData.direction === 'horizontal') {
+ // 水平方向
+ var itemAnimationWidth = state.itemAnimationWidth
+ // 偏移的x轴距离
+ var translateX = currentTouches.x - touchRelactive.x
+ if (currentTouches.x > itemData.windowWidth || currentTouches.x < 0) return
+ // console.log(translateX);
+ // 更新其他轮播样式
+ if (state.direction == 'left') {
+ // 设置当前激活元素的偏移量
+ instance.setStyle({
+ 'transform': 'translate3d('+ translateX + 'px, 0px, 0px)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 移动距离是否超过了指定的容器宽度
+ if (Math.abs(translateX) > itemAnimationWidth) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != currentIndex) {
+ var preIndex = (index == 0) ? list.length - 1 : index - 1
+ var distanceRate = (Math.abs(translateX) - itemAnimationWidth) / (itemData.itemWidth - itemAnimationWidth)
+ var itemTranslateX = list[index].translateX - (list[index].translateX - list[preIndex].translateX) * distanceRate
+ var itemScale = list[index].scale + (list[preIndex].scale - list[index].scale) * distanceRate
+ var itemOpacity = list[index].opacity + (list[preIndex].opacity - list[index].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(list[index]);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log(itemOpacity);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(' + itemTranslateX + 'px, 0px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+ })
+ }
+ })
+ }
+ } else if (state.direction == 'right') {
+ var preIndex = (currentIndex == 0) ? list.length - 1 : currentIndex - 1
+ // 右滑的时候把最底部的取出,并放到最高层级
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(-' + (itemData.itemWidth - translateX) + 'px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 当前轮播逐渐缩小
+ if (Math.abs(translateX) < itemAnimationWidth) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != preIndex) {
+ var replaceIndex = index == list.length - 1 ? 0 : index + 1
+ var distanceRate = Math.abs(translateX) / itemAnimationWidth
+ var itemTranslateX = list[index].translateX + (list[replaceIndex].translateX - list[index].translateX) * distanceRate
+ var itemScale = list[index].scale - (list[index].scale - list[replaceIndex].scale) * distanceRate
+ var itemOpacity = list[index].opacity - (list[index].opacity - list[replaceIndex].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(index);
+ // console.log(replaceIndex);
+ // console.log(list[index]);
+ // console.log(list[replaceIndex].translateX - list[index].translateX);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(' + itemTranslateX + 'px, 0px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+ })
+ }
+ })
+ }
+ }
+ } else if (itemData.direction === 'vertical') {
+ // 垂直方向
+ var itemAnimationHeight = state.itemAnimationHeight
+ // 偏移的y轴距离
+ var translateY = currentTouches.y - touchRelactive.y
+ if (currentTouches.y > itemData.windowHeight || currentTouches.y < 0) return
+ // console.log(translateX);
+ // 更新其他轮播样式
+ if (state.direction == 'up') {
+ // 设置当前激活元素的偏移量
+ instance.setStyle({
+ 'transform': 'translate3d(0px, '+ translateY + 'px, 0px)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 移动距离是否超过了指定的容器宽度
+ if (Math.abs(translateY) > itemAnimationHeight) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != currentIndex) {
+ var preIndex = (index == 0) ? list.length - 1 : index - 1
+ var distanceRate = (Math.abs(translateY) - itemAnimationHeight) / (itemData.itemHeight - itemAnimationHeight)
+ var itemTranslateY = list[index].translateY - (list[index].translateY - list[preIndex].translateY) * distanceRate
+ var itemScale = list[index].scale + (list[preIndex].scale - list[index].scale) * distanceRate
+ var itemOpacity = list[index].opacity + (list[preIndex].opacity - list[index].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(list[index]);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, ' + itemTranslateY + 'px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+
+ })
+ }
+ })
+ }
+ } else if (state.direction == 'down') {
+ var preIndex = (currentIndex == 0) ? list.length - 1 : currentIndex - 1
+ // 下滑的时候把最底部的取出,并放到最高层级
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(0px, -' + (itemData.itemHeight - translateY) + 'px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 当前轮播逐渐缩小
+ if (Math.abs(translateY) < itemAnimationHeight) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != preIndex) {
+ var replaceIndex = index == list.length - 1 ? 0 : index + 1
+ var distanceRate = Math.abs(translateY) / itemAnimationHeight
+ var itemTranslateY = list[index].translateY + (list[replaceIndex].translateY - list[index].translateY) * distanceRate
+ var itemScale = list[index].scale - (list[index].scale - list[replaceIndex].scale) * distanceRate
+ var itemOpacity = list[index].opacity - (list[index].opacity - list[replaceIndex].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(index);
+ // console.log(replaceIndex);
+ // console.log(list[index]);
+ // console.log(list[replaceIndex].translateX - list[index].translateX);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, ' + itemTranslateY + 'px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+ })
+ }
+ })
+ }
+ }
+ }
+}
+
+// 更新当前轮播序号
+function updateCurrentSwiperIndex(index, ownerInstance, state) {
+ state.currentIndex = index
+ ownerInstance.callMethod('changeSwiperIndex', {
+ index: index
+ })
+}
+
+// 切换到下一个轮播
+function switchNextSwiper(newIndex, touches, instance, state) {
+ var currentIndex = state.currentIndex
+ var list = state.list
+ var direction = state.itemData.direction
+ var touchRelactive = state.touchRelactive || {x: 0, y: 0}
+
+ // 已经完成轮播切换
+ var currentListItemData = JSON.parse(JSON.stringify(list))
+
+ if (direction === 'horizontal') {
+ // 水平方向移动
+ var itemWidth = state.itemData.itemWidth
+ // 当前轮播移动到最左边
+ instance.setStyle({
+ 'transform': 'translate3d(-'+ itemWidth + 'px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemWidth - Math.abs(touches.pageX - touchRelactive.x)) / itemWidth * 250)
+
+ setTimeout(instance, function() {
+ for (var i = list.length - 1; i >= 0; i--) {
+ var replaceIndex = i - 1 < 0 ? list.length - 1 : i - 1
+ // console.log(i);
+ // console.log(replaceIndex);
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d('+ currentListItemData[replaceIndex].translateX + 'px, 0px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ } else if (direction === 'vertical') {
+ // 垂直方向移动
+ var itemHeight = state.itemData.itemHeight
+ // 当前轮播移动到最上边
+ instance.setStyle({
+ 'transform': 'translate3d(0px, -'+ itemHeight + 'px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemHeight - Math.abs(touches.pageY - touchRelactive.y)) / itemHeight * 250)
+
+ setTimeout(instance, function() {
+ for (var i = list.length - 1; i >= 0; i--) {
+ var replaceIndex = i - 1 < 0 ? list.length - 1 : i - 1
+ // console.log(i);
+ // console.log(replaceIndex);
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d(0px, '+ currentListItemData[replaceIndex].translateY + 'px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ }
+}
+
+// 切换到上一个轮播
+function switchPrevSwiper(newIndex, touches, instance, state) {
+ var currentIndex = state.currentIndex
+ var list = state.list
+ var direction = state.itemData.direction
+ var touchRelactive = state.touchRelactive || {x: 0, y: 0}
+
+ var currentListItemData = JSON.parse(JSON.stringify(list))
+
+ if (direction === 'horizontal') {
+ // 水平方向移动
+ var itemWidth = state.itemData.itemWidth
+ // 当前上一个轮播移动到正常位置
+ state.itemsInstance[newIndex].setStyle({
+ 'transform': 'translate3d(0px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemWidth - Math.abs(touches.pageX - touchRelactive.x)) / itemWidth * 250)
+ // 更新除当前上一个轮播外的其他轮播,向后移动一个层级
+ // 更新列表位置相关数据
+ setTimeout(instance, function() {
+ for (var i = 0; i < list.length; i++) {
+ var replaceIndex = (i + 1 > list.length - 1) ? 0 : i + 1
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d('+ currentListItemData[replaceIndex].translateX + 'px, 0px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ } else if (direction === 'vertical') {
+ // 垂直方向移动
+ var itemHeight = state.itemData.itemHeight
+ // 当前上一个轮播移动到正常位置
+ state.itemsInstance[newIndex].setStyle({
+ 'transform': 'translate3d(0px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemHeight - Math.abs(touches.pageY - touchRelactive.y)) / itemHeight * 250)
+ // 更新除当前上一个轮播外的其他轮播,向后移动一个层级
+ // 更新列表位置相关数据
+ setTimeout(instance, function() {
+ for (var i = 0; i < list.length; i++) {
+ var replaceIndex = (i + 1 > list.length - 1) ? 0 : i + 1
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d(0px, '+ currentListItemData[replaceIndex].translateY + 'px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ }
+}
+
+// 反转动画
+function toggleSwiperAnimation(state, add) {
+ if (!state.itemsInstance) return
+ if (add === true) {
+ state.itemsInstance.forEach(function(item, index) {
+ if (!item.hasClass('tn-stack-swiper__item__transition')) {
+ item.addClass('tn-stack-swiper__item__transition')
+ }
+ })
+ } else {
+ state.itemsInstance.forEach(function(item, index) {
+ if (item.hasClass('tn-stack-swiper__item__transition')) {
+ item.removeClass('tn-stack-swiper__item__transition')
+ }
+ })
+ }
+}
+
+// 更新数据
+var itemDataObserver = function (newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ state.itemData = newVal
+}
+
+// 列表初始化
+var listObserver = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+ state.itemsInstance = ownerInstance.selectAllComponents('.tn-stack-swiper__item')
+
+ state.list = newVal || []
+
+ state.list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ if (itemData.direction === 'horizontal') {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + 'px, 0px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ } else if (itemData.direction === 'vertical') {
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, '+ item.translateY + 'px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ }
+ })
+}
+
+// 切换轮播位置
+var swiperIndexChange = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ // console.log(newVal);
+ // ownerInstance.callMethod('printLog', newVal)
+ // console.log(oldVal);
+ // ownerInstance.callMethod('printLog', oldVal)
+ // 排除第一次初始化和手动切换的情况
+ if (oldVal < 0 || typeof oldVal == 'undefined' || state.currentIndex == newVal) {
+ if (oldVal < 0 || typeof oldVal == 'undefined') {
+ state.currentIndex = 0
+ }
+ return
+ }
+ state.currentIndex = newVal
+ // console.log(state.currentIndex);
+ if (newVal > oldVal || (oldVal == state.list.length - 1 && newVal == 0)) {
+ // console.log("next");
+ // state.itemsInstance.forEach(function(item, index) {
+ // item.addClass("tn-stack-swiper__item__transition")
+ // })
+ switchNextSwiper(newVal, {
+ pageX: 0
+ }, state.itemsInstance[oldVal], state)
+ } else if (newVal < oldVal || (oldVal == 0 && newVal == state.list.length - 1)) {
+ // console.log("prev");
+ }
+}
+
+// 自动轮播切换状态
+var autoplayFlagChange = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+
+ if (newVal === true) {
+ toggleSwiperAnimation(state, true)
+ } else {
+ toggleSwiperAnimation(state, false)
+ }
+}
+
+// 开始触摸
+var touchStart = function (event, ownerInstance) {
+ // console.log('touchStart');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+
+ var itemData = state.itemData
+
+ // 判断是否为为当前显示的轮播
+ if (dataset.index != state.currentIndex) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 记录当前滑动开始的x,y坐标
+ state.touchRelactive = {
+ x: touches.pageX,
+ y: touches.pageY
+ }
+ // 记录触摸id,用于处理多指的情况
+ state.touchId = touches.identifier
+
+ if (itemData.direction === 'horizontal') {
+ // 水平方向移动
+ // 设置左右滑动时相对偏移距离
+ state.itemAnimationWidth = itemData.itemWidth * (dataset.switchrate / 100)
+ } else if (itemData.direction === 'vertical') {
+ // 垂直方向移动
+ // 设置上下滑动时相对偏移距离
+ state.itemAnimationHeight = itemData.itemHeight * (dataset.switchrate / 100)
+ }
+
+ // 移除运动动画时间
+ toggleSwiperAnimation(state, false)
+
+ // 标记开始触摸
+ state.touching = true
+ ownerInstance.callMethod('changeTouchState', {
+ touching: true
+ })
+ // 停止执行自动轮播
+ ownerInstance.callMethod('clearAutoPlayTimer')
+}
+
+// 开始移动
+var touchMove = function (event, ownerInstance) {
+ // console.log('touchMove');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+
+ // 判断是否为为当前显示的轮播
+ if (dataset.index != state.currentIndex) return
+
+ // 还没开始触摸直接返回
+ if (!state.touching) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 判断是否为同一个触摸点
+ if (state.touchId != touches.identifier) return
+
+ var currentTouchRelactive = {
+ x: touches.pageX,
+ y: touches.pageY
+ }
+ // 是否已经确定了移动方向
+ if (!state.direction) {
+ state.direction = decideSwiperDirection(state.touchRelactive, currentTouchRelactive, itemData.direction)
+ }
+ // console.log(decideSwiperDirection(state.touchRelactive, currentTouchRelactive));
+ updateSwiperStyle(currentTouchRelactive, instance, state)
+}
+
+// 移动结束
+var touchEnd = function (event, ownerInstance) {
+ // console.log('touchEnd');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+ var list = state.list
+ var touchRelactive = state.touchRelactive
+
+ // 判断是否为为当前显示的轮播
+ if (dataset.index != state.currentIndex) return
+
+ // 还没开始触摸直接返回
+ if (!state.touching) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 判断是否为同一个触摸点
+ if (state.touchId != touches.identifier) return
+
+ // 添加运动动画时间
+ toggleSwiperAnimation(state, true)
+
+ if (itemData.direction === 'horizontal') {
+ // 水平方向移动
+ var itemAnimationWidth = state.itemAnimationWidth
+ // 判断时左滑还是右滑
+ // 判断是否超过自动滚动到下一页还是回滚
+ if (state.direction == 'left') {
+ if (Math.abs(touches.pageX - touchRelactive.x) < itemAnimationWidth) {
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + 'px, 0px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex
+ })
+ }
+ })
+ } else {
+ var newIndex = state.currentIndex + 1 > list.length - 1 ? 0 : state.currentIndex + 1
+ switchNextSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ } else if (state.direction == 'right') {
+ if (Math.abs(touches.pageX - touchRelactive.x) < itemAnimationWidth) {
+ // 滑动显示图片回滚
+ var preIndex = (state.currentIndex == 0) ? list.length - 1 : state.currentIndex - 1
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(-' + itemData.itemWidth + 'px, 0px, 0px) scale(1)',
+ 'z-index': list[state.currentIndex].zIndex + 1,
+ 'opacity': list[state.currentIndex].opacity
+ })
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + 'px, 0px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ })
+ } else {
+ var newIndex = (state.currentIndex - 1 < 0) ? list.length - 1 : state.currentIndex - 1
+ switchPrevSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ }
+ } else if (itemData.direction === 'vertical') {
+ // 垂直方向移动
+ var itemAnimationHeight = state.itemAnimationHeight
+ // 判断时上滑还是下滑
+ // 判断是否超过自动滚动到下一页还是回滚
+ if (state.direction == 'up') {
+ if (Math.abs(touches.pageY - touchRelactive.y) < itemAnimationHeight) {
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, '+ item.translateY + 'px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ })
+ } else {
+ var newIndex = state.currentIndex + 1 > list.length - 1 ? 0 : state.currentIndex + 1
+ switchNextSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ } else if (state.direction == 'down') {
+ if (Math.abs(touches.pageY - touchRelactive.y) < itemAnimationHeight) {
+ // 滑动显示图片回滚
+ var preIndex = (state.currentIndex == 0) ? list.length - 1 : state.currentIndex - 1
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(0px, -' + itemData.itemHeight + 'px, 0px) scale(1)',
+ 'z-index': list[state.currentIndex].zIndex + 1,
+ 'opacity': list[state.currentIndex].opacity
+ })
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, '+ item.translateY + 'px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ })
+ } else {
+ var newIndex = (state.currentIndex - 1 < 0) ? list.length - 1 : state.currentIndex - 1
+ switchPrevSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ }
+ }
+
+ // 清除对应的标志位
+ state.touchRelactive = null
+ state.touching = false
+ state.direction = null
+ state.touchId = null
+
+ ownerInstance.callMethod('changeTouchState', {
+ touching: false
+ })
+ // 重新开始执行自动轮播
+ ownerInstance.callMethod('setAutoPlay')
+}
+
+module.exports = {
+ itemDataObserver: itemDataObserver,
+ listObserver: listObserver,
+ swiperIndexChange: swiperIndexChange,
+ autoplayFlagChange: autoplayFlagChange,
+ touchStart: touchStart,
+ touchMove: touchMove,
+ touchEnd: touchEnd
+}
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-stack-swiper/index.wxs b/tuniao-ui/components/tn-stack-swiper/index.wxs
new file mode 100644
index 0000000..92b8627
--- /dev/null
+++ b/tuniao-ui/components/tn-stack-swiper/index.wxs
@@ -0,0 +1,657 @@
+
+function setTimeout(instance, cb, time) {
+ if (time > 0) {
+ var s = getDate().getTime()
+ var fn = function () {
+ if (getDate().getTime() - s > time) {
+ cb && cb()
+ } else
+ instance.requestAnimationFrame(fn)
+ }
+ fn()
+ }
+ else
+ cb && cb()
+}
+
+// 判断触摸的移动方向
+function decideSwiperDirection(startTouches, currentTouches, direction) {
+ // 震动偏移容差
+ var toleranceShake = 30
+ // 移动容差
+ var toleranceTranslate = 10
+
+ if (direction === 'horizontal') {
+ // 水平方向移动
+ if (Math.abs(currentTouches.y - startTouches.y) <= toleranceShake) {
+ // console.log(currentTouches.x, startTouches.x);
+ if (Math.abs(currentTouches.x - startTouches.x) > toleranceTranslate) {
+ if (currentTouches.x - startTouches.x > 0) {
+ return 'right'
+ } else if (currentTouches.x - startTouches.x < 0) {
+ return 'left'
+ }
+ }
+ }
+ } else if (direction === 'vertical') {
+ // 垂直方向移动
+ if (Math.abs(currentTouches.x - startTouches.x) <= toleranceShake) {
+ // console.log(currentTouches.x, startTouches.x);
+ if (Math.abs(currentTouches.y - startTouches.y) > toleranceTranslate) {
+ if (currentTouches.y - startTouches.y > 0) {
+ return 'down'
+ } else if (currentTouches.y - startTouches.y < 0) {
+ return 'up'
+ }
+ }
+ }
+ }
+ return ''
+}
+
+// 更新轮播样式信息
+function updateSwiperStyle(currentTouches, instance, state) {
+ var itemData = state.itemData
+ var itemsInstance = state.itemsInstance
+ var list = state.list
+ var currentIndex = state.currentIndex
+ var touchRelactive = state.touchRelactive
+ // console.log(itemAnimationWidth);
+
+ if (itemData.direction === 'horizontal') {
+ // 水平方向
+ var itemAnimationWidth = state.itemAnimationWidth
+ // 偏移的x轴距离
+ var translateX = currentTouches.x - touchRelactive.x
+ if (currentTouches.x > itemData.windowWidth || currentTouches.x < 0) return
+ // console.log(translateX);
+ // 更新其他轮播样式
+ if (state.direction == 'left') {
+ // 设置当前激活元素的偏移量
+ instance.setStyle({
+ 'transform': 'translate3d('+ translateX + 'px, 0px, 0px)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 移动距离是否超过了指定的容器宽度
+ if (Math.abs(translateX) > itemAnimationWidth) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != currentIndex) {
+ var preIndex = (index == 0) ? list.length - 1 : index - 1
+ var distanceRate = (Math.abs(translateX) - itemAnimationWidth) / (itemData.itemWidth - itemAnimationWidth)
+ var itemTranslateX = list[index].translateX - (list[index].translateX - list[preIndex].translateX) * distanceRate
+ var itemScale = list[index].scale + (list[preIndex].scale - list[index].scale) * distanceRate
+ var itemOpacity = list[index].opacity + (list[preIndex].opacity - list[index].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(list[index]);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log(itemOpacity);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(' + itemTranslateX + 'px, 0px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+ })
+ }
+ })
+ }
+ } else if (state.direction == 'right') {
+ var preIndex = (currentIndex == 0) ? list.length - 1 : currentIndex - 1
+ // 右滑的时候把最底部的取出,并放到最高层级
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(-' + (itemData.itemWidth - translateX) + 'px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 当前轮播逐渐缩小
+ if (Math.abs(translateX) < itemAnimationWidth) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != preIndex) {
+ var replaceIndex = index == list.length - 1 ? 0 : index + 1
+ var distanceRate = Math.abs(translateX) / itemAnimationWidth
+ var itemTranslateX = list[index].translateX + (list[replaceIndex].translateX - list[index].translateX) * distanceRate
+ var itemScale = list[index].scale - (list[index].scale - list[replaceIndex].scale) * distanceRate
+ var itemOpacity = list[index].opacity - (list[index].opacity - list[replaceIndex].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(index);
+ // console.log(replaceIndex);
+ // console.log(list[index]);
+ // console.log(list[replaceIndex].translateX - list[index].translateX);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(' + itemTranslateX + 'px, 0px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+ })
+ }
+ })
+ }
+ }
+ } else if (itemData.direction === 'vertical') {
+ // 垂直方向
+ var itemAnimationHeight = state.itemAnimationHeight
+ // 偏移的y轴距离
+ var translateY = currentTouches.y - touchRelactive.y
+ if (currentTouches.y > itemData.windowHeight || currentTouches.y < 0) return
+ // console.log(translateX);
+ // 更新其他轮播样式
+ if (state.direction == 'up') {
+ // 设置当前激活元素的偏移量
+ instance.setStyle({
+ 'transform': 'translate3d(0px, '+ translateY + 'px, 0px)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 移动距离是否超过了指定的容器宽度
+ if (Math.abs(translateY) > itemAnimationHeight) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != currentIndex) {
+ var preIndex = (index == 0) ? list.length - 1 : index - 1
+ var distanceRate = (Math.abs(translateY) - itemAnimationHeight) / (itemData.itemHeight - itemAnimationHeight)
+ var itemTranslateY = list[index].translateY - (list[index].translateY - list[preIndex].translateY) * distanceRate
+ var itemScale = list[index].scale + (list[preIndex].scale - list[index].scale) * distanceRate
+ var itemOpacity = list[index].opacity + (list[preIndex].opacity - list[index].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(list[index]);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, ' + itemTranslateY + 'px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+
+ })
+ }
+ })
+ }
+ } else if (state.direction == 'down') {
+ var preIndex = (currentIndex == 0) ? list.length - 1 : currentIndex - 1
+ // 下滑的时候把最底部的取出,并放到最高层级
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(0px, -' + (itemData.itemHeight - translateY) + 'px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 当前轮播逐渐缩小
+ if (Math.abs(translateY) < itemAnimationHeight) {
+ state.itemsInstance.forEach( function(itemInstance, index) {
+ if (index != preIndex) {
+ var replaceIndex = index == list.length - 1 ? 0 : index + 1
+ var distanceRate = Math.abs(translateY) / itemAnimationHeight
+ var itemTranslateY = list[index].translateY + (list[replaceIndex].translateY - list[index].translateY) * distanceRate
+ var itemScale = list[index].scale - (list[index].scale - list[replaceIndex].scale) * distanceRate
+ var itemOpacity = list[index].opacity - (list[index].opacity - list[replaceIndex].opacity) * distanceRate
+ // console.log(preIndex);
+ // console.log(index);
+ // console.log(replaceIndex);
+ // console.log(list[index]);
+ // console.log(list[replaceIndex].translateX - list[index].translateX);
+ // console.log(distanceRate);
+ // console.log(itemTranslateX);
+ // console.log(itemScale);
+ // console.log('-----------------------------------------------------------');
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, ' + itemTranslateY + 'px, 0px) scale(' + itemScale + ')',
+ 'z-index': list[index].zIndex,
+ 'opacity': itemOpacity
+ })
+ }
+ })
+ }
+ }
+ }
+}
+
+// 更新当前轮播序号
+function updateCurrentSwiperIndex(index, ownerInstance, state) {
+ state.currentIndex = index
+ ownerInstance.callMethod('changeSwiperIndex', {
+ index: index
+ })
+}
+
+// 切换到下一个轮播
+function switchNextSwiper(newIndex, touches, instance, state) {
+ var currentIndex = state.currentIndex
+ var list = state.list
+ var direction = state.itemData.direction
+ var touchRelactive = state.touchRelactive || {x: 0, y: 0}
+
+ // 已经完成轮播切换
+ var currentListItemData = JSON.parse(JSON.stringify(list))
+
+ if (direction === 'horizontal') {
+ // 水平方向移动
+ var itemWidth = state.itemData.itemWidth
+ // 当前轮播移动到最左边
+ instance.setStyle({
+ 'transform': 'translate3d(-'+ itemWidth + 'px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemWidth - Math.abs(touches.pageX - touchRelactive.x)) / itemWidth * 250)
+
+ setTimeout(instance, function() {
+ for (var i = list.length - 1; i >= 0; i--) {
+ var replaceIndex = i - 1 < 0 ? list.length - 1 : i - 1
+ // console.log(i);
+ // console.log(replaceIndex);
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d('+ currentListItemData[replaceIndex].translateX + 'px, 0px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ } else if (direction === 'vertical') {
+ // 垂直方向移动
+ var itemHeight = state.itemData.itemHeight
+ // 当前轮播移动到最上边
+ instance.setStyle({
+ 'transform': 'translate3d(0px, -'+ itemHeight + 'px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemHeight - Math.abs(touches.pageY - touchRelactive.y)) / itemHeight * 250)
+
+ setTimeout(instance, function() {
+ for (var i = list.length - 1; i >= 0; i--) {
+ var replaceIndex = i - 1 < 0 ? list.length - 1 : i - 1
+ // console.log(i);
+ // console.log(replaceIndex);
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d(0px, '+ currentListItemData[replaceIndex].translateY + 'px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ }
+}
+
+// 切换到上一个轮播
+function switchPrevSwiper(newIndex, touches, instance, state) {
+ var currentIndex = state.currentIndex
+ var list = state.list
+ var direction = state.itemData.direction
+ var touchRelactive = state.touchRelactive || {x: 0, y: 0}
+
+ var currentListItemData = JSON.parse(JSON.stringify(list))
+
+ if (direction === 'horizontal') {
+ // 水平方向移动
+ var itemWidth = state.itemData.itemWidth
+ // 当前上一个轮播移动到正常位置
+ state.itemsInstance[newIndex].setStyle({
+ 'transform': 'translate3d(0px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemWidth - Math.abs(touches.pageX - touchRelactive.x)) / itemWidth * 250)
+ // 更新除当前上一个轮播外的其他轮播,向后移动一个层级
+ // 更新列表位置相关数据
+ setTimeout(instance, function() {
+ for (var i = 0; i < list.length; i++) {
+ var replaceIndex = (i + 1 > list.length - 1) ? 0 : i + 1
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d('+ currentListItemData[replaceIndex].translateX + 'px, 0px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ } else if (direction === 'vertical') {
+ // 垂直方向移动
+ var itemHeight = state.itemData.itemHeight
+ // 当前上一个轮播移动到正常位置
+ state.itemsInstance[newIndex].setStyle({
+ 'transform': 'translate3d(0px, 0px, 0px) scale(1)',
+ 'z-index': list[currentIndex].zIndex + 1,
+ 'opacity': list[currentIndex].opacity
+ })
+ // 计算当前移动需要的剩余时间
+ var time = Math.floor((itemHeight - Math.abs(touches.pageY - touchRelactive.y)) / itemHeight * 250)
+ // 更新除当前上一个轮播外的其他轮播,向后移动一个层级
+ // 更新列表位置相关数据
+ setTimeout(instance, function() {
+ for (var i = 0; i < list.length; i++) {
+ var replaceIndex = (i + 1 > list.length - 1) ? 0 : i + 1
+ state.itemsInstance[i].setStyle({
+ 'transform': 'translate3d(0px, '+ currentListItemData[replaceIndex].translateY + 'px, 0px) scale(' + currentListItemData[replaceIndex].scale + ')',
+ 'z-index': currentListItemData[replaceIndex].zIndex,
+ 'opacity': currentListItemData[replaceIndex].opacity
+ })
+ state.list[i] = currentListItemData[replaceIndex]
+ }
+ }, time)
+ }
+}
+
+// 反转动画
+function toggleSwiperAnimation(state, add) {
+ if (!state.itemsInstance) return
+ if (add === true) {
+ state.itemsInstance.forEach(function(item, index) {
+ if (!item.hasClass('tn-stack-swiper__item__transition')) {
+ item.addClass('tn-stack-swiper__item__transition')
+ }
+ })
+ } else {
+ state.itemsInstance.forEach(function(item, index) {
+ if (item.hasClass('tn-stack-swiper__item__transition')) {
+ item.removeClass('tn-stack-swiper__item__transition')
+ }
+ })
+ }
+}
+
+// 更新数据
+var itemDataObserver = function (newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ state.itemData = newVal
+}
+
+// 列表初始化
+var listObserver = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+ state.itemsInstance = ownerInstance.selectAllComponents('.tn-stack-swiper__item')
+
+ state.list = newVal || []
+
+ state.list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ if (itemData.direction === 'horizontal') {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + 'px, 0px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ } else if (itemData.direction === 'vertical') {
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, '+ item.translateY + 'px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ }
+ })
+}
+
+// 切换轮播位置
+var swiperIndexChange = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+ // console.log(newVal);
+ // ownerInstance.callMethod('printLog', newVal)
+ // console.log(oldVal);
+ // ownerInstance.callMethod('printLog', oldVal)
+ // 排除第一次初始化和手动切换的情况
+ if (oldVal < 0 || typeof oldVal == 'undefined' || state.currentIndex == newVal) {
+ if (oldVal < 0 || typeof oldVal == 'undefined') {
+ state.currentIndex = 0
+ }
+ return
+ }
+ state.currentIndex = newVal
+ // console.log(state.currentIndex);
+ if (newVal > oldVal || (oldVal == state.list.length - 1 && newVal == 0)) {
+ // console.log("next");
+ // state.itemsInstance.forEach(function(item, index) {
+ // item.addClass("tn-stack-swiper__item__transition")
+ // })
+ switchNextSwiper(newVal, {
+ pageX: 0
+ }, state.itemsInstance[oldVal], state)
+ } else if (newVal < oldVal || (oldVal == 0 && newVal == state.list.length - 1)) {
+ // console.log("prev");
+ }
+}
+
+// 自动轮播切换状态
+var autoplayFlagChange = function(newVal, oldVal, ownerInstance, instance) {
+ var state = ownerInstance.getState()
+
+ if (newVal === true) {
+ toggleSwiperAnimation(state, true)
+ } else {
+ toggleSwiperAnimation(state, false)
+ }
+}
+
+// 开始触摸
+var touchStart = function (event, ownerInstance) {
+ // console.log('touchStart');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+
+ var itemData = state.itemData
+
+ // 判断是否为为当前显示的轮播
+ if (dataset.index != state.currentIndex) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 记录当前滑动开始的x,y坐标
+ state.touchRelactive = {
+ x: touches.pageX,
+ y: touches.pageY
+ }
+ // 记录触摸id,用于处理多指的情况
+ state.touchId = touches.identifier
+
+ if (itemData.direction === 'horizontal') {
+ // 水平方向移动
+ // 设置左右滑动时相对偏移距离
+ state.itemAnimationWidth = itemData.itemWidth * (dataset.switchrate / 100)
+ } else if (itemData.direction === 'vertical') {
+ // 垂直方向移动
+ // 设置上下滑动时相对偏移距离
+ state.itemAnimationHeight = itemData.itemHeight * (dataset.switchrate / 100)
+ }
+
+ // 移除运动动画时间
+ toggleSwiperAnimation(state, false)
+
+ // 标记开始触摸
+ state.touching = true
+ ownerInstance.callMethod('changeTouchState', {
+ touching: true
+ })
+ // 停止执行自动轮播
+ ownerInstance.callMethod('clearAutoPlayTimer')
+}
+
+// 开始移动
+var touchMove = function (event, ownerInstance) {
+ // console.log('touchMove');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+
+ // 判断是否为为当前显示的轮播
+ if (dataset.index != state.currentIndex) return
+
+ // 还没开始触摸直接返回
+ if (!state.touching) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 判断是否为同一个触摸点
+ if (state.touchId != touches.identifier) return
+
+ var currentTouchRelactive = {
+ x: touches.pageX,
+ y: touches.pageY
+ }
+ // 是否已经确定了移动方向
+ if (!state.direction) {
+ state.direction = decideSwiperDirection(state.touchRelactive, currentTouchRelactive, itemData.direction)
+ }
+ // console.log(decideSwiperDirection(state.touchRelactive, currentTouchRelactive));
+ updateSwiperStyle(currentTouchRelactive, instance, state)
+}
+
+// 移动结束
+var touchEnd = function (event, ownerInstance) {
+ // console.log('touchEnd');
+ var instance = event.instance
+ var dataset = instance.getDataset()
+ var state = ownerInstance.getState()
+ var itemData = state.itemData
+ var list = state.list
+ var touchRelactive = state.touchRelactive
+
+ // 判断是否为为当前显示的轮播
+ if (dataset.index != state.currentIndex) return
+
+ // 还没开始触摸直接返回
+ if (!state.touching) return
+
+ var touches = event.changedTouches[0]
+ if (!touches) return
+
+ // 判断是否为同一个触摸点
+ if (state.touchId != touches.identifier) return
+
+ // 添加运动动画时间
+ toggleSwiperAnimation(state, true)
+
+ if (itemData.direction === 'horizontal') {
+ // 水平方向移动
+ var itemAnimationWidth = state.itemAnimationWidth
+ // 判断时左滑还是右滑
+ // 判断是否超过自动滚动到下一页还是回滚
+ if (state.direction == 'left') {
+ if (Math.abs(touches.pageX - touchRelactive.x) < itemAnimationWidth) {
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + 'px, 0px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex
+ })
+ }
+ })
+ } else {
+ var newIndex = state.currentIndex + 1 > list.length - 1 ? 0 : state.currentIndex + 1
+ switchNextSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ } else if (state.direction == 'right') {
+ if (Math.abs(touches.pageX - touchRelactive.x) < itemAnimationWidth) {
+ // 滑动显示图片回滚
+ var preIndex = (state.currentIndex == 0) ? list.length - 1 : state.currentIndex - 1
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(-' + itemData.itemWidth + 'px, 0px, 0px) scale(1)',
+ 'z-index': list[state.currentIndex].zIndex + 1,
+ 'opacity': list[state.currentIndex].opacity
+ })
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d('+ item.translateX + 'px, 0px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ })
+ } else {
+ var newIndex = (state.currentIndex - 1 < 0) ? list.length - 1 : state.currentIndex - 1
+ switchPrevSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ }
+ } else if (itemData.direction === 'vertical') {
+ // 垂直方向移动
+ var itemAnimationHeight = state.itemAnimationHeight
+ // 判断时上滑还是下滑
+ // 判断是否超过自动滚动到下一页还是回滚
+ if (state.direction == 'up') {
+ if (Math.abs(touches.pageY - touchRelactive.y) < itemAnimationHeight) {
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, '+ item.translateY + 'px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ })
+ } else {
+ var newIndex = state.currentIndex + 1 > list.length - 1 ? 0 : state.currentIndex + 1
+ switchNextSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ } else if (state.direction == 'down') {
+ if (Math.abs(touches.pageY - touchRelactive.y) < itemAnimationHeight) {
+ // 滑动显示图片回滚
+ var preIndex = (state.currentIndex == 0) ? list.length - 1 : state.currentIndex - 1
+ state.itemsInstance[preIndex].setStyle({
+ 'transform': 'translate3d(0px, -' + itemData.itemHeight + 'px, 0px) scale(1)',
+ 'z-index': list[state.currentIndex].zIndex + 1,
+ 'opacity': list[state.currentIndex].opacity
+ })
+ list.forEach(function(item, index) {
+ var itemInstance = state.itemsInstance[index]
+ if (item && itemInstance) {
+ itemInstance.setStyle({
+ 'transform': 'translate3d(0px, '+ item.translateY + 'px, 0px) scale(' + item.scale + ')',
+ 'z-index': item.zIndex,
+ 'opacity': item.opacity
+ })
+ }
+ })
+ } else {
+ var newIndex = (state.currentIndex - 1 < 0) ? list.length - 1 : state.currentIndex - 1
+ switchPrevSwiper(newIndex, touches, instance, state)
+
+ updateCurrentSwiperIndex(newIndex, ownerInstance, state)
+ }
+ }
+ }
+
+ // 清除对应的标志位
+ state.touchRelactive = null
+ state.touching = false
+ state.direction = null
+ state.touchId = null
+
+ ownerInstance.callMethod('changeTouchState', {
+ touching: false
+ })
+ // 重新开始执行自动轮播
+ ownerInstance.callMethod('setAutoPlay')
+}
+
+module.exports = {
+ itemDataObserver: itemDataObserver,
+ listObserver: listObserver,
+ swiperIndexChange: swiperIndexChange,
+ autoplayFlagChange: autoplayFlagChange,
+ touchStart: touchStart,
+ touchMove: touchMove,
+ touchEnd: touchEnd
+}
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-stack-swiper/tn-stack-swiper.vue b/tuniao-ui/components/tn-stack-swiper/tn-stack-swiper.vue
new file mode 100644
index 0000000..3982da5
--- /dev/null
+++ b/tuniao-ui/components/tn-stack-swiper/tn-stack-swiper.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-steps/tn-steps.vue b/tuniao-ui/components/tn-steps/tn-steps.vue
new file mode 100644
index 0000000..e43ba61
--- /dev/null
+++ b/tuniao-ui/components/tn-steps/tn-steps.vue
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+ {{ index + 1}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-sticky/tn-sticky.vue b/tuniao-ui/components/tn-sticky/tn-sticky.vue
new file mode 100644
index 0000000..a8b3bf9
--- /dev/null
+++ b/tuniao-ui/components/tn-sticky/tn-sticky.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-subsection/tn-subsection.vue b/tuniao-ui/components/tn-subsection/tn-subsection.vue
new file mode 100644
index 0000000..a9f5720
--- /dev/null
+++ b/tuniao-ui/components/tn-subsection/tn-subsection.vue
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-swipe-action-item/index.wxs b/tuniao-ui/components/tn-swipe-action-item/index.wxs
new file mode 100644
index 0000000..977b970
--- /dev/null
+++ b/tuniao-ui/components/tn-swipe-action-item/index.wxs
@@ -0,0 +1,230 @@
+/**
+ * 此为wxs模块,只支持APP-VUE,微信和QQ小程序以及H5平台
+ * wxs内部不支持es6语法,变量只能使用var定义,无法使用解构,箭头函数等特性
+ */
+
+// 开始触摸
+function touchStart(event, ownerInstance) {
+ // 触发事件的组件的ComponentDescriptor实例
+ var instance = event.instance
+ // wxs内的局部变量快照,此快照是属于整个组件,在touchstart和touchmove事件中都能获取到相同的结果
+ var state = instance.getState()
+ if (state.disabled) return
+ var touches = event.touches
+ // 如果进行的是多指触控,不允许操作
+ if (touches && touches.length > 1) return
+ // 标识当前为滑动中状态
+ state.moving = true
+ // 记录触摸开始点的坐标点
+ state.startX = touches[0].pageX
+ state.startY = touches[0].pageY
+ // 记录开始触摸的时间
+ state.touchStartTime = getDate().getTime()
+
+ ownerInstance.callMethod('closeOther')
+}
+
+// 触摸滑动
+function touchMove(event, ownerInstance) {
+ // 触发事件的组件的ComponentDescriptor实例
+ var instance = event.instance
+ // wxs内的局部变量快照,此快照是属于整个组件,在touchstart和touchmove事件中都能获取到相同的结果
+ var state = instance.getState()
+ if (state.disabled || !state.moving) return
+ var touches = event.touches
+ var pageX = touches[0].pageX
+ var pageY = touches[0].pageY
+ var moveX = pageX - state.startX
+ var moveY = pageY - state.startY
+ var buttonsWidth = state.buttonsWidth
+
+ // 移动的X轴距离大于Y轴距离,也即终点与起点位置连线,与X轴夹角小于45度时,禁止页面滚动
+ if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > state.threshold) {
+ // event.preventDefault && event.preventDefault()
+ // event.stopPropagation && event.stopPropagation()
+ }
+ // 移动的Y轴距离大于X轴距离,也即终点与起点位置连线,与Y轴夹角小于45度时,认为页面时上下滑动而不是左右滑动单元格
+ if (Math.abs(moveX) < Math.abs(moveY)) return
+
+ // 限制右滑的距离,不允许内容部分往右偏移,右滑会导致X轴偏移值大于0,以此做判断
+ // 此处不能直接return,因为滑动过程中会缺失某些关键点坐标,会导致错乱,所以处理的方法是在超出后设置为0
+ if (state.status === 'open') {
+ // 在开启状态下,忽略左滑动
+ if (moveX < 0) moveX = 0
+ // 要收起菜单,最大能移动的距离为按钮的总宽度
+ if (moveX > buttonsWidth) moveX = buttonsWidth
+ // 如果是已经打开的状态,向左滑动时,移动收起菜单
+ moveSwipeAction(-buttonsWidth + moveX, instance, ownerInstance)
+ } else {
+ // 关闭状态下,忽略右滑
+ if (moveX > 0) return
+ // 滑动的距离不允许超过所有按钮的总宽度,此时只能左滑
+ // 滑动距离设置为按钮的宽度(负数)
+ if (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth
+ // 在滑动过程中不断移动单元格内容,使其不断显示出来
+ moveSwipeAction(moveX, instance, ownerInstance)
+ }
+}
+
+// 触摸结束
+function touchEnd(event, ownerInstance) {
+ // 触发事件的组件的ComponentDescriptor实例
+ var instance = event.instance
+ // wxs内的局部变量快照,此快照是属于整个组件,在touchstart和touchmove事件中都能获取到相同的结果
+ var state = instance.getState()
+ if (!state.moving || state.disabled) return
+ var touches = event.changedTouches ? event.changedTouches[0] : {}
+ var pageX = touches.pageX
+ var pageY = touches.pageY
+ var moveX = pageX - state.startX
+ if (state.status === 'open') {
+ // 在开启状态下,忽略左滑动
+ if (moveX < 0) moveX = 0
+ // 在开启状态下,点击一下内容区域,moveX为0,也即没有移动,这是执行收起操作
+ if (moveX === 0) {
+ return closeSwipeAction(instance, ownerInstance)
+ }
+
+ // 在开启状态下,滑动距离小于阈值,则默认不关闭同时恢复原来的打开状态
+ if (Math.abs(moveX) < state.threshold) {
+ openSwipeAction(instance, ownerInstance)
+ } else {
+ // 如果滑动距离大于阈值则执行收起逻辑
+ closeSwipeAction(instance, ownerInstance)
+ }
+ } else {
+
+ // 获取手指离开的时间
+ var touchEndTime = getDate().getTime()
+ // 判断是否点击了
+ if (Math.abs(pageX - state.startX) < 5 && Math.abs(pageY - state.startY) < 5 && touchEndTime - state.touchStartTime < 100) {
+ ownerInstance.callMethod('handlerItemClick')
+ }
+
+ // 在关闭状态下,忽略右滑动
+ if (moveX > 0) return
+ if (Math.abs(moveX) < state.threshold) {
+ closeSwipeAction(instance, ownerInstance)
+ } else {
+ openSwipeAction(instance, ownerInstance)
+ }
+ }
+}
+
+// 获取过渡时间
+function getDuration(value) {
+ if (value.toString().indexOf('s') >= 0) return value
+ return value > 30 ? value + 'ms' : value + 's'
+}
+
+// 移动滑动选择器内容区域,同时显示出其隐藏的菜单
+function moveSwipeAction(moveX, instance, ownerInstance) {
+ var state = instance.getState()
+ // 获取所有按钮的实例,需要通过它去设置按钮的位移
+ var buttons = ownerInstance.selectAllComponents('.tn-swipe-action-item__right__button')
+
+ // 设置菜单内容部分的偏移
+ instance.requestAnimationFrame(function () {
+ instance.setStyle({
+ // 设置translateX的值
+ 'transition': 'none',
+ transform: 'translateX('+ moveX +'px)',
+ '-webkit-transform': 'translateX('+ moveX +'px)'
+ })
+ })
+}
+
+// 一次性展开滑动菜单
+function openSwipeAction(instance, ownerInstance) {
+ var state = instance.getState()
+ // 获取所有按钮的实例,需要通过它去设置按钮的位移
+ var buttons = ownerInstance.selectAllComponents('.tn-swipe-action-item__right__button')
+ // 处理duration单位问题
+ var duration = getDuration(state.duration)
+ // 展开过程中,是向左移动,所以x的偏移应该是负值
+ var buttonsWidth = -state.buttonsWidth
+ instance.requestAnimationFrame(function () {
+ // 设置菜单主体内容
+ instance.setStyle({
+ 'transition': 'transform ' + duration,
+ 'transform': 'translateX('+ buttonsWidth +'px)',
+ '-webkit-transform': 'translateX('+ buttonsWidth +'px)'
+ })
+ })
+ setStatus('open', instance, ownerInstance)
+}
+
+// 一次性收起滑动菜单
+function closeSwipeAction(instance, ownerInstance) {
+ var state = instance.getState()
+ // 获取所有按钮的实例,需要通过它去设置按钮的位移
+ var buttons = ownerInstance.selectAllComponents('.tn-swipe-action-item__right__button')
+ var len = buttons.length
+ // 处理duration单位问题
+ var duration = getDuration(state.duration)
+ instance.requestAnimationFrame(function () {
+ // 设置菜单主体内容
+ instance.setStyle({
+ 'transition': 'transform ' + duration,
+ 'transform': 'translateX(0px)',
+ '-webkit-transform': 'translateX(0px)'
+ })
+ // 设置各个隐藏按钮的收起状态
+ for (var i = len - 1; i >= 0; i--) {
+ buttons[i].setStyle({
+ 'transition': 'transform ' + duration,
+ 'transform': 'translateX(0px)',
+ '-webkit-transform': 'translateX(0px)'
+ })
+ }
+ })
+ setStatus('close', instance, ownerInstance)
+}
+
+// 标记菜单的当前状态,open - 打开 close - 关闭
+function setStatus(status, instance, ownerInstance) {
+ var state = instance.getState()
+ state.status = status
+ ownerInstance.callMethod('setStatus', status)
+}
+
+// status的状态发生变化
+function statusChange(newValue, oldValue, ownerInstance, instance) {
+ var state = instance.getState()
+ if (state.disabled) return
+ // 打开或关闭单元格
+ if (newValue === 'close' && state.status === 'open') {
+ closeSwipeAction(instance, ownerInstance)
+ } else if (newValue === 'open' && state.status === 'close') {
+ openSwipeAction(instance, ownerInstance)
+ }
+}
+
+// 菜单尺寸发生变化
+function sizeChange(newValue, oldValue, ownerInstance, instance) {
+ // wxs内的局部变量快照
+ var state = instance.getState()
+ state.disabled = newValue.disabled
+ state.duration = newValue.duration
+ state.show = newValue.show
+ state.threshold = newValue.threshold
+ state.buttons = newValue.buttons
+
+ if (state.buttons) {
+ var len = state.buttons.length
+ var buttonsWidth = 0
+ var buttons = newValue.buttons
+ for (var i = 0; i < len; i++) {
+ buttonsWidth += buttons[i].width
+ }
+ }
+ state.buttonsWidth = buttonsWidth
+}
+
+module.exports = {
+ touchStart: touchStart,
+ touchMove: touchMove,
+ touchEnd: touchEnd,
+ sizeChange: sizeChange,
+ statusChange: statusChange
+}
\ No newline at end of file
diff --git a/tuniao-ui/components/tn-swipe-action-item/tn-swipe-action-item.vue b/tuniao-ui/components/tn-swipe-action-item/tn-swipe-action-item.vue
new file mode 100644
index 0000000..7fd29a0
--- /dev/null
+++ b/tuniao-ui/components/tn-swipe-action-item/tn-swipe-action-item.vue
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-swipe-action/tn-swipe-action.vue b/tuniao-ui/components/tn-swipe-action/tn-swipe-action.vue
new file mode 100644
index 0000000..1b238b4
--- /dev/null
+++ b/tuniao-ui/components/tn-swipe-action/tn-swipe-action.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-swiper/tn-swiper.vue b/tuniao-ui/components/tn-swiper/tn-swiper.vue
new file mode 100644
index 0000000..9b854fe
--- /dev/null
+++ b/tuniao-ui/components/tn-swiper/tn-swiper.vue
@@ -0,0 +1,364 @@
+
+
+
+
+
+
+
+
+ {{ item[titleName] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ swiperIndex + 1 }}/{{ list.length }}
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-switch/tn-switch.vue b/tuniao-ui/components/tn-switch/tn-switch.vue
new file mode 100644
index 0000000..7280813
--- /dev/null
+++ b/tuniao-ui/components/tn-switch/tn-switch.vue
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tabbar/tn-tabbar.vue b/tuniao-ui/components/tn-tabbar/tn-tabbar.vue
new file mode 100644
index 0000000..66125ce
--- /dev/null
+++ b/tuniao-ui/components/tn-tabbar/tn-tabbar.vue
@@ -0,0 +1,576 @@
+
+ {}">
+
+
+
+
+
+
+
+
+
+
+
+ {{ $tn.number.formatNumberString(item.count) }}
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-table/tn-table.vue b/tuniao-ui/components/tn-table/tn-table.vue
new file mode 100644
index 0000000..519b178
--- /dev/null
+++ b/tuniao-ui/components/tn-table/tn-table.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tabs-swiper/tn-tabs-swiper.vue b/tuniao-ui/components/tn-tabs-swiper/tn-tabs-swiper.vue
new file mode 100644
index 0000000..c5de9be
--- /dev/null
+++ b/tuniao-ui/components/tn-tabs-swiper/tn-tabs-swiper.vue
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+ {{ item[count] || item['count']}}
+ {{ item[name] || item['name'] }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tabs/tn-tabs.vue b/tuniao-ui/components/tn-tabs/tn-tabs.vue
new file mode 100644
index 0000000..26993a7
--- /dev/null
+++ b/tuniao-ui/components/tn-tabs/tn-tabs.vue
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+
+
+
+ {{ item[count] || item['count']}}
+ {{ item[name] || item['name'] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tag/tn-tag.vue b/tuniao-ui/components/tn-tag/tn-tag.vue
new file mode 100644
index 0000000..180ca59
--- /dev/null
+++ b/tuniao-ui/components/tn-tag/tn-tag.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-td/tn-td.vue b/tuniao-ui/components/tn-td/tn-td.vue
new file mode 100644
index 0000000..00b230f
--- /dev/null
+++ b/tuniao-ui/components/tn-td/tn-td.vue
@@ -0,0 +1,307 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-time-line-item/tn-time-line-item.vue b/tuniao-ui/components/tn-time-line-item/tn-time-line-item.vue
new file mode 100644
index 0000000..5372a10
--- /dev/null
+++ b/tuniao-ui/components/tn-time-line-item/tn-time-line-item.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-time-line-item/tn-time-line-item.vue_bk b/tuniao-ui/components/tn-time-line-item/tn-time-line-item.vue_bk
new file mode 100644
index 0000000..5372a10
--- /dev/null
+++ b/tuniao-ui/components/tn-time-line-item/tn-time-line-item.vue_bk
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-time-line/tn-time-line.vue b/tuniao-ui/components/tn-time-line/tn-time-line.vue
new file mode 100644
index 0000000..951dd3f
--- /dev/null
+++ b/tuniao-ui/components/tn-time-line/tn-time-line.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-time-line/tn-time-line.vue_bk b/tuniao-ui/components/tn-time-line/tn-time-line.vue_bk
new file mode 100644
index 0000000..951dd3f
--- /dev/null
+++ b/tuniao-ui/components/tn-time-line/tn-time-line.vue_bk
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tips/tn-tips.vue b/tuniao-ui/components/tn-tips/tn-tips.vue
new file mode 100644
index 0000000..3c49cd6
--- /dev/null
+++ b/tuniao-ui/components/tn-tips/tn-tips.vue
@@ -0,0 +1,240 @@
+
+
+ {{ msg }}
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-toast/tn-toast.vue b/tuniao-ui/components/tn-toast/tn-toast.vue
new file mode 100644
index 0000000..6e77b93
--- /dev/null
+++ b/tuniao-ui/components/tn-toast/tn-toast.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+ {{ title }}
+ {{ content }}
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tr/tn-tr.vue b/tuniao-ui/components/tn-tr/tn-tr.vue
new file mode 100644
index 0000000..0380511
--- /dev/null
+++ b/tuniao-ui/components/tn-tr/tn-tr.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tree-node/tn-tree-node.vue b/tuniao-ui/components/tn-tree-node/tn-tree-node.vue
new file mode 100644
index 0000000..10f3f4d
--- /dev/null
+++ b/tuniao-ui/components/tn-tree-node/tn-tree-node.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ node.text }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-tree-view/tn-tree-view.vue b/tuniao-ui/components/tn-tree-view/tn-tree-view.vue
new file mode 100644
index 0000000..99e8c7f
--- /dev/null
+++ b/tuniao-ui/components/tn-tree-view/tn-tree-view.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-verification-code-input/tn-verification-code-input.vue b/tuniao-ui/components/tn-verification-code-input/tn-verification-code-input.vue
new file mode 100644
index 0000000..1b7a587
--- /dev/null
+++ b/tuniao-ui/components/tn-verification-code-input/tn-verification-code-input.vue
@@ -0,0 +1,324 @@
+
+
+
+
+
+
+
+
+
+
+ {{ charArr[index] ? charArr[index] : '' }}
+
+
+ {{ charArr[index] ? '●' : '' }}
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-verification-code/tn-verification-code.vue b/tuniao-ui/components/tn-verification-code/tn-verification-code.vue
new file mode 100644
index 0000000..9076ce4
--- /dev/null
+++ b/tuniao-ui/components/tn-verification-code/tn-verification-code.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/components/tn-waterfall/tn-waterfall.vue b/tuniao-ui/components/tn-waterfall/tn-waterfall.vue
new file mode 100644
index 0000000..827be0e
--- /dev/null
+++ b/tuniao-ui/components/tn-waterfall/tn-waterfall.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/tuniao-ui/iconfont.css b/tuniao-ui/iconfont.css
new file mode 100644
index 0000000..c6df848
--- /dev/null
+++ b/tuniao-ui/iconfont.css
@@ -0,0 +1,3061 @@
+@charset "UTF-8";
+
+@font-face {
+ font-family: "tuniaoFont"; /* Project id 3063751 */
+ src:
+ url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
+ url('//at.alicdn.com/t/c/font_3063751_pd5m6puw4p.woff?t=1701183381697') format('woff'),
+ url('//at.alicdn.com/t/c/font_3063751_pd5m6puw4p.ttf?t=1701183381697') format('truetype');
+}
+
+[class*='tn-icon-'] {
+ font-family: 'tuniaoFont' !important;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ text-align: center;
+ text-decoration: none;
+}
+
+.tn-icon-left-circle-simple:before {
+ content: "\ea38";
+}
+
+.tn-icon-left-circle-simple-fill:before {
+ content: "\ea39";
+}
+
+.tn-icon-down-circle-simple:before {
+ content: "\ea3a";
+}
+
+.tn-icon-down-circle-simple-fill:before {
+ content: "\ea3b";
+}
+
+.tn-icon-right-circle-simple-fill:before {
+ content: "\ea3c";
+}
+
+.tn-icon-right-circle-simple:before {
+ content: "\ea3d";
+}
+
+.tn-icon-up-circle-simple:before {
+ content: "\ea3e";
+}
+
+.tn-icon-up-circle-simple-fill:before {
+ content: "\ea3f";
+}
+
+.tn-icon-my-love:before {
+ content: "\ea35";
+}
+
+.tn-icon-address-fill:before {
+ content: "\ea36";
+}
+
+.tn-icon-address:before {
+ content: "\ea37";
+}
+
+.tn-icon-like-lack-fill:before {
+ content: "\ea32";
+}
+
+.tn-icon-oa:before {
+ content: "\ea33";
+}
+
+.tn-icon-like-break-fill:before {
+ content: "\ea34";
+}
+
+.tn-icon-signal:before {
+ content: "\ea2e";
+}
+
+.tn-icon-help-question:before {
+ content: "\ea2f";
+}
+
+.tn-icon-radioactivity:before {
+ content: "\ea30";
+}
+
+.tn-icon-signal-no:before {
+ content: "\ea31";
+}
+
+.tn-icon-dice-face:before {
+ content: "\ea2d";
+}
+
+.tn-icon-vip-diamond:before {
+ content: "\e9c9";
+}
+
+.tn-icon-video-square:before {
+ content: "\e9ca";
+}
+
+.tn-icon-vip-diamond-fill:before {
+ content: "\ea29";
+}
+
+.tn-icon-vr:before {
+ content: "\ea2a";
+}
+
+.tn-icon-vr-fill:before {
+ content: "\ea2b";
+}
+
+.tn-icon-video-square-fill:before {
+ content: "\ea2c";
+}
+
+.tn-icon-arrivals:before {
+ content: "\ea27";
+}
+
+.tn-icon-departures:before {
+ content: "\ea28";
+}
+
+.tn-icon-parking:before {
+ content: "\ea26";
+}
+
+.tn-icon-fireworks:before {
+ content: "\ea25";
+}
+
+.tn-icon-cloud-fill:before {
+ content: "\ea23";
+}
+
+.tn-icon-cloud:before {
+ content: "\ea24";
+}
+
+.tn-icon-snowflake:before {
+ content: "\e949";
+}
+
+.tn-icon-prohibit:before {
+ content: "\ea22";
+}
+
+.tn-icon-honeycomb-fill:before {
+ content: "\ea20";
+}
+
+.tn-icon-honeycomb:before {
+ content: "\ea21";
+}
+
+.tn-icon-starry:before {
+ content: "\ea1e";
+}
+
+.tn-icon-vscode:before {
+ content: "\ea1f";
+}
+
+.tn-icon-tips-fill:before {
+ content: "\ea1b";
+}
+
+.tn-icon-tip:before {
+ content: "\ea1c";
+}
+
+.tn-icon-tips:before {
+ content: "\ea1d";
+}
+
+.tn-icon-write-feather-fill:before {
+ content: "\ea19";
+}
+
+.tn-icon-write-feather:before {
+ content: "\ea1a";
+}
+
+.tn-icon-eat:before {
+ content: "\e98b";
+}
+
+.tn-icon-eat-fill:before {
+ content: "\e98c";
+}
+
+.tn-icon-eat-west:before {
+ content: "\ea0f";
+}
+
+.tn-icon-eat-west-fill:before {
+ content: "\ea10";
+}
+
+.tn-icon-eat-other:before {
+ content: "\ea11";
+}
+
+.tn-icon-eat-other-fill:before {
+ content: "\ea12";
+}
+
+.tn-icon-food-fill:before {
+ content: "\ea13";
+}
+
+.tn-icon-food:before {
+ content: "\ea14";
+}
+
+.tn-icon-folder-reduce:before {
+ content: "\ea15";
+}
+
+.tn-icon-folder-add-fill:before {
+ content: "\ea16";
+}
+
+.tn-icon-folder-reduce-fill:before {
+ content: "\ea17";
+}
+
+.tn-icon-folder-add:before {
+ content: "\ea18";
+}
+
+.tn-icon-fold:before {
+ content: "\ea0d";
+}
+
+.tn-icon-unfold:before {
+ content: "\ea0e";
+}
+
+.tn-icon-refresh-simple:before {
+ content: "\ea0c";
+}
+
+.tn-icon-assign-fill:before {
+ content: "\ea0a";
+}
+
+.tn-icon-assign:before {
+ content: "\ea0b";
+}
+
+.tn-icon-praise-simple:before {
+ content: "\ea06";
+}
+
+.tn-icon-praise-simple-fill:before {
+ content: "\ea07";
+}
+
+.tn-icon-tread-simple-fill:before {
+ content: "\ea08";
+}
+
+.tn-icon-tread-simple:before {
+ content: "\ea09";
+}
+
+.tn-icon-fish:before {
+ content: "\ea05";
+}
+
+.tn-icon-pushpin-fill:before {
+ content: "\ea03";
+}
+
+.tn-icon-pushpin:before {
+ content: "\ea04";
+}
+
+.tn-icon-equal:before {
+ content: "\ea00";
+}
+
+.tn-icon-equal-fill:before {
+ content: "\ea01";
+}
+
+.tn-icon-totop-simple:before {
+ content: "\ea02";
+}
+
+.tn-icon-floral-fill:before {
+ content: "\e9fe";
+}
+
+.tn-icon-floral:before {
+ content: "\e9ff";
+}
+
+.tn-icon-my-job:before {
+ content: "\e9f9";
+}
+
+.tn-icon-my-job-fill:before {
+ content: "\e9fa";
+}
+
+.tn-icon-my-formal:before {
+ content: "\e9fb";
+}
+
+.tn-icon-my-formal-fill:before {
+ content: "\e9fc";
+}
+
+.tn-icon-history:before {
+ content: "\e9fd";
+}
+
+.tn-icon-seafox:before {
+ content: "\e9f8";
+}
+
+.tn-icon-norm-fill:before {
+ content: "\e9f6";
+}
+
+.tn-icon-norm:before {
+ content: "\e9f7";
+}
+
+.tn-icon-cargoship:before {
+ content: "\e9f5";
+}
+
+.tn-icon-menu-grille-fill:before {
+ content: "\e9f3";
+}
+
+.tn-icon-menu-grille:before {
+ content: "\e9f4";
+}
+
+.tn-icon-piggy-bank:before {
+ content: "\e9ef";
+}
+
+.tn-icon-skull-fill:before {
+ content: "\e9f0";
+}
+
+.tn-icon-skull:before {
+ content: "\e9f1";
+}
+
+.tn-icon-piggy-bank-fill:before {
+ content: "\e9f2";
+}
+
+.tn-icon-next-song:before {
+ content: "\e9eb";
+}
+
+.tn-icon-previous-song:before {
+ content: "\e9ec";
+}
+
+.tn-icon-previous-song-fill:before {
+ content: "\e9ed";
+}
+
+.tn-icon-next-song-fill:before {
+ content: "\e9ee";
+}
+
+.tn-icon-ai:before {
+ content: "\e9e9";
+}
+
+.tn-icon-ai-fill:before {
+ content: "\e9ea";
+}
+
+.tn-icon-headset-fill:before {
+ content: "\e9e8";
+}
+
+.tn-icon-reduce-rhombus-fill:before {
+ content: "\e9e6";
+}
+
+.tn-icon-reduce-rhombus:before {
+ content: "\e9e7";
+}
+
+.tn-icon-umbrella-fill:before {
+ content: "\e9a1";
+}
+
+.tn-icon-footprint-fill:before {
+ content: "\e992";
+}
+
+.tn-icon-folder:before {
+ content: "\e9df";
+}
+
+.tn-icon-folder-fill:before {
+ content: "\e9e0";
+}
+
+.tn-icon-folder-download-fill:before {
+ content: "\e9e1";
+}
+
+.tn-icon-pyramid:before {
+ content: "\e9e2";
+}
+
+.tn-icon-folder-upload:before {
+ content: "\e9e3";
+}
+
+.tn-icon-folder-download:before {
+ content: "\e9e4";
+}
+
+.tn-icon-folder-upload-fill:before {
+ content: "\e9e5";
+}
+
+.tn-icon-hotspot:before {
+ content: "\e9dc";
+}
+
+.tn-icon-router:before {
+ content: "\e9dd";
+}
+
+.tn-icon-router-fill:before {
+ content: "\e9de";
+}
+
+.tn-icon-menu-rhombus:before {
+ content: "\e9da";
+}
+
+.tn-icon-menu-rhombus-fill:before {
+ content: "\e9db";
+}
+
+.tn-icon-plane-fill:before {
+ content: "\e9d8";
+}
+
+.tn-icon-plane:before {
+ content: "\e9d9";
+}
+
+.tn-icon-spiral:before {
+ content: "\e9d2";
+}
+
+.tn-icon-lotus:before {
+ content: "\e9d3";
+}
+
+.tn-icon-koi:before {
+ content: "\e9d4";
+}
+
+.tn-icon-koi-fill:before {
+ content: "\e9d5";
+}
+
+.tn-icon-add-rhombus-fill:before {
+ content: "\e9d6";
+}
+
+.tn-icon-add-rhombus:before {
+ content: "\e9d7";
+}
+
+.tn-icon-bookmark:before {
+ content: "\e9ce";
+}
+
+.tn-icon-bookmark-fill:before {
+ content: "\e9cf";
+}
+
+.tn-icon-refresh:before {
+ content: "\e9d0";
+}
+
+.tn-icon-refresh-square:before {
+ content: "\e9d1";
+}
+
+.tn-icon-tread-fill:before {
+ content: "\e9cb";
+}
+
+.tn-icon-audio:before {
+ content: "\e9cc";
+}
+
+.tn-icon-tread:before {
+ content: "\e9cd";
+}
+
+.tn-icon-play:before {
+ content: "\e9c8";
+}
+
+.tn-icon-inventory-fill:before {
+ content: "\e9c3";
+}
+
+.tn-icon-percent-fill:before {
+ content: "\e9c4";
+}
+
+.tn-icon-percent:before {
+ content: "\e9c5";
+}
+
+.tn-icon-inventory:before {
+ content: "\e9c6";
+}
+
+.tn-icon-activity:before {
+ content: "\e9c7";
+}
+
+.tn-icon-qr-code-circle:before {
+ content: "\e9c2";
+}
+
+.tn-icon-task-fill:before {
+ content: "\e9c0";
+}
+
+.tn-icon-task:before {
+ content: "\e9c1";
+}
+
+.tn-icon-text-best:before {
+ content: "\e9be";
+}
+
+.tn-icon-text-free:before {
+ content: "\e9bf";
+}
+
+.tn-icon-text-zgs:before {
+ content: "\e8ff";
+}
+
+.tn-icon-text-xzx:before {
+ content: "\e9ba";
+}
+
+.tn-icon-text-like:before {
+ content: "\e9bb";
+}
+
+.tn-icon-text-sale:before {
+ content: "\e9bc";
+}
+
+.tn-icon-text-hot:before {
+ content: "\e9bd";
+}
+
+.tn-icon-home-leaf:before {
+ content: "\e9b8";
+}
+
+.tn-icon-home-leaf-fill:before {
+ content: "\e9b9";
+}
+
+.tn-icon-service-simple-fill:before {
+ content: "\e9b6";
+}
+
+.tn-icon-service-simple:before {
+ content: "\e9b7";
+}
+
+.tn-icon-meteor-fill:before {
+ content: "\e9b4";
+}
+
+.tn-icon-meteor:before {
+ content: "\e9b5";
+}
+
+.tn-icon-dice-five:before {
+ content: "\e9ae";
+}
+
+.tn-icon-dice-one:before {
+ content: "\e9af";
+}
+
+.tn-icon-dice-three:before {
+ content: "\e9b0";
+}
+
+.tn-icon-dice-six:before {
+ content: "\e9b1";
+}
+
+.tn-icon-dice-four:before {
+ content: "\e9b2";
+}
+
+.tn-icon-dice-two:before {
+ content: "\e9b3";
+}
+
+.tn-icon-theme-fill:before {
+ content: "\e938";
+}
+
+.tn-icon-theme:before {
+ content: "\e9ad";
+}
+
+.tn-icon-download-simple:before {
+ content: "\e9ab";
+}
+
+.tn-icon-upload-simple:before {
+ content: "\e9ac";
+}
+
+.tn-icon-on:before {
+ content: "\e9a9";
+}
+
+.tn-icon-off:before {
+ content: "\e9aa";
+}
+
+.tn-icon-my-circle:before {
+ content: "\e9a7";
+}
+
+.tn-icon-my-circle-fill:before {
+ content: "\e9a8";
+}
+
+.tn-icon-temperature-f:before {
+ content: "\e9a5";
+}
+
+.tn-icon-temperature-c:before {
+ content: "\e9a6";
+}
+
+.tn-icon-sunrise:before {
+ content: "\e9a3";
+}
+
+.tn-icon-sunset:before {
+ content: "\e9a4";
+}
+
+.tn-icon-password:before {
+ content: "\e9a0";
+}
+
+.tn-icon-umbrella:before {
+ content: "\e9a2";
+}
+
+.tn-icon-unite:before {
+ content: "\e999";
+}
+
+.tn-icon-unite-fill:before {
+ content: "\e99a";
+}
+
+.tn-icon-global:before {
+ content: "\e99b";
+}
+
+.tn-icon-reload-home:before {
+ content: "\e99c";
+}
+
+.tn-icon-reload-planet:before {
+ content: "\e99d";
+}
+
+.tn-icon-reload-home-fill:before {
+ content: "\e99e";
+}
+
+.tn-icon-reload-planet-fill:before {
+ content: "\e99f";
+}
+
+.tn-icon-route:before {
+ content: "\e997";
+}
+
+.tn-icon-route-fill:before {
+ content: "\e998";
+}
+
+.tn-icon-my-simple-fill:before {
+ content: "\e98e";
+}
+
+.tn-icon-my-simple:before {
+ content: "\e98f";
+}
+
+.tn-icon-around-fill:before {
+ content: "\e990";
+}
+
+.tn-icon-around:before {
+ content: "\e991";
+}
+
+.tn-icon-footprint:before {
+ content: "\e993";
+}
+
+.tn-icon-my-lack-fill:before {
+ content: "\e994";
+}
+
+.tn-icon-my-lack:before {
+ content: "\e995";
+}
+
+.tn-icon-bigscreen:before {
+ content: "\e996";
+}
+
+.tn-icon-escalator:before {
+ content: "\e98d";
+}
+
+.tn-icon-suitcase:before {
+ content: "\e989";
+}
+
+.tn-icon-suitcase-fill:before {
+ content: "\e98a";
+}
+
+.tn-icon-add-square-fill:before {
+ content: "\e904";
+}
+
+.tn-icon-cute:before {
+ content: "\e988";
+}
+
+.tn-icon-compress:before {
+ content: "\e96e";
+}
+
+.tn-icon-expend:before {
+ content: "\e96f";
+}
+
+.tn-icon-windows:before {
+ content: "\e970";
+}
+
+.tn-icon-trademark:before {
+ content: "\e971";
+}
+
+.tn-icon-tailor:before {
+ content: "\e972";
+}
+
+.tn-icon-move:before {
+ content: "\e973";
+}
+
+.tn-icon-pillow:before {
+ content: "\e974";
+}
+
+.tn-icon-bathtub:before {
+ content: "\e975";
+}
+
+.tn-icon-buy:before {
+ content: "\e976";
+}
+
+.tn-icon-buy-fill:before {
+ content: "\e977";
+}
+
+.tn-icon-allday:before {
+ content: "\e978";
+}
+
+.tn-icon-home-love-fill:before {
+ content: "\e979";
+}
+
+.tn-icon-home-love:before {
+ content: "\e97a";
+}
+
+.tn-icon-gesture-two:before {
+ content: "\e97b";
+}
+
+.tn-icon-gesture-four:before {
+ content: "\e97c";
+}
+
+.tn-icon-gesture-five:before {
+ content: "\e97d";
+}
+
+.tn-icon-gesture-one:before {
+ content: "\e97e";
+}
+
+.tn-icon-gesture-three:before {
+ content: "\e97f";
+}
+
+.tn-icon-gesture-dropdown:before {
+ content: "\e980";
+}
+
+.tn-icon-plant-fill:before {
+ content: "\e981";
+}
+
+.tn-icon-plant:before {
+ content: "\e982";
+}
+
+.tn-icon-pillow-fill:before {
+ content: "\e983";
+}
+
+.tn-icon-bathtub-fill:before {
+ content: "\e984";
+}
+
+.tn-icon-wheelchair:before {
+ content: "\e985";
+}
+
+.tn-icon-narrow-all:before {
+ content: "\e986";
+}
+
+.tn-icon-fullscreen-all:before {
+ content: "\e987";
+}
+
+.tn-icon-close-square-fill:before {
+ content: "\e945";
+}
+
+.tn-icon-add-square:before {
+ content: "\e962";
+}
+
+.tn-icon-close-square:before {
+ content: "\e963";
+}
+
+.tn-icon-my-reduce:before {
+ content: "\e964";
+}
+
+.tn-icon-square-fill:before {
+ content: "\e965";
+}
+
+.tn-icon-pay-fill:before {
+ content: "\e966";
+}
+
+.tn-icon-commissary:before {
+ content: "\e967";
+}
+
+.tn-icon-commissary-fill:before {
+ content: "\e968";
+}
+
+.tn-icon-notice-no-fill:before {
+ content: "\e969";
+}
+
+.tn-icon-cross-fill:before {
+ content: "\e96a";
+}
+
+.tn-icon-nintendo-switch:before {
+ content: "\e96b";
+}
+
+.tn-icon-mammoth:before {
+ content: "\e96c";
+}
+
+.tn-icon-open:before {
+ content: "\e96d";
+}
+
+.tn-icon-bed-fill:before {
+ content: "\e916";
+}
+
+.tn-icon-bed:before {
+ content: "\e961";
+}
+
+.tn-icon-menu-flex-fill:before {
+ content: "\e956";
+}
+
+.tn-icon-menu-flex:before {
+ content: "\e957";
+}
+
+.tn-icon-logistics-fill:before {
+ content: "\e958";
+}
+
+.tn-icon-ghost-fill:before {
+ content: "\e959";
+}
+
+.tn-icon-keyboard-circle-fill:before {
+ content: "\e95a";
+}
+
+.tn-icon-brand-fill:before {
+ content: "\e95b";
+}
+
+.tn-icon-clear-fill:before {
+ content: "\e95c";
+}
+
+.tn-icon-mouse-fill:before {
+ content: "\e95d";
+}
+
+.tn-icon-brand:before {
+ content: "\e95e";
+}
+
+.tn-icon-monitor-fill:before {
+ content: "\e95f";
+}
+
+.tn-icon-covid-19-fill:before {
+ content: "\e960";
+}
+
+.tn-icon-install-fill:before {
+ content: "\e936";
+}
+
+.tn-icon-install:before {
+ content: "\e955";
+}
+
+.tn-icon-restroom-female:before {
+ content: "\e953";
+}
+
+.tn-icon-restroom-male:before {
+ content: "\e954";
+}
+
+.tn-icon-first:before {
+ content: "\e950";
+}
+
+.tn-icon-third:before {
+ content: "\e951";
+}
+
+.tn-icon-second:before {
+ content: "\e952";
+}
+
+.tn-icon-ninja:before {
+ content: "\e94b";
+}
+
+.tn-icon-program:before {
+ content: "\e94c";
+}
+
+.tn-icon-program-fill:before {
+ content: "\e94d";
+}
+
+.tn-icon-circle-more:before {
+ content: "\e94e";
+}
+
+.tn-icon-windmill:before {
+ content: "\e94f";
+}
+
+.tn-icon-alien:before {
+ content: "\e946";
+}
+
+.tn-icon-taichi:before {
+ content: "\e947";
+}
+
+.tn-icon-knot:before {
+ content: "\e948";
+}
+
+.tn-icon-whale:before {
+ content: "\e94a";
+}
+
+.tn-icon-dragon:before {
+ content: "\e944";
+}
+
+.tn-icon-home-in-fill:before {
+ content: "\e942";
+}
+
+.tn-icon-home-in:before {
+ content: "\e943";
+}
+
+.tn-icon-home-loading:before {
+ content: "\e940";
+}
+
+.tn-icon-home-loading-fill:before {
+ content: "\e941";
+}
+
+.tn-icon-cell:before {
+ content: "\e93b";
+}
+
+.tn-icon-loading:before {
+ content: "\e93c";
+}
+
+.tn-icon-orange:before {
+ content: "\e93d";
+}
+
+.tn-icon-bigbug:before {
+ content: "\e93e";
+}
+
+.tn-icon-dinosaur:before {
+ content: "\e93f";
+}
+
+.tn-icon-dna:before {
+ content: "\e931";
+}
+
+.tn-icon-chain:before {
+ content: "\e932";
+}
+
+.tn-icon-email:before {
+ content: "\e933";
+}
+
+.tn-icon-education:before {
+ content: "\e934";
+}
+
+.tn-icon-english:before {
+ content: "\e935";
+}
+
+.tn-icon-seal:before {
+ content: "\e937";
+}
+
+.tn-icon-book:before {
+ content: "\e939";
+}
+
+.tn-icon-email-fill:before {
+ content: "\e93a";
+}
+
+.tn-icon-maths:before {
+ content: "\e92f";
+}
+
+.tn-icon-molecule:before {
+ content: "\e930";
+}
+
+.tn-icon-ghost:before {
+ content: "\e92d";
+}
+
+.tn-icon-money-fill:before {
+ content: "\e92e";
+}
+
+.tn-icon-menu-alone:before {
+ content: "\e929";
+}
+
+.tn-icon-menu-alone-fill:before {
+ content: "\e92a";
+}
+
+.tn-icon-tree:before {
+ content: "\e92b";
+}
+
+.tn-icon-rabbit:before {
+ content: "\e92c";
+}
+
+.tn-icon-block-fill:before {
+ content: "\e925";
+}
+
+.tn-icon-block:before {
+ content: "\e926";
+}
+
+.tn-icon-menu-classify:before {
+ content: "\e927";
+}
+
+.tn-icon-menu-classify-fill:before {
+ content: "\e928";
+}
+
+.tn-icon-home-totop-fill:before {
+ content: "\e923";
+}
+
+.tn-icon-home-totop:before {
+ content: "\e924";
+}
+
+.tn-icon-petal:before {
+ content: "\e920";
+}
+
+.tn-icon-clover-fill:before {
+ content: "\e921";
+}
+
+.tn-icon-clover:before {
+ content: "\e922";
+}
+
+.tn-icon-heartbeat:before {
+ content: "\e917";
+}
+
+.tn-icon-paperbag:before {
+ content: "\e918";
+}
+
+.tn-icon-paperbag-fill:before {
+ content: "\e919";
+}
+
+.tn-icon-menu-match:before {
+ content: "\e91a";
+}
+
+.tn-icon-menu-match-fill:before {
+ content: "\e91b";
+}
+
+.tn-icon-sofa-fill:before {
+ content: "\e91c";
+}
+
+.tn-icon-fullscreen:before {
+ content: "\e91d";
+}
+
+.tn-icon-narrow:before {
+ content: "\e91e";
+}
+
+.tn-icon-smallscreen:before {
+ content: "\e91f";
+}
+
+.tn-icon-payment-wechat:before {
+ content: "\e90a";
+}
+
+.tn-icon-cursor:before {
+ content: "\e912";
+}
+
+.tn-icon-cursor-fill:before {
+ content: "\e913";
+}
+
+.tn-icon-check:before {
+ content: "\e914";
+}
+
+.tn-icon-payment-alipay:before {
+ content: "\e915";
+}
+
+.tn-icon-dashboard:before {
+ content: "\e90b";
+}
+
+.tn-icon-module:before {
+ content: "\e90c";
+}
+
+.tn-icon-at-sign:before {
+ content: "\e90d";
+}
+
+.tn-icon-copyright:before {
+ content: "\e90e";
+}
+
+.tn-icon-pin:before {
+ content: "\e90f";
+}
+
+.tn-icon-module-fill:before {
+ content: "\e910";
+}
+
+.tn-icon-dashboard-fill:before {
+ content: "\e911";
+}
+
+.tn-icon-birthday:before {
+ content: "\e905";
+}
+
+.tn-icon-sofa:before {
+ content: "\e906";
+}
+
+.tn-icon-iot:before {
+ content: "\e907";
+}
+
+.tn-icon-monitor:before {
+ content: "\e908";
+}
+
+.tn-icon-iot-fill:before {
+ content: "\e909";
+}
+
+.tn-icon-tabs-smile:before {
+ content: "\e900";
+}
+
+.tn-icon-huawei:before {
+ content: "\e901";
+}
+
+.tn-icon-iphone:before {
+ content: "\e902";
+}
+
+.tn-icon-tiktok:before {
+ content: "\e903";
+}
+
+.tn-icon-sword-fill:before {
+ content: "\e8fa";
+}
+
+.tn-icon-job-fill:before {
+ content: "\e8fb";
+}
+
+.tn-icon-rocket-fill:before {
+ content: "\e8fc";
+}
+
+.tn-icon-totop:before {
+ content: "\e8fd";
+}
+
+.tn-icon-totop-fill:before {
+ content: "\e8fe";
+}
+
+.tn-icon-logout:before {
+ content: "\e8f8";
+}
+
+.tn-icon-login:before {
+ content: "\e8f9";
+}
+
+.tn-icon-expand:before {
+ content: "\e8f7";
+}
+
+.tn-icon-bug:before {
+ content: "\e8e3";
+}
+
+.tn-icon-bug-fill:before {
+ content: "\e8e4";
+}
+
+.tn-icon-company-fill:before {
+ content: "\e8e5";
+}
+
+.tn-icon-edit-write-fill:before {
+ content: "\e8e6";
+}
+
+.tn-icon-menu-circle-fill:before {
+ content: "\e8e7";
+}
+
+.tn-icon-level-fill:before {
+ content: "\e8e8";
+}
+
+.tn-icon-menu-fill:before {
+ content: "\e8e9";
+}
+
+.tn-icon-science-fill:before {
+ content: "\e8ea";
+}
+
+.tn-icon-deploy-fill:before {
+ content: "\e8eb";
+}
+
+.tn-icon-menu-more-fill:before {
+ content: "\e8ec";
+}
+
+.tn-icon-search-menu-fill:before {
+ content: "\e8ed";
+}
+
+.tn-icon-organizatio-fill:before {
+ content: "\e8ee";
+}
+
+.tn-icon-platform-fill:before {
+ content: "\e8ef";
+}
+
+.tn-icon-platform:before {
+ content: "\e8f0";
+}
+
+.tn-icon-search-list-fill:before {
+ content: "\e8f1";
+}
+
+.tn-icon-menu-sort-fill:before {
+ content: "\e8f2";
+}
+
+.tn-icon-cube-fill:before {
+ content: "\e8f3";
+}
+
+.tn-icon-menu-sorts-fill:before {
+ content: "\e8f4";
+}
+
+.tn-icon-server-fill:before {
+ content: "\e8f5";
+}
+
+.tn-icon-menu-list-fill:before {
+ content: "\e8f6";
+}
+
+.tn-icon-errands:before {
+ content: "\e8df";
+}
+
+.tn-icon-errands-fill:before {
+ content: "\e8e0";
+}
+
+.tn-icon-delivery-fill:before {
+ content: "\e8e1";
+}
+
+.tn-icon-delivery:before {
+ content: "\e8e2";
+}
+
+.tn-icon-vip-text:before {
+ content: "\e8dc";
+}
+
+.tn-icon-panda:before {
+ content: "\e8dd";
+}
+
+.tn-icon-logo-shangpu:before {
+ content: "\e8de";
+}
+
+.tn-icon-mouse:before {
+ content: "\e8db";
+}
+
+.tn-icon-notebook-fill:before {
+ content: "\e8da";
+}
+
+.tn-icon-headset:before {
+ content: "\e8d8";
+}
+
+.tn-icon-shears:before {
+ content: "\e8d9";
+}
+
+.tn-icon-notebook:before {
+ content: "\e8d7";
+}
+
+.tn-icon-battery-empty:before {
+ content: "\e8d1";
+}
+
+.tn-icon-battery-low:before {
+ content: "\e8d2";
+}
+
+.tn-icon-battery-mid:before {
+ content: "\e8d3";
+}
+
+.tn-icon-battery-high:before {
+ content: "\e8d4";
+}
+
+.tn-icon-battery-full:before {
+ content: "\e8d5";
+}
+
+.tn-icon-bluetooth:before {
+ content: "\e8d6";
+}
+
+.tn-icon-science:before {
+ content: "\e8cf";
+}
+
+.tn-icon-clip:before {
+ content: "\e8d0";
+}
+
+.tn-icon-con-aquarius:before {
+ content: "\e8c2";
+}
+
+.tn-icon-con-pisces:before {
+ content: "\e8c3";
+}
+
+.tn-icon-con-aries:before {
+ content: "\e8c4";
+}
+
+.tn-icon-con-taurus:before {
+ content: "\e8c5";
+}
+
+.tn-icon-con-gemini:before {
+ content: "\e8c6";
+}
+
+.tn-icon-con-cancer:before {
+ content: "\e8c7";
+}
+
+.tn-icon-con-leo:before {
+ content: "\e8c8";
+}
+
+.tn-icon-con-virgo:before {
+ content: "\e8c9";
+}
+
+.tn-icon-con-libra:before {
+ content: "\e8ca";
+}
+
+.tn-icon-con-scorpio:before {
+ content: "\e8cb";
+}
+
+.tn-icon-con-sagittarius:before {
+ content: "\e8cc";
+}
+
+.tn-icon-con-apricorn:before {
+ content: "\e8cd";
+}
+
+.tn-icon-constellation:before {
+ content: "\e8ce";
+}
+
+.tn-icon-wea-cloud-more:before {
+ content: "\e8b9";
+}
+
+.tn-icon-wea-cloud:before {
+ content: "\e8ba";
+}
+
+.tn-icon-wea-cloud-sun:before {
+ content: "\e8bb";
+}
+
+.tn-icon-wea-rain:before {
+ content: "\e8bc";
+}
+
+.tn-icon-wea-rain-middle:before {
+ content: "\e8bd";
+}
+
+.tn-icon-wea-rain-heavy:before {
+ content: "\e8be";
+}
+
+.tn-icon-wea-snow:before {
+ content: "\e8bf";
+}
+
+.tn-icon-wea-wind:before {
+ content: "\e8c0";
+}
+
+.tn-icon-wea-sun:before {
+ content: "\e8c1";
+}
+
+.tn-icon-empty-data:before {
+ content: "\e8ab";
+}
+
+.tn-icon-empty-message:before {
+ content: "\e8ac";
+}
+
+.tn-icon-empty-cart:before {
+ content: "\e8ad";
+}
+
+.tn-icon-empty-history:before {
+ content: "\e8ae";
+}
+
+.tn-icon-empty-favor:before {
+ content: "\e8af";
+}
+
+.tn-icon-empty-list:before {
+ content: "\e8b0";
+}
+
+.tn-icon-empty-network:before {
+ content: "\e8b1";
+}
+
+.tn-icon-empty-search:before {
+ content: "\e8b2";
+}
+
+.tn-icon-empty-order:before {
+ content: "\e8b3";
+}
+
+.tn-icon-empty-comment:before {
+ content: "\e8b4";
+}
+
+.tn-icon-empty-coupon:before {
+ content: "\e8b5";
+}
+
+.tn-icon-empty-address:before {
+ content: "\e8b6";
+}
+
+.tn-icon-empty-permission:before {
+ content: "\e8b7";
+}
+
+.tn-icon-empty-page:before {
+ content: "\e8b8";
+}
+
+.tn-icon-job:before {
+ content: "\e8aa";
+}
+
+.tn-icon-rocket:before {
+ content: "\e8a5";
+}
+
+.tn-icon-sword:before {
+ content: "\e8a6";
+}
+
+.tn-icon-notice-no:before {
+ content: "\e8a7";
+}
+
+.tn-icon-notice-fill:before {
+ content: "\e8a8";
+}
+
+.tn-icon-notice:before {
+ content: "\e8a9";
+}
+
+.tn-icon-font:before {
+ content: "\e8a4";
+}
+
+.tn-icon-chemistry:before {
+ content: "\e8a3";
+}
+
+.tn-icon-biology:before {
+ content: "\e8a2";
+}
+
+.tn-icon-level:before {
+ content: "\e8a0";
+}
+
+.tn-icon-deploy:before {
+ content: "\e8a1";
+}
+
+.tn-icon-server:before {
+ content: "\e89f";
+}
+
+.tn-icon-cube:before {
+ content: "\e89e";
+}
+
+.tn-icon-organizatio:before {
+ content: "\e89d";
+}
+
+.tn-icon-company:before {
+ content: "\e89c";
+}
+
+.tn-icon-pharmacy:before {
+ content: "\e89b";
+}
+
+.tn-icon-medical:before {
+ content: "\e89a";
+}
+
+.tn-icon-my-add:before {
+ content: "\e898";
+}
+
+.tn-icon-my:before {
+ content: "\e897";
+}
+
+.tn-icon-my-fill:before {
+ content: "\e896";
+}
+
+.tn-icon-trust:before {
+ content: "\e895";
+}
+
+.tn-icon-trust-fill:before {
+ content: "\e894";
+}
+
+.tn-icon-moon:before {
+ content: "\e893";
+}
+
+.tn-icon-moon-fill:before {
+ content: "\e892";
+}
+
+.tn-icon-funds:before {
+ content: "\e891";
+}
+
+.tn-icon-funds-fill:before {
+ content: "\e890";
+}
+
+.tn-icon-signpost:before {
+ content: "\e88f";
+}
+
+.tn-icon-signpost-fill:before {
+ content: "\e88e";
+}
+
+.tn-icon-vip:before {
+ content: "\e88d";
+}
+
+.tn-icon-vip-fill:before {
+ content: "\e88c";
+}
+
+.tn-icon-hardware:before {
+ content: "\e88b";
+}
+
+.tn-icon-hardware-fill:before {
+ content: "\e88a";
+}
+
+.tn-icon-honor:before {
+ content: "\e889";
+}
+
+.tn-icon-honor-fill:before {
+ content: "\e888";
+}
+
+.tn-icon-count:before {
+ content: "\e887";
+}
+
+.tn-icon-count-fill:before {
+ content: "\e886";
+}
+
+.tn-icon-discover-planet:before {
+ content: "\e885";
+}
+
+.tn-icon-discover-planet-fill:before {
+ content: "\e884";
+}
+
+.tn-icon-discover:before {
+ content: "\e883";
+}
+
+.tn-icon-discover-fill:before {
+ content: "\e882";
+}
+
+.tn-icon-home:before {
+ content: "\e881";
+}
+
+.tn-icon-home-fill:before {
+ content: "\e880";
+}
+
+.tn-icon-home-vertical:before {
+ content: "\e87f";
+}
+
+.tn-icon-home-vertical-fill:before {
+ content: "\e87e";
+}
+
+.tn-icon-home-smile:before {
+ content: "\e87d";
+}
+
+.tn-icon-home-smile-fill:before {
+ content: "\e87c";
+}
+
+.tn-icon-home-capsule:before {
+ content: "\e87b";
+}
+
+.tn-icon-home-capsule-fill:before {
+ content: "\e87a";
+}
+
+.tn-icon-focus:before {
+ content: "\e878";
+}
+
+.tn-icon-all:before {
+ content: "\e877";
+}
+
+.tn-icon-assort-fill:before {
+ content: "\e876";
+}
+
+.tn-icon-assort:before {
+ content: "\e875";
+}
+
+.tn-icon-menu-list:before {
+ content: "\e874";
+}
+
+.tn-icon-menu-sorts:before {
+ content: "\e873";
+}
+
+.tn-icon-menu-sort:before {
+ content: "\e872";
+}
+
+.tn-icon-menu-more:before {
+ content: "\e871";
+}
+
+.tn-icon-menu:before {
+ content: "\e870";
+}
+
+.tn-icon-menu-circle:before {
+ content: "\e86f";
+}
+
+.tn-icon-search-menu:before {
+ content: "\e86e";
+}
+
+.tn-icon-search-list:before {
+ content: "\e86d";
+}
+
+.tn-icon-search:before {
+ content: "\e86c";
+}
+
+.tn-icon-link:before {
+ content: "\e86b";
+}
+
+.tn-icon-code:before {
+ content: "\e869";
+}
+
+.tn-icon-computer:before {
+ content: "\e868";
+}
+
+.tn-icon-computer-fill:before {
+ content: "\e867";
+}
+
+.tn-icon-ipad:before {
+ content: "\e866";
+}
+
+.tn-icon-ipad-fill:before {
+ content: "\e865";
+}
+
+.tn-icon-phone:before {
+ content: "\e864";
+}
+
+.tn-icon-phone-fill:before {
+ content: "\e863";
+}
+
+.tn-icon-tel:before {
+ content: "\e862";
+}
+
+.tn-icon-tel-circle-fill:before {
+ content: "\e860";
+}
+
+.tn-icon-tel-circle:before {
+ content: "\e861";
+}
+
+.tn-icon-watercup:before {
+ content: "\e85f";
+}
+
+.tn-icon-gloves-fill:before {
+ content: "\e85d";
+}
+
+.tn-icon-gloves:before {
+ content: "\e85e";
+}
+
+.tn-icon-covid-19:before {
+ content: "\e85c";
+}
+
+.tn-icon-sport-jog:before {
+ content: "\e858";
+}
+
+.tn-icon-sport-run:before {
+ content: "\e859";
+}
+
+.tn-icon-sport-swim:before {
+ content: "\e85a";
+}
+
+.tn-icon-sport-cycle:before {
+ content: "\e85b";
+}
+
+.tn-icon-airplane:before {
+ content: "\e857";
+}
+
+.tn-icon-train:before {
+ content: "\e855";
+}
+
+.tn-icon-steamship:before {
+ content: "\e856";
+}
+
+.tn-icon-bus:before {
+ content: "\e854";
+}
+
+.tn-icon-balancecar:before {
+ content: "\e853";
+}
+
+.tn-icon-electromobile:before {
+ content: "\e852";
+}
+
+.tn-icon-zodiac-zhu:before {
+ content: "\e851";
+}
+
+.tn-icon-zodiac-gou:before {
+ content: "\e850";
+}
+
+.tn-icon-zodiac-ji:before {
+ content: "\e84f";
+}
+
+.tn-icon-zodiac-hou:before {
+ content: "\e84e";
+}
+
+.tn-icon-zodiac-yang:before {
+ content: "\e84d";
+}
+
+.tn-icon-zodiac-ma:before {
+ content: "\e84c";
+}
+
+.tn-icon-zodiac-she:before {
+ content: "\e84b";
+}
+
+.tn-icon-zodiac-long:before {
+ content: "\e84a";
+}
+
+.tn-icon-zodiac-tu:before {
+ content: "\e849";
+}
+
+.tn-icon-zodiac-hu:before {
+ content: "\e848";
+}
+
+.tn-icon-zodiac-niu:before {
+ content: "\e847";
+}
+
+.tn-icon-zodiac-shu:before {
+ content: "\e846";
+}
+
+.tn-icon-lucky-money:before {
+ content: "\e844";
+}
+
+.tn-icon-lucky-money-fill:before {
+ content: "\e845";
+}
+
+.tn-icon-prize:before {
+ content: "\e842";
+}
+
+.tn-icon-gift:before {
+ content: "\e843";
+}
+
+.tn-icon-pay:before {
+ content: "\e841";
+}
+
+.tn-icon-refund:before {
+ content: "\e840";
+}
+
+.tn-icon-money:before {
+ content: "\e83f";
+}
+
+.tn-icon-power:before {
+ content: "\e83e";
+}
+
+.tn-icon-fingerprint:before {
+ content: "\e83d";
+}
+
+.tn-icon-qr-beibei:before {
+ content: "\e83c";
+}
+
+.tn-icon-qr-code:before {
+ content: "\e83b";
+}
+
+.tn-icon-qr-barcode:before {
+ content: "\e83a";
+}
+
+.tn-icon-scan:before {
+ content: "\e839";
+}
+
+.tn-icon-revoke:before {
+ content: "\e837";
+}
+
+.tn-icon-filter:before {
+ content: "\e838";
+}
+
+.tn-icon-upload:before {
+ content: "\e835";
+}
+
+.tn-icon-download:before {
+ content: "\e836";
+}
+
+.tn-icon-fork:before {
+ content: "\e832";
+}
+
+.tn-icon-relation:before {
+ content: "\e833";
+}
+
+.tn-icon-master:before {
+ content: "\e834";
+}
+
+.tn-icon-facebook:before {
+ content: "\e82e";
+}
+
+.tn-icon-google:before {
+ content: "\e82f";
+}
+
+.tn-icon-linkedin:before {
+ content: "\e830";
+}
+
+.tn-icon-twitter:before {
+ content: "\e831";
+}
+
+.tn-icon-logo-tuniao:before {
+ content: "\e82d";
+}
+
+.tn-icon-sina:before {
+ content: "\e82b";
+}
+
+.tn-icon-taobao:before {
+ content: "\e82c";
+}
+
+.tn-icon-gitee:before {
+ content: "\e82a";
+}
+
+.tn-icon-github:before {
+ content: "\e829";
+}
+
+.tn-icon-dingtalk:before {
+ content: "\e828";
+}
+
+.tn-icon-alipay:before {
+ content: "\e827";
+}
+
+.tn-icon-qq:before {
+ content: "\e826";
+}
+
+.tn-icon-moments:before {
+ content: "\e825";
+}
+
+.tn-icon-wechat:before {
+ content: "\e824";
+}
+
+.tn-icon-wechat-fill:before {
+ content: "\e823";
+}
+
+.tn-icon-service:before {
+ content: "\e821";
+}
+
+.tn-icon-service-fill:before {
+ content: "\e822";
+}
+
+.tn-icon-team:before {
+ content: "\e81f";
+}
+
+.tn-icon-team-fill:before {
+ content: "\e820";
+}
+
+.tn-icon-emoji-sad:before {
+ content: "\e81e";
+}
+
+.tn-icon-emoji-sad-fill:before {
+ content: "\e81d";
+}
+
+.tn-icon-emoji-general:before {
+ content: "\e81b";
+}
+
+.tn-icon-emoji-general-fill:before {
+ content: "\e818";
+}
+
+.tn-icon-emoji-good:before {
+ content: "\e817";
+}
+
+.tn-icon-emoji-good-fill:before {
+ content: "\e816";
+}
+
+.tn-icon-clock:before {
+ content: "\e812";
+}
+
+.tn-icon-clock-fill:before {
+ content: "\e813";
+}
+
+.tn-icon-time-fill:before {
+ content: "\e7d9";
+}
+
+.tn-icon-time:before {
+ content: "\e7dc";
+}
+
+.tn-icon-delete:before {
+ content: "\e7d6";
+}
+
+.tn-icon-delete-fill:before {
+ content: "\e7d7";
+}
+
+.tn-icon-clear:before {
+ content: "\e7d5";
+}
+
+.tn-icon-set:before {
+ content: "\e7d1";
+}
+
+.tn-icon-set-fill:before {
+ content: "\e7d2";
+}
+
+.tn-icon-keyboard-circle:before {
+ content: "\e810";
+}
+
+.tn-icon-keyboard:before {
+ content: "\e811";
+}
+
+.tn-icon-wifi-no:before {
+ content: "\e81c";
+}
+
+.tn-icon-wifi:before {
+ content: "\e7d0";
+}
+
+.tn-icon-creative-stop:before {
+ content: "\e819";
+}
+
+.tn-icon-creative-stop-fill:before {
+ content: "\e81a";
+}
+
+.tn-icon-creative-fill:before {
+ content: "\e80e";
+}
+
+.tn-icon-creative:before {
+ content: "\e80f";
+}
+
+.tn-icon-trophy-fill:before {
+ content: "\e80a";
+}
+
+.tn-icon-trophy:before {
+ content: "\e80b";
+}
+
+.tn-icon-game-fill:before {
+ content: "\e808";
+}
+
+.tn-icon-game:before {
+ content: "\e809";
+}
+
+.tn-icon-tag-fill:before {
+ content: "\e806";
+}
+
+.tn-icon-tag:before {
+ content: "\e807";
+}
+
+.tn-icon-logistics:before {
+ content: "\e7cf";
+}
+
+.tn-icon-taxi-fill:before {
+ content: "\e800";
+}
+
+.tn-icon-taxi:before {
+ content: "\e805";
+}
+
+.tn-icon-flag:before {
+ content: "\e7f5";
+}
+
+.tn-icon-flag-fill:before {
+ content: "\e7ff";
+}
+
+.tn-icon-baby:before {
+ content: "\e7f1";
+}
+
+.tn-icon-baby-fill:before {
+ content: "\e7f4";
+}
+
+.tn-icon-shop:before {
+ content: "\e7cd";
+}
+
+.tn-icon-shop-fill:before {
+ content: "\e7ce";
+}
+
+.tn-icon-coupon-fill:before {
+ content: "\e7c8";
+}
+
+.tn-icon-coupon:before {
+ content: "\e7c9";
+}
+
+.tn-icon-shopbag-fill:before {
+ content: "\e7c6";
+}
+
+.tn-icon-shopbag:before {
+ content: "\e7c7";
+}
+
+.tn-icon-basket-fill:before {
+ content: "\e7c4";
+}
+
+.tn-icon-basket:before {
+ content: "\e7c5";
+}
+
+.tn-icon-cart-fill:before {
+ content: "\e7c2";
+}
+
+.tn-icon-cart:before {
+ content: "\e7c3";
+}
+
+.tn-icon-ticket:before {
+ content: "\e7f8";
+}
+
+.tn-icon-ticket-fill:before {
+ content: "\e7fe";
+}
+
+.tn-icon-receipt:before {
+ content: "\e7f6";
+}
+
+.tn-icon-receipt-fill:before {
+ content: "\e7f7";
+}
+
+.tn-icon-cardbag:before {
+ content: "\e7fa";
+}
+
+.tn-icon-cardbag-fill:before {
+ content: "\e7fd";
+}
+
+.tn-icon-bankcard-fill:before {
+ content: "\e7d3";
+}
+
+.tn-icon-bankcard:before {
+ content: "\e7d4";
+}
+
+.tn-icon-identity:before {
+ content: "\e7cb";
+}
+
+.tn-icon-identity-fill:before {
+ content: "\e7cc";
+}
+
+.tn-icon-calendar:before {
+ content: "\e7c0";
+}
+
+.tn-icon-calendar-fill:before {
+ content: "\e7c1";
+}
+
+.tn-icon-order:before {
+ content: "\e7be";
+}
+
+.tn-icon-order-fill:before {
+ content: "\e7bf";
+}
+
+.tn-icon-image:before {
+ content: "\e7bc";
+}
+
+.tn-icon-image-fill:before {
+ content: "\e7bd";
+}
+
+.tn-icon-image-text:before {
+ content: "\e7bb";
+}
+
+.tn-icon-image-text-fill:before {
+ content: "\e7ba";
+}
+
+.tn-icon-data:before {
+ content: "\e7b9";
+}
+
+.tn-icon-data-fill:before {
+ content: "\e7b8";
+}
+
+.tn-icon-statistics:before {
+ content: "\e7b7";
+}
+
+.tn-icon-statistics-fill:before {
+ content: "\e7b6";
+}
+
+.tn-icon-trusty-fill:before {
+ content: "\e801";
+}
+
+.tn-icon-trusty:before {
+ content: "\e802";
+}
+
+.tn-icon-safe-fill:before {
+ content: "\e803";
+}
+
+.tn-icon-safe:before {
+ content: "\e804";
+}
+
+.tn-icon-edit:before {
+ content: "\e7b5";
+}
+
+.tn-icon-edit-form:before {
+ content: "\e7b4";
+}
+
+.tn-icon-edit-write:before {
+ content: "\e7b3";
+}
+
+.tn-icon-write-fill:before {
+ content: "\e7b1";
+}
+
+.tn-icon-write:before {
+ content: "\e7b2";
+}
+
+.tn-icon-eye-hide:before {
+ content: "\e7af";
+}
+
+.tn-icon-eye-close:before {
+ content: "\e7b0";
+}
+
+.tn-icon-eye:before {
+ content: "\e7ad";
+}
+
+.tn-icon-eye-fill:before {
+ content: "\e7ae";
+}
+
+.tn-icon-unlock:before {
+ content: "\e7da";
+}
+
+.tn-icon-lock:before {
+ content: "\e7db";
+}
+
+.tn-icon-sex:before {
+ content: "\e7ac";
+}
+
+.tn-icon-sex-female:before {
+ content: "\e7ab";
+}
+
+.tn-icon-sex-male:before {
+ content: "\e7aa";
+}
+
+.tn-icon-circle-lack:before {
+ content: "\e7a8";
+}
+
+.tn-icon-circle-arrow:before {
+ content: "\e7a9";
+}
+
+.tn-icon-circle-fill:before {
+ content: "\e7a4";
+}
+
+.tn-icon-circle:before {
+ content: "\e7a3";
+}
+
+.tn-icon-copy-fill:before {
+ content: "\e7a1";
+}
+
+.tn-icon-copy:before {
+ content: "\e7a2";
+}
+
+.tn-icon-square:before {
+ content: "\e7a0";
+}
+
+.tn-icon-group-double:before {
+ content: "\e79e";
+}
+
+.tn-icon-group-square:before {
+ content: "\e79f";
+}
+
+.tn-icon-group-triangle:before {
+ content: "\e795";
+}
+
+.tn-icon-group-circle:before {
+ content: "\e796";
+}
+
+.tn-icon-group-null:before {
+ content: "\e797";
+}
+
+.tn-icon-share-triangle:before {
+ content: "\e792";
+}
+
+.tn-icon-share-square:before {
+ content: "\e790";
+}
+
+.tn-icon-share-circle:before {
+ content: "\e791";
+}
+
+.tn-icon-share:before {
+ content: "\e78f";
+}
+
+.tn-icon-send-fill:before {
+ content: "\e793";
+}
+
+.tn-icon-send:before {
+ content: "\e794";
+}
+
+.tn-icon-light-fill:before {
+ content: "\e78d";
+}
+
+.tn-icon-light:before {
+ content: "\e78e";
+}
+
+.tn-icon-praise-fill:before {
+ content: "\e7eb";
+}
+
+.tn-icon-praise:before {
+ content: "\e7f0";
+}
+
+.tn-icon-star-fill:before {
+ content: "\e78b";
+}
+
+.tn-icon-star:before {
+ content: "\e78c";
+}
+
+.tn-icon-caring:before {
+ content: "\e789";
+}
+
+.tn-icon-caring-fill:before {
+ content: "\e78a";
+}
+
+.tn-icon-fire:before {
+ content: "\e787";
+}
+
+.tn-icon-fire-fill:before {
+ content: "\e788";
+}
+
+.tn-icon-topic:before {
+ content: "\e786";
+}
+
+.tn-icon-topics:before {
+ content: "\e784";
+}
+
+.tn-icon-topics-fill:before {
+ content: "\e785";
+}
+
+.tn-icon-like-break:before {
+ content: "\e782";
+}
+
+.tn-icon-like-lack:before {
+ content: "\e783";
+}
+
+.tn-icon-like:before {
+ content: "\e781";
+}
+
+.tn-icon-like-fill:before {
+ content: "\e780";
+}
+
+.tn-icon-reply:before {
+ content: "\e7a6";
+}
+
+.tn-icon-reply-fill:before {
+ content: "\e7a7";
+}
+
+.tn-icon-comment-fill:before {
+ content: "\e79c";
+}
+
+.tn-icon-comment:before {
+ content: "\e79d";
+}
+
+.tn-icon-message-fill:before {
+ content: "\e798";
+}
+
+.tn-icon-message:before {
+ content: "\e799";
+}
+
+.tn-icon-flower-fill:before {
+ content: "\e77e";
+}
+
+.tn-icon-flower:before {
+ content: "\e77f";
+}
+
+.tn-icon-location-fill:before {
+ content: "\e77c";
+}
+
+.tn-icon-location:before {
+ content: "\e77d";
+}
+
+.tn-icon-map-fill:before {
+ content: "\e77a";
+}
+
+.tn-icon-map:before {
+ content: "\e77b";
+}
+
+.tn-icon-camera:before {
+ content: "\e774";
+}
+
+.tn-icon-camera-fill:before {
+ content: "\e775";
+}
+
+.tn-icon-live-stream:before {
+ content: "\e7fb";
+}
+
+.tn-icon-live-stream-fill:before {
+ content: "\e7fc";
+}
+
+.tn-icon-sing:before {
+ content: "\e7f9";
+}
+
+.tn-icon-music-fill:before {
+ content: "\e7ec";
+}
+
+.tn-icon-music-stop:before {
+ content: "\e7ed";
+}
+
+.tn-icon-video-fill:before {
+ content: "\e7e9";
+}
+
+.tn-icon-video:before {
+ content: "\e7ea";
+}
+
+.tn-icon-voice-fill:before {
+ content: "\e7e7";
+}
+
+.tn-icon-voice:before {
+ content: "\e7e8";
+}
+
+.tn-icon-previous-fill:before {
+ content: "\e7f2";
+}
+
+.tn-icon-next-fill:before {
+ content: "\e7f3";
+}
+
+.tn-icon-play-fill:before {
+ content: "\e7ee";
+}
+
+.tn-icon-stop:before {
+ content: "\e7ef";
+}
+
+.tn-icon-backspace:before {
+ content: "\e814";
+}
+
+.tn-icon-backspace-fill:before {
+ content: "\e815";
+}
+
+.tn-icon-sound-close-fill:before {
+ content: "\e778";
+}
+
+.tn-icon-sound-close:before {
+ content: "\e779";
+}
+
+.tn-icon-sound-fill:before {
+ content: "\e776";
+}
+
+.tn-icon-sound:before {
+ content: "\e777";
+}
+
+.tn-icon-sound-reduce-fill:before {
+ content: "\e7e5";
+}
+
+.tn-icon-sound-reduce:before {
+ content: "\e7e6";
+}
+
+.tn-icon-sound-add:before {
+ content: "\e80c";
+}
+
+.tn-icon-sound-add-fill:before {
+ content: "\e80d";
+}
+
+.tn-icon-sequence-vertical:before {
+ content: "\e79a";
+}
+
+.tn-icon-sequence:before {
+ content: "\e79b";
+}
+
+.tn-icon-align-center:before {
+ content: "\e7e1";
+}
+
+.tn-icon-align-right:before {
+ content: "\e7e2";
+}
+
+.tn-icon-align-left:before {
+ content: "\e7e3";
+}
+
+.tn-icon-align:before {
+ content: "\e7e4";
+}
+
+.tn-icon-title:before {
+ content: "\e772";
+}
+
+.tn-icon-sort:before {
+ content: "\e773";
+}
+
+.tn-icon-more-vertical:before {
+ content: "\e770";
+}
+
+.tn-icon-more-horizontal:before {
+ content: "\e771";
+}
+
+.tn-icon-more-circle:before {
+ content: "\e76e";
+}
+
+.tn-icon-more-circle-fill:before {
+ content: "\e76f";
+}
+
+.tn-icon-warning:before {
+ content: "\e76c";
+}
+
+.tn-icon-warning-fill:before {
+ content: "\e76d";
+}
+
+.tn-icon-zoom-out:before {
+ content: "\e76a";
+}
+
+.tn-icon-zoom-out-fill:before {
+ content: "\e76b";
+}
+
+.tn-icon-zoom-in-fill:before {
+ content: "\e768";
+}
+
+.tn-icon-zoom-in:before {
+ content: "\e769";
+}
+
+.tn-icon-success-square:before {
+ content: "\e763";
+}
+
+.tn-icon-success-circle-fill:before {
+ content: "\e764";
+}
+
+.tn-icon-success-circle:before {
+ content: "\e765";
+}
+
+.tn-icon-success-square-fill:before {
+ content: "\e766";
+}
+
+.tn-icon-success:before {
+ content: "\e767";
+}
+
+.tn-icon-close-fill:before {
+ content: "\e760";
+}
+
+.tn-icon-close:before {
+ content: "\e761";
+}
+
+.tn-icon-close-circle:before {
+ content: "\e762";
+}
+
+.tn-icon-help:before {
+ content: "\e75e";
+}
+
+.tn-icon-help-fill:before {
+ content: "\e75f";
+}
+
+.tn-icon-tip-fill:before {
+ content: "\e75d";
+}
+
+.tn-icon-left:before {
+ content: "\e7e0";
+}
+
+.tn-icon-left-triangle:before {
+ content: "\e757";
+}
+
+.tn-icon-left-fill:before {
+ content: "\e758";
+}
+
+.tn-icon-left-double:before {
+ content: "\e759";
+}
+
+.tn-icon-left-circle:before {
+ content: "\e75a";
+}
+
+.tn-icon-left-arrow:before {
+ content: "\e75b";
+}
+
+.tn-icon-down:before {
+ content: "\e7df";
+}
+
+.tn-icon-down-arrow:before {
+ content: "\e752";
+}
+
+.tn-icon-down-circle:before {
+ content: "\e753";
+}
+
+.tn-icon-down-double:before {
+ content: "\e754";
+}
+
+.tn-icon-down-fill:before {
+ content: "\e755";
+}
+
+.tn-icon-down-triangle:before {
+ content: "\e756";
+}
+
+.tn-icon-right:before {
+ content: "\e7de";
+}
+
+.tn-icon-right-fill:before {
+ content: "\e74d";
+}
+
+.tn-icon-right-arrow:before {
+ content: "\e74e";
+}
+
+.tn-icon-right-double:before {
+ content: "\e74f";
+}
+
+.tn-icon-right-triangle:before {
+ content: "\e750";
+}
+
+.tn-icon-right-circle:before {
+ content: "\e751";
+}
+
+.tn-icon-up:before {
+ content: "\e7dd";
+}
+
+.tn-icon-up-arrow:before {
+ content: "\e748";
+}
+
+.tn-icon-up-circle:before {
+ content: "\e749";
+}
+
+.tn-icon-up-triangle:before {
+ content: "\e74a";
+}
+
+.tn-icon-up-double:before {
+ content: "\e74b";
+}
+
+.tn-icon-up-fill:before {
+ content: "\e74c";
+}
+
+.tn-icon-add-circle:before {
+ content: "\e740";
+}
+
+.tn-icon-add:before {
+ content: "\e741";
+}
+
+.tn-icon-add-fill:before {
+ content: "\e742";
+}
+
+.tn-icon-reduce:before {
+ content: "\e743";
+}
+
+.tn-icon-reduce-square-fill:before {
+ content: "\e744";
+}
+
+.tn-icon-reduce-square:before {
+ content: "\e745";
+}
+
+.tn-icon-reduce-circle:before {
+ content: "\e746";
+}
+
+.tn-icon-reduce-circle-fill:before {
+ content: "\e747";
+}
diff --git a/tuniao-ui/index.js b/tuniao-ui/index.js
new file mode 100644
index 0000000..140fc71
--- /dev/null
+++ b/tuniao-ui/index.js
@@ -0,0 +1,73 @@
+// 引入全局mixin
+import mixin from './libs/mixin/mixin.js'
+// 全局挂载引入http相关请求拦截插件
+import Request from './libs/luch-request'
+
+// 调试输出信息
+function wranning(str) {
+ // 开发环境进行信息输出,主要是一些报错信息
+ // 这个环境的来由是在程序编写时候,点击hx编辑器运行调试代码的时候,详见:
+ // https://uniapp.dcloud.io/frame?id=%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%92%8c%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83
+ if (process.env.NODE_ENV === 'development') {
+ console.warn(str)
+ }
+}
+
+// 更新自定义状态栏的信息
+import updateCustomBarInfo from './libs/function/updateCustomBarInfo.js'
+// 获取颜色工具
+import color from './libs/function/color.js'
+// 消息工具
+import message from './libs/function/message.js'
+// 获取唯一id
+import uuid from './libs/function/uuid.js'
+// 数组工具
+import array from './libs/function/array.js'
+
+// 规则检验
+import test from './libs/function/test.js'
+// 获取整个父组件
+import $parent from './libs/function/$parent.js'
+// 格式化字符串工具
+import string from './libs/function/string.js'
+// 格式化数值工具
+import number from './libs/function/number.js'
+// 深度复制
+import deepClone from './libs/function/deepClone.js'
+
+// z-index配置信息
+import zIndex from './libs/config/zIndex.js'
+// 主题颜色信息
+import colorInfo from './libs/config/color.js'
+
+const $tn = {
+ http: new Request(),
+ updateCustomBar: updateCustomBarInfo,
+ color,
+ message,
+ uuid,
+ array,
+ test,
+ $parent,
+ string,
+ number,
+ deepClone,
+ zIndex,
+ colorInfo,
+}
+
+// 挂载到uni对象上
+uni.$tn = $tn
+
+const install = Vue => {
+ // 全局混入
+ Vue.mixin(mixin)
+
+ // Filter格式化
+
+ Vue.prototype.$tn = $tn
+}
+
+export default {
+ install
+}
diff --git a/tuniao-ui/index.scss b/tuniao-ui/index.scss
new file mode 100644
index 0000000..b0493b3
--- /dev/null
+++ b/tuniao-ui/index.scss
@@ -0,0 +1,13 @@
+// 引入公共基础类
+@import './libs/css/main.scss';
+@import './libs/css/color.scss';
+
+// 小程序特有的样式
+/* #ifdef MP */
+@import "./libs/css/style.mp.scss";
+/* #endif */
+
+// H5特有的样式
+/* #ifdef H5 */
+@import "./libs/css/style.h5.scss";
+/* #endif */
\ No newline at end of file
diff --git a/tuniao-ui/libs/config/color.js b/tuniao-ui/libs/config/color.js
new file mode 100644
index 0000000..eb71bf2
--- /dev/null
+++ b/tuniao-ui/libs/config/color.js
@@ -0,0 +1,15 @@
+// TuniaoUI颜色值
+export default {
+ mainColor: '#01BEFF',
+ reverseMainColor: '#FFF00D',
+ femaleColor: '#FF71D2',
+ maleColor: '#82B2FF',
+ mainOrange: '#FBBD12',
+ bgColor: '#FFFFFF',
+ spaceColor: '#F8F7F8',
+ fontColor: '#080808',
+ fontSubColor: '#AAAAAA',
+ contentColor: '#838383',
+ fontHolderColor: '#E6E6E6',
+ maskBgColor: 'rgba(0, 0, 0, 0.4)',
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/config/zIndex.js b/tuniao-ui/libs/config/zIndex.js
new file mode 100644
index 0000000..e3ba9a3
--- /dev/null
+++ b/tuniao-ui/libs/config/zIndex.js
@@ -0,0 +1,17 @@
+// 各组件的z-index值
+export default {
+ landsacpe: 29100,
+ navbar: 29090,
+ toast: 20090,
+ goodsNav: 20089,
+ alert: 20085,
+ modal: 20080,
+ popup: 20075,
+ tips: 19080,
+ sticky: 19075,
+ indexListSticky: 19070,
+ fab: 19060,
+ mask: 9999,
+ tableTr: 1001,
+ tableTd: 1000
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/css/color.scss b/tuniao-ui/libs/css/color.scss
new file mode 100644
index 0000000..51f98eb
--- /dev/null
+++ b/tuniao-ui/libs/css/color.scss
@@ -0,0 +1,563 @@
+
+@mixin getColor($color: #FFFFFF, $light-color: #FFFFFF, $dark-color: #FFFFFF, $disabled-color: #FFFFFF) {
+ color: $color !important;
+ @if $color != #FFFFFF and $color != #000000 {
+ &--light {
+ color: $light-color !important;
+ }
+ &--dark {
+ color: $dark-color !important;
+ }
+ &--disabled {
+ color: $disabled-color !important;
+ }
+ }
+}
+
+@mixin getBorderColor($color: #FFFFFF, $light-color: #FFFFFF, $dark-color: #FFFFFF, $disabled-color: #FFFFFF) {
+ @if $color != #FFFFFF and $color != #000000 {
+ &--light {
+ border-color: $light-color !important;
+ }
+ &--dark {
+ border-color: $dark-color !important;
+ }
+ &--disabled {
+ border-color: $disabled-color !important;
+ }
+ }
+ border-color: $color !important;
+}
+
+@mixin getBackgroundColor($color: #FFFFFF, $light-color: #FFFFFF, $dark-color: #FFFFFF, $disabled-color: #FFFFFF) {
+ background-color: $color !important;
+ @if $color != #FFFFFF and $color != #000000 {
+ color: $tn-font-color;
+ &--light {
+ background-color: $light-color !important;
+ }
+ &--dark {
+ background-color: $dark-color !important;
+ }
+ &--disabled {
+ background-color: $disabled-color !important;
+ }
+ }
+ @else {
+ color: $tn-font-color;
+ }
+}
+
+@mixin getShadowColor($type: box, $color: #FFFFFF) {
+ @if $type == box {
+ box-shadow: 12rpx 12rpx 16rpx #{$color};
+ } @else if $type == text {
+ text-shadow: 6rpx 6rpx 8rpx #{$color};
+ }
+}
+
+@mixin getGradientColor($start-color, $end-color, $font-color: #FFFFFF) {
+ background-image: repeating-linear-gradient(45deg, $start-color, $end-color);
+ color: $font-color;
+
+ &--reverse {
+ background-image: repeating-linear-gradient(-45deg, $start-color, $end-color);
+ color: $font-color;
+ }
+}
+
+@mixin getMainColorGradient($start-color, $start-color-light, $start-color-disabled, $end-color, $end-color-light) {
+ @include getGradientColor($start-color, $end-color);
+
+ &--light {
+ @include getGradientColor($start-color-light, $end-color-light, $start-color);
+ }
+
+ &--single {
+ @include getGradientColor($start-color, $start-color-disabled);
+ }
+}
+
+/* 颜色 start */
+.tn-color-red {
+ @include getColor($tn-color-red, $tn-color-red-light, $tn-color-red-dark, $tn-color-red-disabled);
+}
+.tn-color-purplered {
+ @include getColor($tn-color-purplered, $tn-color-purplered-light, $tn-color-purplered-dark, $tn-color-purplered-disabled);
+}
+.tn-color-purple {
+ @include getColor($tn-color-purple, $tn-color-purple-light, $tn-color-purple-dark, $tn-color-purple-disabled);
+}
+.tn-color-bluepurple {
+ @include getColor($tn-color-bluepurple, $tn-color-bluepurple-light, $tn-color-bluepurple-dark, $tn-color-bluepurple-disabled);
+}
+.tn-color-aquablue {
+ @include getColor($tn-color-aquablue, $tn-color-aquablue-light, $tn-color-aquablue-dark, $tn-color-aquablue-disabled);
+}
+.tn-color-blue {
+ @include getColor($tn-color-blue, $tn-color-blue-light, $tn-color-blue-dark, $tn-color-blue-disabled);
+}
+.tn-color-indigo {
+ @include getColor($tn-color-indigo, $tn-color-indigo-light, $tn-color-indigo-dark, $tn-color-indigo-disabled);
+}
+.tn-color-cyan {
+ @include getColor($tn-color-cyan, $tn-color-cyan-light, $tn-color-cyan-dark, $tn-color-cyan-disabled);
+}
+.tn-color-teal {
+ @include getColor($tn-color-teal, $tn-color-teal-light, $tn-color-teal-dark, $tn-color-teal-disabled);
+}
+.tn-color-green {
+ @include getColor($tn-color-green, $tn-color-green-light, $tn-color-green-dark, $tn-color-green-disabled);
+}
+.tn-color-yellowgreen {
+ @include getColor($tn-color-yellowgreen, $tn-color-yellowgreen-light, $tn-color-yellowgreen-dark, $tn-color-yellowgreen-disabled);
+}
+.tn-color-lime {
+ @include getColor($tn-color-lime, $tn-color-lime-light, $tn-color-lime-dark, $tn-color-lime-disabled);
+}
+.tn-color-yellow {
+ @include getColor($tn-color-yellow, $tn-color-yellow-light, $tn-color-yellow-dark, $tn-color-yellow-disabled);
+}
+.tn-color-orangeyellow {
+ @include getColor($tn-color-orangeyellow, $tn-color-orangeyellow-light, $tn-color-orangeyellow-dark, $tn-color-orangeyellow-disabled);
+}
+.tn-color-orange {
+ @include getColor($tn-color-orange, $tn-color-orange-light, $tn-color-orange-dark, $tn-color-orange-disabled);
+}
+.tn-color-orangered {
+ @include getColor($tn-color-orangered, $tn-color-orangered-light, $tn-color-orangered-dark, $tn-color-orangered-disabled);
+}
+.tn-color-brown {
+ @include getColor($tn-color-brown, $tn-color-brown-light, $tn-color-brown-dark, $tn-color-brown-disabled);
+}
+.tn-color-grey {
+ @include getColor($tn-color-grey, $tn-color-grey-light, $tn-color-grey-dark, $tn-color-grey-disabled);
+}
+.tn-color-gray {
+ @include getColor($tn-color-gray, $tn-color-gray-light, $tn-color-gray-dark, $tn-color-gray-disabled);
+}
+.tn-color-white {
+ @include getColor();
+}
+.tn-color-black {
+ @include getColor(#000000);
+}
+/* 颜色 end */
+
+/* 边框颜色 start */
+.tn-border-red {
+ @include getBorderColor($tn-color-red, $tn-color-red-light, $tn-color-red-dark, $tn-color-red-disabled);
+}
+.tn-border-purplered {
+ @include getBorderColor($tn-color-purplered, $tn-color-purplered-light, $tn-color-purplered-dark, $tn-color-purplered-disabled);
+}
+.tn-border-purple {
+ @include getBorderColor($tn-color-purple, $tn-color-purple-light, $tn-color-purple-dark, $tn-color-purple-disabled);
+}
+.tn-border-bluepurple {
+ @include getBorderColor($tn-color-bluepurple, $tn-color-bluepurple-light, $tn-color-bluepurple-dark, $tn-color-bluepurple-disabled);
+}
+.tn-border-aquablue {
+ @include getBorderColor($tn-color-aquablue, $tn-color-aquablue-light, $tn-color-aquablue-dark, $tn-color-aquablue-disabled);
+}
+.tn-border-blue {
+ @include getBorderColor($tn-color-blue, $tn-color-blue-light, $tn-color-blue-dark, $tn-color-blue-disabled);
+}
+.tn-border-indigo {
+ @include getBorderColor($tn-color-indigo, $tn-color-indigo-light, $tn-color-indigo-dark, $tn-color-indigo-disabled);
+}
+.tn-border-cyan {
+ @include getBorderColor($tn-color-cyan, $tn-color-cyan-light, $tn-color-cyan-dark, $tn-color-cyan-disabled);
+}
+.tn-border-teal {
+ @include getBorderColor($tn-color-teal, $tn-color-teal-light, $tn-color-teal-dark, $tn-color-teal-disabled);
+}
+.tn-border-green {
+ @include getBorderColor($tn-color-green, $tn-color-green-light, $tn-color-green-dark, $tn-color-green-disabled);
+}
+.tn-border-yellowgreen {
+ @include getBorderColor($tn-color-yellowgreen, $tn-color-yellowgreen-light, $tn-color-yellowgreen-dark, $tn-color-yellowgreen-disabled);
+}
+.tn-border-lime {
+ @include getBorderColor($tn-color-lime, $tn-color-lime-light, $tn-color-lime-dark, $tn-color-lime-disabled);
+}
+.tn-border-yellow {
+ @include getBorderColor($tn-color-yellow, $tn-color-yellow-light, $tn-color-yellow-dark, $tn-color-yellow-disabled);
+}
+.tn-border-orangeyellow {
+ @include getBorderColor($tn-color-orangeyellow, $tn-color-orangeyellow-light, $tn-color-orangeyellow-dark, $tn-color-orangeyellow-disabled);
+}
+.tn-border-orange {
+ @include getBorderColor($tn-color-orange, $tn-color-orange-light, $tn-color-orange-dark, $tn-color-orange-disabled);
+}
+.tn-border-orangered {
+ @include getBorderColor($tn-color-orangered, $tn-color-orangered-light, $tn-color-orangered-dark, $tn-color-orangered-disabled);
+}
+.tn-border-brown {
+ @include getBorderColor($tn-color-brown, $tn-color-brown-light, $tn-color-brown-dark, $tn-color-brown-disabled);
+}
+.tn-border-grey {
+ @include getBorderColor($tn-color-grey, $tn-color-grey-light, $tn-color-grey-dark, $tn-color-grey-disabled);
+}
+.tn-border-gray {
+ @include getBorderColor($tn-color-gray, $tn-color-gray-light, $tn-color-gray-dark, $tn-color-gray-disabled);
+}
+.tn-border-white {
+ @include getBorderColor();
+}
+.tn-border-black {
+ @include getBorderColor(#000000);
+}
+/* 边框颜色 end */
+
+/* 背景颜色 start */
+.tn-bg-red {
+ @include getBackgroundColor($tn-color-red, $tn-color-red-light, $tn-color-red-dark, $tn-color-red-disabled);
+}
+.tn-bg-purplered {
+ @include getBackgroundColor($tn-color-purplered, $tn-color-purplered-light, $tn-color-purplered-dark, $tn-color-purplered-disabled);
+}
+.tn-bg-purple {
+ @include getBackgroundColor($tn-color-purple, $tn-color-purple-light, $tn-color-purple-dark, $tn-color-purple-disabled);
+}
+.tn-bg-bluepurple {
+ @include getBackgroundColor($tn-color-bluepurple, $tn-color-bluepurple-light, $tn-color-bluepurple-dark, $tn-color-bluepurple-disabled);
+}
+.tn-bg-aquablue {
+ @include getBackgroundColor($tn-color-aquablue, $tn-color-aquablue-light, $tn-color-aquablue-dark, $tn-color-aquablue-disabled);
+}
+.tn-bg-blue {
+ @include getBackgroundColor($tn-color-blue, $tn-color-blue-light, $tn-color-blue-dark, $tn-color-blue-disabled);
+}
+.tn-bg-indigo {
+ @include getBackgroundColor($tn-color-indigo, $tn-color-indigo-light, $tn-color-indigo-dark, $tn-color-indigo-disabled);
+}
+.tn-bg-cyan {
+ @include getBackgroundColor($tn-color-cyan, $tn-color-cyan-light, $tn-color-cyan-dark, $tn-color-cyan-disabled);
+}
+.tn-bg-teal {
+ @include getBackgroundColor($tn-color-teal, $tn-color-teal-light, $tn-color-teal-dark, $tn-color-teal-disabled);
+}
+.tn-bg-green {
+ @include getBackgroundColor($tn-color-green, $tn-color-green-light, $tn-color-green-dark, $tn-color-green-disabled);
+}
+.tn-bg-yellowgreen {
+ @include getBackgroundColor($tn-color-yellowgreen, $tn-color-yellowgreen-light, $tn-color-yellowgreen-dark, $tn-color-yellowgreen-disabled);
+}
+.tn-bg-lime {
+ @include getBackgroundColor($tn-color-lime, $tn-color-lime-light, $tn-color-lime-dark, $tn-color-lime-disabled);
+}
+.tn-bg-yellow {
+ @include getBackgroundColor($tn-color-yellow, $tn-color-yellow-light, $tn-color-yellow-dark, $tn-color-yellow-disabled);
+}
+.tn-bg-orangeyellow {
+ @include getBackgroundColor($tn-color-orangeyellow, $tn-color-orangeyellow-light, $tn-color-orangeyellow-dark, $tn-color-orangeyellow-disabled);
+}
+.tn-bg-orange {
+ @include getBackgroundColor($tn-color-orange, $tn-color-orange-light, $tn-color-orange-dark, $tn-color-orange-disabled);
+}
+.tn-bg-orangered {
+ @include getBackgroundColor($tn-color-orangered, $tn-color-orangered-light, $tn-color-orangered-dark, $tn-color-orangered-disabled);
+}
+.tn-bg-brown {
+ @include getBackgroundColor($tn-color-brown, $tn-color-brown-light, $tn-color-brown-dark, $tn-color-brown-disabled);
+}
+.tn-bg-grey {
+ @include getBackgroundColor($tn-color-grey, $tn-color-grey-light, $tn-color-grey-dark, $tn-color-grey-disabled);
+}
+.tn-bg-gray {
+ @include getBackgroundColor($tn-color-gray, $tn-color-gray-light, $tn-color-gray-dark, $tn-color-gray-disabled);
+}
+.tn-bg-white {
+ @include getBackgroundColor();
+}
+.tn-bg-black {
+ @include getBackgroundColor(#000000);
+}
+/* 背景颜色 end */
+
+/* 阴影颜色 start */
+.tn-shadow-red {
+ @include getShadowColor(box, $tn-color-red-light);
+}
+.tn-shadow-purplered {
+ @include getShadowColor(box, $tn-color-purplered-light);
+}
+.tn-shadow-purple {
+ @include getShadowColor(box, $tn-color-purple-light);
+}
+.tn-shadow-bluepurple {
+ @include getShadowColor(box, $tn-color-bluepurple-light);
+}
+.tn-shadow-aquablue {
+ @include getShadowColor(box, $tn-color-aquablue-light);
+}
+.tn-shadow-blue {
+ @include getShadowColor(box, $tn-color-blue-light);
+}
+.tn-shadow-indigo {
+ @include getShadowColor(box, $tn-color-indigo-light);
+}
+.tn-shadow-cyan {
+ @include getShadowColor(box, $tn-color-cyan-light);
+}
+.tn-shadow-teal {
+ @include getShadowColor(box, $tn-color-teal-light);
+}
+.tn-shadow-green {
+ @include getShadowColor(box, $tn-color-green-light);
+}
+.tn-shadow-yellowgreen {
+ @include getShadowColor(box, $tn-color-yellowgreen-light);
+}
+.tn-shadow-lime {
+ @include getShadowColor(box, $tn-color-lime-light);
+}
+.tn-shadow-yellow {
+ @include getShadowColor(box, $tn-color-yellow-light);
+}
+.tn-shadow-orangeyellow {
+ @include getShadowColor(box, $tn-color-orangeyellow-light);
+}
+.tn-shadow-orange {
+ @include getShadowColor(box, $tn-color-orange-light);
+}
+.tn-shadow-orangered {
+ @include getShadowColor(box, $tn-color-orangered-light);
+}
+.tn-shadow-brown {
+ @include getShadowColor(box, $tn-color-brown-light);
+}
+.tn-shadow-grey {
+ @include getShadowColor(box, $tn-color-grey-light);
+}
+.tn-shadow-gray {
+ @include getShadowColor(box, $tn-color-gray-light);
+}
+
+.tn-text-shadow-red {
+ @include getShadowColor(text, $tn-color-red-light);
+}
+.tn-text-shadow-purplered {
+ @include getShadowColor(text, $tn-color-purplered-light);
+}
+.tn-text-shadow-purple {
+ @include getShadowColor(text, $tn-color-purple-light);
+}
+.tn-text-shadow-bluepurple {
+ @include getShadowColor(text, $tn-color-bluepurple-light);
+}
+.tn-text-shadow-aquablue {
+ @include getShadowColor(text, $tn-color-aquablue-light);
+}
+.tn-text-shadow-blue {
+ @include getShadowColor(text, $tn-color-blue-light);
+}
+.tn-text-shadow-indigo {
+ @include getShadowColor(text, $tn-color-indigo-light);
+}
+.tn-text-shadow-cyan {
+ @include getShadowColor(text, $tn-color-cyan-light);
+}
+.tn-text-shadow-teal {
+ @include getShadowColor(text, $tn-color-teal-light);
+}
+.tn-text-shadow-green {
+ @include getShadowColor(text, $tn-color-green-light);
+}
+.tn-text-shadow-yellowgreen {
+ @include getShadowColor(text, $tn-color-yellowgreen-light);
+}
+.tn-text-shadow-lime {
+ @include getShadowColor(text, $tn-color-lime-light);
+}
+.tn-text-shadow-yellow {
+ @include getShadowColor(text, $tn-color-yellow-light);
+}
+.tn-text-shadow-orangeyellow {
+ @include getShadowColor(text, $tn-color-orangeyellow-light);
+}
+.tn-text-shadow-orange {
+ @include getShadowColor(text, $tn-color-orange-light);
+}
+.tn-text-shadow-orangered {
+ @include getShadowColor(text, $tn-color-orangered-light);
+}
+.tn-text-shadow-brown {
+ @include getShadowColor(text, $tn-color-brown-light);
+}
+.tn-text-shadow-grey {
+ @include getShadowColor(text, $tn-color-grey-light);
+}
+.tn-text-shadow-gray {
+ @include getShadowColor(text, $tn-color-gray-light);
+}
+/* 阴影颜色 end */
+
+/* 主色渐变色 start */
+.tn-main-gradient-red {
+ @include getMainColorGradient($tn-color-red, $tn-color-red-light, $tn-color-red-disabled, $tn-color-purplered, $tn-color-purplered-light);
+}
+.tn-main-gradient-purplered {
+ @include getMainColorGradient($tn-color-purplered, $tn-color-purplered-light, $tn-color-purplered-disabled, $tn-color-purple, $tn-color-purple-light);
+}
+.tn-main-gradient-purple {
+ @include getMainColorGradient($tn-color-purple, $tn-color-purple-light, $tn-color-purple-disabled, $tn-color-bluepurple, $tn-color-bluepurple-light);
+}
+.tn-main-gradient-bluepurple {
+ @include getMainColorGradient($tn-color-bluepurple, $tn-color-bluepurple-light, $tn-color-bluepurple-disabled, $tn-color-aquablue, $tn-color-aquablue-light);
+}
+.tn-main-gradient-aquablue {
+ @include getMainColorGradient($tn-color-aquablue, $tn-color-aquablue-light, $tn-color-aquablue-disabled, $tn-color-blue, $tn-color-blue-light);
+}
+.tn-main-gradient-blue {
+ @include getMainColorGradient($tn-color-blue, $tn-color-blue-light, $tn-color-blue-disabled, $tn-color-indigo, $tn-color-indigo-light);
+}
+.tn-main-gradient-indigo {
+ @include getMainColorGradient($tn-color-indigo, $tn-color-indigo-light, $tn-color-indigo-disabled, $tn-color-cyan, $tn-color-cyan-light);
+}
+.tn-main-gradient-cyan {
+ @include getMainColorGradient($tn-color-cyan, $tn-color-cyan-light, $tn-color-cyan-disabled, $tn-color-teal, $tn-color-teal-light);
+}
+.tn-main-gradient-teal {
+ @include getMainColorGradient($tn-color-teal, $tn-color-teal-light, $tn-color-teal-disabled, $tn-color-green, $tn-color-green-light);
+}
+.tn-main-gradient-green {
+ @include getMainColorGradient($tn-color-green, $tn-color-green-light, $tn-color-green-disabled, $tn-color-yellowgreen, $tn-color-yellowgreen-light);
+}
+.tn-main-gradient-yellowgreen {
+ @include getMainColorGradient($tn-color-yellowgreen, $tn-color-yellowgreen-light, $tn-color-yellowgreen-disabled, $tn-color-lime, $tn-color-lime-light);
+}
+.tn-main-gradient-lime {
+ @include getMainColorGradient($tn-color-lime, $tn-color-lime-light, $tn-color-lime-disabled, $tn-color-yellow, $tn-color-yellow-light);
+}
+.tn-main-gradient-yellow {
+ @include getMainColorGradient($tn-color-yellow, $tn-color-yellow-light, $tn-color-yellow-disabled, $tn-color-orangeyellow, $tn-color-orangeyellow-light);
+}
+.tn-main-gradient-orangeyellow {
+ @include getMainColorGradient($tn-color-orangeyellow, $tn-color-orangeyellow-light, $tn-color-orangeyellow-disabled, $tn-color-orange, $tn-color-orange-light);
+}
+.tn-main-gradient-orange {
+ @include getMainColorGradient($tn-color-orange, $tn-color-orange-light, $tn-color-orange-disabled, $tn-color-orangered, $tn-color-orangered-light);
+}
+.tn-main-gradient-orangered {
+ @include getMainColorGradient($tn-color-orangered, $tn-color-orangered-light, $tn-color-orangered-disabled, $tn-color-red, $tn-color-red-light);
+}
+/* 主色渐变色 end */
+
+/* 动态背景颜色 start */
+
+.tn-dynamic-bg-1 {
+ color: #fff;
+ background: linear-gradient(45deg, #F15BB5, #9A5CE5, #01BEFF, #00F5D4);
+ background-size: 500% 500%;
+ animation: dynamicBg 15s ease infinite;
+}
+
+@keyframes dynamicBg {
+ 0% {
+ background-position: 0% 50%;
+ }
+
+ 50% {
+ background-position: 100% 50%;
+ }
+
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 动态背景颜色 end */
+
+/* 酷炫背景颜色图片 start */
+
+.tn-cool-bg-color-1 {
+ @include getGradientColor($tn-cool-bg-color-1-start, $tn-cool-bg-color-1-end);
+}
+.tn-cool-bg-color-2 {
+ @include getGradientColor($tn-cool-bg-color-2-start, $tn-cool-bg-color-2-end);
+}
+.tn-cool-bg-color-3 {
+ @include getGradientColor($tn-cool-bg-color-3-start, $tn-cool-bg-color-3-end);
+}
+.tn-cool-bg-color-4 {
+ @include getGradientColor($tn-cool-bg-color-4-start, $tn-cool-bg-color-4-end);
+}
+.tn-cool-bg-color-5 {
+ @include getGradientColor($tn-cool-bg-color-5-start, $tn-cool-bg-color-5-end);
+}
+.tn-cool-bg-color-6 {
+ @include getGradientColor($tn-cool-bg-color-6-start, $tn-cool-bg-color-6-end);
+}
+.tn-cool-bg-color-7 {
+ @include getGradientColor($tn-cool-bg-color-7-start, $tn-cool-bg-color-7-end);
+}
+.tn-cool-bg-color-8 {
+ @include getGradientColor($tn-cool-bg-color-8-start, $tn-cool-bg-color-8-end);
+}
+.tn-cool-bg-color-9 {
+ @include getGradientColor($tn-cool-bg-color-9-start, $tn-cool-bg-color-9-end);
+}
+.tn-cool-bg-color-10 {
+ @include getGradientColor($tn-cool-bg-color-10-start, $tn-cool-bg-color-10-end);
+}
+.tn-cool-bg-color-11 {
+ @include getGradientColor($tn-cool-bg-color-11-start, $tn-cool-bg-color-11-end);
+}
+.tn-cool-bg-color-12 {
+ @include getGradientColor($tn-cool-bg-color-12-start, $tn-cool-bg-color-12-end);
+}
+.tn-cool-bg-color-13 {
+ @include getGradientColor($tn-cool-bg-color-13-start, $tn-cool-bg-color-13-end);
+}
+.tn-cool-bg-color-14 {
+ @include getGradientColor($tn-cool-bg-color-14-start, $tn-cool-bg-color-14-end);
+}
+.tn-cool-bg-color-15 {
+ @include getGradientColor($tn-cool-bg-color-15-start, $tn-cool-bg-color-15-end);
+}
+.tn-cool-bg-color-16 {
+ @include getGradientColor($tn-cool-bg-color-16-start, $tn-cool-bg-color-16-end);
+}
+
+.tn-cool-bg-image::after {
+ content: " ";
+ position: absolute;
+ z-index: -1;
+ width: 100%;
+ height: 100%;
+ left: 0;
+ bottom: 0;
+ border-radius: 10rpx;
+ opacity: 1;
+ transform: scale(1, 1);
+ background-size: 100% 100%;
+ background-image: inherit;
+}
+
+.tn-cool-bg-image:nth-of-type(1n)::after {
+ background-image: url(https://resource.tuniaokj.com/images/cool_bg_image/1.png);
+}
+
+.tn-cool-bg-image:nth-of-type(2n)::after {
+ background-image: url(https://resource.tuniaokj.com/images/cool_bg_image/2.png);
+}
+
+.tn-cool-bg-image:nth-of-type(3n)::after {
+ background-image: url(https://resource.tuniaokj.com/images/cool_bg_image/3.png);
+}
+
+.tn-cool-bg-image:nth-of-type(4n)::after {
+ background-image: url(https://resource.tuniaokj.com/images/cool_bg_image/4.png);
+}
+
+.tn-cool-bg-image:nth-of-type(5n)::after {
+ background-image: url(https://resource.tuniaokj.com/images/cool_bg_image/5.png);
+}
+
+.tn-cool-bg-image:nth-of-type(6n)::after {
+ background-image: url(https://resource.tuniaokj.com/images/cool_bg_image/6.png);
+}
+
+/* 酷炫背景颜色图片 end */
diff --git a/tuniao-ui/libs/css/main.scss b/tuniao-ui/libs/css/main.scss
new file mode 100644
index 0000000..f60ab11
--- /dev/null
+++ b/tuniao-ui/libs/css/main.scss
@@ -0,0 +1,722 @@
+$direction: top, right, bottom, left;
+
+body {
+ // 全局灰白效果
+ /* filter: grayscale(100%);
+ -webkit-filter: grayscale(100%); */
+
+ background-color: $tn-bg-color;
+ /* background-color: #ffffff; */
+ font-size: 28rpx;
+ color: $tn-font-color;
+ font-family: Helvetica Neue, Helvetica, sans-serif;
+ // 修复点击view标签的时候会有蓝色遮罩
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
+}
+
+view,
+scroll-view,
+swiper,
+button,
+input,
+textarea,
+label,
+navigator,
+image {
+ box-sizing: border-box;
+}
+
+button::after {
+ border: none;
+}
+
+.tn-round {
+ border-radius: 5000rpx !important;
+}
+
+.tn-radius {
+ border-radius: 6rpx;
+}
+
+/* 基本样式 start */
+
+.tn-width-full {
+ width: 100%;
+}
+
+.tn-height-full {
+ height: 100%;
+}
+
+/* 基本样式 end */
+
+
+/* 边框 start */
+
+.tn-border-solid,
+.tn-border-solid-top,
+.tn-border-solid-right,
+.tn-border-solid-bottom,
+.tn-border-solid-left,
+.tn-border-solids,
+.tn-border-solids-top,
+.tn-border-solids-right,
+.tn-border-solids-bottom,
+.tn-border-solids-left,
+.tn-border-dashed,
+.tn-border-dashed-top,
+.tn-border-dashed-right,
+.tn-border-dashed-bottom,
+.tn-border-dashed-left {
+ border-radius: inherit;
+ box-sizing: border-box;
+}
+
+@for $i from 0 to length($direction) + 1 {
+ @if $i == 0 {
+ .tn-border-solid {
+ border-width: 1rpx !important;
+ border-style: solid;
+ border-color: $tn-border-solid-color;
+
+ &.tn-bold-border {
+ border-width: 6rpx !important;
+ }
+ }
+ .tn-border-solids {
+ border-width: 1rpx !important;
+ border-style: solid;
+ border-color: $tn-border-solids-color;
+
+ &.tn-bold-border {
+ border-width: 6rpx !important;
+ }
+ }
+ .tn-border-dashed {
+ border-width: 1rpx !important;
+ border-style: dashed;
+ border-color: $tn-border-dashed-color;
+
+ &.tn-bold-border {
+ border-width: 6rpx !important;
+ }
+ }
+ } @else {
+ .tn-border-solid-#{nth($direction, $i)} {
+ border: 0rpx;
+ border-#{nth($direction, $i)}-width: 1rpx !important;
+ border-style: solid;
+ border-color: $tn-border-solid-color;
+
+ &.tn-bold-border {
+ border-#{nth($direction, $i)}-width: 6rpx !important;
+ }
+ }
+ .tn-border-solids-#{nth($direction, $i)} {
+ border: 0rpx;
+ border-#{nth($direction, $i)}-width: 1rpx !important;
+ border-style: solid;
+ border-color: $tn-border-solids-color;
+
+ &.tn-bold-border {
+ border-#{nth($direction, $i)}-width: 6rpx !important;
+ }
+ }
+ .tn-border-dashed-#{nth($direction, $i)} {
+ border: 0rpx;
+ border-#{nth($direction, $i)}-width: 1rpx !important;
+ border-style: dashed;
+ border-color: $tn-border-dashed-color;
+
+ &.tn-bold-border {
+ border-#{nth($direction, $i)}-width: 6rpx !important;
+ }
+ }
+ }
+}
+
+.tn-none-border.tn-border-solid,
+.tn-none-border.tn-border-solid-top,
+.tn-none-border.tn-border-solid-right,
+.tn-none-border.tn-border-solid-bottom,
+.tn-none-border.tn-border-solid-left,
+.tn-none-border.tn-border-solids,
+.tn-none-border.tn-border-solids-top,
+.tn-none-border.tn-border-solids-right,
+.tn-none-border.tn-border-solids-bottom,
+.tn-none-border.tn-border-solids-left,
+.tn-none-border.tn-border-dashed,
+.tn-none-border.tn-border-dashed-top,
+.tn-none-border.tn-border-dashed-right,
+.tn-none-border.tn-border-dashed-bottom,
+.tn-none-border.tn-border-dashed-left {
+ border: 0 !important;
+}
+
+.tn-none-border-top.tn-border-solid,
+.tn-none-border-top.tn-border-solid-top,
+.tn-none-border-top.tn-border-solid-right,
+.tn-none-border-top.tn-border-solid-bottom,
+.tn-none-border-top.tn-border-solid-left,
+.tn-none-border-top.tn-border-solids,
+.tn-none-border-top.tn-border-solids-top,
+.tn-none-border-top.tn-border-solids-right,
+.tn-none-border-top.tn-border-solids-bottom,
+.tn-none-border-top.tn-border-solids-left,
+.tn-none-border-top.tn-border-dashed,
+.tn-none-border-top.tn-border-dashed-top,
+.tn-none-border-top.tn-border-dashed-right,
+.tn-none-border-top.tn-border-dashed-bottom,
+.tn-none-border-top.tn-border-dashed-left {
+ /* height: 0 !important; */
+ border-top: 0 !important;
+}
+
+.tn-none-border-right.tn-border-solid,
+.tn-none-border-right.tn-border-solid-top,
+.tn-none-border-right.tn-border-solid-right,
+.tn-none-border-right.tn-border-solid-bottom,
+.tn-none-border-right.tn-border-solid-left,
+.tn-none-border-right.tn-border-solids,
+.tn-none-border-right.tn-border-solids-top,
+.tn-none-border-right.tn-border-solids-right,
+.tn-none-border-right.tn-border-solids-bottom,
+.tn-none-border-right.tn-border-solids-left,
+.tn-none-border-right.tn-border-dashed,
+.tn-none-border-right.tn-border-dashed-top,
+.tn-none-border-right.tn-border-dashed-right,
+.tn-none-border-right.tn-border-dashed-bottom,
+.tn-none-border-right.tn-border-dashed-left {
+ /* width: 0 !important; */
+ border-right: 0 !important;
+}
+
+.tn-none-border-bottom.tn-border-solid,
+.tn-none-border-bottom.tn-border-solid-top,
+.tn-none-border-bottom.tn-border-solid-right,
+.tn-none-border-bottom.tn-border-solid-bottom,
+.tn-none-border-bottom.tn-border-solid-left,
+.tn-none-border-bottom.tn-border-solids,
+.tn-none-border-bottom.tn-border-solids-top,
+.tn-none-border-bottom.tn-border-solids-right,
+.tn-none-border-bottom.tn-border-solids-bottom,
+.tn-none-border-bottom.tn-border-solids-left,
+.tn-none-border-bottom.tn-border-dashed,
+.tn-none-border-bottom.tn-border-dashed-top,
+.tn-none-border-bottom.tn-border-dashed-right,
+.tn-none-border-bottom.tn-border-dashed-bottom,
+.tn-none-border-bottom.tn-border-dashed-left {
+ /* height: 0 !important; */
+ border-bottom: 0 !important;
+}
+
+.tn-none-border-left.tn-border-solid,
+.tn-none-border-left.tn-border-solid-top,
+.tn-none-border-left.tn-border-solid-right,
+.tn-none-border-left.tn-border-solid-bottom,
+.tn-none-border-left.tn-border-solid-left,
+.tn-none-border-left.tn-border-solids,
+.tn-none-border-left.tn-border-solids-top,
+.tn-none-border-left.tn-border-solids-right,
+.tn-none-border-left.tn-border-solids-bottom,
+.tn-none-border-left.tn-border-solids-left,
+.tn-none-border-left.tn-border-dashed,
+.tn-none-border-left.tn-border-dashed-top,
+.tn-none-border-left.tn-border-dashed-right,
+.tn-none-border-left.tn-border-dashed-bottom,
+.tn-none-border-left.tn-border-dashed-left {
+ /* width: 0 !important; */
+ border-left: 0 !important;
+}
+
+/* 边框 end */
+
+
+/* 阴影 start */
+
+.tn-shadow {
+ box-shadow: 6rpx 6rpx 8rpx $tn-shadow-color;
+}
+
+.tn-shadow-warp {
+ position: relative;
+ box-shadow: 0 0 10rpx $tn-shadow-color;
+}
+
+.tn-shadow-warp::before,
+.tn-shadow-warp::after {
+ content: " ";
+ position: absolute;
+ top: 20rpx;
+ bottom: 30rpx;
+ left: 20rpx;
+ width: 50%;
+ box-shadow: 0 30rpx 20rpx $tn-box-shadow-color;
+ transform: rotate(-3deg);
+ z-index: -1;
+}
+
+.tn-shadow-warp::after {
+ right: 20rpx;
+ left: auto;
+ transform: rotate(3deg);
+}
+
+.tn-shadow-blur {
+ position: relative;
+}
+
+.tn-shadow-blur::before {
+ content: " ";
+ display: block;
+ background: inherit;
+ filter: blur(10rpx);
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 10rpx;
+ left: 10rpx;
+ z-index: -1;
+ opacity: 0.4;
+ transform-origin: 0 0;
+ border-radius: inherit;
+ transform: scale(1, 1);
+}
+
+/* 阴影 end */
+
+
+/* flex start */
+
+.tn-flex {
+ display: -webkit-flex;
+ display: flex;
+}
+
+/* flex伸缩基准值 */
+.tn-flex-basic-xs {
+ flex-basis: 20%;
+}
+
+.tn-flex-basic-sm {
+ flex-basis: 40%;
+}
+
+.tn-flex-basic-md {
+ flex-basis: 50%;
+}
+
+.tn-flex-basic-lg {
+ flex-basis: 60%;
+}
+
+.tn-flex-basic-xl {
+ flex-basis: 80%;
+}
+
+.tn-flex-basic-full {
+ flex-basis: 100%;
+}
+
+/* flex布局的方向 */
+.tn-flex-direction-column {
+ flex-direction: column;
+}
+
+.tn-flex-direction-row {
+ flex-direction: row;
+}
+
+.tn-flex-direction-column-reverse {
+ flex-direction: column-reverse;
+}
+
+.tn-flex-direction-row-reverse {
+ flex-direction: row-reverse;
+}
+
+/* flex容器设置换行 */
+.tn-flex-wrap {
+ flex-wrap: wrap;
+}
+
+.tn-flex-nowrap {
+ flex-wrap: nowrap;
+}
+
+/* flex容器自身垂直方向对齐方式 */
+.tn-flex-center {
+ align-self: center;
+}
+
+.tn-flex-top {
+ align-self: flex-start;
+}
+
+.tn-flex-end {
+ align-self: flex-end;
+}
+
+.tn-flex-stretch {
+ align-self: stretch;
+}
+
+/* flex子元素垂直方向对齐方式 */
+.tn-flex-col-center {
+ align-items: center;
+}
+
+.tn-flex-col-top {
+ align-items: flex-start;
+}
+
+.tn-flex-col-bottom {
+ align-items: flex-end;
+}
+
+/* flex子元素水平方向对齐方式 */
+.tn-flex-row-center {
+ justify-content: center;
+}
+
+.tn-flex-row-left {
+ justify-content: flex-start;
+}
+
+.tn-flex-row-right {
+ justify-content: flex-end;
+}
+
+.tn-flex-row-between {
+ justify-content: space-between;
+}
+
+.tn-flex-row-around {
+ justify-content: space-around;
+}
+
+/* flex子元素空间分配 */
+@for $i from 0 to 12 {
+ .tn-flex-#{$i} {
+ flex: $i;
+ }
+}
+
+.tn-col-12 {
+ width: 100%;
+}
+
+.tn-col-11 {
+ width: 91.66666667%;
+}
+
+.tn-col-10 {
+ width: 83.33333333%;
+}
+
+.tn-col-9 {
+ width: 75%;
+}
+
+.tn-col-8 {
+ width: 66.66666667%;
+}
+
+.tn-col-7 {
+ width: 58.33333333%;
+}
+
+.tn-col-6 {
+ width: 50%;
+}
+
+.tn-col-5 {
+ width: 41.66666667%;
+}
+
+.tn-col-4 {
+ width: 33.33333333%;
+}
+
+.tn-col-3 {
+ width: 25%;
+}
+
+.tn-col-2 {
+ width: 16.66666667%;
+}
+
+.tn-col-1 {
+ width: 8.33333333%;
+}
+
+/* flex end */
+
+/* 内边距 start */
+
+@for $i from 0 to length($direction) + 1 {
+ @if $i == 0 {
+ .tn-no-margin {
+ margin: 0;
+ }
+ .tn-margin-xs {
+ margin: 10rpx;
+ }
+ .tn-margin-sm {
+ margin: 20rpx;
+ }
+ .tn-margin {
+ margin: 30rpx;
+ }
+ .tn-margin-lg {
+ margin: 40rpx;
+ }
+ .tn-margin-xl {
+ margin: 50rpx;
+ }
+ } @else {
+ .tn-no-margin-#{nth($direction, $i)} {
+ margin-#{nth($direction, $i)}: 0;
+ }
+ .tn-margin-#{nth($direction, $i)}-xs {
+ margin-#{nth($direction, $i)}: 10rpx;
+ }
+ .tn-margin-#{nth($direction, $i)}-sm {
+ margin-#{nth($direction, $i)}: 20rpx;
+ }
+ .tn-margin-#{nth($direction, $i)} {
+ margin-#{nth($direction, $i)}: 30rpx;
+ }
+ .tn-margin-#{nth($direction, $i)}-lg {
+ margin-#{nth($direction, $i)}: 40rpx;
+ }
+ .tn-margin-#{nth($direction, $i)}-xl {
+ margin-#{nth($direction, $i)}: 50rpx;
+ }
+ }
+}
+
+/* 内边距 end */
+
+/* 外边距 start */
+
+@for $i from 0 to length($direction) + 1 {
+ @if $i == 0 {
+ .tn-no-padding {
+ padding: 0;
+ }
+ .tn-padding-xs {
+ padding: 10rpx;
+ }
+ .tn-padding-sm {
+ padding: 20rpx;
+ }
+ .tn-padding {
+ padding: 30rpx;
+ }
+ .tn-padding-lg {
+ padding: 40rpx;
+ }
+ .tn-padding-xl {
+ padding: 50rpx;
+ }
+ } @else {
+ .tn-no-padding-#{nth($direction, $i)} {
+ padding-#{nth($direction, $i)}: 0;
+ }
+ .tn-padding-#{nth($direction, $i)}-xs {
+ padding-#{nth($direction, $i)}: 10rpx;
+ }
+ .tn-padding-#{nth($direction, $i)}-sm {
+ padding-#{nth($direction, $i)}: 20rpx;
+ }
+ .tn-padding-#{nth($direction, $i)} {
+ padding-#{nth($direction, $i)}: 30rpx;
+ }
+ .tn-padding-#{nth($direction, $i)}-lg {
+ padding-#{nth($direction, $i)}: 40rpx;
+ }
+ .tn-padding-#{nth($direction, $i)}-xl {
+ padding-#{nth($direction, $i)}: 50rpx;
+ }
+ }
+}
+
+/* 外边距 end */
+
+/* float start */
+
+.tn-float-left {
+ float: left;
+}
+
+.tn-float-right {
+ float: right;
+}
+
+.tn-clear-float {
+ clear: both;
+}
+
+.tn-clear-float::after,
+.tn-clear-float::before {
+ content: " ";
+ display: table;
+ clear: both;
+}
+
+/* float end */
+
+/* 文本 start */
+
+.tn-text-xs {
+ font-size: 20rpx;
+}
+
+.tn-text-sm {
+ font-size: 24rpx;
+}
+
+.tn-text-md {
+ font-size: 28rpx;
+}
+
+.tn-text-lg {
+ font-size: 32rpx;
+}
+
+.tn-text-xl {
+ font-size: 36rpx;
+}
+
+.tn-text-xxl {
+ font-size: 40rpx;
+}
+
+.tn-text-xl-xxl {
+ font-size: 80rpx;
+}
+
+.tn-text-xxl-xxl {
+ font-size: 120rpx;
+}
+
+.tn-text-upper {
+ text-transform: uppercase;
+}
+
+.tn-text-cap {
+ text-transform: capitalize;
+}
+
+.tn-text-lower {
+ text-transform: lowercase;
+}
+
+.tn-text-bold {
+ font-weight: bold;
+}
+
+.tn-text-center {
+ text-align: center;
+}
+
+.tn-text-left {
+ text-align: left;
+}
+
+.tn-text-right {
+ text-align: right;
+}
+
+.tn-text-justify {
+ text-align: justify;
+}
+
+.tn-text-content {
+ line-height: 1.6;
+}
+
+.tn-text-ellipsis {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.tn-text-ellipsis-2 {
+ display: -webkit-box;
+ overflow: hidden;
+ white-space: normal !important;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+
+.tn-text-clip {
+ -webkit-background-clip: text;
+ color: transparent !important;
+}
+
+.tn-text-break-word {
+ word-wrap: break-word;
+}
+
+/* 文本 end */
+
+/* hover 点击效果 start */
+.tn-hover {
+ opacity: 0.6;
+}
+/* hover 点击效果 end */
+
+/* 去除原生button样式 start */
+.tn-button--clear-style {
+ background-color: transparent;
+ padding: 0;
+ margin: 0;
+ font-size: inherit;
+ line-height: inherit;
+ border-radius: inherit;
+ color: inherit;
+}
+/* 去除原生button样式 end */
+
+/* 头像组 start */
+// .tn-avatar-group {
+// direction: rtl;
+// unicode-bidi: bidi-override;
+// padding: 0 10rpx 0 40rpx;
+// display: inline-block;
+
+// .tn-avatar {
+// margin-left: -30rpx !important;
+// border: 4rpx solid $tn-border-solid-color;
+// vertical-align: middle;
+
+// &--sm {
+// margin-left: -20rpx !important;
+// border: 1rpx solid $tn-border-solid-color;
+// }
+// }
+// }
+/* 头像组 end */
+
+/* 提升H5端uni.toast()的层级,避免被tn-modal等遮盖 start */
+/* #ifdef H5 */
+uni-toast {
+ z-index: 10090;
+}
+uni-toast .uni-toast {
+ z-index: 10090;
+}
+/* #endif */
+/* 提升H5端uni.toast()的层级,避免被tn-modal等遮盖 end */
+
+/* iPhoneX底部安全区定义 start */
+.tn-safe-area-inset-bottom {
+ padding-bottom: 0;
+ padding-bottom: constant(safe-area-inset-bottom);
+ padding-bottom: env(safe-area-inset-bottom);
+}
+/* iPhoneX底部安全区定义 end */
\ No newline at end of file
diff --git a/tuniao-ui/libs/css/style.h5.scss b/tuniao-ui/libs/css/style.h5.scss
new file mode 100644
index 0000000..647c902
--- /dev/null
+++ b/tuniao-ui/libs/css/style.h5.scss
@@ -0,0 +1,35 @@
+/* H5的时候,隐藏滚动条 */
+::-webkit-scrollbar {
+ display: none;
+ width: 0 !important;
+ height: 0 !important;
+ -webkit-appearance: none;
+ background: transparent;
+}
+
+/* 双标签 start*/
+.capsule {
+ display: inline-flex;
+ vertical-align: middle;
+ width: 20%;
+ min-width: 136rpx;
+ height: 45rpx;
+
+ .capsule-tag {
+ margin: 0;
+
+ &:first-child {
+ border-top-right-radius: 0rpx;
+ border-bottom-right-radius: 0rpx;
+ }
+
+ &:last-child {
+
+ &::after {
+ border-top-left-radius: 0rpx;
+ border-bottom-left-radius: 0rpx;
+ }
+ }
+ }
+}
+/* 双标签 end*/
\ No newline at end of file
diff --git a/tuniao-ui/libs/css/style.mp.scss b/tuniao-ui/libs/css/style.mp.scss
new file mode 100644
index 0000000..f5aed9e
--- /dev/null
+++ b/tuniao-ui/libs/css/style.mp.scss
@@ -0,0 +1,52 @@
+::-webkit-scrollbar {
+ display: none;
+ width: 0 !important;
+ height: 0 !important;
+ -webkit-appearance: none;
+ background: transparent;
+}
+/* 微信小程序编译后页面有组件名的元素,特别处理 start */
+/* #ifdef MP-WEIXIN || MP-QQ */
+// 各家小程序宫格组件外层设置为100%,避免受到父元素display: flex;的影响
+
+/* 双标签 start*/
+.capsule {
+ display: inline-flex;
+ vertical-align: middle;
+ width: 20%;
+ min-width: 136rpx;
+ height: 45rpx;
+
+ tn-tag {
+ margin: 0;
+ width: 100%;
+
+ &:first-child {
+ .tn-tag {
+ border-top-right-radius: 0rpx;
+ border-bottom-right-radius: 0rpx;
+ }
+ }
+
+ &:last-child {
+ .tn-tag {
+ &::after {
+ border-top-left-radius: 0rpx;
+ border-bottom-left-radius: 0rpx;
+ }
+ }
+
+
+ }
+ }
+}
+/* 双标签 end*/
+
+/* #endif */
+/* 微信小程序编译后页面有组件名的元素,特别处理 end */
+
+/* 头条小程序编译后页面有组件名的元素,特别处理 start */
+/* #ifdef MP-TOUTIAO */
+// 各家小程序宫格组件外层设置为100%,避免受到父元素display: flex;的影响
+/* #endif */
+/* 头条小程序编译后页面有组件名的元素,特别处理 end */
\ No newline at end of file
diff --git a/tuniao-ui/libs/function/$parent.js b/tuniao-ui/libs/function/$parent.js
new file mode 100644
index 0000000..49854cc
--- /dev/null
+++ b/tuniao-ui/libs/function/$parent.js
@@ -0,0 +1,18 @@
+// 获取父组件的参数,在支付宝小程序中不支持provide/inject的写法
+// 在非H5中this.$parent可以获取到父组件,但是在H5中需要多次调用this.$parent.$parent.xxx
+// 传递默认值undefined表示查找最顶层的$parent
+export default function $parent(name = undefined) {
+ let parent = this.$parent
+ // 通过whle遍历,这里主要是为了H5需要多层解析
+ while(parent) {
+ // 父组件
+ if (parent.$options && parent.$options.name !== name) {
+ // 如果组件的name不相等,则继续查找
+ parent = parent.$parent
+ } else {
+ return parent
+ }
+ }
+
+ return false
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/function/applyEven.js b/tuniao-ui/libs/function/applyEven.js
new file mode 100644
index 0000000..8a09049
--- /dev/null
+++ b/tuniao-ui/libs/function/applyEven.js
@@ -0,0 +1,27 @@
+//防抖
+export function debounceFun(func, delay=500) {
+ //定时器
+ let timer;
+ return function(...args) {
+ // 清除之前设置的定时器
+ clearTimeout(timer);
+ timer = setTimeout(() => {
+ func.apply(this, args);
+ }, delay);
+ };
+}
+
+//节流
+export function throttleFun(func, delay=500) {
+ //定时器
+ let timer = null;
+ return function(...args) {
+ if(!timer){
+ timer = setTimeout(() => {
+ //执行前清空
+ timer = null;
+ func.apply(this, args);
+ }, delay);
+ }
+ };
+}
diff --git a/tuniao-ui/libs/function/array.js b/tuniao-ui/libs/function/array.js
new file mode 100644
index 0000000..fa947ea
--- /dev/null
+++ b/tuniao-ui/libs/function/array.js
@@ -0,0 +1,22 @@
+/**
+ * 打乱传入的数组
+ *
+ * @param {Array} array 待打乱的数组
+ */
+function random(array = []) {
+ return array.sort(() => Math.random() - 0.5)
+}
+
+/**
+ * 判断是否为数组
+ *
+ * @param {Object} arr
+ */
+function isArray(arr) {
+ return Object.prototype.toString.call(arr) === '[object Array]'
+}
+
+export default {
+ random,
+ isArray
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/function/color.js b/tuniao-ui/libs/function/color.js
new file mode 100644
index 0000000..11f3365
--- /dev/null
+++ b/tuniao-ui/libs/function/color.js
@@ -0,0 +1,270 @@
+let color = [
+ 'red',
+ 'purplered',
+ 'purple',
+ 'bluepurple',
+ 'aquablue',
+ 'blue',
+ 'indigo',
+ 'cyan',
+ 'teal',
+ 'green',
+ 'yellowgreen',
+ 'lime',
+ 'yellow',
+ 'orangeyellow',
+ 'orange',
+ 'orangered',
+ 'brown',
+ 'grey',
+ 'gray'
+]
+
+// 酷炫颜色的数量
+const COOL_BG_COLOR_COUNT = 16
+
+/**
+ * 获取图鸟配色颜色列表
+ */
+function getTuniaoColorList() {
+ return color
+}
+
+/**
+ * 获取指定类型的随机颜色对应的类
+ * @param {String} type 颜色类型
+ */
+function getRandomColorClass(type = 'bg') {
+ const index = Math.floor(Math.random() * color.length)
+ const colorValue = color[index]
+
+ return 'tn-' + type + '-' + colorValue
+}
+
+/**
+ * 随机获取酷炫背景对应的类
+ */
+function getRandomCoolBgClass() {
+ const index = (Math.random() * COOL_BG_COLOR_COUNT) + 1
+ return 'tn-cool-bg-color-' + Math.floor(index)
+}
+
+/**
+ * 根据传入的值获取内部背景颜色类
+ *
+ * @param {String} backgroundColor 背景颜色信息
+ */
+function getBackgroundColorInternalClass(backgroundColor = '') {
+ if (!backgroundColor) return ''
+
+ if (['tn-bg', 'tn-dynamic-bg', 'tn-main-gradient', 'tn-cool-bg'].some(item => {
+ return backgroundColor.includes(item)
+ })) {
+ return backgroundColor
+ }
+ return ''
+}
+
+/**
+ * 根据传入的值获取背景颜色样式
+ *
+ * @param {String} backgroundColor 背景颜色信息
+ */
+function getBackgroundColorStyle(backgroundColor = '') {
+ if (!backgroundColor) return ''
+
+ if (!backgroundColor.startsWith('tn-') || ['#', 'rgb', 'rgba'].some(item => {
+ return backgroundColor.includes(item)
+ })) {
+ return backgroundColor
+ }
+ return ''
+}
+
+/**
+ * 根据传入的值获取内部字体颜色类
+ *
+ * @param {String} fontColor 背景颜色信息
+ */
+function getFontColorInternalClass(fontColor = '') {
+ if (!fontColor) return ''
+
+ if (['tn-color'].some(item => {
+ return fontColor.includes(item)
+ })) {
+ return fontColor
+ }
+ return ''
+}
+
+/**
+ * 根据传入的值获取字体颜色样式
+ *
+ * @param {String} fontColor 背景颜色信息
+ */
+function getFontColorStyle(fontColor = '') {
+ if (!fontColor) return ''
+
+ if (!fontColor.startsWith('tn-') || ['#', 'rgb', 'rgba'].some(item => {
+ return fontColor.includes(item)
+ })) {
+ return fontColor
+ }
+ return ''
+}
+
+/**
+ * 求两个颜色之间的渐变值
+ *
+ * @param {String} startColor 开始颜色
+ * @param {String} endColor 结束颜色
+ * @param {Number} step 颜色等分的份额
+ */
+function colorGradient(startColor = 'rgb(0, 0, 0)', endColor='rgb(255, 255, 255)', step = 10) {
+ let startRGB = hexToRGB(startColor, false)
+ let startR = startRGB[0]
+ let startG = startRGB[1]
+ let startB = startRGB[2]
+
+ let endRGB = hexToRGB(endColor, false)
+ let endR = endRGB[0]
+ let endG = endRGB[1]
+ let endB = endRGB[2]
+
+ // 求差值
+ let R = (endR - startR) / step
+ let G = (endG - startG) / step
+ let B = (endB - startB) / step
+
+ let colorArr = []
+ for (let i = 0; i < step; i++) {
+ // 计算每一步的hex值
+ let hex = rgbToHex(`rgb(${Math.round(R * i + startR)}, ${Math.round(G * i + startG)}, ${Math.round(B * i + startB)})`)
+ colorArr.push(hex)
+ }
+ return colorArr
+}
+
+/**
+ * 将hex的颜色表示方式转换为rgb表示方式
+ *
+ * @param {String} color 颜色
+ * @param {Boolean} str 是否返回字符串
+ * @return {Array|String} rgb的值
+ */
+function hexToRGB(color, str = true) {
+ let reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/
+
+ color = color.toLowerCase()
+ if (color && reg.test(color)) {
+ // #000 => #000000
+ if (color.length === 4) {
+ let colorNew = '#'
+ for (let i = 1; i < 4; i++) {
+ colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1))
+ }
+ color = colorNew
+ }
+ // 处理六位的颜色值
+ let colorChange = []
+ for (let i = 1; i < 7; i += 2) {
+ colorChange.push(parseInt("0x" + color.slice(i, i + 2)))
+ }
+ if (!str) {
+ return colorChange
+ } else {
+ return `rgb(${colorChange[0]}, ${colorChange[1]}, ${colorChange[2]})`
+ }
+ } else if (/^(rgb|RGB)/.test(color)) {
+ let arr = color.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(',')
+ return arr.map(item => Number(item))
+ } else {
+ return color
+ }
+}
+
+/**
+ * 将rgb的颜色表示方式转换成hex表示方式
+ *
+ * @param {Object} rgb rgb颜色值
+ */
+function rgbToHex(rgb) {
+ let reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/
+ if (/^(rgb|RGB)/.test(rgb)) {
+ let color = rgb.replace(/(?:\(|\)|rgb|GRB)*/g, "").split(',')
+ let strHex = '#'
+ for (let i = 0; i < color.length; i++) {
+ let hex = Number(color[i]).toString(16)
+ // 保证每个值否是两位数
+ hex = String(hex).length === 1 ? 0 + '' + hex: hex
+ if (hex === '0') {
+ hex += hex
+ }
+ strHex += hex
+ }
+ if (strHex.length !== 7) {
+ strHex = rgb
+ }
+ return strHex
+ } else if (reg.test(rgb)) {
+ let num = rgb.replace(/#/, '').split('')
+ if (num.length === 6) {
+ return rgb
+ } else if (num.length === 3) {
+ let numHex = '#'
+ for (let i = 0; i < num.length; i++) {
+ numHex += (num[i] + num[i])
+ }
+ return numHex
+ }
+ } else {
+ return rgb
+ }
+}
+
+/**
+ * 将传入的颜色值转换为rgba字符串
+ *
+ * @param {String} color 颜色
+ * @param {Number} alpha 透明度
+ */
+function colorToRGBA(color, alpha = 0.3) {
+ color = rgbToHex(color)
+ // 十六进制颜色值的正则表达式
+ let reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/
+
+ color = color.toLowerCase()
+ if (color && reg.test(color)) {
+ // #000 => #000000
+ if (color.length === 4) {
+ let colorNew = '#'
+ for (let i = 1; i < 4; i++) {
+ colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1))
+ }
+ color = colorNew
+ }
+ // 处理六位的颜色值
+ let colorChange = []
+ for (let i = 1; i < 7; i += 2) {
+ colorChange.push(parseInt("0x" + color.slice(i, i + 2)))
+ }
+ return `rgba(${colorChange[0]}, ${colorChange[1]}, ${colorChange[2]}, ${alpha})`
+ } else {
+ return color
+ }
+}
+
+export default {
+ COOL_BG_COLOR_COUNT: COOL_BG_COLOR_COUNT,
+ getTuniaoColorList,
+ getRandomColorClass,
+ getRandomCoolBgClass,
+ getBackgroundColorInternalClass,
+ getBackgroundColorStyle,
+ getFontColorInternalClass,
+ getFontColorStyle,
+ colorGradient,
+ hexToRGB,
+ rgbToHex,
+ colorToRGBA
+}
diff --git a/tuniao-ui/libs/function/deepClone.js b/tuniao-ui/libs/function/deepClone.js
new file mode 100644
index 0000000..81f4e42
--- /dev/null
+++ b/tuniao-ui/libs/function/deepClone.js
@@ -0,0 +1,29 @@
+/**
+ * 判断是否为数组
+ *
+ * @param {Object} arr
+ */
+function isArray(arr) {
+ return Object.prototype.toString.call(arr) === '[object Array]'
+}
+
+/**
+ * 深度复制数据
+ *
+ * @param {Object} obj
+ */
+function deepClone(obj) {
+ if ([null, undefined, NaN, false].includes(obj)) return obj
+ if (typeof obj !== 'object' && typeof obj !== 'function') {
+ return obj
+ }
+ var o = isArray(obj) ? [] : {}
+ for (let i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ o[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
+ }
+ }
+ return o
+}
+
+export default deepClone
\ No newline at end of file
diff --git a/tuniao-ui/libs/function/message.js b/tuniao-ui/libs/function/message.js
new file mode 100644
index 0000000..113cc0f
--- /dev/null
+++ b/tuniao-ui/libs/function/message.js
@@ -0,0 +1,74 @@
+/**
+ * 弹出系统内置的toast
+ */
+function toast(title, mask = false, cb = null, icon = 'none', duration = 1500) {
+ uni.showToast({
+ title: title,
+ icon: icon,
+ mask: mask,
+ duration: duration,
+ success: () => {
+ setTimeout(() => {
+ cb && cb()
+ }, duration)
+ }
+ })
+}
+
+/**
+ * 弹出内置的加载框
+ */
+function loading(title) {
+ uni.showLoading({
+ title: title,
+ mask: true
+ })
+}
+
+/**
+ * 弹出系统内置的modal
+ */
+function modal(title,
+ content,
+ confirmCb,
+ showCancel = false,
+ cancelCb = null,
+ confirmText = "确定",
+ cancelText = "取消") {
+ uni.showModal({
+ title: title,
+ content: content,
+ showCancel: showCancel,
+ cancelText: cancelText,
+ confirmText: confirmText,
+ success: (res) => {
+ if (res.cancel) {
+ cancelCb && cancelCb()
+ } else if (res.confirm) {
+ confirmCb && confirmCb()
+ }
+ }
+ })
+}
+
+/**
+ * 关闭系统内置toast
+ */
+function closeToast() {
+ uni.hideToast()
+}
+
+/**
+ * 关闭系统内置的加载框
+ */
+function closeLoading() {
+ uni.hideLoading()
+}
+
+export default {
+ toast,
+ loading,
+ modal,
+ closeToast,
+ closeLoading
+}
diff --git a/tuniao-ui/libs/function/number.js b/tuniao-ui/libs/function/number.js
new file mode 100644
index 0000000..ec64ff0
--- /dev/null
+++ b/tuniao-ui/libs/function/number.js
@@ -0,0 +1,128 @@
+/**
+ * 格式化数字字符串
+ * @param {String, Number} value 待格式化的字符串
+ * @param {Number} digits 保留位数
+ */
+function formatNumberString(value, digits = 2) {
+ let number = 0
+ // 判断是什么类型
+ if (typeof value === 'string') {
+ number = Number(value)
+ } else if (typeof value === 'number') {
+ number = value
+ }
+ if (isNaN(number) || number === 0) {
+ return 0
+ }
+
+ let maxNumber = Math.pow(10, digits) - 1
+ if (number > maxNumber) {
+ return `${maxNumber}+`
+ }
+
+ return number
+}
+
+/**
+ * 格式化数字字符串,往数字前添加0
+ *
+ * @param {Object} num 待格式化的数值
+ */
+function formatNumberAddZero(value) {
+ let number = 0
+ // 判断是什么类型
+ if (typeof value === 'string') {
+ number = Number(value)
+ } else if (typeof value === 'number') {
+ number = value
+ }
+ if (isNaN(number) || +number < 10) {
+ return '0' + number
+ } else {
+ return String(number)
+ }
+
+}
+
+/**
+ * 格式化数字,往数值后添加单位
+ *
+ * @param {Object} value 待格式化的数值
+ * @param {Object} digits 保留位数
+ */
+function formatNumberAddPriceUnit(value, digits = 2) {
+ // 数值分割点
+ const unitSplit = [
+ { value: 1, symbol: ''},
+ { value: 1E3, symbol: 'K'},
+ { value: 1E4, symbol: 'W'},
+ ]
+
+ const reg = /\.0+$|(\.[0=9]*[1-9])0+$/
+
+ let number = 0
+ // 判断是什么类型
+ if (typeof value === 'string') {
+ number = Number(value)
+ } else if (typeof value === 'number') {
+ number = value
+ }
+
+ let i
+ for (i = unitSplit.length - 1; i > 0; i--) {
+ if (number >= unitSplit[i].value) break
+ }
+ return (number / unitSplit[i].value).toFixed(digits).replace(reg, "$1") + unitSplit[i].symbol
+}
+
+/**
+ * 获取数值的整数位数
+ *
+ * @param {Object} number 数值
+ */
+function getDigit(number) {
+ let digit = -1
+ while (number >= 1) {
+ digit++
+ number = number / 10
+ }
+ return digit
+}
+
+/**
+ * 获取指定范围的随机数(返回整数)
+
+ * @param {Object} min 最小值
+ * @param {Object} max 最大值
+ */
+function random(min, max) {
+ if (min >= 0 && max > 0 && max >= min) {
+ let gab = max - min
+ return Math.random() * gab + min
+ } else {
+ return 0
+ }
+}
+
+/**
+ * 获取指定范围的随机数(返回整数)
+
+ * @param {Object} min 最小值
+ * @param {Object} max 最大值
+ */
+function randomInt(min, max) {
+ if (min >= 0 && max > 0 && max >= min) {
+ let gab = max - min + 1
+ return Math.floor(Math.random() * gab + min)
+ } else {
+ return 0
+ }
+}
+
+export default {
+ formatNumberString,
+ formatNumberAddZero,
+ formatNumberAddPriceUnit,
+ random,
+ randomInt
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/function/string.js b/tuniao-ui/libs/function/string.js
new file mode 100644
index 0000000..dadc24c
--- /dev/null
+++ b/tuniao-ui/libs/function/string.js
@@ -0,0 +1,69 @@
+/**
+ * 去掉字符串中空格
+ *
+ * @param {String} str 待处理的字符串
+ * @param {String} type 处理类型
+ */
+function trim(str, type = 'both') {
+ if (type === 'both') {
+ return str.replace(/^\s+|\s+$/g, "")
+ } else if (type === 'left') {
+ return str.replace(/^\s*/g, "")
+ } else if (type === 'right') {
+ return str.replace(/(\s*$)/g, "")
+ } else if (type === 'all') {
+ return str.replace(/\s+/g, "")
+ } else {
+ return str
+ }
+}
+
+/**
+ * 获取带单位的长度值
+ *
+ * @param {String} value 待处理的值
+ * @param {String} unit 单位
+ */
+function getLengthUnitValue(value, unit = 'rpx') {
+ if (!value) {
+ return ''
+ }
+ if (/(%|px|rpx|auto)$/.test(value)) return value
+ else return value + unit
+}
+
+/**
+ * 将驼峰命名的字符串转换为指定连接符来进行连接
+ *
+ * @param {Object} string 待转换的字符串
+ * @param {Object} replace 进行连接的字符
+ */
+function humpConvertChar(string, replace = '_') {
+ if (!string || !replace) {
+ return ''
+ }
+ return string.replace(/([A-Z])/g, `${replace}$1`).toLowerCase()
+}
+
+/**
+ * 将用指定连接符来进行连接的字符串转为驼峰命名的字符串
+ *
+ * @param {Object} string 待转换的字符串
+ * @param {Object} replace 进行连接的字符
+ */
+function charConvertHump(string, replace = '_') {
+ if (!string || !replace) {
+ return ''
+ }
+ let reg = RegExp(replace + "(\\w)", "g")
+ return string.replace(reg, function(all, letter) {
+ return letter.toUpperCase()
+ })
+}
+
+export default {
+ trim,
+ getLengthUnitValue,
+ humpConvertChar,
+ charConvertHump
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/function/test.js b/tuniao-ui/libs/function/test.js
new file mode 100644
index 0000000..94fddac
--- /dev/null
+++ b/tuniao-ui/libs/function/test.js
@@ -0,0 +1,232 @@
+/**
+ * 验证电子邮箱格式
+ */
+function email(value) {
+ return /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/.test(value);
+}
+
+/**
+ * 验证手机格式
+ */
+function mobile(value) {
+ return /^1[3-9]\d{9}$/.test(value)
+}
+
+/**
+ * 验证URL格式
+ */
+function url(value) {
+ return /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/.test(value)
+}
+
+/**
+ * 验证日期格式
+ */
+function date(value) {
+ return !/Invalid|NaN/.test(new Date(value).toString())
+}
+
+/**
+ * 验证ISO类型的日期格式
+ */
+function dateISO(value) {
+ return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
+}
+
+/**
+ * 验证十进制数字
+ */
+function number(value) {
+ return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
+}
+
+/**
+ * 验证整数
+ */
+function digits(value) {
+ return /^\d+$/.test(value)
+}
+
+/**
+ * 验证身份证号码
+ */
+function idCard(value) {
+ return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
+ value)
+}
+
+/**
+ * 是否车牌号
+ */
+function carNo(value) {
+ // 新能源车牌
+ const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
+ // 旧车牌
+ const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+ if (value.length === 7) {
+ return creg.test(value);
+ } else if (value.length === 8) {
+ return xreg.test(value);
+ } else {
+ return false;
+ }
+}
+
+/**
+ * 金额,只允许2位小数
+ */
+function amount(value) {
+ //金额,只允许保留两位小数
+ return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value);
+}
+
+/**
+ * 中文
+ */
+function chinese(value) {
+ let reg = /^[\u4e00-\u9fa5]+$/gi;
+ return reg.test(value);
+}
+
+/**
+ * 只能输入字母
+ */
+function letter(value) {
+ return /^[a-zA-Z]*$/.test(value);
+}
+
+/**
+ * 只能是字母或者数字
+ */
+function enOrNum(value) {
+ //英文或者数字
+ let reg = /^[0-9a-zA-Z]*$/g;
+ return reg.test(value);
+}
+
+/**
+ * 验证是否包含某个值
+ */
+function contains(value, param) {
+ return value.indexOf(param) >= 0
+}
+
+/**
+ * 验证一个值范围[min, max]
+ */
+function range(value, param) {
+ return value >= param[0] && value <= param[1]
+}
+
+/**
+ * 验证一个长度范围[min, max]
+ */
+function rangeLength(value, param) {
+ return value.length >= param[0] && value.length <= param[1]
+}
+
+/**
+ * 是否固定电话
+ */
+function landline(value) {
+ let reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
+ return reg.test(value);
+}
+
+/**
+ * 判断是否为空
+ */
+function empty(value) {
+ switch (typeof value) {
+ case 'undefined':
+ return true;
+ case 'string':
+ if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true;
+ break;
+ case 'boolean':
+ if (!value) return true;
+ break;
+ case 'number':
+ if (0 === value || isNaN(value)) return true;
+ break;
+ case 'object':
+ if (null === value || value.length === 0) return true;
+ for (var i in value) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+}
+
+/**
+ * 是否json字符串
+ */
+function jsonString(value) {
+ if (typeof value == 'string') {
+ try {
+ var obj = JSON.parse(value);
+ if (typeof obj == 'object' && obj) {
+ return true;
+ } else {
+ return false;
+ }
+ } catch (e) {
+ return false;
+ }
+ }
+ return false;
+}
+
+
+/**
+ * 是否数组
+ */
+function array(value) {
+ if (typeof Array.isArray === "function") {
+ return Array.isArray(value);
+ } else {
+ return Object.prototype.toString.call(value) === "[object Array]";
+ }
+}
+
+/**
+ * 是否对象
+ */
+function object(value) {
+ return Object.prototype.toString.call(value) === '[object Object]';
+}
+
+/**
+ * 是否短信验证码
+ */
+function code(value, len = 6) {
+ return new RegExp(`^\\d{${len}}$`).test(value);
+}
+
+
+export default {
+ email,
+ mobile,
+ url,
+ date,
+ dateISO,
+ number,
+ digits,
+ idCard,
+ carNo,
+ amount,
+ chinese,
+ letter,
+ enOrNum,
+ contains,
+ range,
+ rangeLength,
+ empty,
+ isEmpty: empty,
+ jsonString,
+ landline,
+ object,
+ array,
+ code
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/function/updateCustomBarInfo.js b/tuniao-ui/libs/function/updateCustomBarInfo.js
new file mode 100644
index 0000000..eae9f45
--- /dev/null
+++ b/tuniao-ui/libs/function/updateCustomBarInfo.js
@@ -0,0 +1,44 @@
+/**
+ * 更新自定义顶部导航栏的高度
+ */
+function updateCustomBarInfo () {
+ return new Promise((resolve, reject) => {
+ uni.getSystemInfo({
+ success: (e) => {
+ let statusBarHeight = 0
+ let customBarHeight = 0
+ // #ifndef MP
+ statusBarHeight = e.statusBarHeight
+ if (e.platform == 'android') {
+ customBarHeight = e.statusBarHeight + 50
+ } else {
+ customBarHeight = e.statusBarHeight + 45
+ };
+ // #endif
+
+ // #ifdef MP-WEIXIN
+ statusBarHeight = e.statusBarHeight
+ let custom = wx.getMenuButtonBoundingClientRect()
+ customBarHeight = custom.bottom + ((custom.top - e.statusBarHeight) <= 4 ? (custom.top - e
+ .statusBarHeight) + 4 : (custom.top - e.statusBarHeight))
+ // #endif
+
+ // #ifdef MP-ALIPAY
+ statusBarHeight = e.statusBarHeight
+ customBarHeight = e.statusBarHeight + e.titleBarHeight
+ // #endif
+ resolve({
+ statusBarHeight,
+ customBarHeight
+ })
+ },
+ fail: (err) => {
+ console.log("获取设备信息失败", err);
+ reject()
+ }
+ })
+
+ })
+}
+
+export default updateCustomBarInfo
diff --git a/tuniao-ui/libs/function/uuid.js b/tuniao-ui/libs/function/uuid.js
new file mode 100644
index 0000000..e3cf39e
--- /dev/null
+++ b/tuniao-ui/libs/function/uuid.js
@@ -0,0 +1,41 @@
+/**
+ * 本算法来源于简书开源代码,详见:https://www.jianshu.com/p/fdbf293d0a85
+ * 全局唯一标识符(uuid,Globally Unique Identifier),也称作 uuid(Universally Unique IDentifier)
+ * 一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题
+ * 最可能的情况是左滑删除item或者对某条信息流"不喜欢"并去掉它的时候,会导致组件内的数据可能出现错乱
+ * v-for的时候,推荐使用后端返回的id而不是循环的index
+ * @param {Number} len uuid的长度
+ * @param {Boolean} firstT 将返回的首字母置为"t"
+ * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
+ */
+function uuid(len = 32, firstT = true, radix = null) {
+ let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
+ let uuid = []
+ radix = radix || chars.length
+
+ if (len) {
+ // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
+ for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
+ } else {
+ let r;
+ // rfc4122标准要求返回的uuid中,某些位为固定的字符
+ uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
+ uuid[14] = '4'
+
+ for (let i = 0; i < 36; i++) {
+ if (!uuid[i]) {
+ r = 0 | Math.random() * 16
+ uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
+ }
+ }
+ }
+ // 移除第一个字符,并用t替代,因为第一个字符为数值时,该uuid不能用作id或者class
+ if (firstT) {
+ uuid.shift()
+ return 't' + uuid.join('')
+ } else {
+ return uuid.join('')
+ }
+}
+
+export default uuid
\ No newline at end of file
diff --git a/tuniao-ui/libs/luch-request/adapters/index.js b/tuniao-ui/libs/luch-request/adapters/index.js
new file mode 100644
index 0000000..5a478b5
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/adapters/index.js
@@ -0,0 +1,99 @@
+import buildURL from '../helpers/buildURL'
+import buildFullPath from '../core/buildFullPath'
+import settle from '../core/settle'
+import { isUndefined } from "../utils"
+
+/**
+ * 返回可选值存在的配置
+ * @param {Array} keys - 可选值数组
+ * @param {Object} config2 - 配置
+ * @return {{}} - 存在的配置项
+ */
+const mergeKeys = (keys, config2) => {
+ let config = {}
+ keys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ }
+ })
+ return config
+}
+export default (config) => {
+ return new Promise((resolve, reject) => {
+ let fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)
+ const _config = {
+ url: fullPath,
+ header: config.header,
+ complete: (response) => {
+ config.fullPath = fullPath
+ response.config = config
+ try {
+ // 对可能字符串不是json 的情况容错
+ if (typeof response.data === 'string') {
+ response.data = JSON.parse(response.data)
+ }
+ // eslint-disable-next-line no-empty
+ } catch (e) {
+ }
+ settle(resolve, reject, response)
+ }
+ }
+ let requestTask
+ if (config.method === 'UPLOAD') {
+ delete _config.header['content-type']
+ delete _config.header['Content-Type']
+ let otherConfig = {
+ // #ifdef MP-ALIPAY
+ fileType: config.fileType,
+ // #endif
+ filePath: config.filePath,
+ name: config.name
+ }
+ const optionalKeys = [
+ // #ifdef APP-PLUS || H5
+ 'files',
+ // #endif
+ // #ifdef H5
+ 'file',
+ // #endif
+ // #ifdef H5 || APP-PLUS
+ 'timeout',
+ // #endif
+ 'formData'
+ ]
+ requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)})
+ } else if (config.method === 'DOWNLOAD') {
+ // #ifdef H5 || APP-PLUS
+ if (!isUndefined(config['timeout'])) {
+ _config['timeout'] = config['timeout']
+ }
+ // #endif
+ requestTask = uni.downloadFile(_config)
+ } else {
+ const optionalKeys = [
+ 'data',
+ 'method',
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ 'timeout',
+ // #endif
+ 'dataType',
+ // #ifndef MP-ALIPAY
+ 'responseType',
+ // #endif
+ // #ifdef APP-PLUS
+ 'sslVerify',
+ // #endif
+ // #ifdef H5
+ 'withCredentials',
+ // #endif
+ // #ifdef APP-PLUS
+ 'firstIpv4',
+ // #endif
+ ]
+ requestTask = uni.request({..._config,...mergeKeys(optionalKeys, config)})
+ }
+ if (config.getTask) {
+ config.getTask(requestTask, config)
+ }
+ })
+}
diff --git a/tuniao-ui/libs/luch-request/core/InterceptorManager.js b/tuniao-ui/libs/luch-request/core/InterceptorManager.js
new file mode 100644
index 0000000..3ea0d5e
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/core/InterceptorManager.js
@@ -0,0 +1,51 @@
+'use strict'
+
+
+function InterceptorManager() {
+ this.handlers = []
+}
+
+/**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+InterceptorManager.prototype.use = function use(fulfilled, rejected) {
+ this.handlers.push({
+ fulfilled: fulfilled,
+ rejected: rejected
+ })
+ return this.handlers.length - 1
+}
+
+/**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ */
+InterceptorManager.prototype.eject = function eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null
+ }
+}
+
+/**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ */
+InterceptorManager.prototype.forEach = function forEach(fn) {
+ this.handlers.forEach(h => {
+ if (h !== null) {
+ fn(h)
+ }
+ })
+}
+
+export default InterceptorManager
diff --git a/tuniao-ui/libs/luch-request/core/Request.js b/tuniao-ui/libs/luch-request/core/Request.js
new file mode 100644
index 0000000..43bb14c
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/core/Request.js
@@ -0,0 +1,200 @@
+/**
+ * @Class Request
+ * @description luch-request http请求插件
+ * @version 3.0.7
+ * @Author lu-ch
+ * @Date 2021-09-04
+ * @Email webwork.s@qq.com
+ * 文档: https://www.quanzhan.co/luch-request/
+ * github: https://github.com/lei-mu/luch-request
+ * DCloud: http://ext.dcloud.net.cn/plugin?id=392
+ * HBuilderX: beat-3.0.4 alpha-3.0.4
+ */
+
+
+import dispatchRequest from './dispatchRequest'
+import InterceptorManager from './InterceptorManager'
+import mergeConfig from './mergeConfig'
+import defaults from './defaults'
+import { isPlainObject } from '../utils'
+import clone from '../utils/clone'
+
+export default class Request {
+ /**
+ * @param {Object} arg - 全局配置
+ * @param {String} arg.baseURL - 全局根路径
+ * @param {Object} arg.header - 全局header
+ * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式
+ * @param {String} arg.dataType = [json] - 全局默认的dataType
+ * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持
+ * @param {Object} arg.custom - 全局默认的自定义参数
+ * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
+ * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)
+ * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)
+ * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
+ * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
+ */
+ constructor(arg = {}) {
+ if (!isPlainObject(arg)) {
+ arg = {}
+ console.warn('设置全局参数必须接收一个Object')
+ }
+ this.config = clone({...defaults, ...arg})
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ }
+ }
+
+ /**
+ * @Function
+ * @param {Request~setConfigCallback} f - 设置全局默认配置
+ */
+ setConfig(f) {
+ this.config = f(this.config)
+ }
+
+ middleware(config) {
+ config = mergeConfig(this.config, config)
+ let chain = [dispatchRequest, undefined]
+ let promise = Promise.resolve(config)
+
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ chain.unshift(interceptor.fulfilled, interceptor.rejected)
+ })
+
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ chain.push(interceptor.fulfilled, interceptor.rejected)
+ })
+
+ while (chain.length) {
+ promise = promise.then(chain.shift(), chain.shift())
+ }
+
+ return promise
+ }
+
+ /**
+ * @Function
+ * @param {Object} config - 请求配置项
+ * @prop {String} options.url - 请求路径
+ * @prop {Object} options.data - 请求参数
+ * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
+ * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
+ * @prop {Object} [options.header = config.header] - 请求header
+ * @prop {Object} [options.method = config.method] - 请求方法
+ * @returns {Promise}
+ */
+ request(config = {}) {
+ return this.middleware(config)
+ }
+
+ get(url, options = {}) {
+ return this.middleware({
+ url,
+ method: 'GET',
+ ...options
+ })
+ }
+
+ post(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'POST',
+ ...options
+ })
+ }
+
+ // #ifndef MP-ALIPAY
+ put(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'PUT',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+ delete(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'DELETE',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN
+ connect(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'CONNECT',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN || MP-BAIDU
+ head(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'HEAD',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+ options(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'OPTIONS',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN
+ trace(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'TRACE',
+ ...options
+ })
+ }
+
+ // #endif
+
+ upload(url, config = {}) {
+ config.url = url
+ config.method = 'UPLOAD'
+ return this.middleware(config)
+ }
+
+ download(url, config = {}) {
+ config.url = url
+ config.method = 'DOWNLOAD'
+ return this.middleware(config)
+ }
+}
+
+
+/**
+ * setConfig回调
+ * @return {Object} - 返回操作后的config
+ * @callback Request~setConfigCallback
+ * @param {Object} config - 全局默认config
+ */
diff --git a/tuniao-ui/libs/luch-request/core/buildFullPath.js b/tuniao-ui/libs/luch-request/core/buildFullPath.js
new file mode 100644
index 0000000..f2852f4
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/core/buildFullPath.js
@@ -0,0 +1,20 @@
+'use strict'
+
+import isAbsoluteURL from '../helpers/isAbsoluteURL'
+import combineURLs from '../helpers/combineURLs'
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ * @returns {string} The combined full path
+ */
+export default function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL)
+ }
+ return requestedURL
+}
diff --git a/tuniao-ui/libs/luch-request/core/defaults.js b/tuniao-ui/libs/luch-request/core/defaults.js
new file mode 100644
index 0000000..38afc3a
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/core/defaults.js
@@ -0,0 +1,30 @@
+/**
+ * 默认的全局配置
+ */
+
+
+export default {
+ baseURL: '',
+ header: {},
+ method: 'GET',
+ dataType: 'json',
+ // #ifndef MP-ALIPAY
+ responseType: 'text',
+ // #endif
+ custom: {},
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ timeout: 60000,
+ // #endif
+ // #ifdef APP-PLUS
+ sslVerify: true,
+ // #endif
+ // #ifdef H5
+ withCredentials: false,
+ // #endif
+ // #ifdef APP-PLUS
+ firstIpv4: false,
+ // #endif
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300
+ }
+}
diff --git a/tuniao-ui/libs/luch-request/core/dispatchRequest.js b/tuniao-ui/libs/luch-request/core/dispatchRequest.js
new file mode 100644
index 0000000..c5f2c85
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/core/dispatchRequest.js
@@ -0,0 +1,6 @@
+import adapter from '../adapters/index'
+
+
+export default (config) => {
+ return adapter(config)
+}
diff --git a/tuniao-ui/libs/luch-request/core/mergeConfig.js b/tuniao-ui/libs/luch-request/core/mergeConfig.js
new file mode 100644
index 0000000..a3ccbf7
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/core/mergeConfig.js
@@ -0,0 +1,103 @@
+import {deepMerge, isUndefined} from '../utils'
+
+/**
+ * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局
+ * @param {Array} keys - 配置项
+ * @param {Object} globalsConfig - 当前的全局配置
+ * @param {Object} config2 - 局部配置
+ * @return {{}}
+ */
+const mergeKeys = (keys, globalsConfig, config2) => {
+ let config = {}
+ keys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ } else if (!isUndefined(globalsConfig[prop])) {
+ config[prop] = globalsConfig[prop]
+ }
+ })
+ return config
+}
+/**
+ *
+ * @param globalsConfig - 当前实例的全局配置
+ * @param config2 - 当前的局部配置
+ * @return - 合并后的配置
+ */
+export default (globalsConfig, config2 = {}) => {
+ const method = config2.method || globalsConfig.method || 'GET'
+ let config = {
+ baseURL: globalsConfig.baseURL || '',
+ method: method,
+ url: config2.url || '',
+ params: config2.params || {},
+ custom: {...(globalsConfig.custom || {}), ...(config2.custom || {})},
+ header: deepMerge(globalsConfig.header || {}, config2.header || {})
+ }
+ const defaultToConfig2Keys = ['getTask', 'validateStatus']
+ config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)}
+
+ // eslint-disable-next-line no-empty
+ if (method === 'DOWNLOAD') {
+ // #ifdef H5 || APP-PLUS
+ if (!isUndefined(config2.timeout)) {
+ config['timeout'] = config2['timeout']
+ } else if (!isUndefined(globalsConfig.timeout)) {
+ config['timeout'] = globalsConfig['timeout']
+ }
+ // #endif
+ } else if (method === 'UPLOAD') {
+ delete config.header['content-type']
+ delete config.header['Content-Type']
+ const uploadKeys = [
+ // #ifdef APP-PLUS || H5
+ 'files',
+ // #endif
+ // #ifdef MP-ALIPAY
+ 'fileType',
+ // #endif
+ // #ifdef H5
+ 'file',
+ // #endif
+ 'filePath',
+ 'name',
+ // #ifdef H5 || APP-PLUS
+ 'timeout',
+ // #endif
+ 'formData',
+ ]
+ uploadKeys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ }
+ })
+ // #ifdef H5 || APP-PLUS
+ if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
+ config['timeout'] = globalsConfig['timeout']
+ }
+ // #endif
+ } else {
+ const defaultsKeys = [
+ 'data',
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ 'timeout',
+ // #endif
+ 'dataType',
+ // #ifndef MP-ALIPAY
+ 'responseType',
+ // #endif
+ // #ifdef APP-PLUS
+ 'sslVerify',
+ // #endif
+ // #ifdef H5
+ 'withCredentials',
+ // #endif
+ // #ifdef APP-PLUS
+ 'firstIpv4',
+ // #endif
+ ]
+ config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)}
+ }
+
+ return config
+}
diff --git a/tuniao-ui/libs/luch-request/core/settle.js b/tuniao-ui/libs/luch-request/core/settle.js
new file mode 100644
index 0000000..b2f1659
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/core/settle.js
@@ -0,0 +1,16 @@
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ */
+export default function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus
+ const status = response.statusCode
+ if (status && (!validateStatus || validateStatus(status))) {
+ resolve(response)
+ } else {
+ reject(response)
+ }
+}
diff --git a/tuniao-ui/libs/luch-request/helpers/buildURL.js b/tuniao-ui/libs/luch-request/helpers/buildURL.js
new file mode 100644
index 0000000..d26dc30
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/helpers/buildURL.js
@@ -0,0 +1,69 @@
+'use strict'
+
+import * as utils from './../utils'
+
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%40/gi, '@').
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']')
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @returns {string} The formatted url
+ */
+export default function buildURL(url, params) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url
+ }
+
+ var serializedParams
+ if (utils.isURLSearchParams(params)) {
+ serializedParams = params.toString()
+ } else {
+ var parts = []
+
+ utils.forEach(params, function serialize(val, key) {
+ if (val === null || typeof val === 'undefined') {
+ return
+ }
+
+ if (utils.isArray(val)) {
+ key = key + '[]'
+ } else {
+ val = [val]
+ }
+
+ utils.forEach(val, function parseValue(v) {
+ if (utils.isDate(v)) {
+ v = v.toISOString()
+ } else if (utils.isObject(v)) {
+ v = JSON.stringify(v)
+ }
+ parts.push(encode(key) + '=' + encode(v))
+ })
+ })
+
+ serializedParams = parts.join('&')
+ }
+
+ if (serializedParams) {
+ var hashmarkIndex = url.indexOf('#')
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex)
+ }
+
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
+ }
+
+ return url
+}
diff --git a/tuniao-ui/libs/luch-request/helpers/combineURLs.js b/tuniao-ui/libs/luch-request/helpers/combineURLs.js
new file mode 100644
index 0000000..7b9d1ef
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/helpers/combineURLs.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ * @returns {string} The combined URL
+ */
+export default function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL
+}
diff --git a/tuniao-ui/libs/luch-request/helpers/isAbsoluteURL.js b/tuniao-ui/libs/luch-request/helpers/isAbsoluteURL.js
new file mode 100644
index 0000000..2a82517
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/helpers/isAbsoluteURL.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+export default function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
+}
diff --git a/tuniao-ui/libs/luch-request/index.d.ts b/tuniao-ui/libs/luch-request/index.d.ts
new file mode 100644
index 0000000..e939ce1
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/index.d.ts
@@ -0,0 +1,116 @@
+type AnyObject = Record
+type HttpPromise = Promise>;
+type Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask
+export interface RequestTask {
+ abort: () => void;
+ offHeadersReceived: () => void;
+ onHeadersReceived: () => void;
+}
+export interface HttpRequestConfig {
+ /** 请求基地址 */
+ baseURL?: string;
+ /** 请求服务器接口地址 */
+ url?: string;
+
+ /** 请求查询参数,自动拼接为查询字符串 */
+ params?: AnyObject;
+ /** 请求体参数 */
+ data?: AnyObject;
+
+ /** 文件对应的 key */
+ name?: string;
+ /** HTTP 请求中其他额外的 form data */
+ formData?: AnyObject;
+ /** 要上传文件资源的路径。 */
+ filePath?: string;
+ /** 需要上传的文件列表。使用 files 时,filePath 和 name 不生效,App、H5( 2.6.15+) */
+ files?: Array<{
+ name?: string;
+ file?: File;
+ uri: string;
+ }>;
+ /** 要上传的文件对象,仅H5(2.6.15+)支持 */
+ file?: File;
+
+ /** 请求头信息 */
+ header?: AnyObject;
+ /** 请求方式 */
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "CONNECT" | "HEAD" | "OPTIONS" | "TRACE" | "UPLOAD" | "DOWNLOAD";
+ /** 如果设为 json,会尝试对返回的数据做一次 JSON.parse */
+ dataType?: string;
+ /** 设置响应的数据类型,支付宝小程序不支持 */
+ responseType?: "text" | "arraybuffer";
+ /** 自定义参数 */
+ custom?: AnyObject;
+ /** 超时时间,仅微信小程序(2.10.0)、支付宝小程序支持 */
+ timeout?: number;
+ /** DNS解析时优先使用ipv4,仅 App-Android 支持 (HBuilderX 2.8.0+) */
+ firstIpv4?: boolean;
+ /** 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+) */
+ sslVerify?: boolean;
+ /** 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) */
+ withCredentials?: boolean;
+
+ /** 返回当前请求的task, options。请勿在此处修改options。 */
+ getTask?: (task: T, options: HttpRequestConfig) => void;
+ /** 全局自定义验证器 */
+ validateStatus?: (statusCode: number) => boolean | void;
+}
+export interface HttpResponse {
+ config: HttpRequestConfig;
+ statusCode: number;
+ cookies: Array;
+ data: T;
+ errMsg: string;
+ header: AnyObject;
+}
+export interface HttpUploadResponse {
+ config: HttpRequestConfig;
+ statusCode: number;
+ data: T;
+ errMsg: string;
+}
+export interface HttpDownloadResponse extends HttpResponse {
+ tempFilePath: string;
+}
+export interface HttpError {
+ config: HttpRequestConfig;
+ statusCode?: number;
+ cookies?: Array;
+ data?: any;
+ errMsg: string;
+ header?: AnyObject;
+}
+export interface HttpInterceptorManager {
+ use(
+ onFulfilled?: (config: V) => Promise | V,
+ onRejected?: (config: E) => Promise | E
+ ): void;
+ eject(id: number): void;
+}
+export abstract class HttpRequestAbstract {
+ constructor(config?: HttpRequestConfig);
+ config: HttpRequestConfig;
+ interceptors: {
+ request: HttpInterceptorManager;
+ response: HttpInterceptorManager;
+ }
+ middleware(config: HttpRequestConfig): HttpPromise;
+ request(config: HttpRequestConfig): HttpPromise;
+ get(url: string, config?: HttpRequestConfig): HttpPromise;
+ upload(url: string, config?: HttpRequestConfig): HttpPromise;
+ delete(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ head(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ post(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ put(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ connect(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ options(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ trace(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+
+ download(url: string, config?: HttpRequestConfig): Promise;
+
+ setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void;
+}
+
+declare class HttpRequest extends HttpRequestAbstract { }
+export default HttpRequest;
diff --git a/tuniao-ui/libs/luch-request/index.js b/tuniao-ui/libs/luch-request/index.js
new file mode 100644
index 0000000..d8fe348
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/index.js
@@ -0,0 +1,2 @@
+import Request from './core/Request'
+export default Request
diff --git a/tuniao-ui/libs/luch-request/utils.js b/tuniao-ui/libs/luch-request/utils.js
new file mode 100644
index 0000000..0b5bf21
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/utils.js
@@ -0,0 +1,135 @@
+'use strict'
+
+// utils is a library of generic helper functions non-specific to axios
+
+var toString = Object.prototype.toString
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+export function isArray (val) {
+ return toString.call(val) === '[object Array]'
+}
+
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+export function isObject (val) {
+ return val !== null && typeof val === 'object'
+}
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+export function isDate (val) {
+ return toString.call(val) === '[object Date]'
+}
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+export function isURLSearchParams (val) {
+ return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams
+}
+
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ */
+export function forEach (obj, fn) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return
+ }
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj]
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (var i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj)
+ }
+ } else {
+ // Iterate over object keys
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ fn.call(null, obj[key], key, obj)
+ }
+ }
+ }
+}
+
+/**
+ * 是否为boolean 值
+ * @param val
+ * @returns {boolean}
+ */
+export function isBoolean(val) {
+ return typeof val === 'boolean'
+}
+
+/**
+ * 是否为真正的对象{} new Object
+ * @param {any} obj - 检测的对象
+ * @returns {boolean}
+ */
+export function isPlainObject(obj) {
+ return Object.prototype.toString.call(obj) === '[object Object]'
+}
+
+
+
+/**
+ * Function equal to merge with the difference being that no reference
+ * to original objects is kept.
+ *
+ * @see merge
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+export function deepMerge(/* obj1, obj2, obj3, ... */) {
+ let result = {}
+ function assignValue(val, key) {
+ if (typeof result[key] === 'object' && typeof val === 'object') {
+ result[key] = deepMerge(result[key], val)
+ } else if (typeof val === 'object') {
+ result[key] = deepMerge({}, val)
+ } else {
+ result[key] = val
+ }
+ }
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ forEach(arguments[i], assignValue)
+ }
+ return result
+}
+
+export function isUndefined (val) {
+ return typeof val === 'undefined'
+}
diff --git a/tuniao-ui/libs/luch-request/utils/clone.js b/tuniao-ui/libs/luch-request/utils/clone.js
new file mode 100644
index 0000000..2fee704
--- /dev/null
+++ b/tuniao-ui/libs/luch-request/utils/clone.js
@@ -0,0 +1,264 @@
+/* eslint-disable */
+var clone = (function() {
+ 'use strict';
+
+ function _instanceof(obj, type) {
+ return type != null && obj instanceof type;
+ }
+
+ var nativeMap;
+ try {
+ nativeMap = Map;
+ } catch(_) {
+ // maybe a reference error because no `Map`. Give it a dummy value that no
+ // value will ever be an instanceof.
+ nativeMap = function() {};
+ }
+
+ var nativeSet;
+ try {
+ nativeSet = Set;
+ } catch(_) {
+ nativeSet = function() {};
+ }
+
+ var nativePromise;
+ try {
+ nativePromise = Promise;
+ } catch(_) {
+ nativePromise = function() {};
+ }
+
+ /**
+ * Clones (copies) an Object using deep copying.
+ *
+ * This function supports circular references by default, but if you are certain
+ * there are no circular references in your object, you can save some CPU time
+ * by calling clone(obj, false).
+ *
+ * Caution: if `circular` is false and `parent` contains circular references,
+ * your program may enter an infinite loop and crash.
+ *
+ * @param `parent` - the object to be cloned
+ * @param `circular` - set to true if the object to be cloned may contain
+ * circular references. (optional - true by default)
+ * @param `depth` - set to a number if the object is only to be cloned to
+ * a particular depth. (optional - defaults to Infinity)
+ * @param `prototype` - sets the prototype to be used when cloning an object.
+ * (optional - defaults to parent prototype).
+ * @param `includeNonEnumerable` - set to true if the non-enumerable properties
+ * should be cloned as well. Non-enumerable properties on the prototype
+ * chain will be ignored. (optional - false by default)
+ */
+ function clone(parent, circular, depth, prototype, includeNonEnumerable) {
+ if (typeof circular === 'object') {
+ depth = circular.depth;
+ prototype = circular.prototype;
+ includeNonEnumerable = circular.includeNonEnumerable;
+ circular = circular.circular;
+ }
+ // maintain two arrays for circular references, where corresponding parents
+ // and children have the same index
+ var allParents = [];
+ var allChildren = [];
+
+ var useBuffer = typeof Buffer != 'undefined';
+
+ if (typeof circular == 'undefined')
+ circular = true;
+
+ if (typeof depth == 'undefined')
+ depth = Infinity;
+
+ // recurse this function so we don't reset allParents and allChildren
+ function _clone(parent, depth) {
+ // cloning null always returns null
+ if (parent === null)
+ return null;
+
+ if (depth === 0)
+ return parent;
+
+ var child;
+ var proto;
+ if (typeof parent != 'object') {
+ return parent;
+ }
+
+ if (_instanceof(parent, nativeMap)) {
+ child = new nativeMap();
+ } else if (_instanceof(parent, nativeSet)) {
+ child = new nativeSet();
+ } else if (_instanceof(parent, nativePromise)) {
+ child = new nativePromise(function (resolve, reject) {
+ parent.then(function(value) {
+ resolve(_clone(value, depth - 1));
+ }, function(err) {
+ reject(_clone(err, depth - 1));
+ });
+ });
+ } else if (clone.__isArray(parent)) {
+ child = [];
+ } else if (clone.__isRegExp(parent)) {
+ child = new RegExp(parent.source, __getRegExpFlags(parent));
+ if (parent.lastIndex) child.lastIndex = parent.lastIndex;
+ } else if (clone.__isDate(parent)) {
+ child = new Date(parent.getTime());
+ } else if (useBuffer && Buffer.isBuffer(parent)) {
+ if (Buffer.from) {
+ // Node.js >= 5.10.0
+ child = Buffer.from(parent);
+ } else {
+ // Older Node.js versions
+ child = new Buffer(parent.length);
+ parent.copy(child);
+ }
+ return child;
+ } else if (_instanceof(parent, Error)) {
+ child = Object.create(parent);
+ } else {
+ if (typeof prototype == 'undefined') {
+ proto = Object.getPrototypeOf(parent);
+ child = Object.create(proto);
+ }
+ else {
+ child = Object.create(prototype);
+ proto = prototype;
+ }
+ }
+
+ if (circular) {
+ var index = allParents.indexOf(parent);
+
+ if (index != -1) {
+ return allChildren[index];
+ }
+ allParents.push(parent);
+ allChildren.push(child);
+ }
+
+ if (_instanceof(parent, nativeMap)) {
+ parent.forEach(function(value, key) {
+ var keyChild = _clone(key, depth - 1);
+ var valueChild = _clone(value, depth - 1);
+ child.set(keyChild, valueChild);
+ });
+ }
+ if (_instanceof(parent, nativeSet)) {
+ parent.forEach(function(value) {
+ var entryChild = _clone(value, depth - 1);
+ child.add(entryChild);
+ });
+ }
+
+ for (var i in parent) {
+ var attrs = Object.getOwnPropertyDescriptor(parent, i);
+ if (attrs) {
+ child[i] = _clone(parent[i], depth - 1);
+ }
+
+ try {
+ var objProperty = Object.getOwnPropertyDescriptor(parent, i);
+ if (objProperty.set === 'undefined') {
+ // no setter defined. Skip cloning this property
+ continue;
+ }
+ child[i] = _clone(parent[i], depth - 1);
+ } catch(e){
+ if (e instanceof TypeError) {
+ // when in strict mode, TypeError will be thrown if child[i] property only has a getter
+ // we can't do anything about this, other than inform the user that this property cannot be set.
+ continue
+ } else if (e instanceof ReferenceError) {
+ //this may happen in non strict mode
+ continue
+ }
+ }
+
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(parent);
+ for (var i = 0; i < symbols.length; i++) {
+ // Don't need to worry about cloning a symbol because it is a primitive,
+ // like a number or string.
+ var symbol = symbols[i];
+ var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);
+ if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
+ continue;
+ }
+ child[symbol] = _clone(parent[symbol], depth - 1);
+ Object.defineProperty(child, symbol, descriptor);
+ }
+ }
+
+ if (includeNonEnumerable) {
+ var allPropertyNames = Object.getOwnPropertyNames(parent);
+ for (var i = 0; i < allPropertyNames.length; i++) {
+ var propertyName = allPropertyNames[i];
+ var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);
+ if (descriptor && descriptor.enumerable) {
+ continue;
+ }
+ child[propertyName] = _clone(parent[propertyName], depth - 1);
+ Object.defineProperty(child, propertyName, descriptor);
+ }
+ }
+
+ return child;
+ }
+
+ return _clone(parent, depth);
+ }
+
+ /**
+ * Simple flat clone using prototype, accepts only objects, usefull for property
+ * override on FLAT configuration object (no nested props).
+ *
+ * USE WITH CAUTION! This may not behave as you wish if you do not know how this
+ * works.
+ */
+ clone.clonePrototype = function clonePrototype(parent) {
+ if (parent === null)
+ return null;
+
+ var c = function () {};
+ c.prototype = parent;
+ return new c();
+ };
+
+// private utility functions
+
+ function __objToStr(o) {
+ return Object.prototype.toString.call(o);
+ }
+ clone.__objToStr = __objToStr;
+
+ function __isDate(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object Date]';
+ }
+ clone.__isDate = __isDate;
+
+ function __isArray(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object Array]';
+ }
+ clone.__isArray = __isArray;
+
+ function __isRegExp(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
+ }
+ clone.__isRegExp = __isRegExp;
+
+ function __getRegExpFlags(re) {
+ var flags = '';
+ if (re.global) flags += 'g';
+ if (re.ignoreCase) flags += 'i';
+ if (re.multiline) flags += 'm';
+ return flags;
+ }
+ clone.__getRegExpFlags = __getRegExpFlags;
+
+ return clone;
+})();
+
+export default clone
diff --git a/tuniao-ui/libs/mixin/components_color.js b/tuniao-ui/libs/mixin/components_color.js
new file mode 100644
index 0000000..4cda18a
--- /dev/null
+++ b/tuniao-ui/libs/mixin/components_color.js
@@ -0,0 +1,47 @@
+module.exports = {
+ data() {
+
+ },
+ props: {
+ // 背景颜色
+ backgroundColor: {
+ type: String,
+ default: ''
+ },
+ // 字体颜色
+ fontColor: {
+ type: String,
+ default: ''
+ },
+ // 字体大小
+ fontSize: {
+ type: Number,
+ default: 0
+ },
+ // 字体大小单位
+ fontUnit: {
+ type: String,
+ default: 'rpx'
+ }
+ },
+ computed: {
+ backgroundColorStyle() {
+ return this.$tn.color.getBackgroundColorStyle(this.backgroundColor)
+ },
+ backgroundColorClass() {
+ return this.$tn.color.getBackgroundColorInternalClass(this.backgroundColor)
+ },
+ fontColorStyle() {
+ return this.$tn.color.getFontColorStyle(this.fontColor)
+ },
+ fontColorClass() {
+ return this.$tn.color.getFontColorInternalClass(this.fontColor)
+ },
+ fontSizeStyle() {
+ return this.$tn.string.getLengthUnitValue(this.fontSize, this.fontUnit)
+ }
+ },
+ methods: {
+
+ }
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/mixin/mixin.js b/tuniao-ui/libs/mixin/mixin.js
new file mode 100644
index 0000000..1110dde
--- /dev/null
+++ b/tuniao-ui/libs/mixin/mixin.js
@@ -0,0 +1,68 @@
+module.exports = {
+ data() {
+ return {}
+ },
+ onLoad() {
+ // getRect挂载再$t上,用为这个方法需要使用in(this),所以无法把它独立层一个单独的文件导出
+ this.$tn.getRect = this._tGetRect
+ },
+ beforeDestory() {
+ // 判断当前页面是否存在parent和children
+ // 组件销毁时,移除子组件在父组件children数组中的实例,释放资源,避免数据混乱
+ if (this.parent && uni.$tn.test.array(this.parent.children)) {
+ // 组件销毁时,移除子组件在父组件children数组中的实例
+ const childrenList = this.parent.children
+ childrenList.map((child, index) => {
+ // 如果相对,则移除
+ if (child === this) {
+ childrenList.splice(index, 1)
+ }
+ })
+ }
+ },
+ methods: {
+ /**
+ * 查询节点信息
+ * 当前方法在支付宝小程序中无法获取组件跟接点的尺寸
+ * 解决办法:为组件根部再套一个没有任何作用的view元素
+ */
+ _tGetRect(selector, all) {
+ return new Promise((resolve) => {
+ uni.createSelectorQuery()
+ .in(this)[all ? 'selectAll' : 'select'](selector)
+ .boundingClientRect(rect => {
+ if (all && Array.isArray(rect) && rect.length) {
+ resolve(rect)
+ }
+ if (!all && rect) {
+ resolve(rect)
+ }
+ })
+ .exec()
+ })
+ },
+ /**
+ * 获取父组件的数据
+ */
+ getParentData(parentName = '') {
+ // 避免再created中定义parent变量
+ if (!this.parent) this.parent = false
+ // 通过获取父组件实例
+ // 将父组件this中对应的参数,赋值给本组件的parentData对象中对应的属性
+ // 头条小程序不支持通过this.parent.xxx去监听父组件参数的变化,所以需要本方法进行实现
+ this.parent = this.$tn.$parent.call(this, parentName)
+ if (this.parent) {
+ // 遍历parentData中的属性,将parent中同名的属性赋值给parentData
+ Object.keys(this.parentData).map(key => {
+ this.parentData[key] = this.parent[key]
+ })
+ }
+ },
+ /**
+ * 阻止事件冒泡
+ */
+ preventEvent(e) {
+ e && e.stopPropagation && e.stopPropagation()
+ }
+ }
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/mixin/mpShare.js b/tuniao-ui/libs/mixin/mpShare.js
new file mode 100644
index 0000000..b1ae33f
--- /dev/null
+++ b/tuniao-ui/libs/mixin/mpShare.js
@@ -0,0 +1,30 @@
+module.exports = {
+ onLoad() {
+ // 设置默认的转发参数
+ this.$tn.mpShare = {
+ // 分享的标题,默认为小程序名称
+ title: '',
+ // 分享的路径,默认为当前页面
+ path: '',
+ // 分享时显示的图片,默认为当前页面截图
+ imageUrl: '',
+ // 当前页面是否可以分享
+ share: true
+ }
+ if (!this.$tn.mpShare.share) {
+ uni.hideShareMenu()
+ }
+ },
+ onShareAppMessage() {
+ return this.$tn.mpShare
+ },
+ // #ifdef MP-WEIXIN
+ onShareTimeline() {
+ return {
+ title: this.$tn.mpShare.title,
+ query: this.$tn.mpShare.path.substring(this.$tn.mpShare.path.indexOf('?') + 1, this.$tn.mpShare.path.length),
+ imageUrl: this.$tn.mpShare.imageUrl
+ }
+ }
+ // #endif
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/mixin/touch.js b/tuniao-ui/libs/mixin/touch.js
new file mode 100644
index 0000000..a77445f
--- /dev/null
+++ b/tuniao-ui/libs/mixin/touch.js
@@ -0,0 +1,61 @@
+const MIN_DISTANCE = 10
+
+function getDirection(x, y) {
+ if (x > y && x > MIN_DISTANCE) {
+ return 'horizontal'
+ }
+ if (y > x && y > MIN_DISTANCE) {
+ return 'vertical'
+ }
+ return ''
+}
+
+export default {
+ methods: {
+ touchStart(e) {
+ this.resetTouchStatus()
+ const touch = this.getTouchPoint(e)
+ this.startX = touch.x
+ this.startY = touch.y
+ },
+ touchMove(e) {
+ const touch = this.getTouchPoint(e)
+ this.deltaX = touch.x - this.startX
+ this.deltaY = touch.y - this.startY
+ this.offsetX = Math.abs(this.deltaX)
+ this.offsetY = Math.abs(this.deltaY)
+ this.direction = this.direction || getDirection(this.offsetX, this.offsetY)
+ },
+ getTouchPoint(e) {
+ if (!e) {
+ return {
+ x: 0,
+ y: 0
+ }
+ }
+ if (e.touches && e.touches[0]) {
+ return {
+ x: e.touches[0].pageX,
+ y: e.touches[0].pageY
+ }
+ }
+ if (e.changedTouches && e.changedTouches[0]) {
+ return {
+ x: e.changedTouches[0].pageX,
+ y: e.changedTouches[0].pageY
+ }
+ }
+ return {
+ x: e.clientX || 0,
+ y: e.clientY || 0
+ }
+ },
+ resetTouchStatus() {
+ this.direction = ''
+ this.deltaX = 0
+ this.deltaY = 0
+ this.offsetX = 0
+ this.offsetY = 0
+ }
+ }
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/utils/area.js b/tuniao-ui/libs/utils/area.js
new file mode 100644
index 0000000..0d602e9
--- /dev/null
+++ b/tuniao-ui/libs/utils/area.js
@@ -0,0 +1 @@
+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;
\ No newline at end of file
diff --git a/tuniao-ui/libs/utils/async-validator.js b/tuniao-ui/libs/utils/async-validator.js
new file mode 100644
index 0000000..d7215b9
--- /dev/null
+++ b/tuniao-ui/libs/utils/async-validator.js
@@ -0,0 +1,1356 @@
+function _extends() {
+ _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ return _extends.apply(this, arguments);
+}
+
+/* eslint no-console:0 */
+var formatRegExp = /%[sdj%]/g;
+var warning = function warning() {}; // don't print warning message when in production env or node runtime
+
+if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !==
+ 'undefined' && typeof document !== 'undefined') {
+ warning = function warning(type, errors) {
+ if (typeof console !== 'undefined' && console.warn) {
+ if (errors.every(function(e) {
+ return typeof e === 'string';
+ })) {
+ console.warn(type, errors);
+ }
+ }
+ };
+}
+
+function convertFieldsError(errors) {
+ if (!errors || !errors.length) return null;
+ var fields = {};
+ errors.forEach(function(error) {
+ var field = error.field;
+ fields[field] = fields[field] || [];
+ fields[field].push(error);
+ });
+ return fields;
+}
+
+function format() {
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var i = 1;
+ var f = args[0];
+ var len = args.length;
+
+ if (typeof f === 'function') {
+ return f.apply(null, args.slice(1));
+ }
+
+ if (typeof f === 'string') {
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') {
+ return '%';
+ }
+
+ if (i >= len) {
+ return x;
+ }
+
+ switch (x) {
+ case '%s':
+ return String(args[i++]);
+
+ case '%d':
+ return Number(args[i++]);
+
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+
+ break;
+
+ default:
+ return x;
+ }
+ });
+
+ for (var arg = args[i]; i < len; arg = args[++i]) {
+ str += " " + arg;
+ }
+
+ return str;
+ }
+
+ return f;
+}
+
+function isNativeStringType(type) {
+ return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern';
+}
+
+function isEmptyValue(value, type) {
+ if (value === undefined || value === null) {
+ return true;
+ }
+
+ if (type === 'array' && Array.isArray(value) && !value.length) {
+ return true;
+ }
+
+ if (isNativeStringType(type) && typeof value === 'string' && !value) {
+ return true;
+ }
+
+ return false;
+}
+
+function asyncParallelArray(arr, func, callback) {
+ var results = [];
+ var total = 0;
+ var arrLength = arr.length;
+
+ function count(errors) {
+ results.push.apply(results, errors);
+ total++;
+
+ if (total === arrLength) {
+ callback(results);
+ }
+ }
+
+ arr.forEach(function(a) {
+ func(a, count);
+ });
+}
+
+function asyncSerialArray(arr, func, callback) {
+ var index = 0;
+ var arrLength = arr.length;
+
+ function next(errors) {
+ if (errors && errors.length) {
+ callback(errors);
+ return;
+ }
+
+ var original = index;
+ index = index + 1;
+
+ if (original < arrLength) {
+ func(arr[original], next);
+ } else {
+ callback([]);
+ }
+ }
+
+ next([]);
+}
+
+function flattenObjArr(objArr) {
+ var ret = [];
+ Object.keys(objArr).forEach(function(k) {
+ ret.push.apply(ret, objArr[k]);
+ });
+ return ret;
+}
+
+function asyncMap(objArr, option, func, callback) {
+ if (option.first) {
+ var _pending = new Promise(function(resolve, reject) {
+ var next = function next(errors) {
+ callback(errors);
+ return errors.length ? reject({
+ errors: errors,
+ fields: convertFieldsError(errors)
+ }) : resolve();
+ };
+
+ var flattenArr = flattenObjArr(objArr);
+ asyncSerialArray(flattenArr, func, next);
+ });
+
+ _pending["catch"](function(e) {
+ return e;
+ });
+
+ return _pending;
+ }
+
+ var firstFields = option.firstFields || [];
+
+ if (firstFields === true) {
+ firstFields = Object.keys(objArr);
+ }
+
+ var objArrKeys = Object.keys(objArr);
+ var objArrLength = objArrKeys.length;
+ var total = 0;
+ var results = [];
+ var pending = new Promise(function(resolve, reject) {
+ var next = function next(errors) {
+ results.push.apply(results, errors);
+ total++;
+
+ if (total === objArrLength) {
+ callback(results);
+ return results.length ? reject({
+ errors: results,
+ fields: convertFieldsError(results)
+ }) : resolve();
+ }
+ };
+
+ if (!objArrKeys.length) {
+ callback(results);
+ resolve();
+ }
+
+ objArrKeys.forEach(function(key) {
+ var arr = objArr[key];
+
+ if (firstFields.indexOf(key) !== -1) {
+ asyncSerialArray(arr, func, next);
+ } else {
+ asyncParallelArray(arr, func, next);
+ }
+ });
+ });
+ pending["catch"](function(e) {
+ return e;
+ });
+ return pending;
+}
+
+function complementError(rule) {
+ return function(oe) {
+ if (oe && oe.message) {
+ oe.field = oe.field || rule.fullField;
+ return oe;
+ }
+
+ return {
+ message: typeof oe === 'function' ? oe() : oe,
+ field: oe.field || rule.fullField
+ };
+ };
+}
+
+function deepMerge(target, source) {
+ if (source) {
+ for (var s in source) {
+ if (source.hasOwnProperty(s)) {
+ var value = source[s];
+
+ if (typeof value === 'object' && typeof target[s] === 'object') {
+ target[s] = _extends({}, target[s], {}, value);
+ } else {
+ target[s] = value;
+ }
+ }
+ }
+ }
+
+ return target;
+}
+
+/**
+ * Rule for validating required fields.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param source The source object being validated.
+ * @param errors An array of errors that this rule may add
+ * validation errors to.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function required(rule, value, source, errors, options, type) {
+ if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {
+ errors.push(format(options.messages.required, rule.fullField));
+ }
+}
+
+/**
+ * Rule for validating whitespace.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param source The source object being validated.
+ * @param errors An array of errors that this rule may add
+ * validation errors to.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function whitespace(rule, value, source, errors, options) {
+ if (/^\s+$/.test(value) || value === '') {
+ errors.push(format(options.messages.whitespace, rule.fullField));
+ }
+}
+
+/* eslint max-len:0 */
+
+var pattern = {
+ // http://emailregex.com/
+ email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
+ url: new RegExp(
+ "^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$",
+ 'i'),
+ hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
+};
+var types = {
+ integer: function integer(value) {
+ return types.number(value) && parseInt(value, 10) === value;
+ },
+ "float": function float(value) {
+ return types.number(value) && !types.integer(value);
+ },
+ array: function array(value) {
+ return Array.isArray(value);
+ },
+ regexp: function regexp(value) {
+ if (value instanceof RegExp) {
+ return true;
+ }
+
+ try {
+ return !!new RegExp(value);
+ } catch (e) {
+ return false;
+ }
+ },
+ date: function date(value) {
+ return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear ===
+ 'function';
+ },
+ number: function number(value) {
+ if (isNaN(value)) {
+ return false;
+ }
+
+ // 修改源码,将字符串数值先转为数值
+ return typeof +value === 'number';
+ },
+ object: function object(value) {
+ return typeof value === 'object' && !types.array(value);
+ },
+ method: function method(value) {
+ return typeof value === 'function';
+ },
+ email: function email(value) {
+ return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255;
+ },
+ url: function url(value) {
+ return typeof value === 'string' && !!value.match(pattern.url);
+ },
+ hex: function hex(value) {
+ return typeof value === 'string' && !!value.match(pattern.hex);
+ }
+};
+/**
+ * Rule for validating the type of a value.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param source The source object being validated.
+ * @param errors An array of errors that this rule may add
+ * validation errors to.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function type(rule, value, source, errors, options) {
+ if (rule.required && value === undefined) {
+ required(rule, value, source, errors, options);
+ return;
+ }
+
+ var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];
+ var ruleType = rule.type;
+
+ if (custom.indexOf(ruleType) > -1) {
+ if (!types[ruleType](value)) {
+ errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
+ } // straight typeof check
+
+ } else if (ruleType && typeof value !== rule.type) {
+ errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
+ }
+}
+
+/**
+ * Rule for validating minimum and maximum allowed values.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param source The source object being validated.
+ * @param errors An array of errors that this rule may add
+ * validation errors to.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function range(rule, value, source, errors, options) {
+ var len = typeof rule.len === 'number';
+ var min = typeof rule.min === 'number';
+ var max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane)
+
+ var spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+ var val = value;
+ var key = null;
+ var num = typeof value === 'number';
+ var str = typeof value === 'string';
+ var arr = Array.isArray(value);
+
+ if (num) {
+ key = 'number';
+ } else if (str) {
+ key = 'string';
+ } else if (arr) {
+ key = 'array';
+ } // if the value is not of a supported type for range validation
+ // the validation rule rule should use the
+ // type property to also test for a particular type
+
+
+ if (!key) {
+ return false;
+ }
+
+ if (arr) {
+ val = value.length;
+ }
+
+ if (str) {
+ // 处理码点大于U+010000的文字length属性不准确的bug,如"𠮷𠮷𠮷".lenght !== 3
+ val = value.replace(spRegexp, '_').length;
+ }
+
+ if (len) {
+ if (val !== rule.len) {
+ errors.push(format(options.messages[key].len, rule.fullField, rule.len));
+ }
+ } else if (min && !max && val < rule.min) {
+ errors.push(format(options.messages[key].min, rule.fullField, rule.min));
+ } else if (max && !min && val > rule.max) {
+ errors.push(format(options.messages[key].max, rule.fullField, rule.max));
+ } else if (min && max && (val < rule.min || val > rule.max)) {
+ errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));
+ }
+}
+
+var ENUM = 'enum';
+/**
+ * Rule for validating a value exists in an enumerable list.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param source The source object being validated.
+ * @param errors An array of errors that this rule may add
+ * validation errors to.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function enumerable(rule, value, source, errors, options) {
+ rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [];
+
+ if (rule[ENUM].indexOf(value) === -1) {
+ errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')));
+ }
+}
+
+/**
+ * Rule for validating a regular expression pattern.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param source The source object being validated.
+ * @param errors An array of errors that this rule may add
+ * validation errors to.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function pattern$1(rule, value, source, errors, options) {
+ if (rule.pattern) {
+ if (rule.pattern instanceof RegExp) {
+ // if a RegExp instance is passed, reset `lastIndex` in case its `global`
+ // flag is accidentally set to `true`, which in a validation scenario
+ // is not necessary and the result might be misleading
+ rule.pattern.lastIndex = 0;
+
+ if (!rule.pattern.test(value)) {
+ errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
+ }
+ } else if (typeof rule.pattern === 'string') {
+ var _pattern = new RegExp(rule.pattern);
+
+ if (!_pattern.test(value)) {
+ errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
+ }
+ }
+ }
+}
+
+var rules = {
+ required: required,
+ whitespace: whitespace,
+ type: type,
+ range: range,
+ "enum": enumerable,
+ pattern: pattern$1
+};
+
+/**
+ * Performs validation for string types.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function string(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value, 'string') && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options, 'string');
+
+ if (!isEmptyValue(value, 'string')) {
+ rules.type(rule, value, source, errors, options);
+ rules.range(rule, value, source, errors, options);
+ rules.pattern(rule, value, source, errors, options);
+
+ if (rule.whitespace === true) {
+ rules.whitespace(rule, value, source, errors, options);
+ }
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates a function.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function method(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (value !== undefined) {
+ rules.type(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates a number.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function number(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (value === '') {
+ value = undefined;
+ }
+
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (value !== undefined) {
+ rules.type(rule, value, source, errors, options);
+ rules.range(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates a boolean.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function _boolean(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (value !== undefined) {
+ rules.type(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates the regular expression type.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function regexp(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (!isEmptyValue(value)) {
+ rules.type(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates a number is an integer.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function integer(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (value !== undefined) {
+ rules.type(rule, value, source, errors, options);
+ rules.range(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates a number is a floating point number.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function floatFn(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (value !== undefined) {
+ rules.type(rule, value, source, errors, options);
+ rules.range(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates an array.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function array(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value, 'array') && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options, 'array');
+
+ if (!isEmptyValue(value, 'array')) {
+ rules.type(rule, value, source, errors, options);
+ rules.range(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates an object.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function object(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (value !== undefined) {
+ rules.type(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+var ENUM$1 = 'enum';
+/**
+ * Validates an enumerable list.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function enumerable$1(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (value !== undefined) {
+ rules[ENUM$1](rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Validates a regular expression pattern.
+ *
+ * Performs validation when a rule only contains
+ * a pattern property but is not declared as a string type.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function pattern$2(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value, 'string') && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (!isEmptyValue(value, 'string')) {
+ rules.pattern(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+function date(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+
+ if (!isEmptyValue(value)) {
+ var dateObject;
+
+ if (typeof value === 'number') {
+ dateObject = new Date(value);
+ } else {
+ dateObject = value;
+ }
+
+ rules.type(rule, dateObject, source, errors, options);
+
+ if (dateObject) {
+ rules.range(rule, dateObject.getTime(), source, errors, options);
+ }
+ }
+ }
+
+ callback(errors);
+}
+
+function required$1(rule, value, callback, source, options) {
+ var errors = [];
+ var type = Array.isArray(value) ? 'array' : typeof value;
+ rules.required(rule, value, source, errors, options, type);
+ callback(errors);
+}
+
+function type$1(rule, value, callback, source, options) {
+ var ruleType = rule.type;
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value, ruleType) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options, ruleType);
+
+ if (!isEmptyValue(value, ruleType)) {
+ rules.type(rule, value, source, errors, options);
+ }
+ }
+
+ callback(errors);
+}
+
+/**
+ * Performs validation for any type.
+ *
+ * @param rule The validation rule.
+ * @param value The value of the field on the source object.
+ * @param callback The callback function.
+ * @param source The source object being validated.
+ * @param options The validation options.
+ * @param options.messages The validation messages.
+ */
+
+function any(rule, value, callback, source, options) {
+ var errors = [];
+ var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+ if (validate) {
+ if (isEmptyValue(value) && !rule.required) {
+ return callback();
+ }
+
+ rules.required(rule, value, source, errors, options);
+ }
+
+ callback(errors);
+}
+
+var validators = {
+ string: string,
+ method: method,
+ number: number,
+ "boolean": _boolean,
+ regexp: regexp,
+ integer: integer,
+ "float": floatFn,
+ array: array,
+ object: object,
+ "enum": enumerable$1,
+ pattern: pattern$2,
+ date: date,
+ url: type$1,
+ hex: type$1,
+ email: type$1,
+ required: required$1,
+ any: any
+};
+
+function newMessages() {
+ return {
+ "default": 'Validation error on field %s',
+ required: '%s is required',
+ "enum": '%s must be one of %s',
+ whitespace: '%s cannot be empty',
+ date: {
+ format: '%s date %s is invalid for format %s',
+ parse: '%s date could not be parsed, %s is invalid ',
+ invalid: '%s date %s is invalid'
+ },
+ types: {
+ string: '%s is not a %s',
+ method: '%s is not a %s (function)',
+ array: '%s is not an %s',
+ object: '%s is not an %s',
+ number: '%s is not a %s',
+ date: '%s is not a %s',
+ "boolean": '%s is not a %s',
+ integer: '%s is not an %s',
+ "float": '%s is not a %s',
+ regexp: '%s is not a valid %s',
+ email: '%s is not a valid %s',
+ url: '%s is not a valid %s',
+ hex: '%s is not a valid %s'
+ },
+ string: {
+ len: '%s must be exactly %s characters',
+ min: '%s must be at least %s characters',
+ max: '%s cannot be longer than %s characters',
+ range: '%s must be between %s and %s characters'
+ },
+ number: {
+ len: '%s must equal %s',
+ min: '%s cannot be less than %s',
+ max: '%s cannot be greater than %s',
+ range: '%s must be between %s and %s'
+ },
+ array: {
+ len: '%s must be exactly %s in length',
+ min: '%s cannot be less than %s in length',
+ max: '%s cannot be greater than %s in length',
+ range: '%s must be between %s and %s in length'
+ },
+ pattern: {
+ mismatch: '%s value %s does not match pattern %s'
+ },
+ clone: function clone() {
+ var cloned = JSON.parse(JSON.stringify(this));
+ cloned.clone = this.clone;
+ return cloned;
+ }
+ };
+}
+var messages = newMessages();
+
+/**
+ * Encapsulates a validation schema.
+ *
+ * @param descriptor An object declaring validation rules
+ * for this schema.
+ */
+
+function Schema(descriptor) {
+ this.rules = null;
+ this._messages = messages;
+ this.define(descriptor);
+}
+
+Schema.prototype = {
+ messages: function messages(_messages) {
+ if (_messages) {
+ this._messages = deepMerge(newMessages(), _messages);
+ }
+
+ return this._messages;
+ },
+ define: function define(rules) {
+ if (!rules) {
+ throw new Error('Cannot configure a schema with no rules');
+ }
+
+ if (typeof rules !== 'object' || Array.isArray(rules)) {
+ throw new Error('Rules must be an object');
+ }
+
+ this.rules = {};
+ var z;
+ var item;
+
+ for (z in rules) {
+ if (rules.hasOwnProperty(z)) {
+ item = rules[z];
+ this.rules[z] = Array.isArray(item) ? item : [item];
+ }
+ }
+ },
+ validate: function validate(source_, o, oc) {
+ var _this = this;
+
+ if (o === void 0) {
+ o = {};
+ }
+
+ if (oc === void 0) {
+ oc = function oc() {};
+ }
+
+ var source = source_;
+ var options = o;
+ var callback = oc;
+
+ if (typeof options === 'function') {
+ callback = options;
+ options = {};
+ }
+
+ if (!this.rules || Object.keys(this.rules).length === 0) {
+ if (callback) {
+ callback();
+ }
+
+ return Promise.resolve();
+ }
+
+ function complete(results) {
+ var i;
+ var errors = [];
+ var fields = {};
+
+ function add(e) {
+ if (Array.isArray(e)) {
+ var _errors;
+
+ errors = (_errors = errors).concat.apply(_errors, e);
+ } else {
+ errors.push(e);
+ }
+ }
+
+ for (i = 0; i < results.length; i++) {
+ add(results[i]);
+ }
+
+ if (!errors.length) {
+ errors = null;
+ fields = null;
+ } else {
+ fields = convertFieldsError(errors);
+ }
+
+ callback(errors, fields);
+ }
+
+ if (options.messages) {
+ var messages$1 = this.messages();
+
+ if (messages$1 === messages) {
+ messages$1 = newMessages();
+ }
+
+ deepMerge(messages$1, options.messages);
+ options.messages = messages$1;
+ } else {
+ options.messages = this.messages();
+ }
+
+ var arr;
+ var value;
+ var series = {};
+ var keys = options.keys || Object.keys(this.rules);
+ keys.forEach(function(z) {
+ arr = _this.rules[z];
+ value = source[z];
+ arr.forEach(function(r) {
+ var rule = r;
+
+ if (typeof rule.transform === 'function') {
+ if (source === source_) {
+ source = _extends({}, source);
+ }
+
+ value = source[z] = rule.transform(value);
+ }
+
+ if (typeof rule === 'function') {
+ rule = {
+ validator: rule
+ };
+ } else {
+ rule = _extends({}, rule);
+ }
+
+ rule.validator = _this.getValidationMethod(rule);
+ rule.field = z;
+ rule.fullField = rule.fullField || z;
+ rule.type = _this.getType(rule);
+
+ if (!rule.validator) {
+ return;
+ }
+
+ series[z] = series[z] || [];
+ series[z].push({
+ rule: rule,
+ value: value,
+ source: source,
+ field: z
+ });
+ });
+ });
+ var errorFields = {};
+ return asyncMap(series, options, function(data, doIt) {
+ var rule = data.rule;
+ var deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField ===
+ 'object');
+ deep = deep && (rule.required || !rule.required && data.value);
+ rule.field = data.field;
+
+ function addFullfield(key, schema) {
+ return _extends({}, schema, {
+ fullField: rule.fullField + "." + key
+ });
+ }
+
+ function cb(e) {
+ if (e === void 0) {
+ e = [];
+ }
+
+ var errors = e;
+
+ if (!Array.isArray(errors)) {
+ errors = [errors];
+ }
+
+ if (!options.suppressWarning && errors.length) {
+ Schema.warning('async-validator:', errors);
+ }
+
+ if (errors.length && rule.message) {
+ errors = [].concat(rule.message);
+ }
+
+ errors = errors.map(complementError(rule));
+
+ if (options.first && errors.length) {
+ errorFields[rule.field] = 1;
+ return doIt(errors);
+ }
+
+ if (!deep) {
+ doIt(errors);
+ } else {
+ // if rule is required but the target object
+ // does not exist fail at the rule level and don't
+ // go deeper
+ if (rule.required && !data.value) {
+ if (rule.message) {
+ errors = [].concat(rule.message).map(complementError(rule));
+ } else if (options.error) {
+ errors = [options.error(rule, format(options.messages.required, rule.field))];
+ } else {
+ errors = [];
+ }
+
+ return doIt(errors);
+ }
+
+ var fieldsSchema = {};
+
+ if (rule.defaultField) {
+ for (var k in data.value) {
+ if (data.value.hasOwnProperty(k)) {
+ fieldsSchema[k] = rule.defaultField;
+ }
+ }
+ }
+
+ fieldsSchema = _extends({}, fieldsSchema, {}, data.rule.fields);
+
+ for (var f in fieldsSchema) {
+ if (fieldsSchema.hasOwnProperty(f)) {
+ var fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]];
+ fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f));
+ }
+ }
+
+ var schema = new Schema(fieldsSchema);
+ schema.messages(options.messages);
+
+ if (data.rule.options) {
+ data.rule.options.messages = options.messages;
+ data.rule.options.error = options.error;
+ }
+
+ schema.validate(data.value, data.rule.options || options, function(errs) {
+ var finalErrors = [];
+
+ if (errors && errors.length) {
+ finalErrors.push.apply(finalErrors, errors);
+ }
+
+ if (errs && errs.length) {
+ finalErrors.push.apply(finalErrors, errs);
+ }
+
+ doIt(finalErrors.length ? finalErrors : null);
+ });
+ }
+ }
+
+ var res;
+
+ if (rule.asyncValidator) {
+ res = rule.asyncValidator(rule, data.value, cb, data.source, options);
+ } else if (rule.validator) {
+ res = rule.validator(rule, data.value, cb, data.source, options);
+
+ if (res === true) {
+ cb();
+ } else if (res === false) {
+ cb(rule.message || rule.field + " fails");
+ } else if (res instanceof Array) {
+ cb(res);
+ } else if (res instanceof Error) {
+ cb(res.message);
+ }
+ }
+
+ if (res && res.then) {
+ res.then(function() {
+ return cb();
+ }, function(e) {
+ return cb(e);
+ });
+ }
+ }, function(results) {
+ complete(results);
+ });
+ },
+ getType: function getType(rule) {
+ if (rule.type === undefined && rule.pattern instanceof RegExp) {
+ rule.type = 'pattern';
+ }
+
+ if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {
+ throw new Error(format('Unknown rule type %s', rule.type));
+ }
+
+ return rule.type || 'string';
+ },
+ getValidationMethod: function getValidationMethod(rule) {
+ if (typeof rule.validator === 'function') {
+ return rule.validator;
+ }
+
+ var keys = Object.keys(rule);
+ var messageIndex = keys.indexOf('message');
+
+ if (messageIndex !== -1) {
+ keys.splice(messageIndex, 1);
+ }
+
+ if (keys.length === 1 && keys[0] === 'required') {
+ return validators.required;
+ }
+
+ return validators[this.getType(rule)] || false;
+ }
+};
+
+Schema.register = function register(type, validator) {
+ if (typeof validator !== 'function') {
+ throw new Error('Cannot register a validator by type, validator is not a function');
+ }
+
+ validators[type] = validator;
+};
+
+Schema.warning = warning;
+Schema.messages = messages;
+
+export default Schema;
+//# sourceMappingURL=index.js.map
diff --git a/tuniao-ui/libs/utils/calendar.js b/tuniao-ui/libs/utils/calendar.js
new file mode 100644
index 0000000..da1456a
--- /dev/null
+++ b/tuniao-ui/libs/utils/calendar.js
@@ -0,0 +1,546 @@
+/**
+* @1900-2100区间内的公历、农历互转
+* @charset UTF-8
+* @github https://github.com/jjonline/calendar.js
+* @Author Jea杨(JJonline@JJonline.Cn)
+* @Time 2014-7-21
+* @Time 2016-8-13 Fixed 2033hex、Attribution Annals
+* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
+* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
+* @Version 1.0.3
+* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+*/
+/* eslint-disable */
+var calendar = {
+
+ /**
+ * 农历1900-2100的润大小信息表
+ * @Array Of Property
+ * @return Hex
+ */
+ lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
+ 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
+ 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
+ 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
+ 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
+ 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
+ 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
+ 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
+ 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
+ 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
+ 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
+ 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
+ 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
+ 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
+ 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
+ /** Add By JJonline@JJonline.Cn**/
+ 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
+ 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
+ 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
+ 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
+ 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
+ 0x0d520], // 2100
+
+ /**
+ * 公历每个月份的天数普通表
+ * @Array Of Property
+ * @return Number
+ */
+ solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
+
+ /**
+ * 天干地支之天干速查表
+ * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+ * @return Cn string
+ */
+ Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
+
+ /**
+ * 天干地支之地支速查表
+ * @Array Of Property
+ * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+ * @return Cn string
+ */
+ Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'],
+
+ /**
+ * 天干地支之地支速查表<=>生肖
+ * @Array Of Property
+ * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+ * @return Cn string
+ */
+ Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'],
+
+ /**
+ * 24节气速查表
+ * @Array Of Property
+ * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+ * @return Cn string
+ */
+ solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'],
+
+ /**
+ * 1900-2100各年的24节气日期速查表
+ * @Array Of Property
+ * @return 0x string For splice
+ */
+ sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
+ '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
+ 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
+ '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
+ '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
+ '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
+ '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
+ '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+ '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
+ '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+ '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
+ '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
+ '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
+ '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
+ '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
+ '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
+ '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
+ '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
+ '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
+ '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],
+
+ /**
+ * 数字转中文速查表
+ * @Array Of Property
+ * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+ * @return Cn string
+ */
+ nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'],
+
+ /**
+ * 日期转农历称呼速查表
+ * @Array Of Property
+ * @trans ['初','十','廿','卅']
+ * @return Cn string
+ */
+ nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
+
+ /**
+ * 月份转农历称呼速查表
+ * @Array Of Property
+ * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+ * @return Cn string
+ */
+ nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'],
+
+ /**
+ * 返回农历y年一整年的总天数
+ * @param lunar Year
+ * @return Number
+ * @eg:var count = calendar.lYearDays(1987) ;//count=387
+ */
+ lYearDays: function (y) {
+ var i; var sum = 348
+ for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }
+ return (sum + this.leapDays(y))
+ },
+
+ /**
+ * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+ * @param lunar Year
+ * @return Number (0-12)
+ * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+ */
+ leapMonth: function (y) { // 闰字编码 \u95f0
+ return (this.lunarInfo[y - 1900] & 0xf)
+ },
+
+ /**
+ * 返回农历y年闰月的天数 若该年没有闰月则返回0
+ * @param lunar Year
+ * @return Number (0、29、30)
+ * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+ */
+ leapDays: function (y) {
+ if (this.leapMonth(y)) {
+ return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
+ }
+ return (0)
+ },
+
+ /**
+ * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+ * @param lunar Year
+ * @return Number (-1、29、30)
+ * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+ */
+ monthDays: function (y, m) {
+ if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1
+ return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
+ },
+
+ /**
+ * 返回公历(!)y年m月的天数
+ * @param solar Year
+ * @return Number (-1、28、29、30、31)
+ * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+ */
+ solarDays: function (y, m) {
+ if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+ var ms = m - 1
+ if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
+ return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
+ } else {
+ return (this.solarMonth[ms])
+ }
+ },
+
+ /**
+ * 农历年份转换为干支纪年
+ * @param lYear 农历年的年份数
+ * @return Cn string
+ */
+ toGanZhiYear: function (lYear) {
+ var ganKey = (lYear - 3) % 10
+ var zhiKey = (lYear - 3) % 12
+ if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
+ if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
+ return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
+ },
+
+ /**
+ * 公历月、日判断所属星座
+ * @param cMonth [description]
+ * @param cDay [description]
+ * @return Cn string
+ */
+ toAstro: function (cMonth, cDay) {
+ var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
+ var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
+ return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
+ },
+
+ /**
+ * 传入offset偏移量返回干支
+ * @param offset 相对甲子的偏移量
+ * @return Cn string
+ */
+ toGanZhi: function (offset) {
+ return this.Gan[offset % 10] + this.Zhi[offset % 12]
+ },
+
+ /**
+ * 传入公历(!)y年获得该年第n个节气的公历日期
+ * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+ * @return day Number
+ * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+ */
+ getTerm: function (y, n) {
+ if (y < 1900 || y > 2100) { return -1 }
+ if (n < 1 || n > 24) { return -1 }
+ var _table = this.sTermInfo[y - 1900]
+ var _info = [
+ parseInt('0x' + _table.substr(0, 5)).toString(),
+ parseInt('0x' + _table.substr(5, 5)).toString(),
+ parseInt('0x' + _table.substr(10, 5)).toString(),
+ parseInt('0x' + _table.substr(15, 5)).toString(),
+ parseInt('0x' + _table.substr(20, 5)).toString(),
+ parseInt('0x' + _table.substr(25, 5)).toString()
+ ]
+ var _calday = [
+ _info[0].substr(0, 1),
+ _info[0].substr(1, 2),
+ _info[0].substr(3, 1),
+ _info[0].substr(4, 2),
+
+ _info[1].substr(0, 1),
+ _info[1].substr(1, 2),
+ _info[1].substr(3, 1),
+ _info[1].substr(4, 2),
+
+ _info[2].substr(0, 1),
+ _info[2].substr(1, 2),
+ _info[2].substr(3, 1),
+ _info[2].substr(4, 2),
+
+ _info[3].substr(0, 1),
+ _info[3].substr(1, 2),
+ _info[3].substr(3, 1),
+ _info[3].substr(4, 2),
+
+ _info[4].substr(0, 1),
+ _info[4].substr(1, 2),
+ _info[4].substr(3, 1),
+ _info[4].substr(4, 2),
+
+ _info[5].substr(0, 1),
+ _info[5].substr(1, 2),
+ _info[5].substr(3, 1),
+ _info[5].substr(4, 2)
+ ]
+ return parseInt(_calday[n - 1])
+ },
+
+ /**
+ * 传入农历数字月份返回汉语通俗表示法
+ * @param lunar month
+ * @return Cn string
+ * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+ */
+ toChinaMonth: function (m) { // 月 => \u6708
+ if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+ var s = this.nStr3[m - 1]
+ s += '\u6708'// 加上月字
+ return s
+ },
+
+ /**
+ * 传入农历日期数字返回汉字表示法
+ * @param lunar day
+ * @return Cn string
+ * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+ */
+ toChinaDay: function (d) { // 日 => \u65e5
+ var s
+ switch (d) {
+ case 10:
+ s = '\u521d\u5341'; break
+ case 20:
+ s = '\u4e8c\u5341'; break
+ break
+ case 30:
+ s = '\u4e09\u5341'; break
+ break
+ default:
+ s = this.nStr2[Math.floor(d / 10)]
+ s += this.nStr1[d % 10]
+ }
+ return (s)
+ },
+
+ /**
+ * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+ * @param y year
+ * @return Cn string
+ * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
+ */
+ getAnimal: function (y) {
+ return this.Animals[(y - 4) % 12]
+ },
+
+ /**
+ * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+ * @param y solar year
+ * @param m solar month
+ * @param d solar day
+ * @return JSON object
+ * @eg:console.log(calendar.solar2lunar(1987,11,01));
+ */
+ solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
+ // 年份限定、上限
+ if (y < 1900 || y > 2100) {
+ return -1// undefined转换为数字变为NaN
+ }
+ // 公历传参最下限
+ if (y == 1900 && m == 1 && d < 31) {
+ return -1
+ }
+ // 未传参 获得当天
+ if (!y) {
+ var objDate = new Date()
+ } else {
+ var objDate = new Date(y, parseInt(m) - 1, d)
+ }
+ var i; var leap = 0; var temp = 0
+ // 修正ymd参数
+ var y = objDate.getFullYear()
+ var m = objDate.getMonth() + 1
+ var d = objDate.getDate()
+ var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000
+ for (i = 1900; i < 2101 && offset > 0; i++) {
+ temp = this.lYearDays(i)
+ offset -= temp
+ }
+ if (offset < 0) {
+ offset += temp; i--
+ }
+
+ // 是否今天
+ var isTodayObj = new Date()
+ var isToday = false
+ if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+ isToday = true
+ }
+ // 星期几
+ var nWeek = objDate.getDay()
+ var cWeek = this.nStr1[nWeek]
+ // 数字表示周几顺应天朝周一开始的惯例
+ if (nWeek == 0) {
+ nWeek = 7
+ }
+ // 农历年
+ var year = i
+ var leap = this.leapMonth(i) // 闰哪个月
+ var isLeap = false
+
+ // 效验闰月
+ for (i = 1; i < 13 && offset > 0; i++) {
+ // 闰月
+ if (leap > 0 && i == (leap + 1) && isLeap == false) {
+ --i
+ isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数
+ } else {
+ temp = this.monthDays(year, i)// 计算农历普通月天数
+ }
+ // 解除闰月
+ if (isLeap == true && i == (leap + 1)) { isLeap = false }
+ offset -= temp
+ }
+ // 闰月导致数组下标重叠取反
+ if (offset == 0 && leap > 0 && i == leap + 1) {
+ if (isLeap) {
+ isLeap = false
+ } else {
+ isLeap = true; --i
+ }
+ }
+ if (offset < 0) {
+ offset += temp; --i
+ }
+ // 农历月
+ var month = i
+ // 农历日
+ var day = offset + 1
+ // 天干地支处理
+ var sm = m - 1
+ var gzY = this.toGanZhiYear(year)
+
+ // 当月的两个节气
+ // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+ var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
+ var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
+
+ // 依据12节气修正干支月
+ var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
+ if (d >= firstNode) {
+ gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
+ }
+
+ // 传入的日期的节气与否
+ var isTerm = false
+ var Term = null
+ if (firstNode == d) {
+ isTerm = true
+ Term = this.solarTerm[m * 2 - 2]
+ }
+ if (secondNode == d) {
+ isTerm = true
+ Term = this.solarTerm[m * 2 - 1]
+ }
+ // 日柱 当月一日与 1900/1/1 相差天数
+ var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
+ var gzD = this.toGanZhi(dayCyclical + d - 1)
+ // 该日期所属的星座
+ var astro = this.toAstro(m, d)
+
+ return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }
+ },
+
+ /**
+ * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+ * @param y lunar year
+ * @param m lunar month
+ * @param d lunar day
+ * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+ * @return JSON object
+ * @eg:console.log(calendar.lunar2solar(1987,9,10));
+ */
+ lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
+ var isLeapMonth = !!isLeapMonth
+ var leapOffset = 0
+ var leapMonth = this.leapMonth(y)
+ var leapDay = this.leapDays(y)
+ if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+ if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值
+ var day = this.monthDays(y, m)
+ var _day = day
+ // bugFix 2016-9-25
+ // if month is leap, _day use leapDays method
+ if (isLeapMonth) {
+ _day = this.leapDays(y, m)
+ }
+ if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验
+
+ // 计算农历的时间差
+ var offset = 0
+ for (var i = 1900; i < y; i++) {
+ offset += this.lYearDays(i)
+ }
+ var leap = 0; var isAdd = false
+ for (var i = 1; i < m; i++) {
+ leap = this.leapMonth(y)
+ if (!isAdd) { // 处理闰月
+ if (leap <= i && leap > 0) {
+ offset += this.leapDays(y); isAdd = true
+ }
+ }
+ offset += this.monthDays(y, i)
+ }
+ // 转换闰月农历 需补充该年闰月的前一个月的时差
+ if (isLeapMonth) { offset += day }
+ // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+ var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
+ var calObj = new Date((offset + d - 31) * 86400000 + stmap)
+ var cY = calObj.getUTCFullYear()
+ var cM = calObj.getUTCMonth() + 1
+ var cD = calObj.getUTCDate()
+
+ return this.solar2lunar(cY, cM, cD)
+ }
+}
+
+export default calendar
\ No newline at end of file
diff --git a/tuniao-ui/libs/utils/city.js b/tuniao-ui/libs/utils/city.js
new file mode 100644
index 0000000..94169eb
--- /dev/null
+++ b/tuniao-ui/libs/utils/city.js
@@ -0,0 +1 @@
+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;
\ No newline at end of file
diff --git a/tuniao-ui/libs/utils/emitter.js b/tuniao-ui/libs/utils/emitter.js
new file mode 100644
index 0000000..7af43d2
--- /dev/null
+++ b/tuniao-ui/libs/utils/emitter.js
@@ -0,0 +1,55 @@
+/**
+ * 递归使用call方式 this指向
+ *
+ * @param {String} componentName 需要查找的组件的名称
+ * @param {String} eventName 事件名称
+ * @param {Object} params 需要传递的参数
+ */
+function broadcast(componentName, eventName, params) {
+ // 循环子节点找到需要的节点,没有查找到就递归进行查找
+ this.$children.map(child => {
+ if (componentName === child.$options.name) {
+ child.$emit.apply(child, [eventName].concat(params))
+ } else {
+ broadcast.apply(child, [componentName, eventName].concat(params))
+ }
+ })
+}
+
+export default {
+ methods: {
+ /**
+ * 派发 向上查找一个
+ * @param {Object} componentName 需要查找的组件的名称
+ * @param {Object} eventName 事件名称
+ * @param {Object} params 需要传递的参数
+ */
+ dispatch(componentName, eventName, params) {
+ // 找到最近父节点 $root 根节点
+ let parent = this.$parent || this.$root
+ // 获取当前实例的名称
+ let name = parent.$options.name
+
+ // 当前存在节点并且当前节点没有名称或者名称不等于我们要查找的节点名称,则继续遍历
+ while (parent && (!name || name !== componentName)) {
+ parent = parent.$parent
+ if (parent) {
+ name = parent.$options.name
+ }
+ }
+ // 如果有节点则表示找到
+ if (parent) {
+ parent.$emit.apply(parent, [eventName].concat(params))
+ }
+ },
+ /**
+ * 广播 向下查找多个
+ * @param {Object} componentName 需要查找的组件的名称
+ * @param {Object} eventName 事件名称
+ * @param {Object} params 需要传递的参数
+ */
+ broadcast(componentName, eventName, params) {
+ broadcast.call(this, componentName, eventName, params)
+ }
+ }
+}
\ No newline at end of file
diff --git a/tuniao-ui/libs/utils/province.js b/tuniao-ui/libs/utils/province.js
new file mode 100644
index 0000000..436b190
--- /dev/null
+++ b/tuniao-ui/libs/utils/province.js
@@ -0,0 +1 @@
+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;
\ No newline at end of file
diff --git a/tuniao-ui/theme.scss b/tuniao-ui/theme.scss
new file mode 100644
index 0000000..136a6ec
--- /dev/null
+++ b/tuniao-ui/theme.scss
@@ -0,0 +1,183 @@
+// 此文件为TuniaoUI的主题变量,这些变量目前只能通过uni.scss引入才有效,另外由于
+// uni.scss中引入的样式会同时混入到全局样式文件和单独每一个页面的样式中,造成微信程序包太大,
+// 故uni.scss只建议放scss变量名相关样式,其他的样式可以通过main.js或者App.vue引入
+
+// 组件配置
+$tn-form-item-height: 70rpx;
+
+
+// 主颜色
+$tn-main-color: #01BEFF;
+$tn-main-orange: #FBBD12;
+$tn-embellished-green: #00FFC6;
+$tn-embellished-yellow: #FFF00D;
+$tn-auxiliary-powder: #FF71D2;
+$tn-auxiliary-blue: #82B2FF;
+$tn-bg-color: #FFFFFF;
+$tn-bg-gray-color: #F4F4F4;
+$tn-space-color: #F8F7F8;
+
+// 边框颜色
+$tn-border-solid-color: rgba(0, 0, 0, 0.1);
+$tn-border-solids-color: #eee;
+$tn-border-dashed-color: #ddd;
+
+// 阴影颜色
+$tn-shadow-color: rgba(0, 0, 0, 0.1);
+$tn-box-shadow-color: rgba(0, 0, 0, 0.2);
+
+// 字体颜色
+$tn-font-color: #080808;
+$tn-font-sub-color: #AAAAAA;
+$tn-content-color: #838383;
+$tn-font-holder-color: #E6E6E6;
+
+$tn-mask-bg-color: rgba(0, 0, 0, 0.4);
+
+$tn-progress-bg-color: #f0f0f0;
+
+
+$tn-color-red: #E83A30;
+$tn-color-red-dark: #BA2E26;
+$tn-color-red-disabled: #F39C97;
+$tn-color-red-light: #FAD8D6;
+
+$tn-color-purplered: #E72F8C;
+$tn-color-purplered-dark: #B9266F;
+$tn-color-purplered-disabled: #F397C5;
+$tn-color-purplered-light: #FAD5E8;
+
+$tn-color-purple: #892FE8;
+$tn-color-purple-dark: #6E26BA;
+$tn-color-purple-disabled: #C497F3;
+$tn-color-purple-light: #E7D5FA;
+
+$tn-color-bluepurple: #5F4FD9;
+$tn-color-bluepurple-dark: #4C3FAE;
+$tn-color-bluepurple-disabled: #AFA7EC;
+$tn-color-bluepurple-light: #DFDCF7;
+
+$tn-color-aquablue: #3646FF;
+$tn-color-aquablue-dark: #2B38CC;
+$tn-color-aquablue-disabled: #9AA2FF;
+$tn-color-aquablue-light: #D7DAFF;
+
+$tn-color-blue: #3D7EFF;
+$tn-color-blue-dark: #3165CC;
+$tn-color-blue-disabled: #9EBEFF;
+$tn-color-blue-light: #D8E5FF;
+
+$tn-color-indigo: #31C9E8;
+$tn-color-indigo-dark: #27A1BA;
+$tn-color-indigo-disabled: #98E4F3;
+$tn-color-indigo-light: #D6F4FA;
+
+$tn-color-cyan: #2DE8BD;
+$tn-color-cyan-dark: #24BA97;
+$tn-color-cyan-disabled: #96F3DE;
+$tn-color-cyan-light: #D5FAF2;
+
+$tn-color-teal: #24F083;
+$tn-color-teal-dark: #1DC069;
+$tn-color-teal-disabled: #91F7C1;
+$tn-color-teal-light: #D3FCE6;
+
+$tn-color-green: #31E749;
+$tn-color-green-dark: #27B93A;
+$tn-color-green-disabled: #98F3A4;
+$tn-color-green-light: #D6FADB;
+
+$tn-color-yellowgreen: #A4E82F;
+$tn-color-yellowgreen-dark: #82BA26;
+$tn-color-yellowgreen-disabled: #D1F397;
+$tn-color-yellowgreen-light: #EDFAD5;
+
+$tn-color-lime: #D5EB00;
+$tn-color-lime-dark: #AABC00;
+$tn-color-lime-disabled: #E9F57F;
+$tn-color-lime-light: #F7FBCC;
+
+$tn-color-yellow: #FFF420;
+$tn-color-yellow-dark: #CCC21A;
+$tn-color-yellow-disabled: #FFF88F;
+$tn-color-yellow-light: #FFFDD2;
+
+$tn-color-orangeyellow: #FFCA28;
+$tn-color-orangeyellow-dark: #CCA220;
+$tn-color-orangeyellow-disabled: #FFE493;
+$tn-color-orangeyellow-light: #FFF4D4;
+
+$tn-color-orange: #FFA726;
+$tn-color-orange-dark: #CC851E;
+$tn-color-orange-disabled: #FFD392;
+$tn-color-orange-light: #FFEDD4 ;
+
+$tn-color-orangered: #FF7043;
+$tn-color-orangered-dark: #CC5A36;
+$tn-color-orangered-disabled: #FFB7A1;
+$tn-color-orangered-light: #FFE2D9;
+
+$tn-color-brown: #914F2C;
+$tn-color-brown-dark: #743F23;
+$tn-color-brown-disabled: #C8A795;
+$tn-color-brown-light: #E9DCD5;
+
+$tn-color-grey: #78909C;
+$tn-color-grey-dark: #5F7E8B;
+$tn-color-grey-disabled: #C6D1D8;
+$tn-color-grey-light: #E4E9EC;
+
+$tn-color-gray: #AAAAAA;
+$tn-color-gray-dark: #838383;
+$tn-color-gray-disabled: #E6E6E6;
+$tn-color-gray-light: #F8F7F8;
+
+$tn-cool-bg-color-1-start: #F5317F;
+$tn-cool-bg-color-1-end: #FF7C6E;
+
+$tn-cool-bg-color-2-start: #CA26FF;
+$tn-cool-bg-color-2-end: #F360A7;
+
+$tn-cool-bg-color-3-start: #A26FFC;
+$tn-cool-bg-color-3-end: #9D12FF;
+
+$tn-cool-bg-color-4-start: #AA77F0;
+$tn-cool-bg-color-4-end: #E871E5;
+
+$tn-cool-bg-color-5-start: #40A0F7;
+$tn-cool-bg-color-5-end: #4866E6;
+
+$tn-cool-bg-color-6-start: #209CFF;
+$tn-cool-bg-color-6-end: #68E0CF;
+
+$tn-cool-bg-color-7-start: #00C3FF;
+$tn-cool-bg-color-7-end: #58FFF5;
+
+$tn-cool-bg-color-8-start: #00d1FF;
+$tn-cool-bg-color-8-end: #69FF97;
+
+$tn-cool-bg-color-9-start: #0FD893;
+$tn-cool-bg-color-9-end: #29ECBF;
+
+$tn-cool-bg-color-10-start: #0FD850;
+$tn-cool-bg-color-10-end: #F9F047;
+
+$tn-cool-bg-color-11-start: #24FE41;
+$tn-cool-bg-color-11-end: #F7FD47;
+
+$tn-cool-bg-color-12-start: #D6FF7F;
+$tn-cool-bg-color-12-end: #00F657;
+
+$tn-cool-bg-color-13-start: #FA709A;
+$tn-cool-bg-color-13-end: #FEE140;
+
+$tn-cool-bg-color-14-start: #FE5E9C;
+$tn-cool-bg-color-14-end: #F1AA76;
+
+$tn-cool-bg-color-15-start: #FF3181;
+$tn-cool-bg-color-15-end: #FF8331;
+
+$tn-cool-bg-color-16-start: #ED1C24;
+$tn-cool-bg-color-16-end: #FECE12;
+
+
diff --git a/uni.scss b/uni.scss
index 5b30ca3..e3408ac 100644
--- a/uni.scss
+++ b/uni.scss
@@ -1,3 +1,4 @@
+@import 'tuniao-ui/theme.scss';
/**
* uni-app内置的常用样式变量
*/
diff --git a/uni_modules/tuniaoui-wx-user-info/changelog.md b/uni_modules/tuniaoui-wx-user-info/changelog.md
new file mode 100644
index 0000000..6072eb2
--- /dev/null
+++ b/uni_modules/tuniaoui-wx-user-info/changelog.md
@@ -0,0 +1,4 @@
+## 1.0.1(2022-11-22)
+更新使用文档
+## 1.0.0(2022-11-22)
+适配微信新版获取用户头像、昵称信息
diff --git a/uni_modules/tuniaoui-wx-user-info/components/tuniaoui-wx-user-info/tuniaoui-wx-user-info.vue b/uni_modules/tuniaoui-wx-user-info/components/tuniaoui-wx-user-info/tuniaoui-wx-user-info.vue
new file mode 100644
index 0000000..a08dd7b
--- /dev/null
+++ b/uni_modules/tuniaoui-wx-user-info/components/tuniaoui-wx-user-info/tuniaoui-wx-user-info.vue
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
+
+
+
+
+ 获取您的昵称、头像
+
+
+ 获取用户头像、昵称,主要用于向用户提供具有辨识度的用户中心界面
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保 存
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/tuniaoui-wx-user-info/package.json b/uni_modules/tuniaoui-wx-user-info/package.json
new file mode 100644
index 0000000..b40daeb
--- /dev/null
+++ b/uni_modules/tuniaoui-wx-user-info/package.json
@@ -0,0 +1,83 @@
+{
+ "id": "tuniaoui-wx-user-info",
+ "displayName": "图鸟UI-微信授权登录,用户信息设置,微信头像弹框",
+ "version": "1.0.1",
+ "description": "授权微信用户头像、昵称信息!自定义昵称头像,授权登录弹框,可实现使用微信自带头像昵称功能",
+ "keywords": [
+ "微信小程序",
+ "微信小程序用户信息",
+ "图鸟UI",
+ "微信授权登录"
+],
+ "repository": "",
+"engines": {
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "u"
+ },
+ "App": {
+ "app-vue": "n",
+ "app-nvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "n",
+ "Android Browser": "n",
+ "微信浏览器(Android)": "n",
+ "QQ浏览器(Android)": "n"
+ },
+ "H5-pc": {
+ "Chrome": "n",
+ "IE": "n",
+ "Edge": "n",
+ "Firefox": "n",
+ "Safari": "n"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "n",
+ "百度": "n",
+ "字节跳动": "n",
+ "QQ": "n",
+ "钉钉": "n",
+ "快手": "n",
+ "飞书": "n",
+ "京东": "n"
+ },
+ "快应用": {
+ "华为": "n",
+ "联盟": "n"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/tuniaoui-wx-user-info/readme.md b/uni_modules/tuniaoui-wx-user-info/readme.md
new file mode 100644
index 0000000..35c2c78
--- /dev/null
+++ b/uni_modules/tuniaoui-wx-user-info/readme.md
@@ -0,0 +1,84 @@
+
+# 使用说明
+
+使用方法:
+
+```
+
+
+
+
+ 授权登录
+
+
+
+
+
+
+
+
+
+
+
+```
+
+参数说明:
+
+| 参数 | 说明 |
+| :-------- | ---------------------------------------------------- |
+| v-model | 弹出、关闭设置用户信息弹框 |
+
diff --git a/uni_modules/tuniaoui-wx-user-info/static/iconfont.css b/uni_modules/tuniaoui-wx-user-info/static/iconfont.css
new file mode 100644
index 0000000..217a692
--- /dev/null
+++ b/uni_modules/tuniaoui-wx-user-info/static/iconfont.css
@@ -0,0 +1,25 @@
+@charset "UTF-8";
+
+@font-face {
+ font-family: "tuniaoFont"; /* Project id 3784643 */
+ src:
+ url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAN8AAsAAAAAB4gAAAMvAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDBgqCQIIdATYCJAMMCwgABCAFhH8HPRuYBiMRpmvPIfurAzsYPj7DCVbrRAmElfXCs4V6xacO8aHO69VXu54tTy8h0hcJ7ufgieY+3+xscrn9B8wKQQFBywplLZCw9SwcOyZ5pKsoAQAbcICJTr7AjPPqr06NRkeIAemFpXv8cje1+/LkuLvD789WJZUANjOe9F76qptDOSMUui/Ua0WQKpZGXaqf5hHZdAD6x8tRJtRKtQd7j5UKkk6lWywYkGADCZBnGLugJd6CAI4GOjH956Ep4k7imdNkYTGFAkm2nJyPrBNwA7YhWwgQ/K4bLXITD8wl8xxuBN+XwyYJwOAp5jFjOwNbPNwd3l3WiyFAv3sCBLjcAB6gQM3GjLLSbJpDo1ANiqsiFiX7WAQzqTcMA06j/pb/eAbEx8yMAaAChg3sDjs6COwub8IAoAD4PEZkA7iAZClPKdicmJLc2OiZcQC3cV613sc3Ab9W7YItQtio9YgdKGjgr+ANlbg5gPvXFacv8IyvKTH4pcjV7VIcfnuIAUd3VCbxcCIKj++rvr/hpx/iwxd4/5mxDXeILbBp2+ByMIlGMuQEU3gjiVaMcXk8Dn2gWo5wuRwuIldLRqRwWogvmCRXE9/kSvrVQP4iFDVWRSbRakMk/AtcBYVpO6rpah1V9J/m/Wt+q8WfsOV+S5KFTGD5dwW9KFstZUs5smuYK3V495zwUG+r/Izf0PWtbWj/HUQsAL9u+cGK8NCiAgRnaRJ49fqljrxWc4PaKs4pQwBlMLUeAzgcEGLakvg5nCZ3zgTBkZzAEEUuFEeJyMrq4BGhGT6OPjiqGd4eIZkLKGKjgTKuAAgpPIAhjmdQUngnsrJdeKTxBz4pkgjHjJQeFqFMXv8PQqg0QP+F2cbAdoHqFmaM52jYlcbNoeTq4CtPkjzHAE1Zl0QvFEjGmp9fY6vKwBI9kOvIuQhJ4kJWy0k1dVXFVXcpbfTmIIRKA/RfmG0M7G1T3cKM8VwMXGlEnR1KY0uU+CTJnM1ODk1ZdxJdSOjYdGOp+TW2k6szsNg8qIvIuQipetFCVstpQCB1lcXHXUl5ZOpfdBvgMI9QMaJi8TZdzLS36K8/ueDZOWMAAA==') format('woff2'),
+ url('//at.alicdn.com/t/c/font_3784643_5jru9pe5fad.woff?t=1669045092678') format('woff'),
+ url('//at.alicdn.com/t/c/font_3784643_5jru9pe5fad.ttf?t=1669045092678') format('truetype');
+}
+
+[class*='tn-icon-'] {
+ font-family: 'tuniaoFont' !important;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ text-align: center;
+ text-decoration: none;
+}
+
+.tn-icon-close:before {
+ content: "\e74d";
+}
+
+.tn-icon-camera-fill:before {
+ content: "\e75d";
+}