commit 07c46ac300e09021df58f13e06b14181aafb8a92 Author: 编码猿 Date: Fri Sep 27 01:31:25 2024 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..403adbc --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.pydio b/.pydio new file mode 100644 index 0000000..d73da8d --- /dev/null +++ b/.pydio @@ -0,0 +1 @@ +b13a9f1a-5e2d-4ecd-9ef2-57a2df8ab357 \ No newline at end of file diff --git a/back b/back new file mode 160000 index 0000000..2cad936 --- /dev/null +++ b/back @@ -0,0 +1 @@ +Subproject commit 2cad936e700ec66b1b8d4f80691fc1ed14839ef6 diff --git a/h5/.pydio b/h5/.pydio new file mode 100644 index 0000000..f60d3bf --- /dev/null +++ b/h5/.pydio @@ -0,0 +1 @@ +4c6d7f0a-3b4a-4a8b-a9ef-0d3368b4e958 \ No newline at end of file diff --git a/h5/css/.pydio b/h5/css/.pydio new file mode 100644 index 0000000..e30713b --- /dev/null +++ b/h5/css/.pydio @@ -0,0 +1 @@ +72a98da0-5c36-44c7-98b3-c910d9380559 \ No newline at end of file diff --git a/h5/css/about_us.css b/h5/css/about_us.css new file mode 100644 index 0000000..01b178e --- /dev/null +++ b/h5/css/about_us.css @@ -0,0 +1,24 @@ +.about_center { + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + margin: 30% 0; + padding: 0 0.3rem; + text-align: center; +} +.about_center img{ + width: 1.4rem; + height: 1.4rem; + margin-bottom: 0.4rem; +} +.about_center p{ + font-size: 0.34rem; + margin-bottom: 0.18rem; + font-weight: 400; +} +.about_center span { + font-size: 0.3rem; + color: #666; + line-height: 0.42rem; +} diff --git a/h5/css/agreement.css b/h5/css/agreement.css new file mode 100644 index 0000000..0ac9301 --- /dev/null +++ b/h5/css/agreement.css @@ -0,0 +1,14 @@ +.agreement { + font-size: 0; +} +.agreement span{ + font-size: 0.32rem; + font-weight: bold; + margin-bottom: 0.3rem; + display: inline-block; +} +.agreement p{ + font-size: 0.28rem; + margin-bottom: 0.36rem; + color: #333; +} \ No newline at end of file diff --git a/h5/css/clear.css b/h5/css/clear.css new file mode 100644 index 0000000..398ad2d --- /dev/null +++ b/h5/css/clear.css @@ -0,0 +1,37 @@ +body,ul,li,h1,h2,h3,h4,h5,h6,p{ + margin: 0; + padding: 0; + list-style: none; +} +a { + text-decoration: none; + color: #000; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + -webkit-user-select: none; + -moz-user-focus: none; + -moz-user-select: none; +} +body,html,.content,.s-container,.s-wrapper { + height: 100%; +} +.swiper-dot { + background: #787777 !important; +} +.swiper-active { + background: #fb7299 !important; +} + +.s-container { + overflow: hidden; + position: relative; +} +.s-wrapper { + position: relative; + overflow: hidden; +} +.s-slide { + float: left; + height: calc(100% - 1.6rem - 1rem); + overflow-y: scroll; + margin-top: 1.6rem; +} \ No newline at end of file diff --git a/h5/css/home.css b/h5/css/home.css new file mode 100644 index 0000000..0585058 --- /dev/null +++ b/h5/css/home.css @@ -0,0 +1,132 @@ +.header { + height: 1.6rem; + position: fixed; + top: 0; + width: 100%; + left: 0; + z-index: 9; +} +.header_search { + height: 0.88rem; + display: flex; + justify-content: space-between; + padding: 0 0.3rem; + align-items: center; + box-sizing: border-box; +} +.search { + width: 82%; + background: #fff; + height: 0.6rem; + border-radius: 0.6rem; + display: flex; + align-items: center; + box-sizing: border-box; + padding-left: 0.3rem; +} +.search i { + color: #999; + font-size: 0.26rem; + margin-right: 0.1rem; + padding-top: 0.02rem; +} +.search span { + font-size: 0.24em; + color: #999; +} +.header_search a { + font-size: 0; +} +.icon-wo { + font-size: 0.4rem; +} +.icon-taozi1{ + font-size: 0.45rem; +} +.header_menu{ + position: relative; + height: 0.72rem; + display: flex; + background: #fe7fa2; +} +.header_menu .menu_list{ + display: flex; + width: calc(100% - 0.8rem); + overflow-x: scroll; + align-items: center; + padding-left: 0.3rem; + box-sizing: border-box; +} +.menu_list li { + font-size: 0.26rem; + flex-shrink: 0; + margin-right: 0.26rem; + color: #d3d2d2; +} +.header_menu i{ + width: 0.8rem; + height: 0.72rem; + position: absolute; + right: 0; + top: 0; + font-size: 0.3rem; + background: #fe7fa2; + color: #e3e3e3; + line-height: 0.72rem; + text-align: center; +} +.swiper-slide { + display: flex; + justify-content: space-around; + margin-top: 0.28rem; +} + +.item_content { + margin-top: 0.2rem; +} +.item_content .title{ + font-size: 0.32rem; + color: #333; + margin-bottom: 0.2rem; +} +.item_content ul{ + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} +.item_content li{ + width: 48%; + margin-bottom: 0.3rem; +} +.item_content .item_top { + position: relative; +} +.item_content .item_top img{ + width: 100%; +} +.item_content .item_top span { + position: absolute; + right: 0.2rem; + bottom: 0.52rem; + padding: 0.02rem 0.1rem; + background: #000; + color: #fff; + border-radius: 0.6rem; + font-size: 0.24rem; +} +.item_bottom .item_title{ + font-size: 0.32rem; + margin-bottom: 0.1rem; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + color: #333; +} +.source { + font-size: 0.26rem; + color: #666; +} + +.menu_active { + color: #ffffff !important; +} \ No newline at end of file diff --git a/h5/css/info.css b/h5/css/info.css new file mode 100644 index 0000000..dcb0912 --- /dev/null +++ b/h5/css/info.css @@ -0,0 +1,45 @@ +.info { + width: 100%; +} +.ddd { + font-size: 0; +} +.info img { + width: 100%; + height: auto; +} + +.info figure { + display: block; + margin: 0; + width: 100%; + font-size: 0; +} + +.info figcaption { + display: none; +} +.info .info_item{ + margin-bottom: 0.3rem; +} +.info_item p{ + font-size: 0.24rem; + color: #8e8e8e; + text-align: center; + margin-bottom: 0.1rem; +} +.info_item img{ + width: 100%; +} + +.icon-xin { + +} +.next_page { + display: inline-block; + font-size: 0.4rem; + margin-top: 0.2rem; + color: #fb7299; + width: 100%; + text-align: center; +} \ No newline at end of file diff --git a/h5/css/like.css b/h5/css/like.css new file mode 100644 index 0000000..5da7fac --- /dev/null +++ b/h5/css/like.css @@ -0,0 +1,18 @@ +.newest_img { + height: 5.3078rem; +} +.newest_img img { + height: 4.9678rem; +} +.nodata { + width: 100%; + text-align: center; + margin-top: 0.6rem; +} +.nodata i{ + font-size: 0.9rem; +} +.nodata p{ + font-size: 0.24rem; + color: #666; +} \ No newline at end of file diff --git a/h5/css/loading.css b/h5/css/loading.css new file mode 100644 index 0000000..c0e879f --- /dev/null +++ b/h5/css/loading.css @@ -0,0 +1,208 @@ +.loading { + position: fixed; + width: 100%; + height: 100%; + left: 0; + top: 0; + z-index: 999; + display: flex; + align-items: center; + justify-content: center; +} +.back { + padding: 0.4rem 0.4rem; + background: #fb7299; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.16rem; + max-width: 4rem; +} +.back span { + font-size: 0.3rem; + letter-spacing: 0.02rem; + color: #fff; +} +.load8 { + width: 0.8rem; + height: 0.8rem; + position: relative; +} +.dialog_f { + width: 86%; + background: #fff; + border-radius: 0.32rem; + font-size: 0.32rem; +} +.dialog_header { + padding-top: 0.52rem; + font-weight: 500; + line-height: 0.48rem; + text-align: center; +} +.dialog_message { + max-height: 60vh; + padding: 0.16rem 0.48rem 0.52rem 0.48rem; + overflow-y: auto; + font-size: 0.28rem; + line-height: 0.4rem; + text-align: center; +} +.dialog_footer { + display: flex; + height: 0.96rem; + border-top: 0.02rem solid #ebedf0; +} +.dialog_cancel, +.dialog_confirm { + width: 50%; + text-align: center; + line-height: 0.96rem; +} +.dialog_cancel:active { + background: #e6e6e6; + border-bottom-left-radius: 0.32rem; +} +.dialog_confirm:active { + background: #e6e6e6; + border-bottom-right-radius: 0.32rem; +} +.dialog_cancel { + color: #323233; + border-right: 0.02rem solid #ebedf0; +} +.dialog_confirm { + color: #fb7299; +} +.container1>div, +.container2>div, +.container3>div { + width: 0.2rem; + height: 0.2rem; + background-color: #fff; + border-radius: 100%; + position: absolute; + -webkit-animation: bouncedelay 1.2s infinite ease-in-out; + animation: bouncedelay 1.2s infinite ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.load8 .load8-container { + position: absolute; + width: 100%; + height: 100%; +} + +.container2 { + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.container3 { + -webkit-transform: rotateZ(90deg); + transform: rotateZ(90deg); +} + +.circle1 { + top: 0; + left: 0; +} + +.circle2 { + top: 0; + right: 0; +} + +.circle3 { + right: 0; + bottom: 0; +} + +.circle4 { + left: 0; + bottom: 0; +} + +.container2 .circle1 { + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.container3 .circle1 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +.container1 .circle2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.container2 .circle2 { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +.container3 .circle2 { + -webkit-animation-delay: -0.7s; + animation-delay: -0.7s; +} + +.container1 .circle3 { + -webkit-animation-delay: -0.6s; + animation-delay: -0.6s; +} + +.container2 .circle3 { + -webkit-animation-delay: -0.5s; + animation-delay: -0.5s; +} + +.container3 .circle3 { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.container1 .circle4 { + -webkit-animation-delay: -0.3s; + animation-delay: -0.3s; +} + +.container2 .circle4 { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + +.container3 .circle4 { + -webkit-animation-delay: -0.1s; + animation-delay: -0.1s; +} + +@-webkit-keyframes bouncedelay { + + 0%, + 80%, + 100% { + -webkit-transform: scale(0.0) + } + + 40% { + -webkit-transform: scale(1.0) + } +} + +@keyframes bouncedelay { + + 0%, + 80%, + 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } + + 40% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} \ No newline at end of file diff --git a/h5/css/mechanism.css b/h5/css/mechanism.css new file mode 100644 index 0000000..c28cb6e --- /dev/null +++ b/h5/css/mechanism.css @@ -0,0 +1,23 @@ +.mechanism_list { + display: flex; + flex-wrap: wrap; + margin-top: 0.3rem; + padding: 0 0.3rem; +} +.mechanism_list li { + width: 25%; + text-align: center; + font-size: 0; + margin-bottom: 0.7rem; +} +.mechanism_list p { + font-size: 0.32rem; + margin-bottom: 0.06rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.mechanism_list span { + font-size: 0.24rem; + color: #fb7299; +} \ No newline at end of file diff --git a/h5/css/model.css b/h5/css/model.css new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/h5/css/model.css @@ -0,0 +1 @@ + diff --git a/h5/css/model_info.css b/h5/css/model_info.css new file mode 100644 index 0000000..4fe831c --- /dev/null +++ b/h5/css/model_info.css @@ -0,0 +1,24 @@ +.model_info_header { + display: flex; + justify-content: flex-start; + align-items: center; + font-size: 0; +} +.model_info_header img{ + width: 1.4rem; + height: 1.4rem; + margin-right: 0.2rem; + border-radius: 100%; +} +.right_text { + flex: 1; +} +.right_text p{ + font-weight: 500; + font-size: 0.32rem; + margin-bottom: 0.12rem; +} +.right_text span{ + font-size: 0.24rem; + color: #909090; +} \ No newline at end of file diff --git a/h5/css/my.css b/h5/css/my.css new file mode 100644 index 0000000..24bbedd --- /dev/null +++ b/h5/css/my.css @@ -0,0 +1,44 @@ +.header_my { + display: flex; + align-items: center; + justify-content: center; + height: 4rem; + flex-direction: column; +} +.header_my i{ + font-size: 1.2rem; + margin-bottom: 0.2rem; + color: #fff; +} +.header_my p{ + font-size: 0.32rem; + color: #fff; +} +.setting_list { + margin-top: 0.2rem; +} +.list_item:active { + background: #e6e6e6;; +} +.list_item a{ + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 0.3rem; + height: 0.96rem; +} +.item_left { + display: flex; + align-items: center; +} +.item_left .iconfont{ + font-size: 0.4rem; + margin-right: 0.2rem; +} +.item_left span{ + font-size: 0.3rem; +} +.icon-qianjin-tongyong { + font-size: 0.28rem; + color: #c3c0c0; +} \ No newline at end of file diff --git a/h5/css/public.css b/h5/css/public.css new file mode 100644 index 0000000..0e23d91 --- /dev/null +++ b/h5/css/public.css @@ -0,0 +1,221 @@ +.theme_color { + background: #fb7299; +} +.color_theme { + color: #fb7299; +} +.color_white { + color: white; +} +.padding_30 { + padding: 0.3rem 0.3rem 0 0.3rem; +} +.active { + color:#fb7299 !important; +} + +/* 底部样式 */ +.footer { + position: fixed; + width: 100%; + background: #fff; + height: 1rem; + bottom: 0; +} +.footer ul{ + display: flex; + justify-content: space-around; + align-items: center; + height: 100%; + border-top: 0.02rem solid #e8ebec; + box-sizing: border-box; + padding-top: 0.1rem; +} +.footer ul li a{ + display: flex; + flex-direction: column; + text-align: center; +} +.footer ul li i{ + font-size: 0.3rem; + margin-bottom: 0.08rem; +} +.footer ul li span{ + font-size: 0.24rem; +} +.footer_active i { + color: #fb7299; +} +.footer_active span { + color: #fb7299; +} + + +.header_theme1 { + position: fixed; + width: 100%; + height: 0.9rem; + left: 0; + top: 0; + display: flex; + align-items: center; + padding: 0 0.3rem; + box-sizing: border-box; + z-index: 999; + justify-content: space-between; + font-size: 0; +} +.header_theme1 i { + color: #fff; + margin-right: 0.2rem; +} +.header_theme1 span { + color: #fff; + font-size: 0.32rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + + +/* 模特的css */ +.item { + position: relative; + text-align: center; + width: 22%; +} +.top { + position: relative; +} +.item span { + font-size: 0.22rem; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 0.06rem; + padding: 0.02rem 0.1rem; + background: rgb(0 0 0 / 58%); + color: #fff; + border-radius: 0.2rem; +} +.item img { + width: 1.2rem; + height: 1.2rem; + border-radius: 100%; +} +.item p { + font-size: 0.24rem; + color: #7e7979; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 公共的列表样式 */ +.item_list .title { + font-size: 0.34rem; + color: #333; + margin-bottom: 0.26rem; + margin-top: 0.3rem; +} +.item_list ul { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} +.item_list ul li{ + width: 48%; + margin-bottom: 0.3rem; +} +.item_list ul .newest_img{ + position: relative; +} +.item_list ul .newest_text{} +.item_list .newest_img img{ + width: 100%; + border-radius: 0.1rem; +} +.item_list .newest_img span{ + position: absolute; + padding: 0.08rem 0.14rem; + background: rgb(251 114 153 / 73%); + color: rgb(255 255 255 / 73%); + font-size: 0.24rem; + right: 0.2rem; + bottom: 0.42rem; + border-radius: 0.28rem; +} +.item_list .newest_text .t{ + color: #333; + font-size: 0.3rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-bottom: 0.08rem; +} +.newest_text .source { + color: #666; + font-size: 0.26rem; + margin-bottom: 0.02rem; +} +.newest_text .tags { + display: flex; + flex-wrap: wrap; + margin-top: 0.08rem; +} +.newest_text .tags_item { + padding: 0.04rem 0.1rem; + font-size: 0.24rem; + background: #fb7299; + margin-right: 0.06rem; + color: #fff; + border-radius: 0.18rem; + margin-bottom: 0.06rem; +} +.tags_item a { + color: #fff; +} + +.content_info { + padding-top: 0.9rem; +} +.content_my { + padding-bottom: 1rem; +} +.content_theme1 { + padding-top: 0.9rem; + padding-bottom: 1rem; +} + +.model_list { + display: flex; + justify-content: space-around; + margin-top: 0.24rem; + flex-wrap: wrap; +} +.model_list .item { + margin-bottom: 0.6rem; +} + +.openApp { + position: fixed; + right: 0.3rem; + bottom: 1.8rem; + width: 1rem; + height: 1rem; + z-index: 9; + font-size: 0; +} +.openApp img{ + width: 100%; + height: 100%; + margin-bottom: 0.1rem; +} +.openApp p { + font-size: 0.24rem; + background: #fb7299; + color: #fff; + padding: 0.04rem 0.02rem; + text-align: center; + border-radius: 0.1rem; +} \ No newline at end of file diff --git a/h5/css/reg.css b/h5/css/reg.css new file mode 100644 index 0000000..e142690 --- /dev/null +++ b/h5/css/reg.css @@ -0,0 +1,48 @@ +.content_theme1 { + font-size: 0; + padding-top: 20%; + padding-left: 0.3rem; + padding-right: 0.3rem; +} +.content_theme1 h2{ + font-size: 0.5rem; + margin-bottom: 0.4rem; +} +.content_theme1 p { + font-size: 0.32rem; +} +.content_theme1 span { + font-size: 0.26rem; + color: #7e7979; +} +.reg_input { + margin-top: 0.6rem; +} +.reg_input input { + width: 100%; + height: 0.9rem; + border: none; + outline: none; + border-bottom: 0.02rem solid #e1e0e0; +} +.showpas { + position: relative; + width: 100%; +} +.showPassword { + position: absolute; + right: 0; + top: 0.32rem; + font-size: 0.36rem; + color: #777777; +} +.reg_input button { + margin-top: 1.6rem; + width: 100%; + height: 40px; + border: none; + border-radius: 0.4rem; + background: #fb7299; + color: #fff; + font-size: 0.34rem; +} \ No newline at end of file diff --git a/h5/css/search.css b/h5/css/search.css new file mode 100644 index 0000000..ba18370 --- /dev/null +++ b/h5/css/search.css @@ -0,0 +1,36 @@ +.search_input { + font-size: 0; + display: flex; + height: 0.88rem; + align-items: center; + box-sizing: border-box; + justify-content: space-between; + padding: 0 0.3rem; + position: fixed; + width: 100%; + left: 0; + top: 0; + z-index: 999; +} +.search_input input{ + width: 80%; + border: none; + outline: none; + height: 0.6rem; + padding-left: 0.3rem; + border-radius: 0.6rem; + box-sizing: border-box; + font-size: 0.26rem; +} +.search_input i { + color: #fff; + font-size: 0.32rem; + font-weight: bolder; +} +.search_list ul .nodata{ + font-size: 0.26rem; + width: 100%; + text-align: center; + color: #666; + margin-top: 0.4rem; +} \ No newline at end of file diff --git a/h5/css/swiper.css b/h5/css/swiper.css new file mode 100644 index 0000000..62014b1 --- /dev/null +++ b/h5/css/swiper.css @@ -0,0 +1,42 @@ +.swiper-wrapper .swiper-slide { + float: left; +} +.swiper-container { + overflow: hidden; + position: relative; +} +.swiper-pagination { + position: absolute; + bottom: 10px; + left: 50%; + transform: translateX(-50%); +} +.swiper-dot { + width: 7px; + height: 7px; + background: #fff; + border-radius: 100%; + margin-right: 5px; + float: left; +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #fff; + font-size: 30px; + cursor: pointer; +} +.swiper-button-prev { + left: 10px; +} +.swiper-button-next { + right: 10px; +} +.swiper-wrapper { + position: relative; +} +.swiper-active { + background: red !important; +} \ No newline at end of file diff --git a/h5/css/type_edit.css b/h5/css/type_edit.css new file mode 100644 index 0000000..ae5ab13 --- /dev/null +++ b/h5/css/type_edit.css @@ -0,0 +1,25 @@ +.chioose { + margin-top: 0.3rem; +} +.chioose p { + font-size: 0.24rem; + margin-bottom: 0.14rem; + color: #666; +} +.chiooseWrap { + display: flex; + flex-wrap: wrap; +} +.chiooseWrap li{ + width: 23.8%; + text-align: center; + font-size: 0.28rem; + border: 1px solid #ccc; + margin-bottom: 0.1rem; + padding: 0.1rem 0; + box-sizing: border-box; + margin-right: 0.1rem; +} +.chiooseWrap li:nth-child(4n) { + margin-right: 0 !important; +} \ No newline at end of file diff --git a/h5/img/.pydio b/h5/img/.pydio new file mode 100644 index 0000000..0f199ce --- /dev/null +++ b/h5/img/.pydio @@ -0,0 +1 @@ +190bf728-ecb6-41a2-b182-ccae33a5acd2 \ No newline at end of file diff --git a/h5/img/logo.png b/h5/img/logo.png new file mode 100644 index 0000000..20f598d Binary files /dev/null and b/h5/img/logo.png differ diff --git a/h5/index.js b/h5/index.js new file mode 100644 index 0000000..3f97b9a --- /dev/null +++ b/h5/index.js @@ -0,0 +1,8 @@ +const express = require('express'); +const path = require('path'); +const app = express(); +app.use(express.static(path.join(__dirname, './'))); + +app.listen(80, () => { + console.log(`App listening at port 80`) +}); \ No newline at end of file diff --git a/h5/js/.pydio b/h5/js/.pydio new file mode 100644 index 0000000..c272ab4 --- /dev/null +++ b/h5/js/.pydio @@ -0,0 +1 @@ +98fe628d-1925-4f47-bd76-c01ba2962e8d \ No newline at end of file diff --git a/h5/js/config/.pydio b/h5/js/config/.pydio new file mode 100644 index 0000000..7855dd5 --- /dev/null +++ b/h5/js/config/.pydio @@ -0,0 +1 @@ +7b3d63ff-1f55-4bd0-94d0-7f9557551b6b \ No newline at end of file diff --git a/h5/js/config/index.js b/h5/js/config/index.js new file mode 100644 index 0000000..4c8e16b --- /dev/null +++ b/h5/js/config/index.js @@ -0,0 +1,19 @@ +/** + * 项目的配置文件 + */ +var Config = { + BaseUrl: 'http://127.0.0.1:3000/api/json', // 测试环境基地址 + // BaseUrl: 'http://47.114.153.249:3000/api/json', // 正式环境地址 + ApiList: { + index: '/index', // 获取首页 + info: '/info', // 进入详情 + mechanism: '/mechanism', // 获取机构 + mechanismList: '/mechanismList', // 获取机构下面的列表 + type: '/class', // 获取首页顶部的分类 + classList: '/classList', // 获取分类列表 + allModel: '/allModel', // 所有模特 + modelList: '/modelList', // 进入模特的个人主页 + search: '/search', // 搜索接口 + register: '/register', // 用户注册接口 + } +} \ No newline at end of file diff --git a/h5/js/http/.pydio b/h5/js/http/.pydio new file mode 100644 index 0000000..6d1df07 --- /dev/null +++ b/h5/js/http/.pydio @@ -0,0 +1 @@ +fde3a02a-8c34-4e71-b172-2fad0859c904 \ No newline at end of file diff --git a/h5/js/http/index.js b/h5/js/http/index.js new file mode 100644 index 0000000..86818ab --- /dev/null +++ b/h5/js/http/index.js @@ -0,0 +1,59 @@ +/** + * ajax代码的封装 + * @param {*} params + */ +function ajax(params) { + return new Promise(function (resolve, reject) { + // 显示加载进度条 + Tips.loading() + // 拿出电话(创建一个新的ajax对象) + var ajax = new XMLHttpRequest(); + ajax.timeout = 10000 + // 如果是GET请求特殊处理一下参数 + if (params.methods == "GET") { + var par = "" + for (const key in params.data) { + par += `&${key}=${params.data[key]}` + } + params.url = params.url + "?" + par.substr(1) + } + + // 设置电话号码 + // 是否异步 + ajax.open(params.methods, Config.BaseUrl + params.url, true) + + // 如果是post请求,那么设置一下post请求的参数用何种数据格式给后端 + // json格式 + if (params.methods == "POST") { + ajax.setRequestHeader('Content-Type', 'application/json;charset=utf-8') + } + + // 拨号 + if (params.methods == "POST") { + ajax.send(JSON.stringify(params.data)); + } else { + ajax.send() + } + + // 监听网络状态,只有网络请求成功的时候才渲染页面,否则显示错误信息 + ajax.onreadystatechange = function () { + if (ajax.readyState == 4) { + if (ajax.status == 200) { + var data = JSON.parse(ajax.responseText); + if (data.status == 200 || data.code == 200) { + // 关闭进度条 + Tips.close() + resolve(data.result || data) + } else { + Tips.toast(data.msg || data.error) + throw new Error(data.msg || data.error); + } + } else { + Tips.toast("网络故障,稍后再试..") + // reject("数据请求失败,稍后再试") + } + } + } + + }) +} \ No newline at end of file diff --git a/h5/js/page/.pydio b/h5/js/page/.pydio new file mode 100644 index 0000000..b1caca6 --- /dev/null +++ b/h5/js/page/.pydio @@ -0,0 +1 @@ +1389d664-0cad-42b0-b080-5e05130ca49c \ No newline at end of file diff --git a/h5/js/page/home.js b/h5/js/page/home.js new file mode 100644 index 0000000..08d3ad4 --- /dev/null +++ b/h5/js/page/home.js @@ -0,0 +1,322 @@ +class Home { + + constructor() { + this.TabsDatas = []; + this.list = []; + this.PageSwiper = null; + this.CurrentPage = 0; + // 点击搜索进入搜索页面 + document.querySelector(".search").onclick = () => { + location.href = "./search.html" + } + + // 通过在本地保存一个变量 homeIndex,记录用户在首页当前浏览到哪个分类, + // 然后从其他页面回首页,那么根据本地变量 homeIndex 的数值,再回到上次浏览的分类 + if (localStorage.getItem("homeIndex") != null) { + this.CurrentPage = localStorage.getItem("homeIndex") + } + + this.GetTypeData().then(() => this.GetIndexData()) + } + + // 获取分类的数据,并渲染页面 + async GetTypeData() { + if (localStorage.getItem("typeList") == null) { + // 获取分类数据 + this.list = (await homeService.type({})).principal; + localStorage.setItem("typeList", JSON.stringify(this.list)) + } else { + this.list = JSON.parse(localStorage.getItem("typeList")) + } + + console.log("this.list ============== :", this.list); + // 根据分类的数组长度遍历生成与分类对应的内容 + this.list.forEach((v, i) => { + this.TabsDatas.push({ + id: v.id, + title: v.title, + page: 0, + TotalPage: 0, + content: [] + }) + document.querySelector(".s-wrapper").innerHTML += + ` +
+
+
    + +
+
+
+ ` + }); + + // 为每一个内容绑定滚动事件 + var slide = document.querySelectorAll(".s-wrapper .s-slide"); + var self = this; + slide.forEach((v, i) => { + if (i > 0) { + v.addEventListener('scroll', function () { + if (Math.ceil(this.scrollHeight - this.scrollTop) == this.clientHeight) { + self.TabsDatas[i - 1].page += 1; + if (self.TabsDatas[i - 1].page <= self.TabsDatas[i - 1].TotalPage) { + self.GetTypeInfoData(i) + } + } + }) + } + }) + + // 向数据中追加首页 + this.list.unshift({ id: -1, title: '首页' }); + // 根据数据生成横向菜单 + var MenuList = document.querySelector(".menu_list"); + this.list.forEach((v, i) => { + MenuList.innerHTML += ` +
  • ${v.title}
  • + ` + }); + + + // 如果本地有 homeIndex,那么从其他页面返回的时候将顶部菜单滚动到对应位置 + if (localStorage.getItem("homeIndex") != null) { + var offsetLeft = document.querySelectorAll(".menu_list li")[this.CurrentPage].offsetLeft - 14; + document.querySelector(".menu_list").scrollLeft = offsetLeft + } + + // 横向菜单被点击的时候 + var mLi = document.querySelectorAll(".menu_list li") + mLi.forEach((v, i) => { + v.onclick = (e) => { + this.SetUrl(i) + + // 使横向菜单滑动 + document.querySelector(".menu_list").scrollLeft = e.target.offsetLeft - 14 + + // 清除激活样式 + mLi.forEach(d => d.className = "") + // 添加激活样式 + v.className = "menu_active" + this.PageSwiper.slideTo(i) + // 请求用户点击的分类的列表数据 + if (this.list[i].id != -1 && this.TabsDatas[i - 1].content.length == 0) { + this.GetTypeInfoData(i) + } + } + }) + + this.initPageSwiper(); + } + + /** + * 初始化页面切换的轮播 + */ + initPageSwiper() { + this.PageSwiper = new swiper('.s-container', { + time: 3, + wrapper: '.s-wrapper', + slide: '.s-slide', + auto: false, + speed: 300, + on: { + slideChangeTransitionStart: (index) => { + this.SetUrl(index) + // 获取所有菜单的li标签 + var MenuLi = document.querySelectorAll(".menu_list li"); + // 清除激活样式 + MenuLi.forEach(v => v.className = "") + // 添加激活样式 + MenuLi[index].className = "menu_active" + // 页面滚动的时候顶部菜单也移动位置 + document.querySelector(".menu_list").scrollLeft = MenuLi[index].offsetLeft - 14; + // 请求用户点击的分类的列表数据 + if (this.list[index].id != -1 && this.TabsDatas[index - 1].content.length == 0) { + this.GetTypeInfoData(index) + } + } + } + }) + + // 必须在轮播图初始化后才去请求跳转到对应的页面和请求页面数据 + if (this.CurrentPage != 0) { + this.GetTypeInfoData(this.CurrentPage) + this.PageSwiper.slideTo(this.CurrentPage) + } + } + + // 修改地址栏id参数为下标,然后重新进入首页的时候,直接继续进入上次访问分类 + SetUrl(index) { + // 本地保存下标 + localStorage.setItem("homeIndex", index) + } + + /** + * 获取分类下的列表数据 + */ + async GetTypeInfoData(index) { + + var res = await homeService.classList({ + page: this.TabsDatas[index - 1].page, + id: this.TabsDatas[index - 1].id + }); + this.TabsDatas[index - 1].page = res.current_page; + this.TabsDatas[index - 1].TotalPage = res.total_page; + this.TabsDatas[index - 1].content = [ + ...this.TabsDatas[index - 1].content, + ...res.data + ]; + + var sWrapper = document.querySelectorAll(".s-wrapper .s-slide .list_content ul") + res.data.forEach((v) => { + sWrapper[index - 1].innerHTML += ` +
  • +
    + + ${v.title} + + ${v.total}P +
    +
    + +

    ${v.title}

    +

    ${v.user}

    +

    ${v.source}

    +
    +
    + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
    +
    +
  • + ` + }); + } + + // 获取首页的数据,并渲染各个布局 + async GetIndexData() { + // 获取首页的数据 + var list = await homeService.GetHomeData({}); + // 轮播图模特的数据 + var ModelList = list.model.res; + // 最新收录 + var newestList = list.newest.data; + // 今日推荐 + var recommendedList = list.recommended.data; + + var swiperWrapper = document.querySelector(".swiper-wrapper"); + // 根据数据遍历生成banner 的 swiper-slide + var slideElement = []; + [1, 2].forEach(() => { + var o = document.createElement("div"); + o.className = "swiper-slide"; + slideElement.push(o) + }) + ModelList.forEach((v, i) => { + if (i <= 3) { + slideElement[0].innerHTML += + `
    + +
    + + ${v.total} +
    +

    ${v.title}

    +
    +
    ` + } else { + slideElement[1].innerHTML += + `
    + +
    + + ${v.total} +
    +

    ${v.title}

    +
    +
    ` + } + }) + // 将 swiper-slide 填入页面中 + slideElement.forEach(v => swiperWrapper.appendChild(v)) + + new swiper('.swiper-container', { + time: 3, + auto: false, + speed: 800 + }); + + + // 遍历 最新收录 + document.querySelector(".newest .title").innerHTML = ` + + 最新收录 + `; + newestList.forEach(v => { + document.querySelector(".newest ul").innerHTML += + ` +
  • +
    + + ${v.title} + + ${v.total_page}套 +
    +
    + +

    ${v.title}

    +

    ${v.user}

    +

    ${v.source}

    +
    +
    + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
    +
    +
  • + ` + }) + + // 今日推荐 + document.querySelector(".recommended .title").innerHTML = ` + + 今日推荐 + `; + recommendedList.forEach(v => { + document.querySelector(".recommended ul").innerHTML += + ` +
  • +
    + + ${v.title} + + ${v.total_page}套 +
    +
    + +

    ${v.title}

    +

    ${v.user}

    +

    ${v.source}

    +
    +
    + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } + +
    +
    +
  • + ` + }) + } +} + +var home = new Home(); \ No newline at end of file diff --git a/h5/js/page/info.js b/h5/js/page/info.js new file mode 100644 index 0000000..53cfec0 --- /dev/null +++ b/h5/js/page/info.js @@ -0,0 +1,173 @@ +class Info { + + constructor() { + this.page = 1; + this.TotalPage = 0; + this.preview = ""; + this.InfoList = []; + this.GetInfoData() + } + + async GetInfoData(action = "first") { + this.InfoList = await homeService.info({ + id: utils.GetQueryString("id"), + page: this.page + }); + + this.TotalPage = this.InfoList.total_page + // 设置网页标题 + document.title = this.InfoList.title + + this.InfoList.data.forEach((v) => { + var image = new Image(); + image.src = v.src; + image.onload = () => { + if (image.width < image.height) { + this.preview = v.src; + } + this.LikePhotot() + document.querySelector(".info").innerHTML += ` +
    + + ${v.title} + +
    ${v.title}
    +
    + ` + } + }); + + this.BindNextPage(); + initPhotoSwipeFromDOM('.info'); + + if (action == "first") { + + document.querySelector(".recommend .title").innerText = "推荐写真" + this.InfoList.recommend.forEach(v => { + document.querySelector(".recommend ul").innerHTML += + ` +
  • +
    + + ${v.title} + + ${v.total}P +
    +
    + +

    ${v.title}

    +

    ${v.user}

    +

    ${v.source}

    +
    +
    + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
    +
    +
  • + ` + }) + + document.querySelector(".relevant .title").innerText = "相关写真" + this.InfoList.relevant.forEach(v => { + document.querySelector(".relevant ul").innerHTML += + ` +
  • +
    + + ${v.title} + + ${v.total}P +
    +
    + +

    ${v.title}

    +

    ${v.user}

    +

    ${v.source}

    +
    +
    + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
    +
    +
  • + ` + }) + + } + + } + + BindNextPage() { + document.querySelector(".next_page").style.display = "block" + document.querySelector(".next_page").onclick = () => { + this.page += 1; + if (this.page > this.TotalPage) { + document.querySelector(".next_page").style.display = "none" + } else { + if (this.page == this.TotalPage) { + document.querySelector(".next_page").style.display = "none" + this.GetInfoData("loadMore") + } else { + this.GetInfoData("loadMore") + } + } + } + } + + LikePhotot() { + // true 收藏, false 取消收藏 + var status = null; + var LikeList = JSON.parse(localStorage.getItem("likeList")) == null + ? [] : JSON.parse(localStorage.getItem("likeList")) + + var isHave = LikeList.filter((v) => { + if (v.id == utils.GetQueryString("id")) { + return v + } + }) + + // 该写真你未收藏,true 点击进行收藏 + if (isHave.length == 0) { + status = true + // 改写真你已收藏,点击取消收藏 + } else { + status = false + document.querySelector(".like").className = "like iconfont icon-aixin" + } + + document.querySelector(".like").onclick = () => { + console.log(this.preview); + if (status == true) { + LikeList.push({ + id: utils.GetQueryString("id"), + title: this.InfoList.title, + user: this.InfoList.info, + source: this.InfoList.source, + total: this.InfoList.total, + preview: this.preview + }) + localStorage.setItem("likeList", JSON.stringify(LikeList)) + status = false + document.querySelector(".like").className = "like iconfont icon-aixin" + + } else { + LikeList = LikeList.filter((v) => { + if (v.id != utils.GetQueryString("id")) { + return v + } + }); + status = true + document.querySelector(".like").className = "like iconfont icon-xin" + + localStorage.setItem("likeList", JSON.stringify(LikeList)) + } + } + } +} + +new Info() \ No newline at end of file diff --git a/h5/js/page/like.js b/h5/js/page/like.js new file mode 100644 index 0000000..f279d7b --- /dev/null +++ b/h5/js/page/like.js @@ -0,0 +1,74 @@ +class Like { + constructor() { + this.like = JSON.parse(localStorage.getItem("likeList")) == null + ? [] + : JSON.parse(localStorage.getItem("likeList")); + + this.GetLikeList() + } + + GetLikeList() { + if (this.like == null || this.like.length == 0) { + document.querySelector(".jglist ul").innerHTML = ""; + document.querySelector(".jglist ul").innerHTML = + ` +
    + +

    暂无收藏

    +
    + ` + } else { + document.querySelector(".jglist ul").innerHTML = ""; + this.like.forEach(v => { + document.querySelector(".jglist ul").innerHTML += + ` +
  • +
    + + ${v.title} + + ${v.total} +
    + +
  • + ` + }); + + this.BindLongPress() + } + } + + BindLongPress() { + var Li = document.querySelectorAll(".jglist ul li"); + Li.forEach((v, i) => { + utils.longPress(v, () => { + Tips.dialog({ + title: '删除收藏', + message: '确认删除您选中的写真集吗?', + cancelText: '取消', + confirmText: '确定', + cancel: () => { }, + confirm: () => { + this.like = this.like.filter((r)=>{ + return r.id != this.like[i].id + }) + + localStorage.setItem("likeList", JSON.stringify(this.like)) + this.GetLikeList() + } + }) + }) + }) + } +} + +new Like() \ No newline at end of file diff --git a/h5/js/page/mechanism.js b/h5/js/page/mechanism.js new file mode 100644 index 0000000..150bd0b --- /dev/null +++ b/h5/js/page/mechanism.js @@ -0,0 +1,23 @@ +class Mechanism { + constructor () { + this.GetMechanismList() + } + + async GetMechanismList() { + var res = await homeService.mechanism({}); + console.log(res); + var Li = document.querySelector(".mechanism_list"); + res.forEach(v => { + Li.innerHTML+=` +
  • + +

    ${v.title}

    + ${v.quantity} +
    +
  • + ` + }); + } +} + +var mechanism = new Mechanism(); \ No newline at end of file diff --git a/h5/js/page/mechanism_info.js b/h5/js/page/mechanism_info.js new file mode 100644 index 0000000..65b14db --- /dev/null +++ b/h5/js/page/mechanism_info.js @@ -0,0 +1,60 @@ +class MechanismInfo { + + constructor () { + // 设置标题栏文字 + utils.SetHeaderTitle(utils.GetQueryString("t")) + this.GetMechanismInfo() + } + + async GetMechanismInfo() { + var res = [] + if (utils.GetQueryString("type") == "tags") { + res = await homeService.classList({ + page: 0, + id: utils.GetQueryString("id") + }) + } else { + res = await homeService.mechanismList({ + page: 0, + id: utils.GetQueryString("id") + }) + } + + console.log(res); + + res.data.forEach(v => { + document.querySelector(".jglist ul").innerHTML+= + ` +
  • +
    + + ${v.title} + + ${v.total}P +
    +
    + +

    ${v.title}

    +

    ${v.user}

    + ${ + v.hasOwnProperty("source") + ? `

    ${v.source}

    ` + : '' + } +
    +
    + ${ + (v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
    +
    +
  • + ` + }); + } + +} + +new MechanismInfo() \ No newline at end of file diff --git a/h5/js/page/model.js b/h5/js/page/model.js new file mode 100644 index 0000000..9ab2a7a --- /dev/null +++ b/h5/js/page/model.js @@ -0,0 +1,56 @@ +class Model { + constructor () { + this.GetModelList() + this.newModelList = [] + } + + async GetModelList() { + var res = await homeService.allModel({}); + console.log(res); + var hot_models = res.hot_models; + var newest = res.newest; + + this.newModelList = [...hot_models, ...newest] + this.RenderModelItem(hot_models, '.hot_models') + this.RenderModelItem(newest, '.newest') + + } + + + RenderModelItem(data, className) { + if (className == ".hot_models") { + document.querySelector(`${className} .title`).innerText='热门模特' + } else { + document.querySelector(`${className} .title`).innerText='最新模特' + } + data.forEach(v => { + document.querySelector(`${className} .model_list`).innerHTML+= + ` +
    +
    + ${v.title} + ${ + v.total.length == 0 + ? '' + : `${v.total}` + } +
    +

    ${v.title}

    +
    + ` + }); + + this.BindItemClick() + } + + BindItemClick() { + var Item = document.querySelectorAll(".item"); + Item.forEach((v,i)=>{ + v.onclick = () => { + location.href = `model_info.html?id=${this.newModelList[i].id}&t=${this.newModelList[i].title}` + } + }) + } +} + +var model = new Model(); \ No newline at end of file diff --git a/h5/js/page/model_info.js b/h5/js/page/model_info.js new file mode 100644 index 0000000..bba9c5e --- /dev/null +++ b/h5/js/page/model_info.js @@ -0,0 +1,75 @@ +class ModelInfo { + + constructor () { + utils.SetHeaderTitle(utils.GetQueryString("t")) + this.GetModelInfoData() + } + + async GetModelInfoData() { + var res = await homeService.modelList({ + page: 0, + id: utils.GetQueryString("id") + }) + + // 设置模特的头像,名字,介绍 + document.querySelector(".model_info_header").innerHTML = ` + ${res.model_info.name} +
    +

    ${res.model_info.name}

    + ${res.model_info.explain} +
    + ` + + // 遍历模特的作品 + document.querySelector(".tazuop .title").innerText = "她的作品" + res.data.forEach(v => { + document.querySelector(".tazuop ul").innerHTML+= + ` +
  • +
    + + ${v.title} + + ${v.total}P +
    +
    + +

    ${v.title}

    +

    ${v.source}

    +
    +
    + ${ + (v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
    +
    +
  • + ` + }); + + // 遍历类似模特 + document.querySelector(".similar .title").innerText = "类似模特" + res.similar.forEach((v)=>{ + document.querySelector(".similar .model_list").innerHTML+= ` +
    +
    + ${v.title} + ${v.total} +
    +

    ${v.title}

    +
    + ` + }) + + var items = document.querySelectorAll(".similar .model_list .item") + items.forEach((v,i)=>{ + v.onclick = function () { + location.href = `model_info.html?id=${res.similar[i].id}&t=${res.similar[i].title}` + } + }) + } +} + +new ModelInfo() \ No newline at end of file diff --git a/h5/js/page/my.js b/h5/js/page/my.js new file mode 100644 index 0000000..da2bd3b --- /dev/null +++ b/h5/js/page/my.js @@ -0,0 +1,30 @@ +class My { + constructor() { + this.bindClick() + } + + bindClick() { + document.querySelector(".updateApp").onclick = function () { + Tips.loading() + setTimeout(()=>{ + Tips.close(); + Tips.toast("当前已是最新版本",2000) + },2000) + } + document.querySelector(".clearData").onclick = function () { + Tips.dialog({ + title: '清除缓存', + message: '是否清除App所有的缓存,将会删除收藏的数据,首页的自定义分类等,慎重选择!!', + cancelText: '取消', + confirmText: '确定', + confirm: ()=> { + localStorage.clear() + setTimeout(()=>{ + Tips.toast("缓存清除成功") + },1000) + } + }) + } + } +} +new My() \ No newline at end of file diff --git a/h5/js/page/reg.js b/h5/js/page/reg.js new file mode 100644 index 0000000..a60dc73 --- /dev/null +++ b/h5/js/page/reg.js @@ -0,0 +1,59 @@ +class Reg { + constructor() { + this.showPassword(); + this.phone = document.querySelector(".userphone"); + this.pass = document.querySelector(".showpas input"); + this.UserReg() + } + + showPassword() { + var showPassword = document.querySelector(".showPassword"); + + showPassword.onclick = () => { + if (showPassword.classList.contains("icon-eye1")) { + showPassword.classList.remove("icon-eye1") + showPassword.classList.add("icon-eye") + this.pass.type = "text" + } else { + this.pass.type = "password" + showPassword.classList.remove("icon-eye") + showPassword.classList.add("icon-eye1") + } + + } + } + + UserReg() { + document.querySelector(".reg_input button").onclick = async () => { + if (!/^[1][3,4,5,7,8,9][0-9]{9}$/.test(this.phone.value)) { + Tips.toast("手机号格式不正确",2000) + return; + } + + if (this.pass.value.length == 0) { + Tips.toast("密码不能为空",2000) + return; + } + + let res = await homeService.search({ + userphone: this.phone.value, + userpwd: this.pass.value, + superior: utils.GetQueryString("objectId") == null + ? '' + : utils.GetQueryString("objectId") + }); + + Tips.dialog({ + title: '温馨提示', + message: '注册成功,点击确定跳转至App下载页面,请安装App', + cancelText: '取消', + confirmText: '确定', + confirm: ()=> { + location.href = "../share/index.html"; + } + }) + } + + } +} +new Reg() \ No newline at end of file diff --git a/h5/js/page/search.js b/h5/js/page/search.js new file mode 100644 index 0000000..e9b5396 --- /dev/null +++ b/h5/js/page/search.js @@ -0,0 +1,48 @@ +class Search { + constructor() { + this.GetSearchList() + } + + async GetSearchList() { + var SearchInput = document.querySelector(".search_input input"), + SearchSubmit = document.querySelector(".search_input .icon-search"); + + SearchSubmit.onclick = async () => { + console.log("111"); + if (SearchInput.value.length == 0) { + Tips.toast("输入不能为空") + } else { + var res = await homeService.search({ + keyword: SearchInput.value + }); + if (res.length == 0) { + document.querySelector(".search_list ul").innerHTML = "" + document.querySelector(".search_list ul").innerHTML = ` + 没有搜索结果 + ` + } else { + document.querySelector(".search_list ul").innerHTML = "" + res.forEach(v => { + document.querySelector(".search_list ul").innerHTML+= ` +
  • +
    + + ${v.title} + + 49P +
    + +
  • + ` + }); + } + } + } + + } +} +new Search() \ No newline at end of file diff --git a/h5/js/page/type_edit.js b/h5/js/page/type_edit.js new file mode 100644 index 0000000..b0a8c66 --- /dev/null +++ b/h5/js/page/type_edit.js @@ -0,0 +1,84 @@ +class TypeEdit { + constructor() { + this.YouChioose = [] + this.NoChiooseList = [] + this.RenderYouChioose() + } + + RenderYouChioose() { + this.YouChioose = JSON.parse(localStorage.getItem("typeList")); + console.log(this.YouChioose); + + // 渲染 点击删除以下分类 + document.querySelector(".you_chioose .chiooseWrap").innerHTML = "" + this.YouChioose.forEach(v => { + document.querySelector(".you_chioose .chiooseWrap").innerHTML += ` +
  • ${v.title}
  • + ` + }); + this.BindTopClick() + + // 渲染 点击添加以下分类 + if (localStorage.getItem("nochioose") == null) { + localStorage.setItem("nochioose", JSON.stringify([])) + } else { + this.NoChiooseList = JSON.parse(localStorage.getItem("nochioose")) + document.querySelector(".chioose_list .chiooseWrap").innerHTML = "" + this.NoChiooseList.forEach(v => { + document.querySelector(".chioose_list .chiooseWrap").innerHTML += ` +
  • ${v.title}
  • + ` + }); + + this.BindBottomClick() + + } + } + + BindTopClick() { + // 绑定事件 + var YouChiooseLi = document.querySelectorAll(".you_chioose .chiooseWrap li"); + YouChiooseLi.forEach((v, i) => { + v.onclick = () => { + + var noCh = JSON.parse(localStorage.getItem("nochioose")) + noCh.push(this.YouChioose[i]); + localStorage.setItem("nochioose", JSON.stringify(noCh)); + + this.YouChioose = this.YouChioose.filter(res => { + if (res.id != this.YouChioose[i].id) { + return res + } + }) + + localStorage.setItem("typeList", JSON.stringify(this.YouChioose)) + this.RenderYouChioose() + } + }) + } + + + BindBottomClick() { + var Li = document.querySelectorAll(".chioose_list .chiooseWrap li"); + Li.forEach((v,i)=>{ + v.onclick = () => { + + var typeList = JSON.parse(localStorage.getItem("typeList")) + typeList.push(this.NoChiooseList[i]); + localStorage.setItem("typeList", JSON.stringify(typeList)); + + this.NoChiooseList = this.NoChiooseList.filter(res => { + if (res.id != this.NoChiooseList[i].id) { + return res + } + }); + + localStorage.setItem("nochioose", JSON.stringify(this.NoChiooseList)) + this.RenderYouChioose() + + } + }) + } +} + +new TypeEdit() \ No newline at end of file diff --git a/h5/js/service/.pydio b/h5/js/service/.pydio new file mode 100644 index 0000000..73464e3 --- /dev/null +++ b/h5/js/service/.pydio @@ -0,0 +1 @@ +bbee3d0d-25eb-4ed6-9cad-b421310b11c6 \ No newline at end of file diff --git a/h5/js/service/HomeService.js b/h5/js/service/HomeService.js new file mode 100644 index 0000000..0742aa2 --- /dev/null +++ b/h5/js/service/HomeService.js @@ -0,0 +1,82 @@ +/** + * 请求的中间层 + * 被页面调用,然后它去调用ajax + */ +class HomeService { + + + GetHomeData(data) { + return ajax({ + url: Config.ApiList.index, + data: data, + methods: 'GET' + }); + } + + info(data) { + return ajax({ + url: Config.ApiList.info, + data: data, + methods: 'GET' + }); + } + + mechanism(data) { + return ajax({ + url: Config.ApiList.mechanism, + data: data, + methods: 'GET' + }); + } + + type(data) { + return ajax({ + url: Config.ApiList.type, + data: data, + methods: 'GET' + }); + } + + classList(data) { + return ajax({ + url: Config.ApiList.classList, + data: data, + methods: 'GET' + }); + } + + allModel(data) { + return ajax({ + url: Config.ApiList.allModel, + data: data, + methods: 'GET' + }); + } + + modelList(data) { + return ajax({ + url: Config.ApiList.modelList, + data: data, + methods: 'GET' + }); + } + + mechanismList(data) { + return ajax({ + url: Config.ApiList.mechanismList, + data: data, + methods: 'GET' + }); + } + + search(data) { + return ajax({ + url: Config.ApiList.search, + data: data, + methods: 'GET' + }); + } + +}; + +var homeService = new HomeService() \ No newline at end of file diff --git a/h5/js/utils/.pydio b/h5/js/utils/.pydio new file mode 100644 index 0000000..c49841d --- /dev/null +++ b/h5/js/utils/.pydio @@ -0,0 +1 @@ +488ed502-ec30-4416-8d35-0466dd5945ad \ No newline at end of file diff --git a/h5/js/utils/dist/.pydio b/h5/js/utils/dist/.pydio new file mode 100644 index 0000000..56965cf --- /dev/null +++ b/h5/js/utils/dist/.pydio @@ -0,0 +1 @@ +00c6edd8-0917-47fc-9cef-1b3488de1f0d \ No newline at end of file diff --git a/h5/js/utils/dist/default-skin/.pydio b/h5/js/utils/dist/default-skin/.pydio new file mode 100644 index 0000000..eea3386 --- /dev/null +++ b/h5/js/utils/dist/default-skin/.pydio @@ -0,0 +1 @@ +ca87688d-0d6b-4c4a-884a-f0647da4b538 \ No newline at end of file diff --git a/h5/js/utils/dist/default-skin/default-skin.css b/h5/js/utils/dist/default-skin/default-skin.css new file mode 100644 index 0000000..54c2c61 --- /dev/null +++ b/h5/js/utils/dist/default-skin/default-skin.css @@ -0,0 +1,482 @@ +/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */ +/* + + Contents: + + 1. Buttons + 2. Share modal and links + 3. Index indicator ("1 of X" counter) + 4. Caption + 5. Loading indicator + 6. Additional styles (root element, top bar, idle state, hidden state, etc.) + +*/ +/* + + 1. Buttons + + */ +/* + +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/h5/page/like.html b/h5/page/like.html new file mode 100644 index 0000000..a49304f --- /dev/null +++ b/h5/page/like.html @@ -0,0 +1,44 @@ + + + + + + + + 屁桃儿 + + + + + + + + + + +
    +
    + + 我的收藏 +
    + +
    + + + + +
    +
    + +
    +
    +
      +
      +
      + + + + + + + \ No newline at end of file diff --git a/h5/page/mechanism.html b/h5/page/mechanism.html new file mode 100644 index 0000000..5b0b53b --- /dev/null +++ b/h5/page/mechanism.html @@ -0,0 +1,68 @@ + + + + + + + 屁桃儿 + + + + + + + + + + + +
      +
      + + 机构 +
      +
      + +
      + +
      + + + + + + + + + + + + \ No newline at end of file diff --git a/h5/page/mechanism_info.html b/h5/page/mechanism_info.html new file mode 100644 index 0000000..caf6d54 --- /dev/null +++ b/h5/page/mechanism_info.html @@ -0,0 +1,42 @@ + + + + + + + + 屁桃儿 + + + + + + + + + + + +
      +
      + + +
      +
      + +
      +
      +
        +
        +
        + + + + + + + + + + + \ No newline at end of file diff --git a/h5/page/model.html b/h5/page/model.html new file mode 100644 index 0000000..c9f115c --- /dev/null +++ b/h5/page/model.html @@ -0,0 +1,75 @@ + + + + + + + 屁桃儿 + + + + + + + + + + + +
        +
        + + 模特 +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        + + + + + + + + + + + + \ No newline at end of file diff --git a/h5/page/model_info.html b/h5/page/model_info.html new file mode 100644 index 0000000..4889c54 --- /dev/null +++ b/h5/page/model_info.html @@ -0,0 +1,52 @@ + + + + + + + + 屁桃儿 + + + + + + + + + + + + +
        +
        + + 模特详情 +
        +
        + +
        +
        + +
        +
        +
          +
          + + +
          +
          +
          +
          + +
          + + + + + + + + + + \ No newline at end of file diff --git a/h5/page/my.html b/h5/page/my.html new file mode 100644 index 0000000..739f52b --- /dev/null +++ b/h5/page/my.html @@ -0,0 +1,108 @@ + + + + + + + + 屁桃儿 + + + + + + + + + + + + +
          + +

          我的

          +
          + +
          + +
          + + + + + + + \ No newline at end of file diff --git a/h5/page/reg.html b/h5/page/reg.html new file mode 100644 index 0000000..055338e --- /dev/null +++ b/h5/page/reg.html @@ -0,0 +1,44 @@ + + + + + + + 屁桃儿 + + + + + + + + +
          +
          + 屁桃儿 +
          +
          +
          +

          注 册

          +

          欢迎注册屁桃儿,请使用手机号注册

          + 请确保手机号的正确性,否则部分功能无法正常使用 +
          + +
          + + +
          + + +
          +
          + + + + + + + + + + \ No newline at end of file diff --git a/h5/page/search.html b/h5/page/search.html new file mode 100644 index 0000000..2e51d3a --- /dev/null +++ b/h5/page/search.html @@ -0,0 +1,42 @@ + + + + + + + + 屁桃儿 + + + + + + + + + + + + +
          + + + +
          + +
          +
          +
            + +
          +
          +
          + + + + + + + + + \ No newline at end of file diff --git a/h5/page/type_edit.html b/h5/page/type_edit.html new file mode 100644 index 0000000..e9be615 --- /dev/null +++ b/h5/page/type_edit.html @@ -0,0 +1,39 @@ + + + + + + + 屁桃儿 + + + + + + + + + + +
          +
          + + 分类管理 +
          +
          + +
          +
          +

          点击删除以下分类

          +
            +
            +
            +

            点击添加以下分类

            +
              +
              +
              + + + + + \ No newline at end of file diff --git a/h5_webview/.gitignore b/h5_webview/.gitignore new file mode 100755 index 0000000..5edb4ee --- /dev/null +++ b/h5_webview/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/h5_webview/.project b/h5_webview/.project new file mode 100644 index 0000000..3acff1c --- /dev/null +++ b/h5_webview/.project @@ -0,0 +1,17 @@ + + + caipu + Project caipu created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/h5_webview/.pydio b/h5_webview/.pydio new file mode 100644 index 0000000..91c0df3 --- /dev/null +++ b/h5_webview/.pydio @@ -0,0 +1 @@ +4b362550-15a7-435f-bfad-fc0f183d8085 \ No newline at end of file diff --git a/h5_webview/.settings/.pydio b/h5_webview/.settings/.pydio new file mode 100644 index 0000000..81a31e6 --- /dev/null +++ b/h5_webview/.settings/.pydio @@ -0,0 +1 @@ +97693908-77e6-4e10-ba2e-f13dd2b664e2 \ No newline at end of file diff --git a/h5_webview/.settings/org.eclipse.buildship.core.prefs b/h5_webview/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..9810b47 --- /dev/null +++ b/h5_webview/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=/usr +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/h5_webview/app/.gitignore b/h5_webview/app/.gitignore new file mode 100755 index 0000000..796b96d --- /dev/null +++ b/h5_webview/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/h5_webview/app/.pydio b/h5_webview/app/.pydio new file mode 100644 index 0000000..781583b --- /dev/null +++ b/h5_webview/app/.pydio @@ -0,0 +1 @@ +1b84c923-d924-4791-9efd-36303ec4265d \ No newline at end of file diff --git a/h5_webview/app/build.gradle b/h5_webview/app/build.gradle new file mode 100755 index 0000000..dbf29f9 --- /dev/null +++ b/h5_webview/app/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + useLibrary 'org.apache.http.legacy' + defaultConfig { + applicationId "com.cp.bmy.cp" + minSdkVersion 15 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + ndk{ + abiFilters "armeabi","armeabi-v7a","x86","mips" + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/h5_webview/app/libs/.pydio b/h5_webview/app/libs/.pydio new file mode 100644 index 0000000..f5d1375 --- /dev/null +++ b/h5_webview/app/libs/.pydio @@ -0,0 +1 @@ +f9b28e75-49c6-4e9e-804d-23b97793766f \ No newline at end of file diff --git a/h5_webview/app/libs/tbs_sdk_thirdapp_v3.6.0.1310_43612_sharewithdownload_withoutGame_obfs_20180706_163319.jar b/h5_webview/app/libs/tbs_sdk_thirdapp_v3.6.0.1310_43612_sharewithdownload_withoutGame_obfs_20180706_163319.jar new file mode 100755 index 0000000..17b441c Binary files /dev/null and b/h5_webview/app/libs/tbs_sdk_thirdapp_v3.6.0.1310_43612_sharewithdownload_withoutGame_obfs_20180706_163319.jar differ diff --git a/h5_webview/app/proguard-rules.pro b/h5_webview/app/proguard-rules.pro new file mode 100755 index 0000000..f1b4245 --- /dev/null +++ b/h5_webview/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/h5_webview/app/release/.pydio b/h5_webview/app/release/.pydio new file mode 100644 index 0000000..f7e633a --- /dev/null +++ b/h5_webview/app/release/.pydio @@ -0,0 +1 @@ +c3fec5dc-e118-456c-aadd-3321812af2c1 \ No newline at end of file diff --git a/h5_webview/app/release/output.json b/h5_webview/app/release/output.json new file mode 100755 index 0000000..9f0c959 --- /dev/null +++ b/h5_webview/app/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/h5_webview/app/src/.pydio b/h5_webview/app/src/.pydio new file mode 100644 index 0000000..2b8dd61 --- /dev/null +++ b/h5_webview/app/src/.pydio @@ -0,0 +1 @@ +9b8cce0e-0d10-452b-8052-1a19fee88ebf \ No newline at end of file diff --git a/h5_webview/app/src/main/.pydio b/h5_webview/app/src/main/.pydio new file mode 100644 index 0000000..f2704d6 --- /dev/null +++ b/h5_webview/app/src/main/.pydio @@ -0,0 +1 @@ +92fb5dcd-4dc0-41b2-82ab-163ba8e2c7e0 \ No newline at end of file diff --git a/h5_webview/app/src/main/AndroidManifest.xml b/h5_webview/app/src/main/AndroidManifest.xml new file mode 100755 index 0000000..9a5df3f --- /dev/null +++ b/h5_webview/app/src/main/AndroidManifest.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/.pydio b/h5_webview/app/src/main/assets/.pydio new file mode 100644 index 0000000..2e7034e --- /dev/null +++ b/h5_webview/app/src/main/assets/.pydio @@ -0,0 +1 @@ +55605050-f2a5-4364-8c97-486bfaec7307 \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/.pydio b/h5_webview/app/src/main/assets/css/.pydio new file mode 100644 index 0000000..c469806 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/.pydio @@ -0,0 +1 @@ +245a036a-4f4f-4796-a915-69ec716b66dd \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/about_us.css b/h5_webview/app/src/main/assets/css/about_us.css new file mode 100644 index 0000000..01b178e --- /dev/null +++ b/h5_webview/app/src/main/assets/css/about_us.css @@ -0,0 +1,24 @@ +.about_center { + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + margin: 30% 0; + padding: 0 0.3rem; + text-align: center; +} +.about_center img{ + width: 1.4rem; + height: 1.4rem; + margin-bottom: 0.4rem; +} +.about_center p{ + font-size: 0.34rem; + margin-bottom: 0.18rem; + font-weight: 400; +} +.about_center span { + font-size: 0.3rem; + color: #666; + line-height: 0.42rem; +} diff --git a/h5_webview/app/src/main/assets/css/agreement.css b/h5_webview/app/src/main/assets/css/agreement.css new file mode 100644 index 0000000..0ac9301 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/agreement.css @@ -0,0 +1,14 @@ +.agreement { + font-size: 0; +} +.agreement span{ + font-size: 0.32rem; + font-weight: bold; + margin-bottom: 0.3rem; + display: inline-block; +} +.agreement p{ + font-size: 0.28rem; + margin-bottom: 0.36rem; + color: #333; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/clear.css b/h5_webview/app/src/main/assets/css/clear.css new file mode 100644 index 0000000..398ad2d --- /dev/null +++ b/h5_webview/app/src/main/assets/css/clear.css @@ -0,0 +1,37 @@ +body,ul,li,h1,h2,h3,h4,h5,h6,p{ + margin: 0; + padding: 0; + list-style: none; +} +a { + text-decoration: none; + color: #000; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + -webkit-user-select: none; + -moz-user-focus: none; + -moz-user-select: none; +} +body,html,.content,.s-container,.s-wrapper { + height: 100%; +} +.swiper-dot { + background: #787777 !important; +} +.swiper-active { + background: #fb7299 !important; +} + +.s-container { + overflow: hidden; + position: relative; +} +.s-wrapper { + position: relative; + overflow: hidden; +} +.s-slide { + float: left; + height: calc(100% - 1.6rem - 1rem); + overflow-y: scroll; + margin-top: 1.6rem; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/home.css b/h5_webview/app/src/main/assets/css/home.css new file mode 100644 index 0000000..0585058 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/home.css @@ -0,0 +1,132 @@ +.header { + height: 1.6rem; + position: fixed; + top: 0; + width: 100%; + left: 0; + z-index: 9; +} +.header_search { + height: 0.88rem; + display: flex; + justify-content: space-between; + padding: 0 0.3rem; + align-items: center; + box-sizing: border-box; +} +.search { + width: 82%; + background: #fff; + height: 0.6rem; + border-radius: 0.6rem; + display: flex; + align-items: center; + box-sizing: border-box; + padding-left: 0.3rem; +} +.search i { + color: #999; + font-size: 0.26rem; + margin-right: 0.1rem; + padding-top: 0.02rem; +} +.search span { + font-size: 0.24em; + color: #999; +} +.header_search a { + font-size: 0; +} +.icon-wo { + font-size: 0.4rem; +} +.icon-taozi1{ + font-size: 0.45rem; +} +.header_menu{ + position: relative; + height: 0.72rem; + display: flex; + background: #fe7fa2; +} +.header_menu .menu_list{ + display: flex; + width: calc(100% - 0.8rem); + overflow-x: scroll; + align-items: center; + padding-left: 0.3rem; + box-sizing: border-box; +} +.menu_list li { + font-size: 0.26rem; + flex-shrink: 0; + margin-right: 0.26rem; + color: #d3d2d2; +} +.header_menu i{ + width: 0.8rem; + height: 0.72rem; + position: absolute; + right: 0; + top: 0; + font-size: 0.3rem; + background: #fe7fa2; + color: #e3e3e3; + line-height: 0.72rem; + text-align: center; +} +.swiper-slide { + display: flex; + justify-content: space-around; + margin-top: 0.28rem; +} + +.item_content { + margin-top: 0.2rem; +} +.item_content .title{ + font-size: 0.32rem; + color: #333; + margin-bottom: 0.2rem; +} +.item_content ul{ + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} +.item_content li{ + width: 48%; + margin-bottom: 0.3rem; +} +.item_content .item_top { + position: relative; +} +.item_content .item_top img{ + width: 100%; +} +.item_content .item_top span { + position: absolute; + right: 0.2rem; + bottom: 0.52rem; + padding: 0.02rem 0.1rem; + background: #000; + color: #fff; + border-radius: 0.6rem; + font-size: 0.24rem; +} +.item_bottom .item_title{ + font-size: 0.32rem; + margin-bottom: 0.1rem; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + color: #333; +} +.source { + font-size: 0.26rem; + color: #666; +} + +.menu_active { + color: #ffffff !important; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/info.css b/h5_webview/app/src/main/assets/css/info.css new file mode 100644 index 0000000..dcb0912 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/info.css @@ -0,0 +1,45 @@ +.info { + width: 100%; +} +.ddd { + font-size: 0; +} +.info img { + width: 100%; + height: auto; +} + +.info figure { + display: block; + margin: 0; + width: 100%; + font-size: 0; +} + +.info figcaption { + display: none; +} +.info .info_item{ + margin-bottom: 0.3rem; +} +.info_item p{ + font-size: 0.24rem; + color: #8e8e8e; + text-align: center; + margin-bottom: 0.1rem; +} +.info_item img{ + width: 100%; +} + +.icon-xin { + +} +.next_page { + display: inline-block; + font-size: 0.4rem; + margin-top: 0.2rem; + color: #fb7299; + width: 100%; + text-align: center; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/like.css b/h5_webview/app/src/main/assets/css/like.css new file mode 100644 index 0000000..5da7fac --- /dev/null +++ b/h5_webview/app/src/main/assets/css/like.css @@ -0,0 +1,18 @@ +.newest_img { + height: 5.3078rem; +} +.newest_img img { + height: 4.9678rem; +} +.nodata { + width: 100%; + text-align: center; + margin-top: 0.6rem; +} +.nodata i{ + font-size: 0.9rem; +} +.nodata p{ + font-size: 0.24rem; + color: #666; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/loading.css b/h5_webview/app/src/main/assets/css/loading.css new file mode 100644 index 0000000..c0e879f --- /dev/null +++ b/h5_webview/app/src/main/assets/css/loading.css @@ -0,0 +1,208 @@ +.loading { + position: fixed; + width: 100%; + height: 100%; + left: 0; + top: 0; + z-index: 999; + display: flex; + align-items: center; + justify-content: center; +} +.back { + padding: 0.4rem 0.4rem; + background: #fb7299; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0.16rem; + max-width: 4rem; +} +.back span { + font-size: 0.3rem; + letter-spacing: 0.02rem; + color: #fff; +} +.load8 { + width: 0.8rem; + height: 0.8rem; + position: relative; +} +.dialog_f { + width: 86%; + background: #fff; + border-radius: 0.32rem; + font-size: 0.32rem; +} +.dialog_header { + padding-top: 0.52rem; + font-weight: 500; + line-height: 0.48rem; + text-align: center; +} +.dialog_message { + max-height: 60vh; + padding: 0.16rem 0.48rem 0.52rem 0.48rem; + overflow-y: auto; + font-size: 0.28rem; + line-height: 0.4rem; + text-align: center; +} +.dialog_footer { + display: flex; + height: 0.96rem; + border-top: 0.02rem solid #ebedf0; +} +.dialog_cancel, +.dialog_confirm { + width: 50%; + text-align: center; + line-height: 0.96rem; +} +.dialog_cancel:active { + background: #e6e6e6; + border-bottom-left-radius: 0.32rem; +} +.dialog_confirm:active { + background: #e6e6e6; + border-bottom-right-radius: 0.32rem; +} +.dialog_cancel { + color: #323233; + border-right: 0.02rem solid #ebedf0; +} +.dialog_confirm { + color: #fb7299; +} +.container1>div, +.container2>div, +.container3>div { + width: 0.2rem; + height: 0.2rem; + background-color: #fff; + border-radius: 100%; + position: absolute; + -webkit-animation: bouncedelay 1.2s infinite ease-in-out; + animation: bouncedelay 1.2s infinite ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.load8 .load8-container { + position: absolute; + width: 100%; + height: 100%; +} + +.container2 { + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.container3 { + -webkit-transform: rotateZ(90deg); + transform: rotateZ(90deg); +} + +.circle1 { + top: 0; + left: 0; +} + +.circle2 { + top: 0; + right: 0; +} + +.circle3 { + right: 0; + bottom: 0; +} + +.circle4 { + left: 0; + bottom: 0; +} + +.container2 .circle1 { + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.container3 .circle1 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +.container1 .circle2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.container2 .circle2 { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +.container3 .circle2 { + -webkit-animation-delay: -0.7s; + animation-delay: -0.7s; +} + +.container1 .circle3 { + -webkit-animation-delay: -0.6s; + animation-delay: -0.6s; +} + +.container2 .circle3 { + -webkit-animation-delay: -0.5s; + animation-delay: -0.5s; +} + +.container3 .circle3 { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.container1 .circle4 { + -webkit-animation-delay: -0.3s; + animation-delay: -0.3s; +} + +.container2 .circle4 { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + +.container3 .circle4 { + -webkit-animation-delay: -0.1s; + animation-delay: -0.1s; +} + +@-webkit-keyframes bouncedelay { + + 0%, + 80%, + 100% { + -webkit-transform: scale(0.0) + } + + 40% { + -webkit-transform: scale(1.0) + } +} + +@keyframes bouncedelay { + + 0%, + 80%, + 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } + + 40% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/mechanism.css b/h5_webview/app/src/main/assets/css/mechanism.css new file mode 100644 index 0000000..c28cb6e --- /dev/null +++ b/h5_webview/app/src/main/assets/css/mechanism.css @@ -0,0 +1,23 @@ +.mechanism_list { + display: flex; + flex-wrap: wrap; + margin-top: 0.3rem; + padding: 0 0.3rem; +} +.mechanism_list li { + width: 25%; + text-align: center; + font-size: 0; + margin-bottom: 0.7rem; +} +.mechanism_list p { + font-size: 0.32rem; + margin-bottom: 0.06rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.mechanism_list span { + font-size: 0.24rem; + color: #fb7299; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/model.css b/h5_webview/app/src/main/assets/css/model.css new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/model.css @@ -0,0 +1 @@ + diff --git a/h5_webview/app/src/main/assets/css/model_info.css b/h5_webview/app/src/main/assets/css/model_info.css new file mode 100644 index 0000000..4fe831c --- /dev/null +++ b/h5_webview/app/src/main/assets/css/model_info.css @@ -0,0 +1,24 @@ +.model_info_header { + display: flex; + justify-content: flex-start; + align-items: center; + font-size: 0; +} +.model_info_header img{ + width: 1.4rem; + height: 1.4rem; + margin-right: 0.2rem; + border-radius: 100%; +} +.right_text { + flex: 1; +} +.right_text p{ + font-weight: 500; + font-size: 0.32rem; + margin-bottom: 0.12rem; +} +.right_text span{ + font-size: 0.24rem; + color: #909090; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/my.css b/h5_webview/app/src/main/assets/css/my.css new file mode 100644 index 0000000..24bbedd --- /dev/null +++ b/h5_webview/app/src/main/assets/css/my.css @@ -0,0 +1,44 @@ +.header_my { + display: flex; + align-items: center; + justify-content: center; + height: 4rem; + flex-direction: column; +} +.header_my i{ + font-size: 1.2rem; + margin-bottom: 0.2rem; + color: #fff; +} +.header_my p{ + font-size: 0.32rem; + color: #fff; +} +.setting_list { + margin-top: 0.2rem; +} +.list_item:active { + background: #e6e6e6;; +} +.list_item a{ + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 0.3rem; + height: 0.96rem; +} +.item_left { + display: flex; + align-items: center; +} +.item_left .iconfont{ + font-size: 0.4rem; + margin-right: 0.2rem; +} +.item_left span{ + font-size: 0.3rem; +} +.icon-qianjin-tongyong { + font-size: 0.28rem; + color: #c3c0c0; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/public.css b/h5_webview/app/src/main/assets/css/public.css new file mode 100644 index 0000000..0e23d91 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/public.css @@ -0,0 +1,221 @@ +.theme_color { + background: #fb7299; +} +.color_theme { + color: #fb7299; +} +.color_white { + color: white; +} +.padding_30 { + padding: 0.3rem 0.3rem 0 0.3rem; +} +.active { + color:#fb7299 !important; +} + +/* 底部样式 */ +.footer { + position: fixed; + width: 100%; + background: #fff; + height: 1rem; + bottom: 0; +} +.footer ul{ + display: flex; + justify-content: space-around; + align-items: center; + height: 100%; + border-top: 0.02rem solid #e8ebec; + box-sizing: border-box; + padding-top: 0.1rem; +} +.footer ul li a{ + display: flex; + flex-direction: column; + text-align: center; +} +.footer ul li i{ + font-size: 0.3rem; + margin-bottom: 0.08rem; +} +.footer ul li span{ + font-size: 0.24rem; +} +.footer_active i { + color: #fb7299; +} +.footer_active span { + color: #fb7299; +} + + +.header_theme1 { + position: fixed; + width: 100%; + height: 0.9rem; + left: 0; + top: 0; + display: flex; + align-items: center; + padding: 0 0.3rem; + box-sizing: border-box; + z-index: 999; + justify-content: space-between; + font-size: 0; +} +.header_theme1 i { + color: #fff; + margin-right: 0.2rem; +} +.header_theme1 span { + color: #fff; + font-size: 0.32rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + + +/* 模特的css */ +.item { + position: relative; + text-align: center; + width: 22%; +} +.top { + position: relative; +} +.item span { + font-size: 0.22rem; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 0.06rem; + padding: 0.02rem 0.1rem; + background: rgb(0 0 0 / 58%); + color: #fff; + border-radius: 0.2rem; +} +.item img { + width: 1.2rem; + height: 1.2rem; + border-radius: 100%; +} +.item p { + font-size: 0.24rem; + color: #7e7979; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 公共的列表样式 */ +.item_list .title { + font-size: 0.34rem; + color: #333; + margin-bottom: 0.26rem; + margin-top: 0.3rem; +} +.item_list ul { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} +.item_list ul li{ + width: 48%; + margin-bottom: 0.3rem; +} +.item_list ul .newest_img{ + position: relative; +} +.item_list ul .newest_text{} +.item_list .newest_img img{ + width: 100%; + border-radius: 0.1rem; +} +.item_list .newest_img span{ + position: absolute; + padding: 0.08rem 0.14rem; + background: rgb(251 114 153 / 73%); + color: rgb(255 255 255 / 73%); + font-size: 0.24rem; + right: 0.2rem; + bottom: 0.42rem; + border-radius: 0.28rem; +} +.item_list .newest_text .t{ + color: #333; + font-size: 0.3rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-bottom: 0.08rem; +} +.newest_text .source { + color: #666; + font-size: 0.26rem; + margin-bottom: 0.02rem; +} +.newest_text .tags { + display: flex; + flex-wrap: wrap; + margin-top: 0.08rem; +} +.newest_text .tags_item { + padding: 0.04rem 0.1rem; + font-size: 0.24rem; + background: #fb7299; + margin-right: 0.06rem; + color: #fff; + border-radius: 0.18rem; + margin-bottom: 0.06rem; +} +.tags_item a { + color: #fff; +} + +.content_info { + padding-top: 0.9rem; +} +.content_my { + padding-bottom: 1rem; +} +.content_theme1 { + padding-top: 0.9rem; + padding-bottom: 1rem; +} + +.model_list { + display: flex; + justify-content: space-around; + margin-top: 0.24rem; + flex-wrap: wrap; +} +.model_list .item { + margin-bottom: 0.6rem; +} + +.openApp { + position: fixed; + right: 0.3rem; + bottom: 1.8rem; + width: 1rem; + height: 1rem; + z-index: 9; + font-size: 0; +} +.openApp img{ + width: 100%; + height: 100%; + margin-bottom: 0.1rem; +} +.openApp p { + font-size: 0.24rem; + background: #fb7299; + color: #fff; + padding: 0.04rem 0.02rem; + text-align: center; + border-radius: 0.1rem; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/search.css b/h5_webview/app/src/main/assets/css/search.css new file mode 100644 index 0000000..ba18370 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/search.css @@ -0,0 +1,36 @@ +.search_input { + font-size: 0; + display: flex; + height: 0.88rem; + align-items: center; + box-sizing: border-box; + justify-content: space-between; + padding: 0 0.3rem; + position: fixed; + width: 100%; + left: 0; + top: 0; + z-index: 999; +} +.search_input input{ + width: 80%; + border: none; + outline: none; + height: 0.6rem; + padding-left: 0.3rem; + border-radius: 0.6rem; + box-sizing: border-box; + font-size: 0.26rem; +} +.search_input i { + color: #fff; + font-size: 0.32rem; + font-weight: bolder; +} +.search_list ul .nodata{ + font-size: 0.26rem; + width: 100%; + text-align: center; + color: #666; + margin-top: 0.4rem; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/swiper.css b/h5_webview/app/src/main/assets/css/swiper.css new file mode 100644 index 0000000..62014b1 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/swiper.css @@ -0,0 +1,42 @@ +.swiper-wrapper .swiper-slide { + float: left; +} +.swiper-container { + overflow: hidden; + position: relative; +} +.swiper-pagination { + position: absolute; + bottom: 10px; + left: 50%; + transform: translateX(-50%); +} +.swiper-dot { + width: 7px; + height: 7px; + background: #fff; + border-radius: 100%; + margin-right: 5px; + float: left; +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #fff; + font-size: 30px; + cursor: pointer; +} +.swiper-button-prev { + left: 10px; +} +.swiper-button-next { + right: 10px; +} +.swiper-wrapper { + position: relative; +} +.swiper-active { + background: red !important; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/css/type_edit.css b/h5_webview/app/src/main/assets/css/type_edit.css new file mode 100644 index 0000000..ae5ab13 --- /dev/null +++ b/h5_webview/app/src/main/assets/css/type_edit.css @@ -0,0 +1,25 @@ +.chioose { + margin-top: 0.3rem; +} +.chioose p { + font-size: 0.24rem; + margin-bottom: 0.14rem; + color: #666; +} +.chiooseWrap { + display: flex; + flex-wrap: wrap; +} +.chiooseWrap li{ + width: 23.8%; + text-align: center; + font-size: 0.28rem; + border: 1px solid #ccc; + margin-bottom: 0.1rem; + padding: 0.1rem 0; + box-sizing: border-box; + margin-right: 0.1rem; +} +.chiooseWrap li:nth-child(4n) { + margin-right: 0 !important; +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/img/.pydio b/h5_webview/app/src/main/assets/img/.pydio new file mode 100644 index 0000000..1d32420 --- /dev/null +++ b/h5_webview/app/src/main/assets/img/.pydio @@ -0,0 +1 @@ +32a3c82c-0d5e-4a39-9be7-a191801382af \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/img/logo.png b/h5_webview/app/src/main/assets/img/logo.png new file mode 100644 index 0000000..20f598d Binary files /dev/null and b/h5_webview/app/src/main/assets/img/logo.png differ diff --git a/h5_webview/app/src/main/assets/index.js b/h5_webview/app/src/main/assets/index.js new file mode 100644 index 0000000..3f5ac4d --- /dev/null +++ b/h5_webview/app/src/main/assets/index.js @@ -0,0 +1,8 @@ +const express = require('express'); +const path = require('path'); +const app = express(); +app.use(express.static(path.join(__dirname, './'))); + +app.listen(80, () => { + console.log(`App listening at port 8080`) +}); \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/.pydio b/h5_webview/app/src/main/assets/js/.pydio new file mode 100644 index 0000000..05f529e --- /dev/null +++ b/h5_webview/app/src/main/assets/js/.pydio @@ -0,0 +1 @@ +f4d1c05a-a5c1-48b8-9ec8-fca6e74a3bf3 \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/config/.pydio b/h5_webview/app/src/main/assets/js/config/.pydio new file mode 100644 index 0000000..31375fb --- /dev/null +++ b/h5_webview/app/src/main/assets/js/config/.pydio @@ -0,0 +1 @@ +ec5fe0df-562d-41a9-935e-144535ff65b5 \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/config/index.js b/h5_webview/app/src/main/assets/js/config/index.js new file mode 100644 index 0000000..ebac530 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/config/index.js @@ -0,0 +1,18 @@ +/** + * 项目的配置文件 + */ +var Config = { + // BaseUrl: 'http://127.0.0.1:3000/api/json', // 测试环境基地址 + BaseUrl: 'http://103.91.219.114:3000/api/json', // 正式环境地址 + ApiList: { + index: '/index', // 获取首页 + info: '/info', // 进入详情 + mechanism: '/mechanism', // 获取机构 + mechanismList: '/mechanismList', // 获取机构下面的列表 + type: '/class', // 获取首页顶部的分类 + classList: '/classList', // 获取分类列表 + allModel: '/allModel', // 所有模特 + modelList: '/modelList', // 进入模特的个人主页 + search: '/search', // 搜索接口 + } +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/http/.pydio b/h5_webview/app/src/main/assets/js/http/.pydio new file mode 100644 index 0000000..201bc5a --- /dev/null +++ b/h5_webview/app/src/main/assets/js/http/.pydio @@ -0,0 +1 @@ +da1df28d-a11b-4a20-a8b6-5bba4b386cd1 \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/http/index.js b/h5_webview/app/src/main/assets/js/http/index.js new file mode 100644 index 0000000..57ee220 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/http/index.js @@ -0,0 +1,61 @@ +/** + * ajax代码的封装 + * @param {*} params + */ +function ajax(params) { + return new Promise(function (resolve, reject) { + // 显示加载进度条 + Tips.loading() + // 拿出电话(创建一个新的ajax对象) + var ajax = new XMLHttpRequest(); + ajax.timeout = 10000 + // 如果是GET请求特殊处理一下参数 + if (params.methods == "GET") { + var par = "" + params.data.isAndroid = true; + for (const key in params.data) { + par += `&${key}=${params.data[key]}` + } + params.url = params.url + "?" + par.substr(1) + } + + // 设置电话号码 + // 是否异步 + ajax.open(params.methods, Config.BaseUrl + params.url, true) + + // 如果是post请求,那么设置一下post请求的参数用何种数据格式给后端 + // json格式 + if (params.methods == "POST") { + ajax.setRequestHeader('Content-Type', 'application/json;charset=utf-8') + } + + // 拨号 + if (params.methods == "POST") { + ajax.send(JSON.stringify(params.data)); + } else { + ajax.send() + } + + // 监听网络状态,只有网络请求成功的时候才渲染页面,否则显示错误信息 + ajax.onreadystatechange = function () { + if (ajax.readyState == 4) { + if (ajax.status == 200) { + var data = JSON.parse(ajax.responseText); + if (data.status == 200) { + // 关闭进度条 + Tips.close() + resolve(data.data) + + } else { + Tips.toast(data.msg) + reject(data.msg) + } + } else { + Tips.toast("网络故障,稍后再试..") + // reject("数据请求失败,稍后再试") + } + } + } + + }) +} \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/.pydio b/h5_webview/app/src/main/assets/js/page/.pydio new file mode 100644 index 0000000..f575102 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/.pydio @@ -0,0 +1 @@ +9d75d518-638d-43d3-af0a-d56b23284abf \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/home.js b/h5_webview/app/src/main/assets/js/page/home.js new file mode 100644 index 0000000..dfe9006 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/home.js @@ -0,0 +1,321 @@ +class Home { + + constructor() { + this.TabsDatas = []; + this.list = []; + this.PageSwiper = null; + this.CurrentPage = 0; + // 点击搜索进入搜索页面 + document.querySelector(".search").onclick = () => { + location.href = "./search.html" + } + + // 通过在本地保存一个变量 homeIndex,记录用户在首页当前浏览到哪个分类, + // 然后从其他页面回首页,那么根据本地变量 homeIndex 的数值,再回到上次浏览的分类 + if (localStorage.getItem("homeIndex") != null) { + this.CurrentPage = localStorage.getItem("homeIndex") + } + + this.GetTypeData().then(() => this.GetIndexData()) + } + + // 获取分类的数据,并渲染页面 + async GetTypeData() { + if (localStorage.getItem("typeList") == null) { + // 获取分类数据 + this.list = await homeService.type({}); + localStorage.setItem("typeList", JSON.stringify(this.list)) + } else { + this.list = JSON.parse(localStorage.getItem("typeList")) + } + + // 根据分类的数组长度遍历生成与分类对应的内容 + this.list.forEach((v, i) => { + this.TabsDatas.push({ + id: v.id, + title: v.title, + page: 0, + TotalPage: 0, + content: [] + }) + document.querySelector(".s-wrapper").innerHTML += + ` +
              +
              +
                + +
              +
              +
              + ` + }); + + // 为每一个内容绑定滚动事件 + var slide = document.querySelectorAll(".s-wrapper .s-slide"); + var self = this; + slide.forEach((v, i) => { + if (i > 0) { + v.addEventListener('scroll', function () { + if (Math.ceil(this.scrollHeight - this.scrollTop) == this.clientHeight) { + self.TabsDatas[i - 1].page += 1; + if (self.TabsDatas[i - 1].page <= self.TabsDatas[i - 1].TotalPage) { + self.GetTypeInfoData(i) + } + } + }) + } + }) + + // 向数据中追加首页 + this.list.unshift({ id: -1, title: '首页' }); + // 根据数据生成横向菜单 + var MenuList = document.querySelector(".menu_list"); + this.list.forEach((v, i) => { + MenuList.innerHTML += ` +
            • ${v.title}
            • + ` + }); + + + // 如果本地有 homeIndex,那么从其他页面返回的时候将顶部菜单滚动到对应位置 + if (localStorage.getItem("homeIndex") != null) { + var offsetLeft = document.querySelectorAll(".menu_list li")[this.CurrentPage].offsetLeft - 14; + document.querySelector(".menu_list").scrollLeft = offsetLeft + } + + // 横向菜单被点击的时候 + var mLi = document.querySelectorAll(".menu_list li") + mLi.forEach((v, i) => { + v.onclick = (e) => { + this.SetUrl(i) + + // 使横向菜单滑动 + document.querySelector(".menu_list").scrollLeft = e.target.offsetLeft - 14 + + // 清除激活样式 + mLi.forEach(d => d.className = "") + // 添加激活样式 + v.className = "menu_active" + this.PageSwiper.slideTo(i) + // 请求用户点击的分类的列表数据 + if (this.list[i].id != -1 && this.TabsDatas[i - 1].content.length == 0) { + this.GetTypeInfoData(i) + } + } + }) + + this.initPageSwiper(); + } + + /** + * 初始化页面切换的轮播 + */ + initPageSwiper() { + this.PageSwiper = new swiper('.s-container', { + time: 3, + wrapper: '.s-wrapper', + slide: '.s-slide', + auto: false, + speed: 300, + on: { + slideChangeTransitionStart: (index) => { + this.SetUrl(index) + // 获取所有菜单的li标签 + var MenuLi = document.querySelectorAll(".menu_list li"); + // 清除激活样式 + MenuLi.forEach(v => v.className = "") + // 添加激活样式 + MenuLi[index].className = "menu_active" + // 页面滚动的时候顶部菜单也移动位置 + document.querySelector(".menu_list").scrollLeft = MenuLi[index].offsetLeft - 14; + // 请求用户点击的分类的列表数据 + if (this.list[index].id != -1 && this.TabsDatas[index - 1].content.length == 0) { + this.GetTypeInfoData(index) + } + } + } + }) + + // 必须在轮播图初始化后才去请求跳转到对应的页面和请求页面数据 + if (this.CurrentPage != 0) { + this.GetTypeInfoData(this.CurrentPage) + this.PageSwiper.slideTo(this.CurrentPage) + } + } + + // 修改地址栏id参数为下标,然后重新进入首页的时候,直接继续进入上次访问分类 + SetUrl(index) { + // 本地保存下标 + localStorage.setItem("homeIndex", index) + } + + /** + * 获取分类下的列表数据 + */ + async GetTypeInfoData(index) { + + var res = await homeService.classList({ + page: this.TabsDatas[index - 1].page, + id: this.TabsDatas[index - 1].id + }); + this.TabsDatas[index - 1].page = res.current_page; + this.TabsDatas[index - 1].TotalPage = res.total_page; + this.TabsDatas[index - 1].content = [ + ...this.TabsDatas[index - 1].content, + ...res.list + ]; + + var sWrapper = document.querySelectorAll(".s-wrapper .s-slide .list_content ul") + res.list.forEach((v) => { + sWrapper[index - 1].innerHTML += ` +
            • +
              + + ${v.title} + + ${v.total}P +
              +
              + +

              ${v.title}

              +

              ${v.user}

              +

              ${v.source}

              +
              +
              + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
              +
              +
            • + ` + }); + } + + // 获取首页的数据,并渲染各个布局 + async GetIndexData() { + // 获取首页的数据 + var list = await homeService.GetHomeData({}); + // 轮播图模特的数据 + var ModelList = list.model.list; + // 最新收录 + var newestList = list.newest.list; + // 今日推荐 + var recommendedList = list.recommended.list; + + var swiperWrapper = document.querySelector(".swiper-wrapper"); + // 根据数据遍历生成banner 的 swiper-slide + var slideElement = []; + [1, 2].forEach(() => { + var o = document.createElement("div"); + o.className = "swiper-slide"; + slideElement.push(o) + }) + ModelList.forEach((v, i) => { + if (i <= 3) { + slideElement[0].innerHTML += + `
              + +
              + + ${v.total} +
              +

              ${v.title}

              +
              +
              ` + } else { + slideElement[1].innerHTML += + `
              + +
              + + ${v.total} +
              +

              ${v.title}

              +
              +
              ` + } + }) + // 将 swiper-slide 填入页面中 + slideElement.forEach(v => swiperWrapper.appendChild(v)) + + new swiper('.swiper-container', { + time: 3, + auto: false, + speed: 800 + }); + + + // 遍历 最新收录 + document.querySelector(".newest .title").innerHTML = ` + + 最新收录 + `; + newestList.forEach(v => { + document.querySelector(".newest ul").innerHTML += + ` +
            • +
              + + ${v.title} + + ${v.total_page}套 +
              +
              + +

              ${v.title}

              +

              ${v.user}

              +

              ${v.source}

              +
              +
              + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
              +
              +
            • + ` + }) + + // 今日推荐 + document.querySelector(".recommended .title").innerHTML = ` + + 今日推荐 + `; + recommendedList.forEach(v => { + document.querySelector(".recommended ul").innerHTML += + ` +
            • +
              + + ${v.title} + + ${v.total_page}套 +
              +
              + +

              ${v.title}

              +

              ${v.user}

              +

              ${v.source}

              +
              +
              + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } + +
              +
              +
            • + ` + }) + } +} + +var home = new Home(); \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/info.js b/h5_webview/app/src/main/assets/js/page/info.js new file mode 100644 index 0000000..264627d --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/info.js @@ -0,0 +1,173 @@ +class Info { + + constructor() { + this.page = 1; + this.TotalPage = 0; + this.preview = ""; + this.InfoList = []; + this.GetInfoData() + } + + async GetInfoData(action = "first") { + this.InfoList = await homeService.info({ + id: utils.GetQueryString("id"), + page: this.page + }); + + this.TotalPage = this.InfoList.total_page + // 设置网页标题 + document.title = this.InfoList.title + + this.InfoList.list.forEach((v) => { + var image = new Image(); + image.src = v.src; + image.onload = () => { + if (image.width < image.height) { + this.preview = v.src; + } + this.LikePhotot() + document.querySelector(".info").innerHTML += ` +
              + + ${v.title} + +
              ${v.title}
              +
              + ` + } + }); + + this.BindNextPage(); + initPhotoSwipeFromDOM('.info'); + + if (action == "first") { + + document.querySelector(".recommend .title").innerText = "推荐写真" + this.InfoList.recommend.forEach(v => { + document.querySelector(".recommend ul").innerHTML += + ` +
            • +
              + + ${v.title} + + ${v.total}P +
              +
              + +

              ${v.title}

              +

              ${v.user}

              +

              ${v.source}

              +
              +
              + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
              +
              +
            • + ` + }) + + document.querySelector(".relevant .title").innerText = "相关写真" + this.InfoList.relevant.forEach(v => { + document.querySelector(".relevant ul").innerHTML += + ` +
            • +
              + + ${v.title} + + ${v.total}P +
              +
              + +

              ${v.title}

              +

              ${v.user}

              +

              ${v.source}

              +
              +
              + ${(v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
              +
              +
            • + ` + }) + + } + + } + + BindNextPage() { + document.querySelector(".next_page").style.display = "block" + document.querySelector(".next_page").onclick = () => { + this.page += 1; + if (this.page > this.TotalPage) { + document.querySelector(".next_page").style.display = "none" + } else { + if (this.page == this.TotalPage) { + document.querySelector(".next_page").style.display = "none" + this.GetInfoData("loadMore") + } else { + this.GetInfoData("loadMore") + } + } + } + } + + LikePhotot() { + // true 收藏, false 取消收藏 + var status = null; + var LikeList = JSON.parse(localStorage.getItem("likeList")) == null + ? [] : JSON.parse(localStorage.getItem("likeList")) + + var isHave = LikeList.filter((v) => { + if (v.id == utils.GetQueryString("id")) { + return v + } + }) + + // 该写真你未收藏,true 点击进行收藏 + if (isHave.length == 0) { + status = true + // 改写真你已收藏,点击取消收藏 + } else { + status = false + document.querySelector(".like").className = "like iconfont icon-aixin" + } + + document.querySelector(".like").onclick = () => { + console.log(this.preview); + if (status == true) { + LikeList.push({ + id: utils.GetQueryString("id"), + title: this.InfoList.title, + user: this.InfoList.info, + source: this.InfoList.source, + total: this.InfoList.total, + preview: this.preview + }) + localStorage.setItem("likeList", JSON.stringify(LikeList)) + status = false + document.querySelector(".like").className = "like iconfont icon-aixin" + + } else { + LikeList = LikeList.filter((v) => { + if (v.id != utils.GetQueryString("id")) { + return v + } + }); + status = true + document.querySelector(".like").className = "like iconfont icon-xin" + + localStorage.setItem("likeList", JSON.stringify(LikeList)) + } + } + } +} + +new Info() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/like.js b/h5_webview/app/src/main/assets/js/page/like.js new file mode 100644 index 0000000..f279d7b --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/like.js @@ -0,0 +1,74 @@ +class Like { + constructor() { + this.like = JSON.parse(localStorage.getItem("likeList")) == null + ? [] + : JSON.parse(localStorage.getItem("likeList")); + + this.GetLikeList() + } + + GetLikeList() { + if (this.like == null || this.like.length == 0) { + document.querySelector(".jglist ul").innerHTML = ""; + document.querySelector(".jglist ul").innerHTML = + ` +
              + +

              暂无收藏

              +
              + ` + } else { + document.querySelector(".jglist ul").innerHTML = ""; + this.like.forEach(v => { + document.querySelector(".jglist ul").innerHTML += + ` +
            • +
              + + ${v.title} + + ${v.total} +
              + +
            • + ` + }); + + this.BindLongPress() + } + } + + BindLongPress() { + var Li = document.querySelectorAll(".jglist ul li"); + Li.forEach((v, i) => { + utils.longPress(v, () => { + Tips.dialog({ + title: '删除收藏', + message: '确认删除您选中的写真集吗?', + cancelText: '取消', + confirmText: '确定', + cancel: () => { }, + confirm: () => { + this.like = this.like.filter((r)=>{ + return r.id != this.like[i].id + }) + + localStorage.setItem("likeList", JSON.stringify(this.like)) + this.GetLikeList() + } + }) + }) + }) + } +} + +new Like() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/mechanism.js b/h5_webview/app/src/main/assets/js/page/mechanism.js new file mode 100644 index 0000000..150bd0b --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/mechanism.js @@ -0,0 +1,23 @@ +class Mechanism { + constructor () { + this.GetMechanismList() + } + + async GetMechanismList() { + var res = await homeService.mechanism({}); + console.log(res); + var Li = document.querySelector(".mechanism_list"); + res.forEach(v => { + Li.innerHTML+=` +
            • + +

              ${v.title}

              + ${v.quantity} +
              +
            • + ` + }); + } +} + +var mechanism = new Mechanism(); \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/mechanism_info.js b/h5_webview/app/src/main/assets/js/page/mechanism_info.js new file mode 100644 index 0000000..3071775 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/mechanism_info.js @@ -0,0 +1,60 @@ +class MechanismInfo { + + constructor () { + // 设置标题栏文字 + utils.SetHeaderTitle(utils.GetQueryString("t")) + this.GetMechanismInfo() + } + + async GetMechanismInfo() { + var res = [] + if (utils.GetQueryString("type") == "tags") { + res = await homeService.classList({ + page: 0, + id: utils.GetQueryString("id") + }) + } else { + res = await homeService.mechanismList({ + page: 0, + id: utils.GetQueryString("id") + }) + } + + console.log(res); + + res.list.forEach(v => { + document.querySelector(".jglist ul").innerHTML+= + ` +
            • +
              + + ${v.title} + + ${v.total}P +
              +
              + +

              ${v.title}

              +

              ${v.user}

              + ${ + v.hasOwnProperty("source") + ? `

              ${v.source}

              ` + : '' + } +
              +
              + ${ + (v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
              +
              +
            • + ` + }); + } + +} + +new MechanismInfo() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/model.js b/h5_webview/app/src/main/assets/js/page/model.js new file mode 100644 index 0000000..9ab2a7a --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/model.js @@ -0,0 +1,56 @@ +class Model { + constructor () { + this.GetModelList() + this.newModelList = [] + } + + async GetModelList() { + var res = await homeService.allModel({}); + console.log(res); + var hot_models = res.hot_models; + var newest = res.newest; + + this.newModelList = [...hot_models, ...newest] + this.RenderModelItem(hot_models, '.hot_models') + this.RenderModelItem(newest, '.newest') + + } + + + RenderModelItem(data, className) { + if (className == ".hot_models") { + document.querySelector(`${className} .title`).innerText='热门模特' + } else { + document.querySelector(`${className} .title`).innerText='最新模特' + } + data.forEach(v => { + document.querySelector(`${className} .model_list`).innerHTML+= + ` +
              +
              + ${v.title} + ${ + v.total.length == 0 + ? '' + : `${v.total}` + } +
              +

              ${v.title}

              +
              + ` + }); + + this.BindItemClick() + } + + BindItemClick() { + var Item = document.querySelectorAll(".item"); + Item.forEach((v,i)=>{ + v.onclick = () => { + location.href = `model_info.html?id=${this.newModelList[i].id}&t=${this.newModelList[i].title}` + } + }) + } +} + +var model = new Model(); \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/model_info.js b/h5_webview/app/src/main/assets/js/page/model_info.js new file mode 100644 index 0000000..78e8b1a --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/model_info.js @@ -0,0 +1,75 @@ +class ModelInfo { + + constructor () { + utils.SetHeaderTitle(utils.GetQueryString("t")) + this.GetModelInfoData() + } + + async GetModelInfoData() { + var res = await homeService.modelList({ + page: 0, + id: utils.GetQueryString("id") + }) + + // 设置模特的头像,名字,介绍 + document.querySelector(".model_info_header").innerHTML = ` + ${res.model_info.name} +
              +

              ${res.model_info.name}

              + ${res.model_info.explain} +
              + ` + + // 遍历模特的作品 + document.querySelector(".tazuop .title").innerText = "她的作品" + res.list.forEach(v => { + document.querySelector(".tazuop ul").innerHTML+= + ` +
            • +
              + + ${v.title} + + ${v.total}P +
              +
              + +

              ${v.title}

              +

              ${v.source}

              +
              +
              + ${ + (v.tags.map((t) => { + return `` + })).toString().replace(/,/ig, " ") + } +
              +
              +
            • + ` + }); + + // 遍历类似模特 + document.querySelector(".similar .title").innerText = "类似模特" + res.similar.forEach((v)=>{ + document.querySelector(".similar .model_list").innerHTML+= ` +
              +
              + ${v.title} + ${v.total} +
              +

              ${v.title}

              +
              + ` + }) + + var items = document.querySelectorAll(".similar .model_list .item") + items.forEach((v,i)=>{ + v.onclick = function () { + location.href = `model_info.html?id=${res.similar[i].id}&t=${res.similar[i].title}` + } + }) + } +} + +new ModelInfo() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/my.js b/h5_webview/app/src/main/assets/js/page/my.js new file mode 100644 index 0000000..da2bd3b --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/my.js @@ -0,0 +1,30 @@ +class My { + constructor() { + this.bindClick() + } + + bindClick() { + document.querySelector(".updateApp").onclick = function () { + Tips.loading() + setTimeout(()=>{ + Tips.close(); + Tips.toast("当前已是最新版本",2000) + },2000) + } + document.querySelector(".clearData").onclick = function () { + Tips.dialog({ + title: '清除缓存', + message: '是否清除App所有的缓存,将会删除收藏的数据,首页的自定义分类等,慎重选择!!', + cancelText: '取消', + confirmText: '确定', + confirm: ()=> { + localStorage.clear() + setTimeout(()=>{ + Tips.toast("缓存清除成功") + },1000) + } + }) + } + } +} +new My() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/search.js b/h5_webview/app/src/main/assets/js/page/search.js new file mode 100644 index 0000000..e9b5396 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/search.js @@ -0,0 +1,48 @@ +class Search { + constructor() { + this.GetSearchList() + } + + async GetSearchList() { + var SearchInput = document.querySelector(".search_input input"), + SearchSubmit = document.querySelector(".search_input .icon-search"); + + SearchSubmit.onclick = async () => { + console.log("111"); + if (SearchInput.value.length == 0) { + Tips.toast("输入不能为空") + } else { + var res = await homeService.search({ + keyword: SearchInput.value + }); + if (res.length == 0) { + document.querySelector(".search_list ul").innerHTML = "" + document.querySelector(".search_list ul").innerHTML = ` + 没有搜索结果 + ` + } else { + document.querySelector(".search_list ul").innerHTML = "" + res.forEach(v => { + document.querySelector(".search_list ul").innerHTML+= ` +
            • +
              + + ${v.title} + + 49P +
              + +
            • + ` + }); + } + } + } + + } +} +new Search() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/page/type_edit.js b/h5_webview/app/src/main/assets/js/page/type_edit.js new file mode 100644 index 0000000..b0a8c66 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/page/type_edit.js @@ -0,0 +1,84 @@ +class TypeEdit { + constructor() { + this.YouChioose = [] + this.NoChiooseList = [] + this.RenderYouChioose() + } + + RenderYouChioose() { + this.YouChioose = JSON.parse(localStorage.getItem("typeList")); + console.log(this.YouChioose); + + // 渲染 点击删除以下分类 + document.querySelector(".you_chioose .chiooseWrap").innerHTML = "" + this.YouChioose.forEach(v => { + document.querySelector(".you_chioose .chiooseWrap").innerHTML += ` +
            • ${v.title}
            • + ` + }); + this.BindTopClick() + + // 渲染 点击添加以下分类 + if (localStorage.getItem("nochioose") == null) { + localStorage.setItem("nochioose", JSON.stringify([])) + } else { + this.NoChiooseList = JSON.parse(localStorage.getItem("nochioose")) + document.querySelector(".chioose_list .chiooseWrap").innerHTML = "" + this.NoChiooseList.forEach(v => { + document.querySelector(".chioose_list .chiooseWrap").innerHTML += ` +
            • ${v.title}
            • + ` + }); + + this.BindBottomClick() + + } + } + + BindTopClick() { + // 绑定事件 + var YouChiooseLi = document.querySelectorAll(".you_chioose .chiooseWrap li"); + YouChiooseLi.forEach((v, i) => { + v.onclick = () => { + + var noCh = JSON.parse(localStorage.getItem("nochioose")) + noCh.push(this.YouChioose[i]); + localStorage.setItem("nochioose", JSON.stringify(noCh)); + + this.YouChioose = this.YouChioose.filter(res => { + if (res.id != this.YouChioose[i].id) { + return res + } + }) + + localStorage.setItem("typeList", JSON.stringify(this.YouChioose)) + this.RenderYouChioose() + } + }) + } + + + BindBottomClick() { + var Li = document.querySelectorAll(".chioose_list .chiooseWrap li"); + Li.forEach((v,i)=>{ + v.onclick = () => { + + var typeList = JSON.parse(localStorage.getItem("typeList")) + typeList.push(this.NoChiooseList[i]); + localStorage.setItem("typeList", JSON.stringify(typeList)); + + this.NoChiooseList = this.NoChiooseList.filter(res => { + if (res.id != this.NoChiooseList[i].id) { + return res + } + }); + + localStorage.setItem("nochioose", JSON.stringify(this.NoChiooseList)) + this.RenderYouChioose() + + } + }) + } +} + +new TypeEdit() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/service/.pydio b/h5_webview/app/src/main/assets/js/service/.pydio new file mode 100644 index 0000000..c98514c --- /dev/null +++ b/h5_webview/app/src/main/assets/js/service/.pydio @@ -0,0 +1 @@ +8a4aa590-790c-48e9-9fd5-3207697bf8db \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/service/HomeService.js b/h5_webview/app/src/main/assets/js/service/HomeService.js new file mode 100644 index 0000000..0742aa2 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/service/HomeService.js @@ -0,0 +1,82 @@ +/** + * 请求的中间层 + * 被页面调用,然后它去调用ajax + */ +class HomeService { + + + GetHomeData(data) { + return ajax({ + url: Config.ApiList.index, + data: data, + methods: 'GET' + }); + } + + info(data) { + return ajax({ + url: Config.ApiList.info, + data: data, + methods: 'GET' + }); + } + + mechanism(data) { + return ajax({ + url: Config.ApiList.mechanism, + data: data, + methods: 'GET' + }); + } + + type(data) { + return ajax({ + url: Config.ApiList.type, + data: data, + methods: 'GET' + }); + } + + classList(data) { + return ajax({ + url: Config.ApiList.classList, + data: data, + methods: 'GET' + }); + } + + allModel(data) { + return ajax({ + url: Config.ApiList.allModel, + data: data, + methods: 'GET' + }); + } + + modelList(data) { + return ajax({ + url: Config.ApiList.modelList, + data: data, + methods: 'GET' + }); + } + + mechanismList(data) { + return ajax({ + url: Config.ApiList.mechanismList, + data: data, + methods: 'GET' + }); + } + + search(data) { + return ajax({ + url: Config.ApiList.search, + data: data, + methods: 'GET' + }); + } + +}; + +var homeService = new HomeService() \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/utils/.pydio b/h5_webview/app/src/main/assets/js/utils/.pydio new file mode 100644 index 0000000..c2ebfa8 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/utils/.pydio @@ -0,0 +1 @@ +aaafa91c-6f8f-4cd8-9d87-bc5c2afaac14 \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/utils/dist/.pydio b/h5_webview/app/src/main/assets/js/utils/dist/.pydio new file mode 100644 index 0000000..3b0d6be --- /dev/null +++ b/h5_webview/app/src/main/assets/js/utils/dist/.pydio @@ -0,0 +1 @@ +f296bafb-0a71-4d49-90ec-a2522dfac7a5 \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/utils/dist/default-skin/.pydio b/h5_webview/app/src/main/assets/js/utils/dist/default-skin/.pydio new file mode 100644 index 0000000..c50dd28 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/utils/dist/default-skin/.pydio @@ -0,0 +1 @@ +f667823c-e721-4a66-8020-3d19645ff572 \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/js/utils/dist/default-skin/default-skin.css b/h5_webview/app/src/main/assets/js/utils/dist/default-skin/default-skin.css new file mode 100644 index 0000000..54c2c61 --- /dev/null +++ b/h5_webview/app/src/main/assets/js/utils/dist/default-skin/default-skin.css @@ -0,0 +1,482 @@ +/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */ +/* + + Contents: + + 1. Buttons + 2. Share modal and links + 3. Index indicator ("1 of X" counter) + 4. Caption + 5. Loading indicator + 6. Additional styles (root element, top bar, idle state, hidden state, etc.) + +*/ +/* + + 1. Buttons + + */ +/* + +
              +
              +
              +
              +
              +
              +
              + + +
              + +
              + + + + + +
              +
              +
              + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/like.html b/h5_webview/app/src/main/assets/page/like.html new file mode 100644 index 0000000..863221d --- /dev/null +++ b/h5_webview/app/src/main/assets/page/like.html @@ -0,0 +1,37 @@ + + + + + + + + 枸杞社 + + + + + + + + + + +
              +
              + + 我的收藏 +
              +
              + +
              +
              +
                +
                +
                + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/mechanism.html b/h5_webview/app/src/main/assets/page/mechanism.html new file mode 100644 index 0000000..fb330aa --- /dev/null +++ b/h5_webview/app/src/main/assets/page/mechanism.html @@ -0,0 +1,68 @@ + + + + + + + 枸杞社 + + + + + + + + + + + +
                +
                + + 机构 +
                +
                + +
                + +
                + + + + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/mechanism_info.html b/h5_webview/app/src/main/assets/page/mechanism_info.html new file mode 100644 index 0000000..ac2335b --- /dev/null +++ b/h5_webview/app/src/main/assets/page/mechanism_info.html @@ -0,0 +1,42 @@ + + + + + + + + 枸杞社 + + + + + + + + + + + +
                +
                + + +
                +
                + +
                +
                +
                  +
                  +
                  + + + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/model.html b/h5_webview/app/src/main/assets/page/model.html new file mode 100644 index 0000000..3e923f4 --- /dev/null +++ b/h5_webview/app/src/main/assets/page/model.html @@ -0,0 +1,75 @@ + + + + + + + 枸杞社 + + + + + + + + + + + +
                  +
                  + + 模特 +
                  +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/model_info.html b/h5_webview/app/src/main/assets/page/model_info.html new file mode 100644 index 0000000..96940cc --- /dev/null +++ b/h5_webview/app/src/main/assets/page/model_info.html @@ -0,0 +1,52 @@ + + + + + + + + 枸杞社 + + + + + + + + + + + + +
                  +
                  + + 模特详情 +
                  +
                  + +
                  +
                  + +
                  +
                  +
                    +
                    + + +
                    +
                    +
                    +
                    + +
                    + + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/my.html b/h5_webview/app/src/main/assets/page/my.html new file mode 100644 index 0000000..6059907 --- /dev/null +++ b/h5_webview/app/src/main/assets/page/my.html @@ -0,0 +1,108 @@ + + + + + + + + 枸杞社 + + + + + + + + + + + + +
                    + +

                    我的

                    +
                    + +
                    + +
                    + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/search.html b/h5_webview/app/src/main/assets/page/search.html new file mode 100644 index 0000000..d704001 --- /dev/null +++ b/h5_webview/app/src/main/assets/page/search.html @@ -0,0 +1,42 @@ + + + + + + + + 枸杞社 + + + + + + + + + + + + +
                    + + + +
                    + +
                    +
                    +
                      + +
                    +
                    +
                    + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/page/type_edit.html b/h5_webview/app/src/main/assets/page/type_edit.html new file mode 100644 index 0000000..4c71ff7 --- /dev/null +++ b/h5_webview/app/src/main/assets/page/type_edit.html @@ -0,0 +1,39 @@ + + + + + + + 枸杞社 + + + + + + + + + + +
                    +
                    + + 分类管理 +
                    +
                    + +
                    +
                    +

                    点击删除以下分类

                    +
                      +
                      +
                      +

                      点击添加以下分类

                      +
                        +
                        +
                        + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/笔记.txt b/h5_webview/app/src/main/assets/笔记.txt new file mode 100644 index 0000000..3a0d4f1 --- /dev/null +++ b/h5_webview/app/src/main/assets/笔记.txt @@ -0,0 +1,68 @@ +如何拿到异步ajax的返回数据? + 1:使用回调 x + 2:Promise + + 将异步操作转换为同步操作, + 优势:避免回调地狱,提高代码的可读性和精简性 + 有三种状态: + pending(进行中), + resolved(完成), + rejected(失败) + + Promise使用过程中有两种获取数据的写法: + + + 1 + +xxxxx({ id:1, page:2 }).then((res)=>{ + console.log(res); +}).catch(err=>{ + +}) + +then 拿正确的数据 +catch 拿错误的数据 + +2: + +组合 async await + +async function GetHomeList() { + let a = await homeService.mechanism({}) + console.log(a); +} + +未完成 + +【完成】1:首页分类可以编辑 [带你们写] +【完成】4:tabs 被点击进入列表页面 [带你们写,用mechanism_info列表,传入type做判断] +【完成】5:收藏(功能实现,页面未写) +【完成】6:关于我们 页面 [自己写] +【完成】7:用户协议 [自己写] +【完成】8:检测升级 [自己写] +【完成】 9:清除缓存 [自己写,弹窗我来改造] +【完成】10:详情页点击图片可以弹窗显示预览 + +我的任务 +1:机构页面的滚动加载更多 + +任务: +1:模特详情 点击箭头加载更多数据 +【完成】2:首页搜索功能 /search +【完成】3:收藏页面和列表渲染,点击a标签进入详情,长按删除收藏的写真,获取本地likeList,如果有数据显示列表如果没有数据,显示:暂无收藏 + +问题记录: +解决从首页进入详情再返回首页,但是顶部横向菜单滚动位置不对 + + Tips.dialog({ + title: '测试标题', + message: '代码写出来是给人看的东西', + cancelText: '后悔了', + confirmText: '很Ok啊', + cancel: ()=> { + console.log("你点击了取消按钮"); + }, + confirm: ()=> { + console.log("你点击了确定按钮"); + } +}) diff --git a/h5_webview/app/src/main/assets/缩放.html b/h5_webview/app/src/main/assets/缩放.html new file mode 100644 index 0000000..bd5fc33 --- /dev/null +++ b/h5_webview/app/src/main/assets/缩放.html @@ -0,0 +1,69 @@ + + + + + + + + + 缩放 + + + + + + +
                        + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/assets/阻止事件冒泡.html b/h5_webview/app/src/main/assets/阻止事件冒泡.html new file mode 100644 index 0000000..69654d5 --- /dev/null +++ b/h5_webview/app/src/main/assets/阻止事件冒泡.html @@ -0,0 +1,33 @@ + + + + + + Document + + + + + +
                        + +
                        + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/java/.pydio b/h5_webview/app/src/main/java/.pydio new file mode 100644 index 0000000..2e35759 --- /dev/null +++ b/h5_webview/app/src/main/java/.pydio @@ -0,0 +1 @@ +c55b9f2b-999b-414b-a737-567c84eafcaf \ No newline at end of file diff --git a/h5_webview/app/src/main/java/com/.pydio b/h5_webview/app/src/main/java/com/.pydio new file mode 100644 index 0000000..0c24027 --- /dev/null +++ b/h5_webview/app/src/main/java/com/.pydio @@ -0,0 +1 @@ +26ea301c-b4d7-47df-ac5d-c1346006c166 \ No newline at end of file diff --git a/h5_webview/app/src/main/java/com/caipu/.pydio b/h5_webview/app/src/main/java/com/caipu/.pydio new file mode 100644 index 0000000..7847893 --- /dev/null +++ b/h5_webview/app/src/main/java/com/caipu/.pydio @@ -0,0 +1 @@ +a6b8cc5d-c486-4ed1-b6e6-5fafbe0a1569 \ No newline at end of file diff --git a/h5_webview/app/src/main/java/com/caipu/bmy/.pydio b/h5_webview/app/src/main/java/com/caipu/bmy/.pydio new file mode 100644 index 0000000..e1c5987 --- /dev/null +++ b/h5_webview/app/src/main/java/com/caipu/bmy/.pydio @@ -0,0 +1 @@ +c759a447-3c57-4a41-a779-fbad9b085756 \ No newline at end of file diff --git a/h5_webview/app/src/main/java/com/caipu/bmy/cp/.pydio b/h5_webview/app/src/main/java/com/caipu/bmy/cp/.pydio new file mode 100644 index 0000000..5228ed4 --- /dev/null +++ b/h5_webview/app/src/main/java/com/caipu/bmy/cp/.pydio @@ -0,0 +1 @@ +60a28452-24f2-41ea-888a-0dbc0c72beea \ No newline at end of file diff --git a/h5_webview/app/src/main/java/com/caipu/bmy/cp/AppAplication.java b/h5_webview/app/src/main/java/com/caipu/bmy/cp/AppAplication.java new file mode 100755 index 0000000..784646b --- /dev/null +++ b/h5_webview/app/src/main/java/com/caipu/bmy/cp/AppAplication.java @@ -0,0 +1,31 @@ +package com.caipu.bmy.cp; + +import android.app.Application; +import android.util.Log; +import com.tencent.smtt.sdk.QbSdk; + +public class AppAplication extends Application { + @Override + public void onCreate() { + // TODO Auto-generated method stub + super.onCreate(); + //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。 + + QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() { + + @Override + public void onViewInitFinished(boolean arg0) { + // TODO Auto-generated method stub + //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。 + Log.d("app", " onViewInitFinished is " + arg0); + } + + @Override + public void onCoreInitFinished() { + // TODO Auto-generated method stub + } + }; + //x5内核初始化接口 + QbSdk.initX5Environment(getApplicationContext(), cb); + } +} diff --git a/h5_webview/app/src/main/java/com/caipu/bmy/cp/MainActivity.java b/h5_webview/app/src/main/java/com/caipu/bmy/cp/MainActivity.java new file mode 100755 index 0000000..7b73a51 --- /dev/null +++ b/h5_webview/app/src/main/java/com/caipu/bmy/cp/MainActivity.java @@ -0,0 +1,354 @@ +package com.caipu.bmy.cp; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.PendingIntent; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Observable; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.FileProvider; +import android.util.Base64; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; + +import com.tencent.smtt.export.external.interfaces.ClientCertRequest; +import com.tencent.smtt.export.external.interfaces.SslError; +import com.tencent.smtt.export.external.interfaces.SslErrorHandler; +import com.tencent.smtt.export.external.interfaces.WebResourceRequest; +import com.tencent.smtt.export.external.interfaces.WebResourceResponse; +import com.tencent.smtt.sdk.WebChromeClient; +import com.tencent.smtt.sdk.WebSettings; +import android.widget.Toast; +import com.caipu.bmy.cp.utils.X5WebView; +import com.tencent.smtt.sdk.WebView; +import com.tencent.smtt.sdk.WebViewClient; + +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class MainActivity extends Activity { + + + private X5WebView webView; + private long exitTime; + private String picUrl; + private String ImageFileName; + private String WebViewTitle; + private static final int REQUEST_EXTERNAL_STORAGE = 1; + Bitmap bitmap; + private static String[] PERMISSIONS_STORAGE = { + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE }; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + webView = (X5WebView) findViewById(R.id.web_filechooser); + webView.loadUrl("file:///android_asset/page/home.html"); + // 动态申请文件存储和SD卡的权限 + verifyStoragePermissions(MainActivity.this); + + // 长按事件监听 + webView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + final WebView.HitTestResult hitTestResult = webView.getHitTestResult(); + String url = webView.getUrl(); + String[] all= url.split("/page/"); + Log.d("url", all[1]); + + // 如果是图片类型或者是带有图片链接的类型,并且不是like页面的话,那么弹窗 + if ((hitTestResult.getType() == WebView.HitTestResult.IMAGE_TYPE || + hitTestResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) + && !all[1].equals("like.html")) { + // 操作对话框 + AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this); + b.setTitle("请选择你的操作:"); + // "3:分享链接给好友" + b.setItems(new String[]{"1:保存图片到相册", "2:分享图片给好友", "3:分享链接给好友"}, (dialog, which) -> { + picUrl = hitTestResult.getExtra();//获取图片 + switch (which) { + case 0: + //保存图片到相册 + new Thread(() -> url2bitmap(picUrl)).start(); + break; + case 1: + // 分享图片 + new Thread(() -> GetImageInputStream(picUrl)).start(); + break; + case 2: + // 分享链接 + new Thread(() -> { + String ShareText = "1:你有一条新消息:你的好友从《水蜜桃》App给您分享了一张精美写真图片!\n\n2:写真集名称:"+WebViewTitle+"\n\n3:写真地址:http://103.91.219.114:3000/api/json/url?url="+picUrl+"\n\n4:H5访问写真集:http://103.91.219.114/page/"+all[1]; + //+"\n\n5:198万高清写真《水蜜桃》App等你下载,下载地址:http://www.baidu.com" + ShareText(ShareText); + }).start(); + break; + } + }) + .show(); + return true; + } + return false; + } + }); + + webView.setWebChromeClient(new WebChromeClient(){ + @Override + public void onReceivedTitle(WebView view, String title) { + super.onReceivedTitle(view, title); + WebViewTitle = title; + } + }); + + webView.setWebViewClient(new WebViewClient(){ + @Override + public WebResourceResponse shouldInterceptRequest(WebView view, String url) { + Log.d("url", url); + // 拦截网页中所有的请求,如果是图片的话 + if (url.indexOf("jpg") != -1 || url.indexOf("png") != -1 || url.indexOf("jpeg") != -1) { + try { + DefaultHttpClient client = new DefaultHttpClient(); + HttpGet httpGet = new HttpGet(url); + // 手动增加请求头 Referer 字段,绕过目标网站Nginx的图片防盗链 + httpGet.setHeader("Referer", "https://www.tujigu.com/"); + HttpResponse httpReponse = client.execute(httpGet); + Header contentType = httpReponse.getEntity().getContentType(); + Header encoding = httpReponse.getEntity().getContentEncoding(); + InputStream responseInputStream = httpReponse.getEntity().getContent(); + String contentTypeValue = null; + String encodingValue = null; + if (contentType != null) { + contentTypeValue = contentType.getValue(); + } + if (encoding != null) { + encodingValue = encoding.getValue(); + } + return new WebResourceResponse(contentTypeValue, encodingValue, responseInputStream); + } catch (ClientProtocolException e) { + //return null to tell WebView we failed to fetch it WebView should try again. + return null; + } catch (IOException e) { + //return null to tell WebView we failed to fetch it WebView should try again. + return null; + } + } else { + return null; + } + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + webView.getSettings().setBlockNetworkImage(false); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if (url.startsWith("weixin://wap/pay?")) { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(url)); + startActivity(intent); + return true; + } + return super.shouldOverrideUrlLoading(view, url); + } + + //加载https时候,接受所有证书 + @Override + public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { + handler.proceed(); + } + }); + } + + /** + * 分享图片 + * @param imageurl + */ + public void GetImageInputStream(String imageurl) { + URL url; + HttpURLConnection connection = null; + Bitmap bitmap = null; + try { + url = new URL(imageurl); + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestProperty("Referer", "https://www.tujigu.com/"); + connection.setConnectTimeout(6000); //超时设置 + connection.setDoInput(true); + connection.setUseCaches(false); //设置不使用缓存 + InputStream inputStream = connection.getInputStream(); + bitmap = BitmapFactory.decodeStream(inputStream); + inputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + } + shareSingleImage(bitmap); + } + + //分享文字 + public void ShareText(String Text) { + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_TEXT, Text); + shareIntent.setType("text/plain"); + + //设置分享列表的标题,并且每次都显示分享列表 + startActivity(Intent.createChooser(shareIntent, "分享到")); + } + + public void shareSingleImage(Bitmap bitmap) { + //由文件得到uri + Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(this.getContentResolver(), bitmap, null, null)); + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); + shareIntent.setType("image/*"); + startActivity(Intent.createChooser(shareIntent, "分享到")); + } + + public void url2bitmap(String url) { + Bitmap bm = null; + try { + URL iconUrl = new URL(url); + URLConnection conn = iconUrl.openConnection(); + // 下载图片的时候设置请求头绕过防盗链限制 + conn.setRequestProperty("Referer", "https://www.tujigu.com/"); + HttpURLConnection http = (HttpURLConnection) conn; + int length = http.getContentLength(); + conn.connect(); + // 获得图像的字符流 + InputStream is = conn.getInputStream(); + BufferedInputStream bis = new BufferedInputStream(is, length); + bm = BitmapFactory.decodeStream(bis); + bis.close(); + is.close(); + if (bm != null) { + save2Album(bm); + } + } catch (Exception e) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, "获取图片文件流失败", Toast.LENGTH_SHORT).show(); + } + }); + e.printStackTrace(); + } + } + + public static void verifyStoragePermissions(Activity activity) { + // Check if we have write permission + int permission = ActivityCompat.checkSelfPermission(activity, + Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (permission != PackageManager.PERMISSION_GRANTED) { + // We don't have permission so prompt the user + ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, + REQUEST_EXTERNAL_STORAGE); + } + } + + private void save2Album(Bitmap bitmap) { + File appDir = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM); + if (!appDir.exists()) appDir.mkdir(); + String[] str = picUrl.split("/"); + ImageFileName = "水蜜桃_"+System.currentTimeMillis()+"_"+str[str.length - 1]; + File file = new File(appDir, ImageFileName); + try { + FileOutputStream fos = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); + fos.flush(); + fos.close(); + onSaveSuccess(file); + } catch (IOException e) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, "保存图片失败", Toast.LENGTH_SHORT).show(); + } + }); + e.printStackTrace(); + } + } + + private void onSaveSuccess(final File file) { + runOnUiThread(new Runnable() { + @Override + public void run() { + sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); + Toast.makeText(MainActivity.this, "图片:"+ImageFileName+" 成功保存到相册!", Toast.LENGTH_SHORT).show(); + } + }); + } + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_BACK)) { + if (webView.canGoBack()) { + webView.goBack();//返回上一页面 + return false; + } else { + + if (System.currentTimeMillis() - exitTime > 2000) { + Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); + exitTime = System.currentTimeMillis(); + } else { + finish(); + System.exit(0); + android.os.Process.killProcess(android.os.Process.myPid()); + } + } + return false; + }else { + return super.onKeyDown(keyCode, event); + } + } + + /** + * 确保注销配置能够被释放 + */ + @Override + protected void onDestroy() { + // TODO Auto-generated method stub + if (this.webView != null) { + webView.destroy(); + } + super.onDestroy(); + } + + +} diff --git a/h5_webview/app/src/main/java/com/caipu/bmy/cp/utils/.pydio b/h5_webview/app/src/main/java/com/caipu/bmy/cp/utils/.pydio new file mode 100644 index 0000000..d91df37 --- /dev/null +++ b/h5_webview/app/src/main/java/com/caipu/bmy/cp/utils/.pydio @@ -0,0 +1 @@ +b8b34a05-c366-4059-8378-949370f8b470 \ No newline at end of file diff --git a/h5_webview/app/src/main/java/com/caipu/bmy/cp/utils/X5WebView.java b/h5_webview/app/src/main/java/com/caipu/bmy/cp/utils/X5WebView.java new file mode 100755 index 0000000..e3b3a4d --- /dev/null +++ b/h5_webview/app/src/main/java/com/caipu/bmy/cp/utils/X5WebView.java @@ -0,0 +1,60 @@ +package com.caipu.bmy.cp.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; +import android.widget.TextView; +import com.tencent.smtt.sdk.WebSettings; +import com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm; +import com.tencent.smtt.sdk.WebView; +import com.tencent.smtt.sdk.WebViewClient; + +public class X5WebView extends WebView { + TextView title; + private WebViewClient client = new WebViewClient() { + /** + * 防止加载网页时调起系统浏览器 + */ + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return true; + } + }; + + @SuppressLint("SetJavaScriptEnabled") + public X5WebView(Context arg0, AttributeSet arg1) { + super(arg0, arg1); + this.setWebViewClient(client); + // this.setWebChromeClient(chromeClient); + // WebStorage webStorage = WebStorage.getInstance(); + initWebViewSettings(); + this.getView().setClickable(true); + } + + private void initWebViewSettings() { + WebSettings webSetting = this.getSettings(); + webSetting.setJavaScriptEnabled(true); + webSetting.setJavaScriptCanOpenWindowsAutomatically(true); + webSetting.setAllowFileAccess(true); + webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS); + webSetting.setSupportZoom(false); + webSetting.setBuiltInZoomControls(false); + webSetting.setUseWideViewPort(true); + webSetting.setSupportMultipleWindows(true); + webSetting.setLoadWithOverviewMode(true); + webSetting.setAppCacheEnabled(true); + webSetting.setDomStorageEnabled(true); + webSetting.setGeolocationEnabled(true); + webSetting.setAppCacheMaxSize(Long.MAX_VALUE); + webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND); + webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH); + webSetting.setCacheMode(WebSettings.LOAD_DEFAULT); + webSetting.setBlockNetworkImage(true); + } + + public X5WebView(Context arg0) { + super(arg0); + setBackgroundColor(85621); + } + +} diff --git a/h5_webview/app/src/main/jniLibs/.pydio b/h5_webview/app/src/main/jniLibs/.pydio new file mode 100644 index 0000000..0b2d174 --- /dev/null +++ b/h5_webview/app/src/main/jniLibs/.pydio @@ -0,0 +1 @@ +8575fb85-a028-4134-a10f-b89132573160 \ No newline at end of file diff --git a/h5_webview/app/src/main/jniLibs/armeabi/.pydio b/h5_webview/app/src/main/jniLibs/armeabi/.pydio new file mode 100644 index 0000000..39e5123 --- /dev/null +++ b/h5_webview/app/src/main/jniLibs/armeabi/.pydio @@ -0,0 +1 @@ +63ff954b-0202-4d2d-8a58-9480e142bb02 \ No newline at end of file diff --git a/h5_webview/app/src/main/jniLibs/armeabi/liblbs.so b/h5_webview/app/src/main/jniLibs/armeabi/liblbs.so new file mode 100755 index 0000000..b558c45 Binary files /dev/null and b/h5_webview/app/src/main/jniLibs/armeabi/liblbs.so differ diff --git a/h5_webview/app/src/main/res/.pydio b/h5_webview/app/src/main/res/.pydio new file mode 100644 index 0000000..e509ba6 --- /dev/null +++ b/h5_webview/app/src/main/res/.pydio @@ -0,0 +1 @@ +d5e0a3fb-69b9-44f9-b05e-c3bee6b097ab \ No newline at end of file diff --git a/h5_webview/app/src/main/res/drawable-v24/.pydio b/h5_webview/app/src/main/res/drawable-v24/.pydio new file mode 100644 index 0000000..50a6ea9 --- /dev/null +++ b/h5_webview/app/src/main/res/drawable-v24/.pydio @@ -0,0 +1 @@ +90a2f162-dfda-4170-9dcc-76e4dfd6623b \ No newline at end of file diff --git a/h5_webview/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/h5_webview/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100755 index 0000000..6348baa --- /dev/null +++ b/h5_webview/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/h5_webview/app/src/main/res/drawable/.pydio b/h5_webview/app/src/main/res/drawable/.pydio new file mode 100644 index 0000000..2667c8c --- /dev/null +++ b/h5_webview/app/src/main/res/drawable/.pydio @@ -0,0 +1 @@ +7813e170-1425-4c71-8dd4-59a160703d5b \ No newline at end of file diff --git a/h5_webview/app/src/main/res/drawable/ic_launcher_background.xml b/h5_webview/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..6080b1a --- /dev/null +++ b/h5_webview/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/h5_webview/app/src/main/res/drawable/ic_launcherapp.png b/h5_webview/app/src/main/res/drawable/ic_launcherapp.png new file mode 100644 index 0000000..f0e0e54 Binary files /dev/null and b/h5_webview/app/src/main/res/drawable/ic_launcherapp.png differ diff --git a/h5_webview/app/src/main/res/ic_launcher.png b/h5_webview/app/src/main/res/ic_launcher.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/ic_launcher.png differ diff --git a/h5_webview/app/src/main/res/layout/.pydio b/h5_webview/app/src/main/res/layout/.pydio new file mode 100644 index 0000000..51e7743 --- /dev/null +++ b/h5_webview/app/src/main/res/layout/.pydio @@ -0,0 +1 @@ +dcb38b34-0bfb-460a-989b-92e93f9eed0e \ No newline at end of file diff --git a/h5_webview/app/src/main/res/layout/activity_main.xml b/h5_webview/app/src/main/res/layout/activity_main.xml new file mode 100755 index 0000000..08b43b7 --- /dev/null +++ b/h5_webview/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-anydpi-v26/.pydio b/h5_webview/app/src/main/res/mipmap-anydpi-v26/.pydio new file mode 100644 index 0000000..171d1b1 --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-anydpi-v26/.pydio @@ -0,0 +1 @@ +8d94d314-3b5d-43e4-a46b-7bd34323cd5a \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/h5_webview/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..cad2118 --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/h5_webview/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..cad2118 --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-hdpi/.pydio b/h5_webview/app/src/main/res/mipmap-hdpi/.pydio new file mode 100644 index 0000000..7c19bdf --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-hdpi/.pydio @@ -0,0 +1 @@ +f1995c41-e74d-42a3-95b0-a1d46d5a8cfb \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-hdpi/ic_launcher.png b/h5_webview/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/h5_webview/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/h5_webview/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/h5_webview/app/src/main/res/mipmap-mdpi/.pydio b/h5_webview/app/src/main/res/mipmap-mdpi/.pydio new file mode 100644 index 0000000..e3e4431 --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-mdpi/.pydio @@ -0,0 +1 @@ +8471a97d-edb9-439c-8620-7543212358a0 \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-mdpi/ic_launcher.png b/h5_webview/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/h5_webview/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/h5_webview/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/h5_webview/app/src/main/res/mipmap-xhdpi/.pydio b/h5_webview/app/src/main/res/mipmap-xhdpi/.pydio new file mode 100644 index 0000000..6ec1077 --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-xhdpi/.pydio @@ -0,0 +1 @@ +516c0347-9806-4cfb-8958-685b8c387524 \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/h5_webview/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/h5_webview/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/h5_webview/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/h5_webview/app/src/main/res/mipmap-xxhdpi/.pydio b/h5_webview/app/src/main/res/mipmap-xxhdpi/.pydio new file mode 100644 index 0000000..5be2e02 --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-xxhdpi/.pydio @@ -0,0 +1 @@ +abaa407e-2ff6-461d-b1df-90f93c2c6d68 \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/h5_webview/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/h5_webview/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/h5_webview/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/h5_webview/app/src/main/res/mipmap-xxxhdpi/.pydio b/h5_webview/app/src/main/res/mipmap-xxxhdpi/.pydio new file mode 100644 index 0000000..75e2089 --- /dev/null +++ b/h5_webview/app/src/main/res/mipmap-xxxhdpi/.pydio @@ -0,0 +1 @@ +66de881a-d673-41f0-99b4-d7541f22d6ac \ No newline at end of file diff --git a/h5_webview/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/h5_webview/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/h5_webview/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/h5_webview/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..cf20c94 Binary files /dev/null and b/h5_webview/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/h5_webview/app/src/main/res/values/.pydio b/h5_webview/app/src/main/res/values/.pydio new file mode 100644 index 0000000..4448569 --- /dev/null +++ b/h5_webview/app/src/main/res/values/.pydio @@ -0,0 +1 @@ +8d7a7b87-b1af-4295-83f4-df0aa35fcf8e \ No newline at end of file diff --git a/h5_webview/app/src/main/res/values/colors.xml b/h5_webview/app/src/main/res/values/colors.xml new file mode 100755 index 0000000..cc01623 --- /dev/null +++ b/h5_webview/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #fb7299 + #fb7299 + #fb7299 + diff --git a/h5_webview/app/src/main/res/values/strings.xml b/h5_webview/app/src/main/res/values/strings.xml new file mode 100755 index 0000000..9a15e1f --- /dev/null +++ b/h5_webview/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + 水蜜桃 + diff --git a/h5_webview/app/src/main/res/values/styles.xml b/h5_webview/app/src/main/res/values/styles.xml new file mode 100755 index 0000000..0eb88fe --- /dev/null +++ b/h5_webview/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/h5_webview/build.gradle b/h5_webview/build.gradle new file mode 100755 index 0000000..47825b2 --- /dev/null +++ b/h5_webview/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.1.0' + + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/h5_webview/gradle.properties b/h5_webview/gradle.properties new file mode 100755 index 0000000..1d5ffc9 --- /dev/null +++ b/h5_webview/gradle.properties @@ -0,0 +1,14 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +android.useDeprecatedNdk=true +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/h5_webview/gradle/.pydio b/h5_webview/gradle/.pydio new file mode 100644 index 0000000..a19f038 --- /dev/null +++ b/h5_webview/gradle/.pydio @@ -0,0 +1 @@ +3f8f56dc-3ea2-4869-94ab-0b62048514dc \ No newline at end of file diff --git a/h5_webview/gradle/wrapper/.pydio b/h5_webview/gradle/wrapper/.pydio new file mode 100644 index 0000000..eef612d --- /dev/null +++ b/h5_webview/gradle/wrapper/.pydio @@ -0,0 +1 @@ +24539518-0926-4978-a679-38f1d6d13f07 \ No newline at end of file diff --git a/h5_webview/gradle/wrapper/gradle-wrapper.jar b/h5_webview/gradle/wrapper/gradle-wrapper.jar new file mode 100755 index 0000000..758de96 Binary files /dev/null and b/h5_webview/gradle/wrapper/gradle-wrapper.jar differ diff --git a/h5_webview/gradle/wrapper/gradle-wrapper.properties b/h5_webview/gradle/wrapper/gradle-wrapper.properties new file mode 100755 index 0000000..339e443 --- /dev/null +++ b/h5_webview/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Oct 28 01:12:43 CST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-all.zip diff --git a/h5_webview/gradlew b/h5_webview/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/h5_webview/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/h5_webview/gradlew.bat b/h5_webview/gradlew.bat new file mode 100755 index 0000000..f955316 --- /dev/null +++ b/h5_webview/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/h5_webview/index.html b/h5_webview/index.html new file mode 100644 index 0000000..a59a680 --- /dev/null +++ b/h5_webview/index.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/h5_webview/projectFilesBackup/.pydio b/h5_webview/projectFilesBackup/.pydio new file mode 100644 index 0000000..6bd334a --- /dev/null +++ b/h5_webview/projectFilesBackup/.pydio @@ -0,0 +1 @@ +09c29236-efac-467b-a497-1a9a7aeb1bb9 \ No newline at end of file diff --git a/h5_webview/settings.gradle b/h5_webview/settings.gradle new file mode 100755 index 0000000..e7b4def --- /dev/null +++ b/h5_webview/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/ic_launcher_round.png b/ic_launcher_round.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/ic_launcher_round.png differ diff --git a/logo_back.psd b/logo_back.psd new file mode 100644 index 0000000..e9414f6 Binary files /dev/null and b/logo_back.psd differ diff --git a/mApi/.gitignore b/mApi/.gitignore new file mode 100755 index 0000000..8aa08cc --- /dev/null +++ b/mApi/.gitignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/mApi/.pydio b/mApi/.pydio new file mode 100644 index 0000000..d64e7c3 --- /dev/null +++ b/mApi/.pydio @@ -0,0 +1 @@ +a19759e8-d650-433b-8bf3-365303d5bf79 \ No newline at end of file diff --git a/mApi/README.md b/mApi/README.md new file mode 100755 index 0000000..c1bf881 --- /dev/null +++ b/mApi/README.md @@ -0,0 +1,163 @@ +# 1. 前言 + +--- + +为何写这个接口?其实本来不准备写的,这两天在练习 [TypeScript](https://www.tslang.cn/index.html),然后一直在用[TypeScript](https://www.tslang.cn/index.html)改造[express](http://www.expressjs.com.cn/)框架的应用生成器代码。改着改着发现有点无聊了。 + +无聊,而且没有挑战,怎么办?....Google翻墙后随意逛了下,然后无意中看到一个比较`好欺负`的 学(dongzuo)习(pian)网站,然后抄起还没最终完善好的项目代码来练练手! + +**注意:代码本无罪,请以学习的目的来正确看待本项目!** + + +## 2. 技术实现 + +--- + +项目基于[Node.js](http://nodejs.cn/),主要开发语言使用的是[TypeScript](https://www.tslang.cn/index.html),通过自动化构建工具[gulp](https://www.gulpjs.com.cn/)实现对`*.ts`文件的修改后的自动编译成`*.js`。 + +使用模块 [gulp-uglify](https://www.npmjs.com/package/gulp-uglify) 压缩编译成功后的js代码,然后通过模块 [gulp-babel](https://www.npmjs.com/package/gulp-babel)将编译后的`es6`转换成`es5`代码。 + +因为当我们还没写完某段ts代码,gulp在后台编译的时候就会报错,报错直接导致了gulp终止了进程也就无法对代码进行有效的实时编译。所以这里使用模块 [gulp-plumber](https://www.npmjs.com/package/gulp-plumber)在容易出错的地方写错误监听。这个插件可以阻止 gulp 插件发生错误导致进程退出并输出错误日志。 + +代码位置:`gulpfile.js` 第18行 +```js +//编译ts文件为js +gulp.task('build-ts',function(){ + return tsp.src() + .pipe(plumber()) // 捕捉编译ts编译的错误,避免因为错误导致gulp进场关闭 + .pipe(tsp()) + .pipe(gulp.dest(PATHS.output)); +}); + +``` + + +因为我们要让gulp在后台监听并实时编译ts文件,然后还想让我们的nodejs服务器同步我们ts文件编译结束能自动重启查看到效果,所以我这里安装了模块 [concurrently](https://www.npmjs.com/package/concurrently) 。主要用于同步运行gulp任何和启动nodejs网站服务器。 + +`package.json`中代码: + +```js +"scripts": { + ... + "all": "concurrently \"gulp dev\" \"npm run dev\" " +} +``` + +所以请先全局安装 `concurrently`,命令: + +> npm install -g concurrently + +然后在安装你的网站依赖。 + + +**项目里有些文件和代码和此次爬虫的代码无关,只是我之前还没写完的代码留在那,懒得删除!并不影响使用...** + + +## 3. 接口 + +--- + +> 测试阶段接口统一运行在 [http://127.0.0.1:3000](http://127.0.0.1:3000) + +### 3.1: 获取网站主页数据 + +--- + +这个接口获取的是网站主页的数据,视频数量有限,不过是推荐的热门视频。 + + +| 接口地址 | 请求方式 | 参数 | +| :-----------| :------- | ---------------------- | +| /index | GET | 无 | + +- 实例:[http://127.0.0.1:3000/index](http://127.0.0.1:3000/index) + +- 数据返回: + +```json +{ + status: 200, + length: 24, + time: "2018-08-11 23:22:26", + result: [ + { + title: "SM调教最新**娘", + href: "https://www.**.com/Html/93/5949.html", + gif: "https://pic.**.com/Uploads/vod/2018-08-11/7.mp4.gif", + time: "2018-08-11", + mp4: "https://d.e**i.com/20180811/93/7/7.mp4" + }, + { + title: "极品**女主播96年美女赵晓晓人这么瘦却有这么一对****", + href: "https://www.**.com/Html/91/5948.html", + gif: "https://pic.**.com/Uploads/vod/2018-08-11/924.mp4.gif", + time: "2018-08-11", + mp4: "https://d.**.com/20180811/91/924/924.mp4" + }, + ] +} +``` + +### 3.2: 获取网站各栏目的视频数据 + +--- + +这个接口是用来获取各个网站分类栏目的数据,视频数量和分类更多! + + +| 接口地址 | 请求方式 | 参数 | +| :------------------------ | :------- | ---------- | +| /videoClass | GET | type:具体栏目编号(参考下面的表)
                        page: 页码| + +- 实例:[http://127.0.0.1:3000/videoClass?type=60&page=1](http://127.0.0.1:3000/videoClass?type=60&page=1) + + +- 数据返回: + +```json +{ + status: 200, + length: 12, + time: "2018-08-11 23:35:55", + total: "共2642部 4/221", + result: [ + { + title: "藝壇風雨錄-[粵語中字]", + href: "https://www.**.com/Html/109/5865.html", + gif: "https://pic.**.com/Uploads/vod/2018-08-06/11.mp4.jpg", + time: "2018-08-06", + mp4: "https://d.**.com/20180806/109/11/11.mp4" + }, + { + title: "正点留学妹妹**视频被**漂亮", + href: "https://www.**.com/Html/87/5857.html", + gif: "https://pic.**.com/Uploads/vod/2018-08-05/64.mp4.gif", + time: "2018-08-05", + mp4: "https://d.**.com/20180805/87/64/64.mp4" + } + ] +} +``` + +注意:type 字段的具体编号请看下表: + +| 栏目名称 | 栏目编号 | +| :--------| :------| +| 国产精品 | 60 | +| 中文字幕 | 94 | +| S级女优 | 100 | +| 欧美性爱 | 62 | +| 成人动漫 | 101 | +| 自拍偷拍 | 89 | +| 夫妻同房 | 87 | +| 开放90后 | 93 | +| 换妻游戏 | 90 | +| 网红主播 | 91 | +| 手机小视频 | 88 | +| 明星艳照门 | 92 | +| 经典三级 | 109 | +| 无码在线 | 110 | +| 熟女人妻 | 111 | +| 美颜巨乳 | 112 | +| 颜射吃精 | 113 | +| 丝袜制服 | 114 | diff --git a/mApi/api/.pydio b/mApi/api/.pydio new file mode 100644 index 0000000..96ab0e3 --- /dev/null +++ b/mApi/api/.pydio @@ -0,0 +1 @@ +320ef53f-50f1-4129-ae6b-50dcb9c34f8e \ No newline at end of file diff --git a/mApi/api/api.md b/mApi/api/api.md new file mode 100755 index 0000000..9cd5b85 --- /dev/null +++ b/mApi/api/api.md @@ -0,0 +1,127 @@ +## API接口文档 + +--- + +> 接口统一运行在:[http://149.28.26.249:3000/](http://149.28.26.249:3000/) + +注意: + +- 1:接口全部使用GET方式进行数据请求 +- 2:接口参数全部采用 RSA 非对称性加密,所以需要文件里面的 `rsa_pub.pem` 公钥对接口参数进行加密 +- 3:参数需要放在http请求头部的 `token` 中进行数据传递。 + + +完整的流程: + +举例,例如这边访问 分类接口: + +- 1:接口URL地址如下:http://149.28.26.249:3000:3000/class +- 2:接口参数拼接后:type=60&page=1 +- 3:使用 `rsa_pub.pem` 对 步骤2 进行加密得到密文: +```txt +qwe87LzOllYQYOHnLERCw0u/xIoBePAuNa36iu4e27hMdLCrOVd/YXesT+Q5qXVmB/FC0vR5H7rHrW+MmdTX78ey546ua3pTSlTieO8J4QGcwE+YERPJ1mG8QKmNyOVVffQaa9ltOWaHcNUH5EKEjUIU2wDDIBT5Xxl1/4CsZPc= +``` +- 4:将加密后的密文放到http请求的头部`token`中,发送请求。 +![token](./img/token.png) + +- 5:后端Node.js将会从header中拿到`token`然后用私钥解密,等到参数 type=60&page=1,然后爬虫根据规则去爬取网站返回json数据。数据格式如下: +![json](./img/json.png) + + +### 1:首页 + +这个接口获取的是网站主页的数据,视频数量有限,不过是推荐的热门视频。 + +| 接口地址 | 请求方式 | 参数 | +| :-----------| :------- | ---------------------- | +| /index | GET | 无 | + +数据返回: +```json +{ + length: 24, // 数据长度 + status: 200, // 请求状态 200,成功 + time: "2018-08-25 15:29:24", // 请求时间 + result: [ + { + // 视频的gif地址 + gif: "https://pic.5ppav.com/Uploads/vod/2018-08-25/7.mp4.gif", + // 视频的详情页网址(一般前端用不上) + href: "https://www.974sp.com/Html/93/6153.html", + // 视频的 mp4 播放地址 + mp4: "https://d.eeoai.com/20180825/93/7/7.mp4", + // 视频发布时间 + time: "2018-08-25", + // 视频的标题 + title: "台南召妓全紀錄~長X女大學生" + } + ... + ] +} +``` + +### 2: 分类接口 + +这个接口是用来获取各个网站分类栏目的数据,视频数量和分类更多! + + +| 接口地址 | 请求方式 | 参数 | +| :------------------------ | :------- | ---------- | +| /class | GET | type:具体栏目编号(参考下面的表)
                        page: 页码(请求第几页)| + + +数据返回: +```json +{ + length: 12, // 数据长度 + status: 200, // 请求状态 200,成功 + time: "2018-08-25 15:29:24", // 请求时间 + total: { + // 当前第几页 + currentPage: 1, + // 该分类总计多少视频 + totalNumber: 2725, + // 该分类总计有多少页 + totalPage: 228 + }, + result: [ + { + // 视频的gif地址 + gif: "https://pic.5ppav.com/Uploads/vod/2018-08-25/7.mp4.gif", + // 视频的详情页网址(一般前端用不上) + href: "https://www.974sp.com/Html/93/6153.html", + // 视频的 mp4 播放地址 + mp4: "https://d.eeoai.com/20180825/93/7/7.mp4", + // 视频发布时间 + time: "2018-08-25", + // 视频的标题 + title: "台南召妓全紀錄~長X女大學生" + } + ... + ] +} + +``` + +注意:type 字段的具体编号请看下表: + +| 栏目名称 | 栏目编号 | +| :--------| :------| +| 国产精品 | 60 | +| 中文字幕 | 94 | +| S级女优 | 100 | +| 欧美性爱 | 62 | +| 成人动漫 | 101 | +| 自拍偷拍 | 89 | +| 夫妻同房 | 87 | +| 开放90后 | 93 | +| 换妻游戏 | 90 | +| 网红主播 | 91 | +| 手机小视频 | 88 | +| 明星艳照门 | 92 | +| 经典三级 | 109 | +| 无码在线 | 110 | +| 熟女人妻 | 111 | +| 美颜巨乳 | 112 | +| 颜射吃精 | 113 | +| 丝袜制服 | 114 | diff --git a/mApi/api/img/.pydio b/mApi/api/img/.pydio new file mode 100644 index 0000000..b3e3e2e --- /dev/null +++ b/mApi/api/img/.pydio @@ -0,0 +1 @@ +44d5909a-9e22-4c51-a408-fc68f3a6abac \ No newline at end of file diff --git a/mApi/api/img/json.png b/mApi/api/img/json.png new file mode 100755 index 0000000..af655af Binary files /dev/null and b/mApi/api/img/json.png differ diff --git a/mApi/api/img/token.png b/mApi/api/img/token.png new file mode 100755 index 0000000..08ba142 Binary files /dev/null and b/mApi/api/img/token.png differ diff --git a/mApi/api/rsa_pub.pem b/mApi/api/rsa_pub.pem new file mode 100755 index 0000000..da6d483 --- /dev/null +++ b/mApi/api/rsa_pub.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUbu7pfBOXprboQ4P/jBDHYAQq +B7GTp/uzcDGiwHfdaGnjAxioNHgim9zO+/Bz/A/K9g5z7LKy/URl94QOKVpyTf1a +c1WF6E7N0H3ALkylc0rS5Ciy5FY9MdwhyhuzlBkYoBsd7tY8/QxuDuzZ/hwFooZs +GW9/C7DnjeEQ7RRRgQIDAQAB +-----END PUBLIC KEY----- diff --git a/mApi/cluster.js b/mApi/cluster.js new file mode 100755 index 0000000..334957c --- /dev/null +++ b/mApi/cluster.js @@ -0,0 +1,14 @@ +var cluster = require('cluster'); +if (cluster.isMaster) { + //Fork a worker to run the main program + for (var i = 0; i < 2; i++) var worker = cluster.fork(); +} else { + //Run main program + require('./build/www.js'); + console.log('worker is running'); +} + +cluster.on('death', function(worker) { + console.log('worker ' + worker.pid + ' died. restart...'); + cluster.fork(); +}); \ No newline at end of file diff --git a/mApi/gulpfile.js b/mApi/gulpfile.js new file mode 100755 index 0000000..25b394a --- /dev/null +++ b/mApi/gulpfile.js @@ -0,0 +1,47 @@ +let gulp = require('gulp'); +let ts = require('gulp-typescript'); +let uglify = require('gulp-uglify'); +let babel = require('gulp-babel'); +let plumber = require('gulp-plumber'); +let tsp = ts.createProject('tsconfig.json'); + + +//常量配置 +const PATHS = { + scripts:['./src/**/*.ts'], + output:'./build', + minifyJs: './build/**/*.js' +}; +//编译ts文件为js +gulp.task('build-ts',function(){ + return tsp.src() + .pipe(plumber()) + .pipe(tsp()) + .pipe(gulp.dest(PATHS.output)); +}); + +// 压缩混淆转换js代码 +gulp.task('minify-js',function(){ + gulp.src(PATHS.minifyJs) + .pipe(babel({ + presets: ['env'] + })) + .pipe(uglify({ + ie8: true + })) + .pipe(gulp.dest(PATHS.output)); +}); + +//当ts文件变化,重新编译ts文件为js +gulp.task('watch-ts',function(){ + gulp.watch(PATHS.scripts,['build-ts'],['minify-js']); +}); + +// 复制 RSA非对称加密的 api 接口加密文件到build文件夹 +gulp.task('copy',function(){ + gulp.src('src/rsa/*.pem') + .pipe(gulp.dest(`${PATHS.output}/rsa`)); +}); + +//开发任务 +gulp.task('dev',['build-ts','minify-js','watch-ts','copy']); \ No newline at end of file diff --git a/mApi/package-lock.json b/mApi/package-lock.json new file mode 100755 index 0000000..6be08bf --- /dev/null +++ b/mApi/package-lock.json @@ -0,0 +1,5099 @@ +{ + "name": "nodechat", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/cheerio": { + "version": "0.22.8", + "resolved": "http://registry.npm.taobao.org/@types/cheerio/download/@types/cheerio-0.22.8.tgz", + "integrity": "sha1-VwL3T3i3PhPx6xvUNcLJ3mGiUNQ=", + "dev": true + }, + "@types/mysql": { + "version": "2.15.5", + "resolved": "http://registry.npm.taobao.org/@types/mysql/download/@types/mysql-2.15.5.tgz", + "integrity": "sha1-bXWvtcwBjJ1msvN6BGkk45f4VDA=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "10.5.8", + "resolved": "http://registry.npm.taobao.org/@types/node/download/@types/node-10.5.8.tgz", + "integrity": "sha1-bxTM7K0dGTMvBjpqdk+JB4Af7OA=", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/ansi-colors/download/ansi-colors-1.1.0.tgz", + "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/ansi-cyan/download/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/ansi-gray/download/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/ansi-red/download/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/ansi-wrap/download/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/append-buffer/download/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/array-differ/download/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/array-each/download/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/array-slice/download/array-slice-1.1.0.tgz", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/atob/download/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz", + "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "http://registry.npm.taobao.org/babel-core/download/babel-core-6.26.3.tgz", + "integrity": "sha1-suLwnjQtDwyI4vAuBneUEl51wgc=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.1.tgz", + "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-builder-binary-assignment-operator-visitor/download/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-call-delegate/download/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-helper-define-map/download/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-explode-assignable-expression/download/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-function-name/download/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-helper-regex/download/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helper-replace-supers/download/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-exponentiation-operator/download/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-destructuring/download/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-duplicate-keys/download/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-for-of/download/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-amd/download/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha1-WKeThjqefKhwvcWogRF/+sJ9tvM=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-systemjs/download/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-umd/download/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-typeof-symbol/download/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-exponentiation-operator/download/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "http://registry.npm.taobao.org/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "http://registry.npm.taobao.org/babel-preset-env/download/babel-preset-env-1.7.0.tgz", + "integrity": "sha1-3qefpOvriDzTXasH4mDBycBN93o=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-register/download/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-template/download/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "http://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "http://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/beeper/download/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "bignumber.js": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/bignumber.js/download/bignumber.js-4.1.0.tgz", + "integrity": "sha1-228UBnwUC9RmJIFaeRbJLZtsJLE=", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "http://registry.npm.taobao.org/browserslist/download/browserslist-3.2.8.tgz", + "integrity": "sha1-sABTYdZHHw9ZUnl6dvyYXx+Xj8Y=", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/buffer-equal/download/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000876", + "resolved": "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000876.tgz", + "integrity": "sha1-afwbaWo1/ZEIkGGqkW9nfucFeto=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "http://registry.npm.taobao.org/cheerio/download/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/clone-buffer/download/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/clone-stats/download/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.1.2.tgz", + "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "co": { + "version": "4.6.0", + "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.2.tgz", + "integrity": "sha1-SYgbj7pn3xKpa98/VsCqueeRMUc=", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.6.0", + "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concurrently": { + "version": "3.6.1", + "resolved": "http://registry.npm.taobao.org/concurrently/download/concurrently-3.6.1.tgz", + "integrity": "sha1-L5W67FxAUSlN+7VbV6O5ij4rRew=", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "commander": "2.6.0", + "date-fns": "^1.23.0", + "lodash": "^4.5.1", + "read-pkg": "^3.0.0", + "rx": "2.3.24", + "spawn-command": "^0.0.2-1", + "supports-color": "^3.2.3", + "tree-kill": "^1.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.1.tgz", + "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.4.0", + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.4.0.tgz", + "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + } + } + } + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.5.7.tgz", + "integrity": "sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/css-what/download/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.29.0", + "resolved": "http://registry.npm.taobao.org/date-fns/download/date-fns-1.29.0.tgz", + "integrity": "sha1-EuYJzcuTUScxHQTTMzTilgoqVOY=", + "dev": true + }, + "dateformat": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/dateformat/download/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/deprecated/download/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/detect-file/download/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/domelementtype/download/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/dom-walk/download/dom-walk-0.1.2.tgz", + "integrity": "sha1-DFSL7wSPTR8qlySQAiNgYNqj/YQ=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "http://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "http://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexify": { + "version": "3.6.0", + "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.6.0.tgz", + "integrity": "sha1-WSkD9dgLONA3IgVBJk1poZj7NBA=", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.57", + "resolved": "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.57.tgz", + "integrity": "sha1-YbJEbxavJvuIcyEAB6djetZEyC0=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "~1.3.0" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/entities/download/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.16.3", + "resolved": "http://registry.npm.taobao.org/express/download/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.1.tgz", + "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/find-index/download/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/findup-sync/download/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/fined/download/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/first-chunk-stream/download/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-1.0.0.tgz", + "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "dev": true + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.0.3.tgz", + "integrity": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "http://registry.npm.taobao.org/foreach/download/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/fs-mkdirp-stream/download/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/gaze/download/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "~0.1.0" + } + }, + "get-random-values": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/get-random-values/download/get-random-values-1.2.2.tgz", + "integrity": "sha1-8dlE0AJUM9U6K9mUG56XXZii9/8=", + "dev": true, + "requires": { + "global": "^4.4.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "4.5.3", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "http://registry.npm.taobao.org/glob-watcher/download/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "http://registry.npm.taobao.org/glob2base/download/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npm.taobao.org/global/download/global-4.4.0.tgz", + "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/global-modules/download/global-modules-1.0.0.tgz", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/global-prefix/download/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "http://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "dev": true + }, + "globule": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/globule/download/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glogg": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/glogg/download/glogg-1.0.1.tgz", + "integrity": "sha1-3PdY5EeJzD89MsHzVio2duajSBA=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "http://registry.npm.taobao.org/gulp/download/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npm.taobao.org/semver/download/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "gulp-babel": { + "version": "7.0.1", + "resolved": "http://registry.npm.taobao.org/gulp-babel/download/gulp-babel-7.0.1.tgz", + "integrity": "sha1-ucjin6N2s2xXmJ24IPwcFxW7R8s=", + "dev": true, + "requires": { + "plugin-error": "^1.0.1", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-plumber": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/gulp-plumber/download/gulp-plumber-1.2.0.tgz", + "integrity": "sha1-GOoDkSye5IP4pUmZc7WVTNkPatg=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2", + "through2": "^2.0.3" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "http://registry.npm.taobao.org/array-slice/download/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/plugin-error/download/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "gulp-typescript": { + "version": "5.0.0-alpha.3", + "resolved": "http://registry.npm.taobao.org/gulp-typescript/download/gulp-typescript-5.0.0-alpha.3.tgz", + "integrity": "sha1-xJowbLu4yX9f6KeSCGcbZkLvmGE=", + "dev": true, + "requires": { + "ansi-colors": "^2.0.2", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "through2": "^2.0.3", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.3" + }, + "dependencies": { + "ansi-colors": { + "version": "2.0.5", + "resolved": "http://registry.npm.taobao.org/ansi-colors/download/ansi-colors-2.0.5.tgz", + "integrity": "sha1-XaN4Jf7z51872kf3YNZL/RDhXhA=", + "dev": true + }, + "clone": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/clone-stats/download/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", + "dev": true + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-2.2.0.tgz", + "integrity": "sha1-2FsH2pbkWNJbL/4Z/s6fLKoT7YY=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-3.0.3.tgz", + "integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + } + } + }, + "gulp-uglify": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/gulp-uglify/download/gulp-uglify-3.0.1.tgz", + "integrity": "sha1-jT7uRmUhvqaxD9dd/3Kt+LfqLZc=", + "dev": true, + "requires": { + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash": "^4.13.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "http://registry.npm.taobao.org/gulp-util/download/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.0.tgz", + "integrity": "sha1-RGV/VoiiLP1LckhugbOj+xF0LCk=", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz", + "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", + "dev": true + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "http://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/interpret/download/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "http://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", + "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-absolute/download/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-negated-glob/download/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-relative/download/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-unc-path/download/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-valid-glob/download/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/lead/download/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "http://registry.npm.taobao.org/liftoff/download/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.10.tgz", + "integrity": "sha1-G3eTz3JZ6jj7NmHU04syYK+K5Oc=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "http://registry.npm.taobao.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "http://registry.npm.taobao.org/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._reescape/download/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/lodash._root/download/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/lodash.isarguments/download/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/lodash.isarray/download/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "http://registry.npm.taobao.org/lodash.keys/download/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "http://registry.npm.taobao.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "http://registry.npm.taobao.org/lodash.template/download/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "http://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "make-error": { + "version": "1.3.4", + "resolved": "http://registry.npm.taobao.org/make-error/download/make-error-1.3.4.tgz", + "integrity": "sha1-GZeO1XX56VRdL/jBPjO10Ypn1TU=", + "dev": true + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "http://registry.npm.taobao.org/make-error-cause/download/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, + "requires": { + "make-error": "^1.2.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/make-iterator/download/make-iterator-1.0.1.tgz", + "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "dev": true + }, + "mime-db": { + "version": "1.35.0", + "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.35.0.tgz", + "integrity": "sha1-BWnWV0ZkkSg3CWY603mpm5DZq0c=", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.19.tgz", + "integrity": "sha1-ceRkU3p++BwV8tudl+kT/A/2BvA=", + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npm.taobao.org/min-document/download/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "moment": { + "version": "2.22.2", + "resolved": "http://registry.npm.taobao.org/moment/download/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/multipipe/download/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mysql": { + "version": "2.16.0", + "resolved": "http://registry.npm.taobao.org/mysql/download/mysql-2.16.0.tgz", + "integrity": "sha1-sjsiq13kT8LV0yvU9a9mU/xF4ro=", + "dev": true, + "requires": { + "bignumber.js": "4.1.0", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natives": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/natives/download/natives-1.1.4.tgz", + "integrity": "sha1-Lw8iT8mn3VNAfHZnyEz42+dz3lg=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "node-jsencrypt": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/node-jsencrypt/download/node-jsencrypt-1.0.0.tgz", + "integrity": "sha1-g//O1BTsvhL+oBfGxYXJv8Sa0Zs=", + "dev": true, + "requires": { + "get-random-values": "^1.2.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "now-and-later": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/now-and-later/download/now-and-later-2.0.0.tgz", + "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/nth-check/download/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.12.tgz", + "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/object.defaults/download/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/object.map/download/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.3.3", + "resolved": "http://registry.npm.taobao.org/once/download/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "http://registry.npm.taobao.org/orchestrator/download/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "3.0.3", + "resolved": "http://registry.npm.taobao.org/parse5/download/parse5-3.0.3.tgz", + "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/path-root-regex/download/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/plugin-error/download/plugin-error-1.0.1.tgz", + "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "http://registry.npm.taobao.org/private/download/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.4.tgz", + "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "psl": { + "version": "1.1.29", + "resolved": "http://registry.npm.taobao.org/psl/download/psl-1.1.29.tgz", + "integrity": "sha1-YPWA02AXC7cip5fMcEQR5tqFDGc=", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "dev": true, + "requires": { + "once": "^1.4.0" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + } + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "http://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "http://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "http://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.10.1.tgz", + "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/remove-bom-buffer/download/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/remove-bom-stream/download/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz", + "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true + } + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.8.1.tgz", + "integrity": "sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY=", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/resolve-dir/download/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/resolve-options/download/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "rx": { + "version": "2.3.24", + "resolved": "http://registry.npm.taobao.org/rx/download/rx-2.3.24.tgz", + "integrity": "sha1-FPlQpCF9fjXapxu8vljv9o6ksrc=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "http://registry.npm.taobao.org/send/download/send-0.16.2.tgz", + "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "http://registry.npm.taobao.org/sequencify/download/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "serve-static": { + "version": "1.13.2", + "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.2.tgz", + "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-value": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/sigmund/download/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.1.tgz", + "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "http://registry.npm.taobao.org/spawn-command/download/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.0.tgz", + "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.1.0.tgz", + "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.0.tgz", + "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "http://registry.npm.taobao.org/sqlstring/download/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz", + "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", + "dev": true + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/stream-consume/download/stream-consume-0.1.1.tgz", + "integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/through2-filter/download/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/to-absolute-glob/download/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/to-through/download/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz", + "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/tree-kill/download/tree-kill-1.2.0.tgz", + "integrity": "sha1-WEZ4Yje0I5AU8F2xVrZDIS1MbzY=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typescript": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/typescript/download/typescript-3.0.1.tgz", + "integrity": "sha1-Q3OPKVhdOodXVSCkuTq2Am7xH9s=", + "dev": true + }, + "uglify-js": { + "version": "3.4.7", + "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.7.tgz", + "integrity": "sha1-Tfa5LlR4mqkholTLHjNwTW7BK4k=", + "dev": true, + "requires": { + "commander": "~2.16.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.16.0", + "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.16.0.tgz", + "integrity": "sha1-8WOQWTmWzrTz7rAgsx14Uo9/ilA=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/value-or-function/download/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "^1.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/vinyl-sourcemap/download/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/clone-stats/download/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.2.0", + "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-2.2.0.tgz", + "integrity": "sha1-2FsH2pbkWNJbL/4Z/s6fLKoT7YY=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff --git a/mApi/package.json b/mApi/package.json new file mode 100755 index 0000000..36f1425 --- /dev/null +++ b/mApi/package.json @@ -0,0 +1,37 @@ +{ + "name": "nodechat", + "version": "1.0.0", + "description": "本来用typescript练手重写express的应用生成器,不过到后面用这个写爬虫练手。", + "main": "index.js", + "scripts": { + "dev": "node-dev ./build/www.js", + "build": "gulp dev", + "all": "concurrently \"gulp dev\" \"npm run dev\" " + }, + "keywords": [ + "chat", + "nodejs" + ], + "author": "bmy", + "license": "ISC", + "devDependencies": { + "@types/cheerio": "^0.22.8", + "@types/mysql": "^2.15.5", + "@types/node": "^10.5.7", + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + "cheerio": "^1.0.0-rc.2", + "concurrently": "^3.6.1", + "express": "^4.16.3", + "gulp": "^3.9.1", + "gulp-babel": "^7.0.1", + "gulp-plumber": "^1.2.0", + "gulp-typescript": "^5.0.0-alpha.3", + "gulp-uglify": "^3.0.1", + "moment": "^2.22.2", + "mysql": "^2.16.0", + "node-jsencrypt": "^1.0.0", + "request": "^2.88.0", + "typescript": "^3.0.1" + } +} diff --git a/mApi/src/.pydio b/mApi/src/.pydio new file mode 100644 index 0000000..0a4a406 --- /dev/null +++ b/mApi/src/.pydio @@ -0,0 +1 @@ +b13a6818-95b9-48ac-88f1-9dde569b879d \ No newline at end of file diff --git a/mApi/src/api/.pydio b/mApi/src/api/.pydio new file mode 100644 index 0000000..a8d71dc --- /dev/null +++ b/mApi/src/api/.pydio @@ -0,0 +1 @@ +6dab72fe-06a3-4667-bf7a-d3183fc559c8 \ No newline at end of file diff --git a/mApi/src/api/index.ts b/mApi/src/api/index.ts new file mode 100755 index 0000000..d7ef5a0 --- /dev/null +++ b/mApi/src/api/index.ts @@ -0,0 +1,225 @@ +import * as request from "request"; +import * as cheerio from "cheerio"; +import config from "./../config"; +class api { + + private videoList: Array; + private imgList: Array; + private pagination: string; + private videBaseUrl: string; + private videoType: string; + + constructor() { + this.videoList = []; + this.videBaseUrl = config.url.video + this.videoType = '.mp4' + } + + /** + * 发送GET请求,获取网站html代码 + * @param url 网站地址 + */ + public get(url: string) { + let options: any = { + url: url, + headers: { + 'Referer': 'https://www.657xd.com/' + } + }; + return new Promise((resolve, reject) => { + request(url, function (error, response, body) { + if (error) { + console.log(`-----请求出错----`); + console.log(error); + console.log(`-----请求出错----`); + reject('error') + } else { + resolve(body) + } + }); + }) + + } + + /** + * 解析网页代码,获取数据 + * @param html html代码 + * @param callback 回调 + */ + public cheerios(html: string, callback: any, total?: boolean) { + + let videoListHtml: any = this.CheerioLoad(html, '.movie2_list ul li') + + total ? this.pagination = videoListHtml.$('.pagination').find('strong').text() : '' + this.videoList = []; + + (_this => { + videoListHtml.data.each(function (item) { + let list: any = videoListHtml.$(this); + + + if (list.find('span').text().length != 0) { + let mp4Url = _this.mp4URL( + list.find('span').text(), + list.find('a').attr('href'), + list.html().match(/get_local\(\"([\s\S]*?).jpg/)[1] + ); + + _this.videoList.push({ + title: list.find('h3').text(), // 视频标题 + href: `${config.url.BaseUrl()}${list.find('a').attr('href')}`, // 视频链接地址 + gif: `${config.url.video}${list.html().match(/get_local\(\"([\s\S]*?)\"\)/)[1]}`, // 视频缩略图 + time: list.find('span').text(), // 视频发布时间 + mp4: config.url.video+mp4Url, + m3u8: _this.mp42(mp4Url) + }) + } + }) + })(this) + + callback(this.videoList, this.pagination) + } + + /** + * http://127.0.0.1:3000/image?type=63&page=3 + * 查看首页图片 + * @param html + * @param callback + * @param total + */ + public cheeriosIMG(html: string, callback: any, total?: boolean) { + + let imgListHtml: any = this.CheerioLoad(html, '.box ul li') + + total ? this.pagination = imgListHtml.$('.pagination').text() : '' + + this.imgList = []; + + (_this => { + imgListHtml.data.each(function (item) { + let list: any = imgListHtml.$(this); + _this.imgList.push({ + title: list.find('a').text(), + href: list.find('a').attr('href'), + time: list.find('a').find('span').text() + }) + }) + })(this) + callback(this.imgList, this.pagination) + } + + /** + * http://127.0.0.1:3000/imageinfo?id=/Html/63/12544.html + * 从图片列表进入图片详情 + * @param html + * @param callback + */ + public enterInfos(html: string, callback: any) { + let list: any = this.CheerioLoad(html, '.content img') + let title: string = list.$('.page_title h1').text() + let imgdata: Array = [] + list.data.each(function (item) { + let img: any = list.$(this); + imgdata.push({ + title: title, + url: img.attr('src') + }) + }); + + callback(imgdata) + } + + /** + * 根据规律直接分析得到视频的真实mp4地址 + * @param time 视频发布时间 + * @param href 视频链接地址 + * @param id 视频缩略图 + */ + public mp4URL(time: string, href: string, id: string) { + let times: string = time.replace(/-/ig, '') + let hrefs: string = href.match(/\/(\d*)\//)[1] + let ids: string = this.chechImgUrl(id); + let URLS: string; + if (ids != 'null') { + URLS = `/${times}/${hrefs}/${ids}/${ids}${this.videoType}` + } else { + URLS = 'http://static.runoob.com/video/f0381j0mxd7.m701.mp4' + } + return URLS; + // return this.mp42(URLS); + } + + //线路一 根据视频MP4地址获取m3u8播放地址 + public mp42(s) { + var purls = [ + "https://1dbffh8.com", + "https://1bhut8.com", + "https://1bfsdgfht.com", + "https://1bhyr6.com", + "https://1bryts1.com" + ]; + var spcl_url = "https://p.043vb.com"; + + var purl = purls[Math.floor(Math.random() * purls.length)]; + var uu = purl + s + ".m3u8"; + var hour = new Date().getHours(); + var sdate = new Date().getDay(); + var x = Math.random();//0-1之间 + + if (hour >= 21 || hour < 22) { + if (x < 0.3) { + uu = spcl_url + s + ".m3u8"; + } + if (sdate == 5 || sdate == 6) { + if (x < 0.5) { + uu = spcl_url + s + ".m3u8"; + } + } + + } else { + uu = purl + s + ".m3u8"; + } + if (hour >= 22 || hour <= 1) { + + if (x < 0.45) { + uu = spcl_url + s + ".m3u8"; + } + if (sdate == 5 || sdate == 6) { + if (x < 0.55) { + uu = spcl_url + s + ".m3u8"; + } + } + + } else { + uu = purl + s + ".m3u8"; + } + + return uu; + } + + /** + * 返回Cheerio数据 + * @param html html代码 + * @param dom 需要获取的dom节点 + */ + public CheerioLoad(html: any, dom) { + let $: any = cheerio.load(html); + return { + $: $, + data: $(dom) + }; + } + + public chechImgUrl(url) { + if (url.match(/\/(\d*).mp4/) == null) { + url = 'null' + } else { + url = url.match(/\/(\d*).mp4/)[1] + } + return url + } + + +} + +export default api \ No newline at end of file diff --git a/mApi/src/app.ts b/mApi/src/app.ts new file mode 100755 index 0000000..ab2a819 --- /dev/null +++ b/mApi/src/app.ts @@ -0,0 +1,14 @@ +import * as express from 'express'; +import * as path from 'path'; + +let app = express(); + +import indexRouter from './routes/modular/index'; + +app.use(express.static(path.join(__dirname, "public"))); + +app.use(express.json()); +app.use(express.urlencoded({ extended: false })); +app.use("/", indexRouter); + +export default app \ No newline at end of file diff --git a/mApi/src/config/.pydio b/mApi/src/config/.pydio new file mode 100644 index 0000000..75142f1 --- /dev/null +++ b/mApi/src/config/.pydio @@ -0,0 +1 @@ +6bec38f6-dcf5-4ff3-95a1-23cd9c666a11 \ No newline at end of file diff --git a/mApi/src/config/index.ts b/mApi/src/config/index.ts new file mode 100755 index 0000000..f8aa17c --- /dev/null +++ b/mApi/src/config/index.ts @@ -0,0 +1,185 @@ +export default { + address: 'http://127.0.0.1', + port: 1314, + rsa: { + public: "../../rsa/rsa_pub.pem", + private: "../../rsa/rsa_priv.pem" + }, + mysql: { + connectionLimit: 10, + host: "127.0.0.1", + user: "root", + password: "714500", + database: "haozhuo" + }, + url: { + BaseUrl: () => { + var host = ""; + var getdz = ""; + var url = new Array(); + url.push("1b572.com"); + url.push("1b667.com"); + url.push("1b669.com"); + url.push("1b670.com"); + url.push("1b671.com"); + + url.push("11b12.com"); + url.push("11b13.com"); + url.push("11b15.com"); + url.push("11b16.com"); + url.push("11b17.com"); + url.push("11b18.com"); + url.push("11b19.com"); + url.push("11b20.com"); + url.push("11b21.com"); + url.push("11b23.com"); + url.push("11b25.com"); + url.push("11b26.com"); + url.push("11b27.com"); + url.push("11b28.com"); + url.push("11b29.com"); + url.push("11b30.com"); + url.push("11b32.com"); + url.push("22b11.com"); + url.push("22b12.com"); + url.push("22b13.com"); + url.push("22b15.com"); + url.push("22b16.com"); + url.push("22b17.com"); + url.push("22b18.com"); + url.push("22b19.com"); + url.push("22b20.com"); + url.push("22b21.com"); + url.push("22b23.com"); + url.push("22b25.com"); + url.push("22b26.com"); + url.push("22b27.com"); + url.push("22b28.com"); + url.push("22b29.com"); + url.push("22b30.com"); + url.push("22b32.com"); + url.push("33b12.com"); + url.push("33b13.com"); + url.push("33b15.com"); + url.push("33b16.com"); + url.push("33b17.com"); + url.push("33b18.com"); + url.push("33b19.com"); + url.push("33b20.com"); + url.push("33b21.com"); + url.push("33b22.com"); + url.push("33b23.com"); + url.push("33b25.com"); + url.push("33b26.com"); + url.push("33b27.com"); + url.push("33b28.com"); + + var UyoOfAKC1 = new Date("2020/12/24 18:30:00".replace(/\-/g, "/")).getTime(); + + var VK2 = 1; //VK2>=1 + var PhKNMS3 = (Math.floor((new Date().getTime() - UyoOfAKC1) / 86400000) + 1) * VK2; + var i4 = 0; + var cncOFZ5 = VK2 - 1; + var MrZRcYn6 = Math.floor(Math.random() * (cncOFZ5 - i4 + 1) + i4); + var a7 = PhKNMS3 + MrZRcYn6; + if (a7 < 0 || a7 >= url.length) { + a7 = url.length - (MrZRcYn6 + 1); + PhKNMS3 = url.length - (cncOFZ5 + 1); + } + var D$Uja8 = true; + for (var j = i4; j <= cncOFZ5; j++) { + if (host.indexOf(url[PhKNMS3 + j]) >= 0) { + D$Uja8 = false; + break + } + } + var i = a7; + if (D$Uja8 == true) { + var Rvq9 = url[a7]; + if (typeof (Rvq9) == "undefined") { + Rvq9 = url[url.length - 1] + } + var x_ratio = Math.random();//0~1 + if (x_ratio < 0.5) { + getdz = "https://" + escape(Rvq9); + } else { + getdz = "https://www." + escape(Rvq9); + } + + } + return getdz; + }, + video: 'https://1dhgjyr9.com', + index: '/index.html', + class: [ + { + title: '国产精品', + url: '/60/' + }, + { + title: '中文字幕', + url: '/94/' + }, + { + title: 'S级女优', + url: '/100/' + }, + { + title: '欧美性爱', + url: '/62/' + }, + { + title: '成人动漫', + url: '/101/' + }, + { + title: '自拍偷拍', + url: '/89/' + }, + { + title: '夫妻同房', + url: '/87/' + }, + { + title: '开放90后', + url: '/93/' + }, + { + title: '换妻游戏', + url: '/90/' + }, + { + title: '网红主播', + url: '/91/' + }, + { + title: '手机小视频', + url: '/88/' + }, + { + title: '经典三级', + url: '/109/' + }, + { + title: '无码在线', + url: '/110/' + }, + { + title: '熟女人妻', + url: '/111/' + }, + { + title: '美颜巨乳', + url: '/112/' + }, + { + title: '颜射吃精', + url: '/113/' + }, + { + title: '丝袜制服', + url: '/114/' + } + ] + } +} \ No newline at end of file diff --git a/mApi/src/mysql/.pydio b/mApi/src/mysql/.pydio new file mode 100644 index 0000000..62d2a2f --- /dev/null +++ b/mApi/src/mysql/.pydio @@ -0,0 +1 @@ +aa1faf5e-b04a-4264-9ba0-745100cdd496 \ No newline at end of file diff --git a/mApi/src/mysql/index.ts b/mApi/src/mysql/index.ts new file mode 100755 index 0000000..b639f36 --- /dev/null +++ b/mApi/src/mysql/index.ts @@ -0,0 +1,38 @@ +import * as mysql from "mysql"; +import config from "../config"; + +class MySql { + private pool:any + + constructor(){ + this.pool = mysql.createPool(config.mysql); + } + + /** + * 执行数据库操作 + * @param sql sql语句 + * @param values 参数值 + */ + query (sql:string, values?:Array) { + return new Promise((resolve, reject) => { + this.pool.getConnection(function(err, connection) { + if (err) { + reject(err); + } else { + connection.query(sql, values, (err, rows) => { + if (err) { + reject(err); + } else { + rows.length == 0 ? (rows = ["NoData..."]) : rows; + resolve(rows); + } + // 结束会话 + connection.release(); + }); + } + }); + }) + } +} + +export default MySql \ No newline at end of file diff --git a/mApi/src/routes/.pydio b/mApi/src/routes/.pydio new file mode 100644 index 0000000..f710843 --- /dev/null +++ b/mApi/src/routes/.pydio @@ -0,0 +1 @@ +195eddce-af6f-49ce-9e1f-ddc16e30ca4a \ No newline at end of file diff --git a/mApi/src/routes/controller.ts b/mApi/src/routes/controller.ts new file mode 100755 index 0000000..5096553 --- /dev/null +++ b/mApi/src/routes/controller.ts @@ -0,0 +1,103 @@ +import * as express from 'express' +import utils from '../utils' +const router = express.Router() + +class Controller { + public routers: any; + public response: any; + public request: any; + public utils = new utils(); + + constructor () { + router.all('*', (req, res, next) => { + this.response = res + this.request= req + + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With, token, X-Bmob-Application-Id, X-Bmob-REST-API-Key"); + res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); + if(req.method == "OPTIONS") res.send(200); + else next(); + + }); + // 暴露 router,方便其他路由使用 + this.routers = router + } + + /** + * GET 请求 + * @param url 请求的地址 + * @param callback 回调 + */ + public GetRoutes(url: string,callback: any) : void { + router.get(url, (req, res) => { + let params; + switch (url) { + case '/index': + callback(res, req) + break; + case '/imageinfo': + if(params.id != ''){ + callback(res, req, params) + }else { + res.json({ + status: 404, + message: '参数缺失' + }) + } + break; + case '/image': + if(req.query.type != '' && + req.query.page != ''){ + callback(res, req) + }else { + res.json({ + status: 404, + message: '参数缺失' + }) + } + case '/videoClass': + // 判断是否存在必要参数key,和值 + console.log(req.query); + + if(req.query.type != '' && + req.query.page != '') { + callback(res, req) + }else { + res.json({ + status: 404, + message: '参数缺失' + }) + } + break; + default: + break; + } + }) + } + + /** + * POST 请求 + * @param url 请求的地址 + * @param callback 回调 + */ + public PostRoutes(url: string, callback: any) : void { + router.post(url, (req, res) => { + callback(res, req) + }) + } + + + private useApiStyle (req,res) { + if(req.query.hasOwnProperty("_rsa") && req.query._rsa != ''){ + res.json({ + status: "SRA接口等待实现..." + }) + }else { + return false + } + } + +} + +export default Controller diff --git a/mApi/src/routes/modular/.pydio b/mApi/src/routes/modular/.pydio new file mode 100644 index 0000000..9230db4 --- /dev/null +++ b/mApi/src/routes/modular/.pydio @@ -0,0 +1 @@ +5ada070d-70e8-4b4f-80f2-ada2d255cf95 \ No newline at end of file diff --git a/mApi/src/routes/modular/index.ts b/mApi/src/routes/modular/index.ts new file mode 100755 index 0000000..a32b7af --- /dev/null +++ b/mApi/src/routes/modular/index.ts @@ -0,0 +1,138 @@ +import Controller from "../controller"; +// import mysql from "./../../mysql"; +import utils from "./../../utils"; +import api from "./../../api"; +import config from "./../../config"; + +class index extends Controller{ + public utils = new utils(); + // public db = new mysql(); + public api = new api(); + + constructor () { + super(); + this.indexRouter() + this.otherClass() + this.imageRouter() + this.enterInfo() + } + + /** + * 网站首页api + * 接口地址:http://127.0.0.1:3000/index + */ + private indexRouter(): void { + this.GetRoutes('/index',async (res, req) => { + let data:any = await this.api.get(config.url.BaseUrl()) + this.api.cheerios(data, (result)=>{ + return res.json({ + status: 200, + length: result.length, + time: this.utils.GetTime(), + result: result + }) + }) + }) + } + + /** + * 网站分类页面api + * 接口地址:http://127.0.0.1:3000/videoClass?type=60&page=1 + * @param type 网站栏目id + * @param page 想要获取第几页的数据 + */ + private otherClass(): void { + this.GetRoutes('/videoClass', async (res,req) => { + let type: string = req.query.type + let page: string = req.query.page + + let data: any = await this.api.get(this.returnURL(type, page)) + this.api.cheerios(data, (result, pagination)=>{ + return res.json({ + status: 200, + length: result.length, + time: this.utils.GetTime(), + resultList: { + total: this.returnPage(pagination), + video: result + } + }) + }, true) + }) + } + + /** + * 获取图片列表 + */ + private imageRouter(): void { + this.GetRoutes('/image', async (res,req) => { + let type: string = req.query.type + let page: string = req.query.page + let data:any = await this.api.get(this.returnURL(type,page)) + this.api.cheeriosIMG(data, (result, pagination)=>{ + + return res.json({ + status: 200, + length: result.length, + time: this.utils.GetTime(), + total: this.returnPage(pagination.substring(0,22), true), + result: result + }) + },true) + }) + } + + /** + * 进入图片详情 + */ + private enterInfo() { + this.GetRoutes('/imageinfo', async (res,req,params) => { + let id: string = params.id + let data:any = await this.api.get(`${config.url.BaseUrl()}${id}`) + this.api.enterInfos(data,(result) =>{ + return res.json({ + status: 200, + length: result.length, + time: this.utils.GetTime(), + result: result + }) + }) + }) + } + + /** + * 因为这里第一个URL地址和其他之后每一个的地址不一样,所以这里做下简单判断 + * @param type + * @param page + */ + private returnURL(type:string, page:string): any { + let URL:string; + page === '1' ? URL = `${config.url.BaseUrl()}/Html/${type}/` : URL = `${config.url.BaseUrl()}/Html/${type}/index-${page}.html` + return URL + } + + /** + * 返回总视频数,当前页,总页数 + * @param page + */ + private returnPage(page:string, action?:boolean):any { + let pages:any; + if(action) { + pages = { + totalNumber: page.match(/共(\S*)篇/)[1], + currentPage: page.match(/:(\S*)\//)[1], + totalPage: page.match(/\/(\S*)页/)[1] + } + }else { + pages = { + totalNumber: page.match(/共(\S*)部/)[1], + currentPage: page.match(/\s+(\S*)\//)[1], + totalPage: page.match(/\/(\S*)/)[1] + } + } + + return pages + } +} + +export default new index().routers diff --git a/mApi/src/rsa/.pydio b/mApi/src/rsa/.pydio new file mode 100644 index 0000000..629d435 --- /dev/null +++ b/mApi/src/rsa/.pydio @@ -0,0 +1 @@ +e91c2418-1979-4c6b-83c4-c5d6a1ea9a0b \ No newline at end of file diff --git a/mApi/src/rsa/help.md b/mApi/src/rsa/help.md new file mode 100755 index 0000000..5808082 --- /dev/null +++ b/mApi/src/rsa/help.md @@ -0,0 +1,5 @@ +RSA 非对称性加密在api接口中的使用 + +rsa_pub.pem: 公钥发给前端,前端ajax请求用公钥加密参数 + +rsa_priv.pem:私钥留在服务器上,用来解密前端ajax参数 \ No newline at end of file diff --git a/mApi/src/rsa/rsa_priv.pem b/mApi/src/rsa/rsa_priv.pem new file mode 100755 index 0000000..1869ec6 --- /dev/null +++ b/mApi/src/rsa/rsa_priv.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDUbu7pfBOXprboQ4P/jBDHYAQqB7GTp/uzcDGiwHfdaGnjAxio +NHgim9zO+/Bz/A/K9g5z7LKy/URl94QOKVpyTf1ac1WF6E7N0H3ALkylc0rS5Ciy +5FY9MdwhyhuzlBkYoBsd7tY8/QxuDuzZ/hwFooZsGW9/C7DnjeEQ7RRRgQIDAQAB +AoGBALp9LHWCfDysmXOrGaz0jCJLEzzGhkjGtnsfKiPjbRbMu/ATXskDTterFpwK +pltb041sluGD0Ji7KBmPwbkg6olFB8EUCu5U281+8vNXaynzwCYF/tdaRoRUcIVf +VZS1y48LwH1JdPCtQvNldIAho5Nop7dWgz0qT2dCUezu7ab1AkEA/twQt1vnRpbk +vp3donKkux6hI8gwV58X7jtZjIOstVWlbGUBI90nln71lEUUmkuWK6YCyJy6fhAo ++gZ1OlltzwJBANViRRFJoGmZZLL9Jhgmeg52syVSWYcxquihKUdP4Wg6lbiETaHT +iqNnIBTG/c5W462zJ4JfKMB1NPKUwcYy768CQQDdVZle5H3SnDFEKi3VauMNbuha +/vyc3BoYV4rJsYFIan0jygRXdTVwSgpVHjlqVsKwXZiFSTfdS4OKwBkG96uZAkAL +YfqdOXg9KdmdUrO9hg/sxZg43XO5KoUbc71n+HLlxHpIJYaeo1I59T5Y3WScpTXw +BiaNZdYeriHs7tKHaCAxAkB548KLYhkxrl1SjLdmW8OcvenVORTim03dmsgUDg57 +RRenq8VNgEvEdl/5N2k8evrr3bciMAxnk0oAGUYCsbDI +-----END RSA PRIVATE KEY----- diff --git a/mApi/src/rsa/rsa_pub.pem b/mApi/src/rsa/rsa_pub.pem new file mode 100755 index 0000000..da6d483 --- /dev/null +++ b/mApi/src/rsa/rsa_pub.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUbu7pfBOXprboQ4P/jBDHYAQq +B7GTp/uzcDGiwHfdaGnjAxioNHgim9zO+/Bz/A/K9g5z7LKy/URl94QOKVpyTf1a +c1WF6E7N0H3ALkylc0rS5Ciy5FY9MdwhyhuzlBkYoBsd7tY8/QxuDuzZ/hwFooZs +GW9/C7DnjeEQ7RRRgQIDAQAB +-----END PUBLIC KEY----- diff --git a/mApi/src/utils/.pydio b/mApi/src/utils/.pydio new file mode 100644 index 0000000..8b92a87 --- /dev/null +++ b/mApi/src/utils/.pydio @@ -0,0 +1 @@ +1ce2a739-84af-4587-a927-daf5d4118598 \ No newline at end of file diff --git a/mApi/src/utils/index.ts b/mApi/src/utils/index.ts new file mode 100755 index 0000000..45354a6 --- /dev/null +++ b/mApi/src/utils/index.ts @@ -0,0 +1,48 @@ +import * as moment from "moment"; +import * as fs from "fs"; +import * as path from "path"; +import config from "./../config"; +import * as JsEncrypt from "node-jsencrypt"; +import * as querystring from "querystring"; + +class Utils { + private publicKey; + private privateKey; + private RsaEncrypt = new JsEncrypt() + constructor () { + // 公钥 + this.publicKey = fs.readFileSync(path.join(__filename,config.rsa.public), "utf8") + // 私钥 + this.privateKey = fs.readFileSync(path.join(__filename,config.rsa.private), "utf8") + } + + /** + * 返回指定的时间 + * @param timer 时间的格式 + */ + public GetTime (timer?:string) { + timer = timer || 'YYYY-MM-DD HH:mm:ss' + return moment().format(timer); + } + + /** + * 使用公钥( rsa_pub.pem )对接口参数进行加密 + * @param ciphertext 需要加密的数据 + */ + // public Encryption (ciphertext: string) { + // let encrypted = crypto.publicEncrypt(this.publicKey, Buffer.from(ciphertext)) + // return encrypted.toString('base64') + // } + + /** + * 使用私钥( rsa_priv.pem ) 对接口参数 token 进行解密 + * 解密后在使用 querystring 进行序列化 + * @param ciphertext 需要解密的参数 + */ + public Decrypt(ciphertext: string) { + this.RsaEncrypt.setPrivateKey(this.privateKey) + return this.RsaEncrypt.decrypt(ciphertext) + } +} + +export default Utils \ No newline at end of file diff --git a/mApi/src/www.ts b/mApi/src/www.ts new file mode 100755 index 0000000..077b813 --- /dev/null +++ b/mApi/src/www.ts @@ -0,0 +1,50 @@ +import app from './app'; +import config from "./config"; +import * as http from 'http'; + +class service { + port: number; + server: any; + constructor () { + this.port = config.port + this.init() + } + + private init (): void { + this.server = http.createServer(app) + this.start() + } + + private start (): void { + this.server.listen(this.port); + this.server.on('error', this.error); + this.server.on('listening', this.onListening); + } + + private error (error:any): void { + if (error.syscall !== 'listen') { + throw error; + } + var bind = this.port; + switch (error.code) { + case 'EACCES': + console.error(`端口:${bind} 需要提升权限..`); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(`端口:${bind} 被占用...`); + process.exit(1); + break; + default: + throw error; + } + } + + private onListening(): void { + console.log(`App is run: ${config.address}:${config.port}`) + } +} + +new service() + + diff --git a/mApi/test.rest b/mApi/test.rest new file mode 100755 index 0000000..9e565a7 --- /dev/null +++ b/mApi/test.rest @@ -0,0 +1,3 @@ +GET http://127.0.0.1:3000/class?type=60&page=2 HTTP/1.1 +content-type: application/json +token: 'wwwww' diff --git a/mApi/tsconfig.json b/mApi/tsconfig.json new file mode 100755 index 0000000..a838bf0 --- /dev/null +++ b/mApi/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "lib":["es6"], + "module": "commonjs", //指定生成哪个模块系统代码 + "target": "es5", //目标代码类型 + "noImplicitAny": false, //在表达式和声明上有隐含的'any'类型时报错。 + "sourceMap": false, //用于debug + "rootDir":"./src", //仅用来控制输出的目录结构--outDir。 + "outDir":"./build", //重定向输出目录。 + "watch":false //在监视模式下运行编译器。会监视输出文件,在它们改变时重新编译。 + }, + "include":[ + "src/**/*" + ], + "exclude":[ + "views", + "static" + ] +} \ No newline at end of file diff --git a/share/.pydio b/share/.pydio new file mode 100644 index 0000000..c664bf3 --- /dev/null +++ b/share/.pydio @@ -0,0 +1 @@ +a4e1cc5b-f799-4d63-b3d8-a5a0a6ee697e \ No newline at end of file diff --git a/share/css/.pydio b/share/css/.pydio new file mode 100644 index 0000000..51c99fd --- /dev/null +++ b/share/css/.pydio @@ -0,0 +1 @@ +5fbc99a7-5a34-4357-af7b-4cbd2f093600 \ No newline at end of file diff --git a/share/css/clear.css b/share/css/clear.css new file mode 100644 index 0000000..702bcad --- /dev/null +++ b/share/css/clear.css @@ -0,0 +1,10 @@ +body,h1,h2,h3,h4,h5,h6,p,ul,li { + margin: 0; + padding: 0; + list-style: none; +} + +a { + color: #000; + text-decoration: none; +} \ No newline at end of file diff --git a/share/css/index.css b/share/css/index.css new file mode 100644 index 0000000..761acdc --- /dev/null +++ b/share/css/index.css @@ -0,0 +1,175 @@ +.line { + margin-bottom: 25px; +} +.app_header { + width: 100%; + /*background: linear-gradient(to top, #fb7299 0%, #fecfef 99%, #fecfef 100%);*/ + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + height: 100vh; + position: relative; + z-index: 10; + background: url("../img/back.png"); + background-size: cover; + background-repeat: no-repeat; + background-position: center center; + background-attachment: fixed; +} + +.app_header img { + width: 85px; + height: 85px; + padding: 15px; + background: #fff; + border-radius: 20px; + box-shadow: 0px 0px 0px #fff; + /* animation: breathe 1.5s ease infinite alternate; */ + margin-top: -100px; + margin-bottom: 20px; +} +.slide { + position: absolute; + bottom: 50px; + color: #ddd7d7; + text-align: center; + animation: slide 0.8s ease infinite alternate; +} +.slide p { + font-size: 12px; + margin-bottom: 5px; +} +.slide i { + font-size: 20px; +} + +@keyframes slide { + 0% { + bottom: 50px; + } + 100% { + bottom: 30px; + } +} + +@keyframes breathe { + 0% { + box-shadow: 0px 0px 0px #fff; + } + 100% { + box-shadow: 0px 20px 70px #fff; + } +} +.app_header .app_title { + font-size: 28px; + color: #fff; + margin-bottom: 5px; + margin-top: 15px; +} +.app_header span { + font-size: 12px; + color: #ddd7d7; + margin-bottom: 5px; +} +.app_download { + background: #ececec; + padding-top: 60px; + padding-bottom: 40px; + display: flex; + align-items: center; + flex-direction: column; +} +.down_button { + padding: 13px 40px; + background: linear-gradient(45deg, #fb7299 0%, #fecfef 99%, #fecfef 100%); + margin-bottom: 30px; + color: #fff; + border-radius: 22px; +} +.down_button i { + font-size: 18px; +} +#down_code { + width: 120px; + height: 120px; + user-select: all; +} +.app_download p { + font-size: 12px; + margin-top: 13px; + color: #c0c0c0; + user-select: none; +} +.app_content { + padding: 30px 15px; + padding-bottom: 70px; +} +.app_content .title { + font-size: 20px; + margin-bottom: 10px; + color: #4c4c50; + font-weight: 600; +} +.screenshot { + display: flex; + overflow-x: scroll; +} +.screenshot li { + width: 230px; + flex-shrink: 0; + margin-right: 5px; +} +.screenshot li img { + width: 100%; +} + +.update li, +.introduction li, +.detailed li { + font-size: 14px; + color: #636366; + margin-bottom: 4px; + line-height: 20px; +} +.update_tips { + margin-bottom: 10px !important; +} +.h5_version { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 68px; + background: #fff; + z-index: 9; + display: flex; + justify-content: space-between; + padding: 5px 20px; + box-sizing: border-box; + border-top: 1px solid #e6e6e6; + align-items: center; +} +.h5_version_l { + display: flex; +} +.h5_version_l img { + width: 40px; + height: 40px; + margin-right: 5px; +} +.l_title p { + font-size: 18px; + color: #333; + } +.l_title span { + font-size: 13px; + color: #8E9198; +} +.h5_version_r { + background: linear-gradient(45deg, #fb7299 0%, #fecfef 99%, #fecfef 100%); + color: #fff; + padding: 9px 25px; + font-size: 14px; + border-radius: 4px; +} \ No newline at end of file diff --git a/share/img/.pydio b/share/img/.pydio new file mode 100644 index 0000000..87ad22a --- /dev/null +++ b/share/img/.pydio @@ -0,0 +1 @@ +5fb2a505-5434-488a-8b5f-036bafeed621 \ No newline at end of file diff --git a/share/img/1.jpg b/share/img/1.jpg new file mode 100644 index 0000000..7c94727 Binary files /dev/null and b/share/img/1.jpg differ diff --git a/share/img/10.jpg b/share/img/10.jpg new file mode 100644 index 0000000..928287e Binary files /dev/null and b/share/img/10.jpg differ diff --git a/share/img/11.jpg b/share/img/11.jpg new file mode 100644 index 0000000..e68a91c Binary files /dev/null and b/share/img/11.jpg differ diff --git a/share/img/2.jpg b/share/img/2.jpg new file mode 100644 index 0000000..52d6733 Binary files /dev/null and b/share/img/2.jpg differ diff --git a/share/img/3.jpg b/share/img/3.jpg new file mode 100644 index 0000000..76e5a94 Binary files /dev/null and b/share/img/3.jpg differ diff --git a/share/img/4.jpg b/share/img/4.jpg new file mode 100644 index 0000000..70acef5 Binary files /dev/null and b/share/img/4.jpg differ diff --git a/share/img/5.jpg b/share/img/5.jpg new file mode 100644 index 0000000..b554387 Binary files /dev/null and b/share/img/5.jpg differ diff --git a/share/img/6.jpg b/share/img/6.jpg new file mode 100644 index 0000000..06d811c Binary files /dev/null and b/share/img/6.jpg differ diff --git a/share/img/7.jpg b/share/img/7.jpg new file mode 100644 index 0000000..15816d0 Binary files /dev/null and b/share/img/7.jpg differ diff --git a/share/img/8.jpg b/share/img/8.jpg new file mode 100644 index 0000000..2dab90a Binary files /dev/null and b/share/img/8.jpg differ diff --git a/share/img/9.jpg b/share/img/9.jpg new file mode 100644 index 0000000..0944187 Binary files /dev/null and b/share/img/9.jpg differ diff --git a/share/img/back.png b/share/img/back.png new file mode 100644 index 0000000..b5090d0 Binary files /dev/null and b/share/img/back.png differ diff --git a/share/img/ic_launcher.png b/share/img/ic_launcher.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/share/img/ic_launcher.png differ diff --git a/share/index.html b/share/index.html new file mode 100644 index 0000000..a443325 --- /dev/null +++ b/share/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + + + 屁桃儿 - 专业的模特写真应用 + + + + + + +
                        + +

                        屁桃儿

                        + x.x.x + 22.6M / 2万+下载 / 5.7万个评论 +
                        +

                        下拉详情

                        + +
                        + +
                        + +
                        +
                        + +
                        + +
                        +

                        扫码安装App

                        +
                        + +
                        +
                        应用简介
                        +
                          +
                        • 一款十分专业的模特写真App,倾心为您提供国内外共计约198万张的高清写真图,这里有几十种分类包括但不限于各种萝莉,制服系列,捆绑系列,尤物,性感女仆装等等等...满足您的一切喜好!
                        • +
                        +
                        应用截图
                        +
                          +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        • + +
                        • +
                        +
                        新版本特性
                        +
                          +
                        • 最新版本发布啦,更新了一大波的好用功能,你还在等什么,赶快来下载体验吧!!
                        • +
                        +
                        详细信息
                        +
                          +
                        • 应用包名:com.picture.peach
                        • +
                        • 更新时间:xxxx-xx-xx
                        • +
                        • 支持ROM:4.0.3+
                        • +
                        • 开发者名称:编码猿
                        • +
                        + +
                        + +
                        +
                        + +
                        +

                        屁桃儿

                        + 发现美的过程 +
                        +
                        + 注 册 +
                        + + + + + + \ No newline at end of file diff --git a/share/js/.pydio b/share/js/.pydio new file mode 100644 index 0000000..bcebc00 --- /dev/null +++ b/share/js/.pydio @@ -0,0 +1 @@ +0dfca740-ff55-4fef-8542-754717f92fa5 \ No newline at end of file diff --git a/share/js/index.js b/share/js/index.js new file mode 100644 index 0000000..b3f6e10 --- /dev/null +++ b/share/js/index.js @@ -0,0 +1,112 @@ +class index { + constructor() { + this.appUpdateInfo = {}; + this.iosDownApkUrl = "http://47.114.153.249/page/home.html"; + this.checkUpdateUrl = "http://47.114.153.249:3000/api/json/updateVersion"; + this.goToReg(); + this.getVersion(); + } + + goToReg() { + // 如果地址栏有 objectId,表示代理分享出来的链接,先删除下载区域 + if (this.GetQueryString("objectId") != null) { + $(".app_download").remove() + } + + if (this.GetQueryString("objectId") == null) { + $(".h5_version").remove() + } else { + $(".h5_version_r").click(() => { + if (this.GetQueryString("objectId") == null) { + location.href = "../page/reg.html" + } else { + location.href = `../page/reg.html?objectId=${this.GetQueryString("objectId")}` + } + }) + } + } + + getVersion() { + $.ajax({ + type: "GET", + url: this.checkUpdateUrl, + success: (res) => { + this.appUpdateInfo = res; + // 设置app版本 + $(".version_num").text(this.appUpdateInfo.version); + + // 设置按钮文字 + this.downloadApp() == "ios" + ? $(".down_button").append(` + + H5 访问 + `) + : $(".down_button").append(` + + 下载并安装 + `); + + // 点击安装事件 + this.downloadApp() == "ios" + ? $(".down_button").click(() => location.href = this.iosDownApkUrl) + : $(".down_button").click(() => location.href = this.appUpdateInfo.downUrl); + + // 生成二维码 + $(".app_download").length != 0 ? this.CreatedQrcode() : '' + // 新版本特性 + this.appUpdateInfo.updateMsg.forEach((v,i) => { + $(".update").append(`
                      • ${v}
                      • `) + }); + // 详细信息 + $(".detailed .update_time").text(`更新时间:${this.appUpdateInfo.updatedAt}`) + }, + error: (err) => { + throw new Error(err) + } + }) + } + + CreatedQrcode() { + let url = this.downloadApp() == "ios" + ? this.iosDownApkUrl + : this.appUpdateInfo.downUrl; + + new QRCode("QRCodeNone", { + text: url, + width: 128, + height: 128, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRCode.CorrectLevel.H + }); + $("#down_code").append( + this.convertCanvasToImage($("canvas")[0]) + ); + } + + convertCanvasToImage(canvas){ + var image = new Image(); + image.src = canvas.toDataURL("image/png"); + return image; + } + + downloadApp() { + var u = navigator.userAgent; + var ua = navigator.userAgent.toLowerCase(); + var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端 + var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 + if (isiOS) { + return 'ios'; + } else if (isAndroid) { + return "android" + } + } + + GetQueryString(name) { + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + var r = window.location.search.substr(1).match(reg); + if (r != null) return decodeURIComponent(r[2]); return null; + } +} + +new index() \ No newline at end of file diff --git a/share/js/jquery.min.js b/share/js/jquery.min.js new file mode 100644 index 0000000..b061403 --- /dev/null +++ b/share/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
                        "],col:[2,"","
                        "],tr:[2,"","
                        "],td:[3,"","
                        "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
                        ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
                        "),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/untitled/.gitignore b/untitled/.gitignore new file mode 100755 index 0000000..f0692b5 --- /dev/null +++ b/untitled/.gitignore @@ -0,0 +1,76 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +key.jks + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +.vscode/ +pubspec.lock + +Podfile +Podfile.lock +Pods/ +.symlinks/ +**/Flutter/App.framework/ +**/Flutter/Flutter.framework/ +**/Flutter/Generated.xcconfig +**/Flutter/flutter_assets/ +ServiceDefinitions.json +xcuserdata/ +**/DerivedData/ + +local.properties +keystore.properties +.gradle/ +gradlew +gradlew.bat +gradle-wrapper.jar + +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m +GeneratedPluginRegistrant.java +build/ + +.project +.classpath +.settings +!.idea/ \ No newline at end of file diff --git a/untitled/.metadata b/untitled/.metadata new file mode 100644 index 0000000..ccb00e6 --- /dev/null +++ b/untitled/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 8f89f6505b941329a864fef1527243a72800bf4d + channel: beta + +project_type: app diff --git a/untitled/.pydio b/untitled/.pydio new file mode 100644 index 0000000..b145404 --- /dev/null +++ b/untitled/.pydio @@ -0,0 +1 @@ +69b863bd-73ad-4688-bc9e-e83527b0377c \ No newline at end of file diff --git a/untitled/LICENSE b/untitled/LICENSE new file mode 100644 index 0000000..8d61686 --- /dev/null +++ b/untitled/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 编码猿 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/untitled/README.md b/untitled/README.md new file mode 100644 index 0000000..db281de --- /dev/null +++ b/untitled/README.md @@ -0,0 +1,55 @@ +## 蜜桃社 + +使用Flutter开发的模特写真App,项目目前开发完成,对Flutter感兴趣的可以先看看代码,支持Linux,Mac,Windows,Web,Android Ios 等多端 + +> PS: Flutter写的应用也太丝滑太流畅了吧,众多App框架中,只服Flutter!!! + +核心代码都在 `/lib` 文件夹中,文件说明: +```text +|____widget # 公共组件 +|____config # 项目的配置 +|____entity # 数据实体 +|____db # 数据库配置 +|____event # 事件控制中心 +|____utils # 工具函数 +|____main.dart # 主入口 +|____R.dart # 静态资源类,作用类似android中的R文件 +|____http # Dio 的封装 +|____static # 静态资源 +|____service # 请求中间层 +|____views # 主页面 +|____router # 路由配置 +|____Configure.dart # 各种工具和配置的初始化 +|____main.dart # 主启动文件 +|____R.dart # 静态资源配置 +``` + +## 实现功能: +- 搜索 +- 分类编辑 +- 机构 +- 模特 +- 收藏写真 +- 收藏单图 +- 分享 +- 保存到相册 +- 检测升级 +- 最近更新 +- 清除缓存 +- 极光推送 +- 登录 / 注册 / Vip权限控制 + +等... + +看图: + +![1.jpg](docs/1.jpg) +![2.jpg](docs/2.jpg) +![3.jpg](docs/3.jpg) +![4.jpg](docs/4.jpg) +![5.jpg](docs/5.jpg) +![6.jpg](docs/6.jpg) +![7.jpg](docs/7.jpg) +![8.jpg](docs/8.jpg) +![9.jpg](docs/9.jpg) +![10.jpg](docs/10.jpg) diff --git a/untitled/android/.gitignore b/untitled/android/.gitignore new file mode 100644 index 0000000..0a741cb --- /dev/null +++ b/untitled/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/untitled/android/.pydio b/untitled/android/.pydio new file mode 100644 index 0000000..6a7231e --- /dev/null +++ b/untitled/android/.pydio @@ -0,0 +1 @@ +5e234995-074b-4b13-8878-e2e0a155a0eb \ No newline at end of file diff --git a/untitled/android/app/.pydio b/untitled/android/app/.pydio new file mode 100644 index 0000000..34a2849 --- /dev/null +++ b/untitled/android/app/.pydio @@ -0,0 +1 @@ +265255f6-bfd5-4bec-821f-2de6cde670b1 \ No newline at end of file diff --git a/untitled/android/app/build.gradle b/untitled/android/app/build.gradle new file mode 100644 index 0000000..4f367aa --- /dev/null +++ b/untitled/android/app/build.gradle @@ -0,0 +1,82 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +def keystorePropertiesFile = rootProject.file("key.properties") +def keystoreProperties = new Properties() +keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + +android { + lintOptions { + checkReleaseBuilds false + abortOnError false + } + compileSdkVersion 29 + defaultConfig { + applicationId "com.picture.peach" + minSdkVersion 19 + targetSdkVersion 29 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + multiDexEnabled true + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a' + } + + manifestPlaceholders = [ + JPUSH_PKGNAME: applicationId, + JPUSH_APPKEY : "d4e22ab876276f4a374880ca", // NOTE: JPush 上注册的包名对应的 Appkey. + JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. + ] + } + + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.release + minifyEnabled true + useProguard true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation 'com.android.support:multidex:1.0.3' +} + +flutter { + source '../..' +} diff --git a/untitled/android/app/proguard-rules.pro b/untitled/android/app/proguard-rules.pro new file mode 100644 index 0000000..babebba --- /dev/null +++ b/untitled/android/app/proguard-rules.pro @@ -0,0 +1,7 @@ +#Flutter Wrapper +-keep class io.flutter.app.** { *; } +-keep class io.flutter.plugin.** { *; } +-keep class io.flutter.util.** { *; } +-keep class io.flutter.view.** { *; } +-keep class io.flutter.** { *; } +-keep class io.flutter.plugins.** { *; } \ No newline at end of file diff --git a/untitled/android/app/src/.pydio b/untitled/android/app/src/.pydio new file mode 100644 index 0000000..be97cbe --- /dev/null +++ b/untitled/android/app/src/.pydio @@ -0,0 +1 @@ +6a35edbb-8b1a-4a48-928f-87725da1b22a \ No newline at end of file diff --git a/untitled/android/app/src/debug/.pydio b/untitled/android/app/src/debug/.pydio new file mode 100644 index 0000000..9c1c4c4 --- /dev/null +++ b/untitled/android/app/src/debug/.pydio @@ -0,0 +1 @@ +f7acc579-c89b-45d8-8467-eff117e61639 \ No newline at end of file diff --git a/untitled/android/app/src/debug/AndroidManifest.xml b/untitled/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..ee16540 --- /dev/null +++ b/untitled/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/untitled/android/app/src/main/.pydio b/untitled/android/app/src/main/.pydio new file mode 100644 index 0000000..63e9567 --- /dev/null +++ b/untitled/android/app/src/main/.pydio @@ -0,0 +1 @@ +7ee06137-ba62-48a8-8ab0-b5a8a50326df \ No newline at end of file diff --git a/untitled/android/app/src/main/AndroidManifest.xml b/untitled/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f97e49a --- /dev/null +++ b/untitled/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/untitled/android/app/src/main/java/.pydio b/untitled/android/app/src/main/java/.pydio new file mode 100644 index 0000000..e610362 --- /dev/null +++ b/untitled/android/app/src/main/java/.pydio @@ -0,0 +1 @@ +83c50025-5742-4f97-aa6f-a6ad16d6cfbb \ No newline at end of file diff --git a/untitled/android/app/src/main/java/com/.pydio b/untitled/android/app/src/main/java/com/.pydio new file mode 100644 index 0000000..c8091ea --- /dev/null +++ b/untitled/android/app/src/main/java/com/.pydio @@ -0,0 +1 @@ +42ef3096-4d7f-4f3b-b679-ad780a063666 \ No newline at end of file diff --git a/untitled/android/app/src/main/java/com/picture/.pydio b/untitled/android/app/src/main/java/com/picture/.pydio new file mode 100644 index 0000000..03f011a --- /dev/null +++ b/untitled/android/app/src/main/java/com/picture/.pydio @@ -0,0 +1 @@ +fc5e47d9-0e33-4230-8a2f-eae7a237771d \ No newline at end of file diff --git a/untitled/android/app/src/main/java/com/picture/peach/.pydio b/untitled/android/app/src/main/java/com/picture/peach/.pydio new file mode 100644 index 0000000..a43c279 --- /dev/null +++ b/untitled/android/app/src/main/java/com/picture/peach/.pydio @@ -0,0 +1 @@ +ddee1f3e-f490-4c48-9cc1-381069fec57f \ No newline at end of file diff --git a/untitled/android/app/src/main/java/com/picture/peach/MainActivity.java b/untitled/android/app/src/main/java/com/picture/peach/MainActivity.java new file mode 100644 index 0000000..25b5916 --- /dev/null +++ b/untitled/android/app/src/main/java/com/picture/peach/MainActivity.java @@ -0,0 +1,6 @@ +package com.picture.peach; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { +} diff --git a/untitled/android/app/src/main/java/io/.pydio b/untitled/android/app/src/main/java/io/.pydio new file mode 100644 index 0000000..15a932c --- /dev/null +++ b/untitled/android/app/src/main/java/io/.pydio @@ -0,0 +1 @@ +41221280-e881-4615-a939-1fd6da4ed244 \ No newline at end of file diff --git a/untitled/android/app/src/main/java/io/flutter/.pydio b/untitled/android/app/src/main/java/io/flutter/.pydio new file mode 100644 index 0000000..0f70e72 --- /dev/null +++ b/untitled/android/app/src/main/java/io/flutter/.pydio @@ -0,0 +1 @@ +b7b0de61-76c4-40a6-8682-5393d2107d7f \ No newline at end of file diff --git a/untitled/android/app/src/main/java/io/flutter/plugins/.pydio b/untitled/android/app/src/main/java/io/flutter/plugins/.pydio new file mode 100644 index 0000000..67ffbfd --- /dev/null +++ b/untitled/android/app/src/main/java/io/flutter/plugins/.pydio @@ -0,0 +1 @@ +a4c3f563-072c-49c7-bc92-daf483c16746 \ No newline at end of file diff --git a/untitled/android/app/src/main/kotlin/.pydio b/untitled/android/app/src/main/kotlin/.pydio new file mode 100644 index 0000000..141d5a0 --- /dev/null +++ b/untitled/android/app/src/main/kotlin/.pydio @@ -0,0 +1 @@ +5a85048e-9142-48ae-98ba-449116abca94 \ No newline at end of file diff --git a/untitled/android/app/src/main/kotlin/com/.pydio b/untitled/android/app/src/main/kotlin/com/.pydio new file mode 100644 index 0000000..9d4d7e8 --- /dev/null +++ b/untitled/android/app/src/main/kotlin/com/.pydio @@ -0,0 +1 @@ +18ae3e25-e8d7-4fd8-b304-5b3ee859c9fd \ No newline at end of file diff --git a/untitled/android/app/src/main/kotlin/com/example/.pydio b/untitled/android/app/src/main/kotlin/com/example/.pydio new file mode 100644 index 0000000..884ee98 --- /dev/null +++ b/untitled/android/app/src/main/kotlin/com/example/.pydio @@ -0,0 +1 @@ +3bd2169c-0756-435e-a5e3-406c62fd96ab \ No newline at end of file diff --git a/untitled/android/app/src/main/kotlin/com/example/untitled/.pydio b/untitled/android/app/src/main/kotlin/com/example/untitled/.pydio new file mode 100644 index 0000000..0025106 --- /dev/null +++ b/untitled/android/app/src/main/kotlin/com/example/untitled/.pydio @@ -0,0 +1 @@ +bffec605-3db9-4a2c-b58a-f153253fc92f \ No newline at end of file diff --git a/untitled/android/app/src/main/kotlin/com/example/untitled/MainActivity.kt b/untitled/android/app/src/main/kotlin/com/example/untitled/MainActivity.kt new file mode 100644 index 0000000..dda5e32 --- /dev/null +++ b/untitled/android/app/src/main/kotlin/com/example/untitled/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.untitled + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/untitled/android/app/src/main/res/.pydio b/untitled/android/app/src/main/res/.pydio new file mode 100644 index 0000000..02b529d --- /dev/null +++ b/untitled/android/app/src/main/res/.pydio @@ -0,0 +1 @@ +356cdbef-b52a-4080-93c8-f8b1b6ae21cf \ No newline at end of file diff --git a/untitled/android/app/src/main/res/drawable-v21/.pydio b/untitled/android/app/src/main/res/drawable-v21/.pydio new file mode 100644 index 0000000..f9599fd --- /dev/null +++ b/untitled/android/app/src/main/res/drawable-v21/.pydio @@ -0,0 +1 @@ +994a5296-0a26-43f6-a673-5671e7928604 \ No newline at end of file diff --git a/untitled/android/app/src/main/res/drawable-v21/launch_background.xml b/untitled/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/untitled/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/untitled/android/app/src/main/res/drawable/.pydio b/untitled/android/app/src/main/res/drawable/.pydio new file mode 100644 index 0000000..c579e71 --- /dev/null +++ b/untitled/android/app/src/main/res/drawable/.pydio @@ -0,0 +1 @@ +1c5257fb-f306-44d9-9a16-d92a0b5e3daa \ No newline at end of file diff --git a/untitled/android/app/src/main/res/drawable/launch_background.xml b/untitled/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/untitled/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/untitled/android/app/src/main/res/mipmap-hdpi/.pydio b/untitled/android/app/src/main/res/mipmap-hdpi/.pydio new file mode 100644 index 0000000..4c8e464 --- /dev/null +++ b/untitled/android/app/src/main/res/mipmap-hdpi/.pydio @@ -0,0 +1 @@ +e9fc3ffa-d76b-44b5-abdd-115e1c88d3ec \ No newline at end of file diff --git a/untitled/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/untitled/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/untitled/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/untitled/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/untitled/android/app/src/main/res/mipmap-mdpi/.pydio b/untitled/android/app/src/main/res/mipmap-mdpi/.pydio new file mode 100644 index 0000000..cc540d4 --- /dev/null +++ b/untitled/android/app/src/main/res/mipmap-mdpi/.pydio @@ -0,0 +1 @@ +13ae13a7-184e-4edb-944d-6457662cdb2d \ No newline at end of file diff --git a/untitled/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/untitled/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/untitled/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/untitled/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/untitled/android/app/src/main/res/mipmap-xhdpi/.pydio b/untitled/android/app/src/main/res/mipmap-xhdpi/.pydio new file mode 100644 index 0000000..d522150 --- /dev/null +++ b/untitled/android/app/src/main/res/mipmap-xhdpi/.pydio @@ -0,0 +1 @@ +dae6e027-be46-48cd-8237-46af65abb254 \ No newline at end of file diff --git a/untitled/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/untitled/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/untitled/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/untitled/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/untitled/android/app/src/main/res/mipmap-xxhdpi/.pydio b/untitled/android/app/src/main/res/mipmap-xxhdpi/.pydio new file mode 100644 index 0000000..782fb2b --- /dev/null +++ b/untitled/android/app/src/main/res/mipmap-xxhdpi/.pydio @@ -0,0 +1 @@ +d5e93dbd-9008-46c4-82c2-2cb7a5590ca5 \ No newline at end of file diff --git a/untitled/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/untitled/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/untitled/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/untitled/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/untitled/android/app/src/main/res/mipmap-xxxhdpi/.pydio b/untitled/android/app/src/main/res/mipmap-xxxhdpi/.pydio new file mode 100644 index 0000000..9c1a5df --- /dev/null +++ b/untitled/android/app/src/main/res/mipmap-xxxhdpi/.pydio @@ -0,0 +1 @@ +c7dc325d-5b88-4976-abb5-bf7af8354548 \ No newline at end of file diff --git a/untitled/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/untitled/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/untitled/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/untitled/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b838570 Binary files /dev/null and b/untitled/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/untitled/android/app/src/main/res/values-night/.pydio b/untitled/android/app/src/main/res/values-night/.pydio new file mode 100644 index 0000000..fa454ea --- /dev/null +++ b/untitled/android/app/src/main/res/values-night/.pydio @@ -0,0 +1 @@ +48678e93-4c3c-49d6-b1d8-f2f5678257da \ No newline at end of file diff --git a/untitled/android/app/src/main/res/values-night/styles.xml b/untitled/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/untitled/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/untitled/android/app/src/main/res/values/.pydio b/untitled/android/app/src/main/res/values/.pydio new file mode 100644 index 0000000..5444f89 --- /dev/null +++ b/untitled/android/app/src/main/res/values/.pydio @@ -0,0 +1 @@ +3a29f427-76ed-46f1-817f-cb1128154e56 \ No newline at end of file diff --git a/untitled/android/app/src/main/res/values/styles.xml b/untitled/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d74aa35 --- /dev/null +++ b/untitled/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/untitled/android/app/src/main/res/xml/.pydio b/untitled/android/app/src/main/res/xml/.pydio new file mode 100644 index 0000000..4ef8f1b --- /dev/null +++ b/untitled/android/app/src/main/res/xml/.pydio @@ -0,0 +1 @@ +ab0e21c2-2621-43b1-a91a-ab9e366a808c \ No newline at end of file diff --git a/untitled/android/app/src/main/res/xml/network_security_config.xml b/untitled/android/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..dca93c0 --- /dev/null +++ b/untitled/android/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/untitled/android/app/src/profile/.pydio b/untitled/android/app/src/profile/.pydio new file mode 100644 index 0000000..8cccbdd --- /dev/null +++ b/untitled/android/app/src/profile/.pydio @@ -0,0 +1 @@ +d1bea652-4cc7-4d60-a270-890185b50e9d \ No newline at end of file diff --git a/untitled/android/app/src/profile/AndroidManifest.xml b/untitled/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..ee16540 --- /dev/null +++ b/untitled/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/untitled/android/build.gradle b/untitled/android/build.gradle new file mode 100644 index 0000000..9c8894a --- /dev/null +++ b/untitled/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + repositories { + google() + maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + } +} + +allprojects { + repositories { + google() + maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/untitled/android/gradle.properties b/untitled/android/gradle.properties new file mode 100644 index 0000000..4d3226a --- /dev/null +++ b/untitled/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true \ No newline at end of file diff --git a/untitled/android/gradle/.pydio b/untitled/android/gradle/.pydio new file mode 100644 index 0000000..4be0bf5 --- /dev/null +++ b/untitled/android/gradle/.pydio @@ -0,0 +1 @@ +7368acd6-71b5-4ba2-80e6-4bf1cc0b879a \ No newline at end of file diff --git a/untitled/android/gradle/wrapper/.pydio b/untitled/android/gradle/wrapper/.pydio new file mode 100644 index 0000000..946c3fe --- /dev/null +++ b/untitled/android/gradle/wrapper/.pydio @@ -0,0 +1 @@ +c477c113-a8c7-4468-a4ca-6d0e3b797bab \ No newline at end of file diff --git a/untitled/android/gradle/wrapper/gradle-wrapper.properties b/untitled/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bc6a58a --- /dev/null +++ b/untitled/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/untitled/android/settings.gradle b/untitled/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/untitled/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/untitled/android/settings_aar.gradle b/untitled/android/settings_aar.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/untitled/android/settings_aar.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/untitled/asset_generator.dart b/untitled/asset_generator.dart new file mode 100755 index 0000000..99040fb --- /dev/null +++ b/untitled/asset_generator.dart @@ -0,0 +1,91 @@ +import 'dart:io'; + +// ignore: non_constant_identifier_names +var preview_server_port = 2227; + +void main() async { + bool working = false; + var pubSpec = new File('pubspec.yaml'); + var pubLines = pubSpec.readAsLinesSync(); + var newLines = []; + var resource = []; + for (var line in pubLines) { + if (line.contains('begin') && line.contains('#') && line.contains('assets')) { + working = true; + newLines.add(line); + } + if (line.contains('end') && line.contains('#') && line.contains('assets')) working = false; + + if (working) { + if (line.trim().startsWith('#') && line.trim().endsWith('*')) { + newLines.add(line); + var directory = new Directory(line.replaceAll('#', '').replaceAll('*', '').trim()); + if (directory.existsSync()) { + var list = directory.listSync(recursive: true); + resource.add("/// 静态资源配置,程序自动生成,请勿手动修改"); + for (var file in list) { + if (new File(file.path) + .statSync() + .type == FileSystemEntityType.file) { + var path = file.path.replaceAll('\\', '/'); + var varName = path.replaceAll('/', '_').replaceAll('.', '_').toLowerCase(); + var pos = 0; + String char; + while (true) { + pos = varName.indexOf('_', pos); + if (pos == -1) break; + char = varName.substring(pos + 1, pos + 2); + varName = varName.replaceFirst('_$char', '_${char.toUpperCase()}'); + pos++; + } + varName = varName.replaceAll('_', ''); + resource.add("/// ![](http://127.0.0.1:$preview_server_port/$path)"); + resource.add("static final String $varName = '$path';"); + newLines.add(' - $path'); + } + } + } else { + throw new FileSystemException('Directory wrong'); + } + } + } else { + newLines.add(line); + } + } + + var r = new File('lib/R.dart'); + if (r.existsSync()) { + r.deleteSync(); + } + r.createSync(); + var content = 'class R {\n'; + for (var line in resource) { + content = '$content $line\n'; + } + content = '$content}\n'; + r.writeAsStringSync(content); + + var spec = ''; + for (var line in newLines) { + spec = '$spec$line\n'; + } + pubSpec.writeAsStringSync(spec); + + var ser; + try { + ser = await HttpServer.bind('127.0.0.1', preview_server_port); + print('成功启动图片预览服务器于本机<$preview_server_port>端口'); + ser.listen( + (req) { + var index = req.uri.path.lastIndexOf('.'); + var subType = req.uri.path.substring(index); + req.response + ..headers.contentType = new ContentType('image', subType) + ..add(new File('.${req.uri.path}').readAsBytesSync()) + ..close(); + }, + ); + } catch (e) { + print('图片预览服务器已启动或端口被占用'); + } +} \ No newline at end of file diff --git a/untitled/docs/.pydio b/untitled/docs/.pydio new file mode 100644 index 0000000..bae2c09 --- /dev/null +++ b/untitled/docs/.pydio @@ -0,0 +1 @@ +38323431-3441-47fb-9c7e-5e1dd43a06f3 \ No newline at end of file diff --git a/untitled/docs/1.jpg b/untitled/docs/1.jpg new file mode 100644 index 0000000..9eaa441 Binary files /dev/null and b/untitled/docs/1.jpg differ diff --git a/untitled/docs/10.jpg b/untitled/docs/10.jpg new file mode 100644 index 0000000..ab0cc51 Binary files /dev/null and b/untitled/docs/10.jpg differ diff --git a/untitled/docs/2.jpg b/untitled/docs/2.jpg new file mode 100644 index 0000000..f3720f1 Binary files /dev/null and b/untitled/docs/2.jpg differ diff --git a/untitled/docs/3.jpg b/untitled/docs/3.jpg new file mode 100644 index 0000000..e791649 Binary files /dev/null and b/untitled/docs/3.jpg differ diff --git a/untitled/docs/4.jpg b/untitled/docs/4.jpg new file mode 100644 index 0000000..8ced081 Binary files /dev/null and b/untitled/docs/4.jpg differ diff --git a/untitled/docs/5.jpg b/untitled/docs/5.jpg new file mode 100644 index 0000000..d281341 Binary files /dev/null and b/untitled/docs/5.jpg differ diff --git a/untitled/docs/6.jpg b/untitled/docs/6.jpg new file mode 100644 index 0000000..0ef33e5 Binary files /dev/null and b/untitled/docs/6.jpg differ diff --git a/untitled/docs/7.jpg b/untitled/docs/7.jpg new file mode 100644 index 0000000..9c35722 Binary files /dev/null and b/untitled/docs/7.jpg differ diff --git a/untitled/docs/8.jpg b/untitled/docs/8.jpg new file mode 100644 index 0000000..273fa9d Binary files /dev/null and b/untitled/docs/8.jpg differ diff --git a/untitled/docs/9.jpg b/untitled/docs/9.jpg new file mode 100644 index 0000000..3c33b27 Binary files /dev/null and b/untitled/docs/9.jpg differ diff --git a/untitled/gen/.pydio b/untitled/gen/.pydio new file mode 100644 index 0000000..efd5911 --- /dev/null +++ b/untitled/gen/.pydio @@ -0,0 +1 @@ +73cf648b-443a-42d5-8659-e24a13ddd30b \ No newline at end of file diff --git a/untitled/lib/.pydio b/untitled/lib/.pydio new file mode 100644 index 0000000..1731abc --- /dev/null +++ b/untitled/lib/.pydio @@ -0,0 +1 @@ +53c54fc3-dd3f-4d4d-9385-bc1001382434 \ No newline at end of file diff --git a/untitled/lib/Configure.dart b/untitled/lib/Configure.dart new file mode 100644 index 0000000..8e18094 --- /dev/null +++ b/untitled/lib/Configure.dart @@ -0,0 +1,46 @@ +import 'package:event_bus/event_bus.dart'; +import 'package:flutter/material.dart'; +import 'package:package_info/package_info.dart'; +import 'package:peach/utils/_.dart'; +import 'config/_.dart'; +import 'package:device_info/device_info.dart'; + +/* + * 各种工具和配置的初始化 + */ +class Configure { + + static Future init() async { + // 运行初始 + WidgetsFlutterBinding.ensureInitialized(); + + // SharedPreferences 初始化 + await SPreferences.init(); + + // 是否第一次打开的判断 + Config.isFirstOpen = !SPreferences().getBool("isFirstOpen"); + + // 是否第一次打开的判断 + Config.isLogin = !SPreferences().getIsLogin(); + + // 如果不是第一次打开,那么设置主题色,否则不设置 + if (!Config.isFirstOpen) { + Core.SetStatusThemeColor(); + } + + // 初始化极光 + JiGuangPush(); + + // 初始化事件控制中心 + Config.eventBus = EventBus(); + + // 读取保存设备信息 + DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + Config.isAndroid + ? Config.androidDeviceInfo = await deviceInfoPlugin.androidInfo + : Config.iosDeviceInfo = await deviceInfoPlugin.iosInfo; + + // 保存App软件包信息 + Config.packageInfo = await PackageInfo.fromPlatform(); + } +} \ No newline at end of file diff --git a/untitled/lib/R.dart b/untitled/lib/R.dart new file mode 100644 index 0000000..e89d674 --- /dev/null +++ b/untitled/lib/R.dart @@ -0,0 +1,21 @@ +class R { + /// 静态资源配置,程序自动生成,请勿手动修改 + /// ![](http://127.0.0.1:2227/lib/static/img/update_ic_close.png) + static final String libStaticImgUpdateIcClosePng = 'lib/static/img/update_ic_close.png'; + /// ![](http://127.0.0.1:2227/lib/static/img/taxi.png) + static final String libStaticImgTaxiPng = 'lib/static/img/taxi.png'; + /// ![](http://127.0.0.1:2227/lib/static/img/.DS_Store) + static final String libStaticImgDsStore = 'lib/static/img/.DS_Store'; + /// ![](http://127.0.0.1:2227/lib/static/img/welcome3.png) + static final String libStaticImgWelcome3Png = 'lib/static/img/welcome3.png'; + /// ![](http://127.0.0.1:2227/lib/static/img/welcome2.png) + static final String libStaticImgWelcome2Png = 'lib/static/img/welcome2.png'; + /// ![](http://127.0.0.1:2227/lib/static/img/update_bg_app_top.png) + static final String libStaticImgUpdateBgAppTopPng = 'lib/static/img/update_bg_app_top.png'; + /// ![](http://127.0.0.1:2227/lib/static/img/logo.png) + static final String libStaticImgLogoPng = 'lib/static/img/logo.png'; + /// ![](http://127.0.0.1:2227/lib/static/img/vipLogo.png) + static final String libStaticImgViplogoPng = 'lib/static/img/vipLogo.png'; + /// ![](http://127.0.0.1:2227/lib/static/img/back.png) + static final String libStaticImgBackPng = 'lib/static/img/back.png'; +} diff --git a/untitled/lib/config/.pydio b/untitled/lib/config/.pydio new file mode 100644 index 0000000..9e70cc1 --- /dev/null +++ b/untitled/lib/config/.pydio @@ -0,0 +1 @@ +90f95b79-eab7-4698-ade6-5337af05eef9 \ No newline at end of file diff --git a/untitled/lib/config/Colors.dart b/untitled/lib/config/Colors.dart new file mode 100644 index 0000000..118a65e --- /dev/null +++ b/untitled/lib/config/Colors.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class ColorConfig { + + // 主题色 + static const Color ThemeColor = Color(0XFFfb7299); + // static const Color ThemeColor = Color(0XFFffd101); + // 比主题稍微淡一点的主题色 + static const Color ThemeOtherColor = Color(0XFFfe7fa2); + // cell 左侧图标的颜色 + static const Color IconColor = Color(0XFFc3c0c0); + // 某些标题的黑色 + static const Color TitleColor = Color(0XFF333333); + // 某些稍微灰色一点的字体颜色 + static const Color TextColor = Color(0XFF7e7979); + // 未激活时候的字体颜色 + static const Color NoActiveColor = Color(0XFFd3d2d2); + static const Color LineColor = Color(0XFFefefef); + // 白色背景 + static const Color WhiteBackColor = Colors.white; + +} \ No newline at end of file diff --git a/untitled/lib/config/Index.dart b/untitled/lib/config/Index.dart new file mode 100644 index 0000000..d529a81 --- /dev/null +++ b/untitled/lib/config/Index.dart @@ -0,0 +1,221 @@ +import 'dart:io'; +import 'package:event_bus/event_bus.dart'; +import 'package:package_info/package_info.dart'; +import 'package:device_info/device_info.dart'; +import 'package:intro_views_flutter/Models/page_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:peach/R.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/utils/_.dart'; + +class Config { + + /// 第一次打开,本地无值,返回false取反为true所以显示welcome + /// 第二次打开,本地有值,返回true取反false,所以显示app页面 + static bool isFirstOpen = false; + + // 第一次打开,未登录,本地无值,返回false,取反为true,访问登录页面 + // 第二次打开,已登录,本地有值,返回true,取反为返回false,访问app页面 + static bool isLogin = true; + + /// App 的名字 + static String appName = "屁桃儿"; + /// 保存 App安装包信息 + static PackageInfo packageInfo; + + /// 是否为 android + static bool isAndroid = Platform.isAndroid; + /// 保存 android 设备信息 + static AndroidDeviceInfo androidDeviceInfo; + + /// 是否为 ios + static bool isIos = Platform.isIOS; + /// 保存 ios 设备信息 + static IosDeviceInfo iosDeviceInfo; + /// IOS app 下载地址 + // static String iosDownApkUrl = "https://apps.apple.com/cn/app/qq/id444934666"; + static String iosDownApkUrl = "itms-apps://itunes.apple.com/cn/app/id444934666"; + + static int currentIndex = 0; + + // 保存视频数组 + static List feeds = []; + + /// 首页 /home.html + static String h5IpUrl = "http://47.114.153.249/page/"; + static String shareIpUrl = "http://47.114.153.249/share/"; + static String h5DomainUrl = "http://www.geekhelp.cn/page/"; + + /// 极光推送的配置 + static final Map JgConfig = { + "appKey": 'd4e22ab876276f4a374880ca', + "channel": 'pitaoer', + "production": true, + "debug": false, + }; + + /// 首页底部Tab的控制器 + static PageController tabController; + + /// 事件控制中心 + static EventBus eventBus; + + static List vipList = [ + { + "id": 1, + "vipTitle": "月卡", + "vipMoney": 30, + "vipDay": 1, + "vipExplain": [ + "1:✅ 可以收藏(单图收藏&写真收藏)", + "2:❎ 无法保存图片到相册", + "3:❎ 无法使用【成人视频】功能", + "4:❎ 无法下载【成人视频】功能" + ] + }, + { + "id": 2, + "vipTitle": "季卡", + "vipMoney": 88, + "vipDay": 0.9, + "vipExplain": [ + "1:✅ 可以收藏(单图收藏&写真收藏)", + "2:✅ 可以下载保存到相册", + "3:❎ 无法使用【成人视频】功能", + "4:❎ 无法下载【成人视频】功能" + ] + }, + { + "id": 3, + "vipTitle": "年卡", + "vipMoney": 324, + "vipDay": 0.8, + "vipExplain": [ + "1:✅ 可以收藏(单图收藏&写真收藏)", + "2:✅ 可以下载保存到相册", + "3:✅ 可以使用【成人视频】功能", + "4:✅ 可以下载【成人视频】功能" + ] + }, + ]; + + /// 接口地址 + static final Map ApiUrl = { + + // 写真图片接口基地址 + 'PhotoBaseUrl': 'http://192.168.0.105:3000/api/json', + // 'PhotoBaseUrl': 'http://120.27.144.174:3000/api/json', + + // 'VideoBaseUrl': 'http://47.114.153.249:1314', + 'VideoBaseUrl': 'http://192.168.0.105:8090/api', + + // 视频接口基地址 + 'ApiList': { + 'update': '/updateVersion', // App升级接口 + 'index': '/index', // 首页 + 'class': '/class', // 获取分类菜单 + 'login': '/login', // 登录 + 'register': '/register', // 注册 + 'agentreg': '/agentreg', // 代理注册 + 'freeUse': '/freeUse', // vip计数 + 'place': '/placeOrder', // 办理vip + 'orderStatus': '/orderStatus', // 查询购买记录 + + 'agentInfo': '/agent/info', // 【新接口,替换】代替原本的详情 + 'info': '/info', // 进入详情 + + 'classList': '/classList', // 获取分类列表下数据 + 'agentClassList': '/agent/classList', //【新接口,替换】 代替原本的 获取分类列表下数据 + + 'mechanism': '/mechanism', // 机构列表 + + 'mechanismList': '/mechanismList', // 机构列表点击进入详情 + 'agentMechanismList': '/agent/mechanismList', // 【新接口,替换】机构列表点击进入详情 + + 'allModel': '/allModel', // 模特列表 + 'modelList': '/modelList', // 进入模特的个人套图页 + + 'agentRecently': '/agent/recently', // 最近更新 + 'agentSearch': '/agent/search', // 搜索接口 + + 'agentRandom': '/agent/random', // 随机展示 + + + 'videoType': '/likeList' + } + }; + + static final pages = [ + PageViewModel( + pageColor: ColorConfig.ThemeColor, + body: Text( + '一款正经的模特写真应用', + style: TextStyle(fontSize: Screen.setFontSize(17.0)), + ), + title: Text( + Config.appName, + style: TextStyle(fontSize: Screen.setFontSize(30.0)), + ), + textStyle: TextStyle(color: Colors.white), + mainImage: Image.asset( + R.libStaticImgLogoPng, + height: Screen.setHeight(225.0), + width: Screen.setWidth(225.0), + alignment: Alignment.center, + )), + PageViewModel( + pageColor: const Color(0xFF03A9F4), + body: Text( + '基于谷歌 Flutter+Dart 开发,体验更丝滑更流畅,响应速度让人惊叹', + style: TextStyle(fontSize: Screen.setFontSize(17.0)), + ), + title: Text( + '流畅极致', + style: TextStyle(fontSize: Screen.setFontSize(30.0)), + ), + textStyle: TextStyle(color: Colors.white), + mainImage: Image.asset( + R.libStaticImgWelcome2Png, + height: Screen.setHeight(255.0), + width: Screen.setWidth(255.0), + alignment: Alignment.center, + )), + PageViewModel( + pageColor: const Color(0xFF8BC34A), + body: Text( + '国内外100多家写真机构,198万张高清模特写真,有你喜欢的', + style: TextStyle(fontSize: Screen.setFontSize(17.0)), + ), + title: Text( + '全面丰富', + style: TextStyle(fontSize: Screen.setFontSize(30.0)), + ), + mainImage: Image.asset( + R.libStaticImgWelcome3Png, + height: Screen.setHeight(255.0), + width: Screen.setWidth(255.0), + alignment: Alignment.center, + ), + textStyle: TextStyle(color: Colors.white), + ), + PageViewModel( + pageColor: const Color(0xFF607D8B), + body: Text( + '点击【进入】开始使用!', + style: TextStyle(fontSize: Screen.setFontSize(17.0)), + ), + title: Text( + '开始使用', + style: TextStyle(fontSize: Screen.setFontSize(30.0)), + ), + mainImage: Image.asset( + R.libStaticImgTaxiPng, + height: Screen.setHeight(255.0), + width: Screen.setWidth(255.0), + alignment: Alignment.center, + ), + textStyle: TextStyle(color: Colors.white), + ), + ]; +} \ No newline at end of file diff --git a/untitled/lib/config/_.dart b/untitled/lib/config/_.dart new file mode 100644 index 0000000..d7191b4 --- /dev/null +++ b/untitled/lib/config/_.dart @@ -0,0 +1,4 @@ +library config; + +export 'Colors.dart'; +export 'Index.dart'; \ No newline at end of file diff --git a/untitled/lib/db/.pydio b/untitled/lib/db/.pydio new file mode 100644 index 0000000..d242625 --- /dev/null +++ b/untitled/lib/db/.pydio @@ -0,0 +1 @@ +ac4d75e7-753e-48af-8808-f26bd74a9f87 \ No newline at end of file diff --git a/untitled/lib/db/SQLite.dart b/untitled/lib/db/SQLite.dart new file mode 100644 index 0000000..98b0bdc --- /dev/null +++ b/untitled/lib/db/SQLite.dart @@ -0,0 +1,64 @@ +import 'dart:io'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:sqflite/sqflite.dart'; + +class SQLite { + static final SQLite _singleton = SQLite._internal(); + factory SQLite() => _singleton; + SQLite._internal(); + static Database _db; + + Future get db async { + if (_db != null) { + return _db; + } + _db = await _initDB(); + return _db; + } + + Future _initDB() async { + Directory documentsDirectory = await getApplicationDocumentsDirectory(); + String path = join(documentsDirectory.path, 'MiTaoShe'); + print("documentsDirectory.path ============ : ${path}"); + return await openDatabase( + path, + version: 1, + onCreate: _onCreate + ); + } + + + Future _onCreate(Database db, int version) async { + /// 创建like 喜欢表 + await db.execute("CREATE TABLE Like (" + "id integer primary key AUTOINCREMENT," + "preview TEXT," + "source TEXT," + "title TEXT," + "totals TEXT," + "user TEXT" + ")"); + + /// 创建Menu 菜单 Principal(默认菜单) 表 + await db.execute("CREATE TABLE Principal (" + "id integer primary key AUTOINCREMENT," + "title TEXT," + "page integer" + ")"); + + /// 创建Menu 菜单 Additional(可选菜单) 表 + await db.execute("CREATE TABLE Additional (" + "id integer primary key AUTOINCREMENT," + "title TEXT," + "page integer" + ")"); + + /// 创建 单图收藏 表 + await db.execute("CREATE TABLE SingleGraph (" + "id integer primary key AUTOINCREMENT," + "src TEXT" + ")"); + } + +} \ No newline at end of file diff --git a/untitled/lib/entity/.pydio b/untitled/lib/entity/.pydio new file mode 100644 index 0000000..61b2753 --- /dev/null +++ b/untitled/lib/entity/.pydio @@ -0,0 +1 @@ +ec25c7b1-6f31-44ab-90df-f11a67fdde74 \ No newline at end of file diff --git a/untitled/lib/entity/AgentClassListEntity.dart b/untitled/lib/entity/AgentClassListEntity.dart new file mode 100644 index 0000000..c99c23d --- /dev/null +++ b/untitled/lib/entity/AgentClassListEntity.dart @@ -0,0 +1,164 @@ +import 'AgentInfoEntity.dart'; + +class AgentClassListEntity { + int status; + AgentClassListData data; + + AgentClassListEntity({this.status, this.data}); + + AgentClassListEntity.fromJson(Map json) { + status = json['status']; + data = json['data'] != null ? new AgentClassListData.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + if (this.data != null) { + data['data'] = this.data.toJson(); + } + return data; + } +} + +class AgentClassListData { + dynamic total; + int num; + List list; + String page; + + AgentClassListData({this.total, this.num, this.list, this.page}); + + AgentClassListData.fromJson(Map json) { + total = json['total']; + num = json['num']; + page = json['page']; + if (json['list'] != null) { + list = new List(); + json['list'].forEach((v) { + list.add(new ItemList.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['total'] = this.total; + data['num'] = this.num; + data['page'] = this.page; + if (this.list != null) { + data['list'] = this.list.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ItemList { + String id; + String catid; + String title; + String renwu; + String biaoqian; + String jigou; + String bianhao; + String faxingshijian; + String shuliang; + String zhuangtai; + String shijian; + String tuijian; + String classname; + List biaoqianlist; + List jigoulist; + String renwunlist; + String isgood; + String imgSrc; + List renwulist; + + ItemList( + {this.id, + this.catid, + this.title, + this.renwu, + this.biaoqian, + this.jigou, + this.bianhao, + this.faxingshijian, + this.shuliang, + this.zhuangtai, + this.shijian, + this.tuijian, + this.classname, + this.biaoqianlist, + this.jigoulist, + this.renwunlist, + this.isgood, + this.imgSrc, + this.renwulist}); + + ItemList.fromJson(Map json) { + id = json['id']; + catid = json['catid']; + title = json['title']; + renwu = json['renwu']; + biaoqian = json['biaoqian']; + jigou = json['jigou']; + bianhao = json['bianhao']; + faxingshijian = json['faxingshijian']; + shuliang = json['shuliang']; + zhuangtai = json['zhuangtai']; + shijian = json['shijian']; + tuijian = json['tuijian']; + classname = json['classname']; + if (json['biaoqianlist'] != null) { + biaoqianlist = new List(); + json['biaoqianlist'].forEach((v) { + biaoqianlist.add(new Biaoqianlist.fromJson(v)); + }); + } + if (json['jigoulist'] != null) { + jigoulist = new List(); + json['jigoulist'].forEach((v) { + jigoulist.add(new Biaoqianlist.fromJson(v)); + }); + } + renwunlist = json['renwunlist']; + isgood = json['isgood']; + imgSrc = json['img_src']; + if (json['renwulist'] != null) { + renwulist = new List(); + json['renwulist'].forEach((v) { + renwulist.add(new Biaoqianlist.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['catid'] = this.catid; + data['title'] = this.title; + data['renwu'] = this.renwu; + data['biaoqian'] = this.biaoqian; + data['jigou'] = this.jigou; + data['bianhao'] = this.bianhao; + data['faxingshijian'] = this.faxingshijian; + data['shuliang'] = this.shuliang; + data['zhuangtai'] = this.zhuangtai; + data['shijian'] = this.shijian; + data['tuijian'] = this.tuijian; + data['classname'] = this.classname; + if (this.biaoqianlist != null) { + data['biaoqianlist'] = this.biaoqianlist.map((v) => v.toJson()).toList(); + } + if (this.jigoulist != null) { + data['jigoulist'] = this.jigoulist.map((v) => v.toJson()).toList(); + } + data['renwunlist'] = this.renwunlist; + data['isgood'] = this.isgood; + data['img_src'] = this.imgSrc; + if (this.renwulist != null) { + data['renwulist'] = this.renwulist.map((v) => v.toJson()).toList(); + } + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/AgentInfoEntity.dart b/untitled/lib/entity/AgentInfoEntity.dart new file mode 100644 index 0000000..38d42f8 --- /dev/null +++ b/untitled/lib/entity/AgentInfoEntity.dart @@ -0,0 +1,153 @@ +class AgentInfoEntity { + int status; + AgentInfo data; + + AgentInfoEntity({this.status, this.data}); + + AgentInfoEntity.fromJson(Map json) { + status = json['status']; + data = json['data'] != null ? new AgentInfo.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + if (this.data != null) { + data['data'] = this.data.toJson(); + } + return data; + } +} + +class AgentInfo { + String id; + String catid; + String title; + String renwu; + String biaoqian; + String jigou; + String bianhao; + String faxingshijian; + String shuliang; + String zhuangtai; + String shijian; + String tuijian; + String classname; + List biaoqianlist; + List jigoulist; + String renwunlist; + String isgood; + String imgSrc; + List renwulist; + List imgs; + + AgentInfo( + {this.id, + this.catid, + this.title, + this.renwu, + this.biaoqian, + this.jigou, + this.bianhao, + this.faxingshijian, + this.shuliang, + this.zhuangtai, + this.shijian, + this.tuijian, + this.classname, + this.biaoqianlist, + this.jigoulist, + this.renwunlist, + this.isgood, + this.imgSrc, + this.renwulist, + this.imgs}); + + AgentInfo.fromJson(Map json) { + id = json['id']; + catid = json['catid']; + title = json['title']; + renwu = json['renwu']; + biaoqian = json['biaoqian']; + jigou = json['jigou']; + bianhao = json['bianhao']; + faxingshijian = json['faxingshijian']; + shuliang = json['shuliang']; + zhuangtai = json['zhuangtai']; + shijian = json['shijian']; + tuijian = json['tuijian']; + classname = json['classname']; + if (json['biaoqianlist'] != null) { + biaoqianlist = new List(); + json['biaoqianlist'].forEach((v) { + biaoqianlist.add(new Biaoqianlist.fromJson(v)); + }); + } + if (json['jigoulist'] != null) { + jigoulist = new List(); + json['jigoulist'].forEach((v) { + jigoulist.add(new Biaoqianlist.fromJson(v)); + }); + } + renwunlist = json['renwunlist']; + isgood = json['isgood']; + imgSrc = json['img_src']; + if (json['renwulist'] != null) { + renwulist = new List(); + json['renwulist'].forEach((v) { + renwulist.add(new Biaoqianlist.fromJson(v)); + }); + } + imgs = json['imgs'].cast(); + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['catid'] = this.catid; + data['title'] = this.title; + data['renwu'] = this.renwu; + data['biaoqian'] = this.biaoqian; + data['jigou'] = this.jigou; + data['bianhao'] = this.bianhao; + data['faxingshijian'] = this.faxingshijian; + data['shuliang'] = this.shuliang; + data['zhuangtai'] = this.zhuangtai; + data['shijian'] = this.shijian; + data['tuijian'] = this.tuijian; + data['classname'] = this.classname; + if (this.biaoqianlist != null) { + data['biaoqianlist'] = this.biaoqianlist.map((v) => v.toJson()).toList(); + } + if (this.jigoulist != null) { + data['jigoulist'] = this.jigoulist.map((v) => v.toJson()).toList(); + } + data['renwunlist'] = this.renwunlist; + data['isgood'] = this.isgood; + data['img_src'] = this.imgSrc; + if (this.renwulist != null) { + data['renwulist'] = this.renwulist.map((v) => v.toJson()).toList(); + } + data['imgs'] = this.imgs; + return data; + } +} + +class Biaoqianlist { + dynamic id; + String name; + + Biaoqianlist({this.id, this.name}); + + Biaoqianlist.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/ClassEntity.dart b/untitled/lib/entity/ClassEntity.dart new file mode 100644 index 0000000..da72385 --- /dev/null +++ b/untitled/lib/entity/ClassEntity.dart @@ -0,0 +1,109 @@ +class ClassEntity { + int _status; + String _msg; + ClassResult _result; + + ClassEntity({int status, String msg, ClassResult result}) { + this._status = status; + this._msg = msg; + this._result = result; + } + + int get status => _status; + set status(int status) => _status = status; + String get msg => _msg; + set msg(String msg) => _msg = msg; + ClassResult get result => _result; + set result(ClassResult result) => _result = result; + + ClassEntity.fromJson(Map json) { + _status = json['status']; + _msg = json['msg']; + _result = + json['result'] != null ? new ClassResult.fromJson(json['result']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this._status; + data['msg'] = this._msg; + if (this._result != null) { + data['result'] = this._result.toJson(); + } + return data; + } +} + +class ClassResult { + List _principal; + List _additional; + + Result({List principal, List additional}) { + this._principal = principal; + this._additional = additional; + } + + List get principal => _principal; + set principal(List principal) => _principal = principal; + List get additional => _additional; + set additional(List additional) => _additional = additional; + + ClassResult.fromJson(Map json) { + if (json['principal'] != null) { + _principal = new List(); + json['principal'].forEach((v) { + _principal.add(new Principal.fromJson(v)); + }); + } + if (json['additional'] != null) { + _additional = new List(); + json['additional'].forEach((v) { + _additional.add(new Principal.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + if (this._principal != null) { + data['principal'] = this._principal.map((v) => v.toJson()).toList(); + } + if (this._additional != null) { + data['additional'] = this._additional.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Principal { + int _id; + String _title; + int _page; + + Principal({int id, String title, int page}) { + this._id = id; + this._title = title; + this._page = page; + } + + int get id => _id; + set id(int id) => _id = id; + String get title => _title; + set title(String title) => _title = title; + int get page => _page; + set page(int page) => _page = page; + + Principal.fromJson(Map json) { + _id = json['id']; + _title = json['title']; + _page = json['page']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this._id; + data['title'] = this._title; + data['page'] = this._page; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/ClassListEntity.dart b/untitled/lib/entity/ClassListEntity.dart new file mode 100644 index 0000000..283b5dc --- /dev/null +++ b/untitled/lib/entity/ClassListEntity.dart @@ -0,0 +1,77 @@ +import 'package:peach/entity/_.dart'; + +class ClassListEntity { + int status; + String msg; + ClassListResult result; + + ClassListEntity({this.status, this.msg, this.result}); + + ClassListEntity.fromJson(Map json) { + status = json['status']; + msg = json['msg']; + result = + json['result'] != null ? new ClassListResult.fromJson(json['result']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['msg'] = this.msg; + if (this.result != null) { + data['result'] = this.result.toJson(); + } + return data; + } +} + +class ClassListResult { + String group; + int currentPage; + int totalPage; + List data; + + ClassListResult({this.group, this.currentPage, this.totalPage, this.data}); + + ClassListResult.fromJson(Map json) { + group = json['group']; + currentPage = json['current_page']; + totalPage = json['total_page']; + if (json['data'] != null) { + data = new List(); + json['data'].forEach((v) { + data.add(new HomeEntityData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['group'] = this.group; + data['current_page'] = this.currentPage; + data['total_page'] = this.totalPage; + if (this.data != null) { + data['data'] = this.data.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ClassTags { + String title; + int id; + + ClassTags({this.title, this.id}); + + ClassTags.fromJson(Map json) { + title = json['title']; + id = json['id']; + } + + Map toJson() { + final Map data = new Map(); + data['title'] = this.title; + data['id'] = this.id; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/FreeUseEntity.dart b/untitled/lib/entity/FreeUseEntity.dart new file mode 100644 index 0000000..bbe59f8 --- /dev/null +++ b/untitled/lib/entity/FreeUseEntity.dart @@ -0,0 +1,32 @@ +class FreeUseEntity { + int _code; + String _error; + int _freeNumber; + + FreeUseEntity({int code, String error, int freeNumber}) { + this._code = code; + this._error = error; + this._freeNumber = freeNumber; + } + + int get code => _code; + set code(int code) => _code = code; + String get error => _error; + set error(String error) => _error = error; + int get freeNumber => _freeNumber; + set freeNumber(int freeNumber) => _freeNumber = freeNumber; + + FreeUseEntity.fromJson(Map json) { + _code = json['code']; + _error = json['error']; + _freeNumber = json['FreeNumber']; + } + + Map toJson() { + final Map data = new Map(); + data['code'] = this._code; + data['error'] = this._error; + data['FreeNumber'] = this._freeNumber; + return data; + } +} diff --git a/untitled/lib/entity/HomeEntity.dart b/untitled/lib/entity/HomeEntity.dart new file mode 100644 index 0000000..bf0def0 --- /dev/null +++ b/untitled/lib/entity/HomeEntity.dart @@ -0,0 +1,203 @@ +class HomeEntity { + int status; + String msg; + Result result; + + HomeEntity({this.status, this.msg, this.result}); + HomeEntity.fromJson(Map json) { + status = json['status']; + msg = json['msg']; + result = + json['result'] != null ? new Result.fromJson(json['result']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['msg'] = this.msg; + if (this.result != null) { + data['result'] = this.result.toJson(); + } + return data; + } +} + +class Result { + Recommended recommended; + Recommended newest; + Models model; + + Result({this.recommended, this.newest, this.model}); + + Result.fromJson(Map json) { + recommended = json['recommended'] != null + ? new Recommended.fromJson(json['recommended']) + : null; + newest = json['newest'] != null + ? new Recommended.fromJson(json['newest']) + : null; + model = json['model'] != null ? new Models.fromJson(json['model']) : null; + } + + Map toJson() { + final Map data = new Map(); + if (this.recommended != null) { + data['recommended'] = this.recommended.toJson(); + } + if (this.newest != null) { + data['newest'] = this.newest.toJson(); + } + if (this.model != null) { + data['model'] = this.model.toJson(); + } + return data; + } +} + +class Recommended { + String title; + List data; + + Recommended({this.title, this.data}); + + Recommended.fromJson(Map json) { + title = json['title']; + if (json['data'] != null) { + data = new List(); + json['data'].forEach((v) { + data.add(new HomeEntityData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['title'] = this.title; + if (this.data != null) { + data['data'] = this.data.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class HomeEntityData { + int id; + int total; + int totalPage; + String source; + String user; + List tags; + String title; + String preview; + + HomeEntityData( + {this.id, + this.total, + this.totalPage, + this.source, + this.user, + this.tags, + this.title, + this.preview}); + + HomeEntityData.fromJson(Map json) { + id = json['id']; + total = json['total']; + totalPage = json['total_page']; + source = json['source']; + user = json['user']; + if (json['tags'] != null) { + tags = new List(); + json['tags'].forEach((v) { + tags.add(new Tags.fromJson(v)); + }); + } + title = json['title']; + preview = json['preview']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['total'] = this.total; + data['total_page'] = this.totalPage; + data['source'] = this.source; + data['user'] = this.user; + if (this.tags != null) { + data['tags'] = this.tags.map((v) => v.toJson()).toList(); + } + data['title'] = this.title; + data['preview'] = this.preview; + return data; + } +} + +class Tags { + String title; + int id; + + Tags({this.title, this.id}); + + Tags.fromJson(Map json) { + title = json['title']; + id = json['id']; + } + + Map toJson() { + final Map data = new Map(); + data['title'] = this.title; + data['id'] = this.id; + return data; + } +} + +class Models { + String title; + List res; + + Models({this.title, this.res}); + + Models.fromJson(Map json) { + title = json['title']; + if (json['res'] != null) { + res = new List(); + json['res'].forEach((v) { + res.add(new Res.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['title'] = this.title; + if (this.res != null) { + data['res'] = this.res.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Res { + int id; + String title; + String total; + String preview; + + Res({this.id, this.title, this.total, this.preview}); + + Res.fromJson(Map json) { + id = json['id']; + title = json['title']; + total = json['total']; + preview = json['preview']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['total'] = this.total; + data['preview'] = this.preview; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/InfoEntity.dart b/untitled/lib/entity/InfoEntity.dart new file mode 100644 index 0000000..939bd16 --- /dev/null +++ b/untitled/lib/entity/InfoEntity.dart @@ -0,0 +1,116 @@ +import 'HomeEntity.dart'; + +class InfoEntity { + int status; + String msg; + InfoResult result; + + InfoEntity({this.status, this.msg, this.result}); + + InfoEntity.fromJson(Map json) { + status = json['status']; + msg = json['msg']; + result = + json['result'] != null ? new InfoResult.fromJson(json['result']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['msg'] = this.msg; + if (this.result != null) { + data['result'] = this.result.toJson(); + } + return data; + } +} + +class InfoResult { + String title; + String source; + String total; + String info; + int currentPage; + int totalPage; + List data; + List recommend; + List relevant; + + InfoResult( + {this.title, + this.source, + this.total, + this.info, + this.currentPage, + this.totalPage, + this.data, + this.recommend, + this.relevant}); + + InfoResult.fromJson(Map json) { + title = json['title']; + source = json['source']; + total = json['total']; + info = json['info']; + currentPage = json['current_page']; + totalPage = json['total_page']; + if (json['data'] != null) { + data = new List(); + json['data'].forEach((v) { + data.add(new Data.fromJson(v)); + }); + } + if (json['recommend'] != null) { + recommend = new List(); + json['recommend'].forEach((v) { + recommend.add(new HomeEntityData.fromJson(v)); + }); + } + if (json['relevant'] != null) { + relevant = new List(); + json['relevant'].forEach((v) { + relevant.add(new HomeEntityData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['title'] = this.title; + data['source'] = this.source; + data['total'] = this.total; + data['info'] = this.info; + data['current_page'] = this.currentPage; + data['total_page'] = this.totalPage; + if (this.data != null) { + data['data'] = this.data.map((v) => v.toJson()).toList(); + } + if (this.recommend != null) { + data['recommend'] = this.recommend.map((v) => v.toJson()).toList(); + } + if (this.relevant != null) { + data['relevant'] = this.relevant.map((v) => v.toJson()).toList(); + } + return data; + } +} + + +class Data { + String title; + String src; + + Data({this.title, this.src}); + + Data.fromJson(Map json) { + title = json['title']; + src = json['src']; + } + + Map toJson() { + final Map data = new Map(); + data['title'] = this.title; + data['src'] = this.src; + return data; + } +} diff --git a/untitled/lib/entity/LikeEntity.dart b/untitled/lib/entity/LikeEntity.dart new file mode 100644 index 0000000..197e1d4 --- /dev/null +++ b/untitled/lib/entity/LikeEntity.dart @@ -0,0 +1,51 @@ +import 'HomeEntity.dart'; + +class LikeEntity extends HomeEntityData { + int id; + String preview; + String source; + String title; + String totals; + String user; + + LikeEntity({this.id, this.preview, this.source, this.title, this.totals, this.user}); + + LikeEntity.fromJson(Map json) { + id = json['id']; + preview = json['preview']; + source = json['source']; + title = json['title']; + totals = json['totals']; + user = json['user']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['preview'] = this.preview; + data['source'] = this.source; + data['title'] = this.title; + data['totals'] = this.totals; + data['user'] = this.user; + return data; + } +} + +class SingleGraphEntity { + int id; + String src; + + SingleGraphEntity({this.id, this.src}); + + SingleGraphEntity.fromJson(Map json) { + id = json['id']; + src = json['src']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['src'] = this.src; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/LoginEntity.dart b/untitled/lib/entity/LoginEntity.dart new file mode 100644 index 0000000..3dc7e07 --- /dev/null +++ b/untitled/lib/entity/LoginEntity.dart @@ -0,0 +1,34 @@ +class LoginEntity { + int code; + String error; + String username; + String createdAt; + String objectId; + String userType; + String userWeiXin; + + + LoginEntity({this.code, this.error, this.username, this.createdAt, this.objectId, this.userType, this.userWeiXin}); + + LoginEntity.fromJson(Map json) { + code = json['code']; + error = json['error']; + username = json['username']; + createdAt = json['createdAt']; + objectId = json['objectId']; + userType = json['userType']; + userWeiXin = json['userWeiXin']; + } + + Map toJson() { + final Map data = new Map(); + data['code'] = this.code; + data['error'] = this.error; + data['username'] = this.username; + data['createdAt'] = this.createdAt; + data['objectId'] = this.objectId; + data['userType'] = this.userType; + data['userWeiXin'] = this.userWeiXin; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/MechanismEntity.dart b/untitled/lib/entity/MechanismEntity.dart new file mode 100644 index 0000000..a54dbd7 --- /dev/null +++ b/untitled/lib/entity/MechanismEntity.dart @@ -0,0 +1,50 @@ +class MechanismEntity { + int status; + String msg; + List result; + + MechanismEntity({this.status, this.msg, this.result}); + + MechanismEntity.fromJson(Map json) { + status = json['status']; + msg = json['msg']; + if (json['result'] != null) { + result = new List(); + json['result'].forEach((v) { + result.add(new MechanismResult.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['msg'] = this.msg; + if (this.result != null) { + data['result'] = this.result.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class MechanismResult { + int id; + String title; + String quantity; + + MechanismResult({this.id, this.title, this.quantity}); + + MechanismResult.fromJson(Map json) { + id = json['id']; + title = json['title']; + quantity = json['quantity']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['quantity'] = this.quantity; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/ModelEntity.dart b/untitled/lib/entity/ModelEntity.dart new file mode 100644 index 0000000..834ff37 --- /dev/null +++ b/untitled/lib/entity/ModelEntity.dart @@ -0,0 +1,84 @@ +import 'HomeEntity.dart'; + +class ModelEntity { + int status; + String msg; + ModelResult result; + + ModelEntity({this.status, this.msg, this.result}); + + ModelEntity.fromJson(Map json) { + status = json['status']; + msg = json['msg']; + result = + json['result'] != null ? new ModelResult.fromJson(json['result']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['msg'] = this.msg; + if (this.result != null) { + data['result'] = this.result.toJson(); + } + return data; + } +} + +class ModelResult { + List hotModels; + List newest; + + ModelResult({this.hotModels, this.newest}); + + ModelResult.fromJson(Map json) { + if (json['hot_models'] != null) { + hotModels = new List(); + json['hot_models'].forEach((v) { + hotModels.add(new Res.fromJson(v)); + }); + } + if (json['newest'] != null) { + newest = new List(); + json['newest'].forEach((v) { + newest.add(new Res.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + if (this.hotModels != null) { + data['hot_models'] = this.hotModels.map((v) => v.toJson()).toList(); + } + if (this.newest != null) { + data['newest'] = this.newest.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class HotModels { + int id; + String title; + String total; + String preview; + + HotModels({this.id, this.title, this.total, this.preview}); + + HotModels.fromJson(Map json) { + id = json['id']; + title = json['title']; + total = json['total']; + preview = json['preview']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['total'] = this.total; + data['preview'] = this.preview; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/ModelInfoEntity.dart b/untitled/lib/entity/ModelInfoEntity.dart new file mode 100644 index 0000000..41f183d --- /dev/null +++ b/untitled/lib/entity/ModelInfoEntity.dart @@ -0,0 +1,102 @@ +import 'HomeEntity.dart'; + +class ModelInfoEntity { + int status; + String msg; + ModelInfoResult result; + + ModelInfoEntity({this.status, this.msg, this.result}); + + ModelInfoEntity.fromJson(Map json) { + status = json['status']; + msg = json['msg']; + result = + json['result'] != null ? new ModelInfoResult.fromJson(json['result']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['msg'] = this.msg; + if (this.result != null) { + data['result'] = this.result.toJson(); + } + return data; + } +} + +class ModelInfoResult { + int currentPage; + int totalPage; + ModelInfo modelInfo; + List data; + List similar; + + ModelInfoResult( + {this.currentPage, + this.totalPage, + this.modelInfo, + this.data, + this.similar}); + + ModelInfoResult.fromJson(Map json) { + currentPage = json['current_page']; + totalPage = json['total_page']; + modelInfo = json['model_info'] != null + ? new ModelInfo.fromJson(json['model_info']) + : null; + if (json['data'] != null) { + data = new List(); + json['data'].forEach((v) { + data.add(new HomeEntityData.fromJson(v)); + }); + } + if (json['similar'] != null) { + similar = new List(); + json['similar'].forEach((v) { + similar.add(new Res.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['current_page'] = this.currentPage; + data['total_page'] = this.totalPage; + if (this.modelInfo != null) { + data['model_info'] = this.modelInfo.toJson(); + } + if (this.data != null) { + data['data'] = this.data.map((v) => v.toJson()).toList(); + } + if (this.similar != null) { + data['similar'] = this.similar.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ModelInfo { + String portrait; + String name; + String explain; + String total; + + ModelInfo({this.portrait, this.name, this.explain, this.total}); + + ModelInfo.fromJson(Map json) { + portrait = json['portrait']; + name = json['name']; + explain = json['explain']; + total = json['total']; + } + + Map toJson() { + final Map data = new Map(); + data['portrait'] = this.portrait; + data['name'] = this.name; + data['explain'] = this.explain; + data['total'] = this.total; + return data; + } +} diff --git a/untitled/lib/entity/RegisterEntity.dart b/untitled/lib/entity/RegisterEntity.dart new file mode 100644 index 0000000..6eecec7 --- /dev/null +++ b/untitled/lib/entity/RegisterEntity.dart @@ -0,0 +1,38 @@ +class RegisterEntity { + int _code; + String _error; + String _createdAt; + String _objectId; + + RegisterEntity({int code, String error, String createdAt, String objectId}) { + this._code = code; + this._error = error; + this._createdAt = createdAt; + this._objectId = objectId; + } + + int get code => _code; + set code(int code) => _code = code; + String get error => _error; + set error(String error) => _error = error; + String get createdAt => _createdAt; + set createdAt(String createdAt) => _createdAt = createdAt; + String get objectId => _objectId; + set objectId(String objectId) => _objectId = objectId; + + RegisterEntity.fromJson(Map json) { + _code = json['code']; + _error = json['error']; + _createdAt = json['createdAt']; + _objectId = json['objectId']; + } + + Map toJson() { + final Map data = new Map(); + data['code'] = this._code; + data['error'] = this._error; + data['createdAt'] = this._createdAt; + data['objectId'] = this._objectId; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/entity/SearchEntity.dart b/untitled/lib/entity/SearchEntity.dart new file mode 100644 index 0000000..c6c7a80 --- /dev/null +++ b/untitled/lib/entity/SearchEntity.dart @@ -0,0 +1,28 @@ +import 'AgentClassListEntity.dart'; + +class SearchEntity { + int status; + List data; + + SearchEntity({this.status, this.data}); + + SearchEntity.fromJson(Map json) { + status = json['status']; + if (json['data'] != null) { + data = new List(); + json['data'].forEach((v) { + data.add(new ItemList.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + if (this.data != null) { + data['data'] = this.data.map((v) => v.toJson()).toList(); + } + return data; + } + +} \ No newline at end of file diff --git a/untitled/lib/entity/UpdateVersionEntity.dart b/untitled/lib/entity/UpdateVersionEntity.dart new file mode 100644 index 0000000..fdc6f1a --- /dev/null +++ b/untitled/lib/entity/UpdateVersionEntity.dart @@ -0,0 +1,40 @@ +class UpdateVersionEntity { + String createdAt; + String downUrl; + String objectId; + List updateMsg; + String updatedAt; + String version; + int versionCode; + + UpdateVersionEntity( + {this.createdAt, + this.downUrl, + this.objectId, + this.updateMsg, + this.updatedAt, + this.version, + this.versionCode}); + + UpdateVersionEntity.fromJson(Map json) { + createdAt = json['createdAt']; + downUrl = json['downUrl']; + objectId = json['objectId']; + updateMsg = json['updateMsg'].cast(); + updatedAt = json['updatedAt']; + version = json['version']; + versionCode = json['versionCode']; + } + + Map toJson() { + final Map data = new Map(); + data['createdAt'] = this.createdAt; + data['downUrl'] = this.downUrl; + data['objectId'] = this.objectId; + data['updateMsg'] = this.updateMsg; + data['updatedAt'] = this.updatedAt; + data['version'] = this.version; + data['versionCode'] = this.versionCode; + return data; + } +} diff --git a/untitled/lib/entity/VideoListEntity.dart b/untitled/lib/entity/VideoListEntity.dart new file mode 100644 index 0000000..b321619 --- /dev/null +++ b/untitled/lib/entity/VideoListEntity.dart @@ -0,0 +1,418 @@ +class VideoListEntity { + int _result; + String _llsid; + String _webPageArea; + List _feeds; + Null _hostName; + String _pcursor; + String _sTypename; + + VideoListEntity( + {int result, + String llsid, + String webPageArea, + List feeds, + Null hostName, + String pcursor, + String sTypename}) { + this._result = result; + this._llsid = llsid; + this._webPageArea = webPageArea; + this._feeds = feeds; + this._hostName = hostName; + this._pcursor = pcursor; + this._sTypename = sTypename; + } + + int get result => _result; + set result(int result) => _result = result; + String get llsid => _llsid; + set llsid(String llsid) => _llsid = llsid; + String get webPageArea => _webPageArea; + set webPageArea(String webPageArea) => _webPageArea = webPageArea; + List get feeds => _feeds; + set feeds(List feeds) => _feeds = feeds; + Null get hostName => _hostName; + set hostName(Null hostName) => _hostName = hostName; + String get pcursor => _pcursor; + set pcursor(String pcursor) => _pcursor = pcursor; + String get sTypename => _sTypename; + set sTypename(String sTypename) => _sTypename = sTypename; + + VideoListEntity.fromJson(Map json) { + _result = json['result']; + _llsid = json['llsid']; + _webPageArea = json['webPageArea']; + if (json['feeds'] != null) { + _feeds = new List(); + json['feeds'].forEach((v) { + _feeds.add(new Feeds.fromJson(v)); + }); + } + _hostName = json['hostName']; + _pcursor = json['pcursor']; + _sTypename = json['__typename']; + } + + Map toJson() { + final Map data = new Map(); + data['result'] = this._result; + data['llsid'] = this._llsid; + data['webPageArea'] = this._webPageArea; + if (this._feeds != null) { + data['feeds'] = this._feeds.map((v) => v.toJson()).toList(); + } + data['hostName'] = this._hostName; + data['pcursor'] = this._pcursor; + data['__typename'] = this._sTypename; + return data; + } +} + +class Feeds { + int _type; + Author _author; + List _tag; + Photo _photo; + int _canAddComment; + String _currentPcursor; + String _llsid; + int _status; + String _sTypename; + + Feeds( + {int type, + Author author, + List tag, + Photo photo, + int canAddComment, + String currentPcursor, + String llsid, + int status, + String sTypename}) { + this._type = type; + this._author = author; + this._tag = tag; + this._photo = photo; + this._canAddComment = canAddComment; + this._currentPcursor = currentPcursor; + this._llsid = llsid; + this._status = status; + this._sTypename = sTypename; + } + + int get type => _type; + set type(int type) => _type = type; + Author get author => _author; + set author(Author author) => _author = author; + List get tag => _tag; + set tag(List tag) => _tag = tag; + Photo get photo => _photo; + set photo(Photo photo) => _photo = photo; + int get canAddComment => _canAddComment; + set canAddComment(int canAddComment) => _canAddComment = canAddComment; + String get currentPcursor => _currentPcursor; + set currentPcursor(String currentPcursor) => _currentPcursor = currentPcursor; + String get llsid => _llsid; + set llsid(String llsid) => _llsid = llsid; + int get status => _status; + set status(int status) => _status = status; + String get sTypename => _sTypename; + set sTypename(String sTypename) => _sTypename = sTypename; + + Feeds.fromJson(Map json) { + _type = json['type']; + _author = + json['author'] != null ? new Author.fromJson(json['author']) : null; + if (json['tag'] != null) { + _tag = new List(); + json['tag'].forEach((v) { + _tag.add(new Tag.fromJson(v)); + }); + } + _photo = json['photo'] != null ? new Photo.fromJson(json['photo']) : null; + _canAddComment = json['canAddComment']; + _currentPcursor = json['currentPcursor']; + _llsid = json['llsid']; + _status = json['status']; + _sTypename = json['__typename']; + } + + Map toJson() { + final Map data = new Map(); + data['type'] = this._type; + if (this._author != null) { + data['author'] = this._author.toJson(); + } + if (this._tag != null) { + data['tag'] = this._tag.map((v) => v.toJson()).toList(); + } + if (this._photo != null) { + data['photo'] = this._photo.toJson(); + } + data['canAddComment'] = this._canAddComment; + data['currentPcursor'] = this._currentPcursor; + data['llsid'] = this._llsid; + data['status'] = this._status; + data['__typename'] = this._sTypename; + return data; + } +} + +class Author { + String _id; + String _name; + bool _following; + String _headerUrl; + Null _headerUrls; + String _sTypename; + + Author( + {String id, + String name, + bool following, + String headerUrl, + Null headerUrls, + String sTypename}) { + this._id = id; + this._name = name; + this._following = following; + this._headerUrl = headerUrl; + this._headerUrls = headerUrls; + this._sTypename = sTypename; + } + + String get id => _id; + set id(String id) => _id = id; + String get name => _name; + set name(String name) => _name = name; + bool get following => _following; + set following(bool following) => _following = following; + String get headerUrl => _headerUrl; + set headerUrl(String headerUrl) => _headerUrl = headerUrl; + Null get headerUrls => _headerUrls; + set headerUrls(Null headerUrls) => _headerUrls = headerUrls; + String get sTypename => _sTypename; + set sTypename(String sTypename) => _sTypename = sTypename; + + Author.fromJson(Map json) { + _id = json['id']; + _name = json['name']; + _following = json['following']; + _headerUrl = json['headerUrl']; + _headerUrls = json['headerUrls']; + _sTypename = json['__typename']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this._id; + data['name'] = this._name; + data['following'] = this._following; + data['headerUrl'] = this._headerUrl; + data['headerUrls'] = this._headerUrls; + data['__typename'] = this._sTypename; + return data; + } +} + +class Tag { + int _type; + String _name; + String _sTypename; + + Tag({int type, String name, String sTypename}) { + this._type = type; + this._name = name; + this._sTypename = sTypename; + } + + int get type => _type; + set type(int type) => _type = type; + String get name => _name; + set name(String name) => _name = name; + String get sTypename => _sTypename; + set sTypename(String sTypename) => _sTypename = sTypename; + + Tag.fromJson(Map json) { + _type = json['type']; + _name = json['name']; + _sTypename = json['__typename']; + } + + Map toJson() { + final Map data = new Map(); + data['type'] = this._type; + data['name'] = this._name; + data['__typename'] = this._sTypename; + return data; + } +} + +class Photo { + String _id; + int _duration; + String _caption; + String _likeCount; + int _realLikeCount; + String _coverUrl; + Null _coverUrls; + List _photoUrls; + String _photoUrl; + bool _liked; + int _timestamp; + String _expTag; + String _animatedCoverUrl; + int _stereoType; + double _videoRatio; + String _sTypename; + + Photo( + {String id, + int duration, + String caption, + String likeCount, + int realLikeCount, + String coverUrl, + Null coverUrls, + List photoUrls, + String photoUrl, + bool liked, + int timestamp, + String expTag, + String animatedCoverUrl, + int stereoType, + double videoRatio, + String sTypename}) { + this._id = id; + this._duration = duration; + this._caption = caption; + this._likeCount = likeCount; + this._realLikeCount = realLikeCount; + this._coverUrl = coverUrl; + this._coverUrls = coverUrls; + this._photoUrls = photoUrls; + this._photoUrl = photoUrl; + this._liked = liked; + this._timestamp = timestamp; + this._expTag = expTag; + this._animatedCoverUrl = animatedCoverUrl; + this._stereoType = stereoType; + this._videoRatio = videoRatio; + this._sTypename = sTypename; + } + + String get id => _id; + set id(String id) => _id = id; + int get duration => _duration; + set duration(int duration) => _duration = duration; + String get caption => _caption; + set caption(String caption) => _caption = caption; + String get likeCount => _likeCount; + set likeCount(String likeCount) => _likeCount = likeCount; + int get realLikeCount => _realLikeCount; + set realLikeCount(int realLikeCount) => _realLikeCount = realLikeCount; + String get coverUrl => _coverUrl; + set coverUrl(String coverUrl) => _coverUrl = coverUrl; + Null get coverUrls => _coverUrls; + set coverUrls(Null coverUrls) => _coverUrls = coverUrls; + List get photoUrls => _photoUrls; + set photoUrls(List photoUrls) => _photoUrls = photoUrls; + String get photoUrl => _photoUrl; + set photoUrl(String photoUrl) => _photoUrl = photoUrl; + bool get liked => _liked; + set liked(bool liked) => _liked = liked; + int get timestamp => _timestamp; + set timestamp(int timestamp) => _timestamp = timestamp; + String get expTag => _expTag; + set expTag(String expTag) => _expTag = expTag; + String get animatedCoverUrl => _animatedCoverUrl; + set animatedCoverUrl(String animatedCoverUrl) => + _animatedCoverUrl = animatedCoverUrl; + int get stereoType => _stereoType; + set stereoType(int stereoType) => _stereoType = stereoType; + double get videoRatio => _videoRatio; + set videoRatio(double videoRatio) => _videoRatio = videoRatio; + String get sTypename => _sTypename; + set sTypename(String sTypename) => _sTypename = sTypename; + + Photo.fromJson(Map json) { + _id = json['id']; + _duration = json['duration']; + _caption = json['caption']; + _likeCount = json['likeCount']; + _realLikeCount = json['realLikeCount']; + _coverUrl = json['coverUrl']; + _coverUrls = json['coverUrls']; + if (json['photoUrls'] != null) { + _photoUrls = new List(); + json['photoUrls'].forEach((v) { + _photoUrls.add(new PhotoUrls.fromJson(v)); + }); + } + _photoUrl = json['photoUrl']; + _liked = json['liked']; + _timestamp = json['timestamp']; + _expTag = json['expTag']; + _animatedCoverUrl = json['animatedCoverUrl']; + _stereoType = json['stereoType']; + _videoRatio = json['videoRatio']; + _sTypename = json['__typename']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this._id; + data['duration'] = this._duration; + data['caption'] = this._caption; + data['likeCount'] = this._likeCount; + data['realLikeCount'] = this._realLikeCount; + data['coverUrl'] = this._coverUrl; + data['coverUrls'] = this._coverUrls; + if (this._photoUrls != null) { + data['photoUrls'] = this._photoUrls.map((v) => v.toJson()).toList(); + } + data['photoUrl'] = this._photoUrl; + data['liked'] = this._liked; + data['timestamp'] = this._timestamp; + data['expTag'] = this._expTag; + data['animatedCoverUrl'] = this._animatedCoverUrl; + data['stereoType'] = this._stereoType; + data['videoRatio'] = this._videoRatio; + data['__typename'] = this._sTypename; + return data; + } +} + +class PhotoUrls { + String _cdn; + String _url; + String _sTypename; + + PhotoUrls({String cdn, String url, String sTypename}) { + this._cdn = cdn; + this._url = url; + this._sTypename = sTypename; + } + + String get cdn => _cdn; + set cdn(String cdn) => _cdn = cdn; + String get url => _url; + set url(String url) => _url = url; + String get sTypename => _sTypename; + set sTypename(String sTypename) => _sTypename = sTypename; + + PhotoUrls.fromJson(Map json) { + _cdn = json['cdn']; + _url = json['url']; + _sTypename = json['__typename']; + } + + Map toJson() { + final Map data = new Map(); + data['cdn'] = this._cdn; + data['url'] = this._url; + data['__typename'] = this._sTypename; + return data; + } +} diff --git a/untitled/lib/entity/_.dart b/untitled/lib/entity/_.dart new file mode 100644 index 0000000..bfccc8c --- /dev/null +++ b/untitled/lib/entity/_.dart @@ -0,0 +1,19 @@ +library entity; + +export 'HomeEntity.dart'; +export 'InfoEntity.dart'; +export 'ClassListEntity.dart'; +export 'ClassEntity.dart'; +export 'MechanismEntity.dart'; +export 'ModelEntity.dart'; +export 'LikeEntity.dart'; +export 'ModelInfoEntity.dart'; +export 'AgentInfoEntity.dart'; +export 'AgentClassListEntity.dart'; +export 'UpdateVersionEntity.dart'; +export 'SearchEntity.dart'; +export 'VideoListEntity.dart'; +export 'LoginEntity.dart'; +export 'RegisterEntity.dart'; +export 'FreeUseEntity.dart'; +export 'orderStatusEntity.dart'; \ No newline at end of file diff --git a/untitled/lib/entity/orderStatusEntity.dart b/untitled/lib/entity/orderStatusEntity.dart new file mode 100644 index 0000000..5fcfd7f --- /dev/null +++ b/untitled/lib/entity/orderStatusEntity.dart @@ -0,0 +1,110 @@ +class orderStatusEntity { + int _code; + String _error; + List _arr; + + orderStatusEntity({int code, String error, List arr}) { + this._code = code; + this._error = error; + this._arr = arr; + } + + int get code => _code; + set code(int code) => _code = code; + String get error => _error; + set error(String error) => _error = error; + List get arr => _arr; + set arr(List arr) => _arr = arr; + + orderStatusEntity.fromJson(Map json) { + _code = json['code']; + _error = json['error']; + if (json['arr'] != null) { + _arr = new List(); + json['arr'].forEach((v) { + _arr.add(new Arr.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['code'] = this._code; + data['error'] = this._error; + if (this._arr != null) { + data['arr'] = this._arr.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Arr { + String _activateStatus; + String _createdAt; + String _objectId; + String _orderNumber; + String _superiorWeixin; + String _updatedAt; + String _userObjectId; + String _vipLevel; + + Arr( + {String activateStatus, + String createdAt, + String objectId, + String orderNumber, + String superiorWeixin, + String updatedAt, + String userObjectId, + String vipLevel}) { + this._activateStatus = activateStatus; + this._createdAt = createdAt; + this._objectId = objectId; + this._orderNumber = orderNumber; + this._superiorWeixin = superiorWeixin; + this._updatedAt = updatedAt; + this._userObjectId = userObjectId; + this._vipLevel = vipLevel; + } + + String get activateStatus => _activateStatus; + set activateStatus(String activateStatus) => _activateStatus = activateStatus; + String get createdAt => _createdAt; + set createdAt(String createdAt) => _createdAt = createdAt; + String get objectId => _objectId; + set objectId(String objectId) => _objectId = objectId; + String get orderNumber => _orderNumber; + set orderNumber(String orderNumber) => _orderNumber = orderNumber; + String get superiorWeixin => _superiorWeixin; + set superiorWeixin(String superiorWeixin) => _superiorWeixin = superiorWeixin; + String get updatedAt => _updatedAt; + set updatedAt(String updatedAt) => _updatedAt = updatedAt; + String get userObjectId => _userObjectId; + set userObjectId(String userObjectId) => _userObjectId = userObjectId; + String get vipLevel => _vipLevel; + set vipLevel(String vipLevel) => _vipLevel = vipLevel; + + Arr.fromJson(Map json) { + _activateStatus = json['activateStatus']; + _createdAt = json['createdAt']; + _objectId = json['objectId']; + _orderNumber = json['orderNumber']; + _superiorWeixin = json['superiorWeixin']; + _updatedAt = json['updatedAt']; + _userObjectId = json['userObjectId']; + _vipLevel = json['vipLevel']; + } + + Map toJson() { + final Map data = new Map(); + data['activateStatus'] = this._activateStatus; + data['createdAt'] = this._createdAt; + data['objectId'] = this._objectId; + data['orderNumber'] = this._orderNumber; + data['superiorWeixin'] = this._superiorWeixin; + data['updatedAt'] = this._updatedAt; + data['userObjectId'] = this._userObjectId; + data['vipLevel'] = this._vipLevel; + return data; + } +} \ No newline at end of file diff --git a/untitled/lib/event/.pydio b/untitled/lib/event/.pydio new file mode 100644 index 0000000..f9c5dc8 --- /dev/null +++ b/untitled/lib/event/.pydio @@ -0,0 +1 @@ +0c3c1fdf-d565-4af5-a1d0-eb4e01b9a5b9 \ No newline at end of file diff --git a/untitled/lib/event/ClassEditEvent.dart b/untitled/lib/event/ClassEditEvent.dart new file mode 100644 index 0000000..0cf6fe2 --- /dev/null +++ b/untitled/lib/event/ClassEditEvent.dart @@ -0,0 +1,4 @@ +class ClassEditEvent { + bool update; + ClassEditEvent(this.update); +} \ No newline at end of file diff --git a/untitled/lib/event/_.dart b/untitled/lib/event/_.dart new file mode 100644 index 0000000..b7ec68d --- /dev/null +++ b/untitled/lib/event/_.dart @@ -0,0 +1,3 @@ +library event; + +export 'ClassEditEvent.dart'; \ No newline at end of file diff --git a/untitled/lib/http/.pydio b/untitled/lib/http/.pydio new file mode 100644 index 0000000..e321820 --- /dev/null +++ b/untitled/lib/http/.pydio @@ -0,0 +1 @@ +e8aca102-28d2-4562-a27e-b7fa6475de4d \ No newline at end of file diff --git a/untitled/lib/http/Dio.dart b/untitled/lib/http/Dio.dart new file mode 100644 index 0000000..150a309 --- /dev/null +++ b/untitled/lib/http/Dio.dart @@ -0,0 +1,68 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:peach/config/_.dart'; + +/// 单例模式封装 dio +class HttpApi { + Dio _Dio; + static HttpApi _instance = HttpApi.instance(); + factory HttpApi() => _instance; + + HttpApi.instance() { + if (null == _Dio) { + BaseOptions options = new BaseOptions( + baseUrl: Config.ApiUrl['PhotoBaseUrl'], + connectTimeout: 30000, + contentType: 'application/json; charset=utf-8', + responseType: ResponseType.json, + ); + + _Dio = new Dio(options); + _Dio.interceptors.add(InterceptorsWrapper(onRequest: (RequestOptions options) { + // 请求拦截器 + return options; + },onResponse: (Response response) { + // 响应拦截器 + return response; + },onError: (DioError e) { + + print("网络请求出现错误 ====== ${e.message}"); + // 错误拦截器 + return e; + })); + } + } + + /// GET 请求 + Future get({@required String url, Options options, dynamic params}) async { + SetBaseUrl(url); + Response res = await _Dio.get(url, queryParameters: params, options: options); + return res.data; + } + + /// POST 请求 + Future post({@required String url, Options options, dynamic params}) async { + SetBaseUrl(url); + Response res = await _Dio.post(url, data: params, options: options); + return res.data; + } + + void SetBaseUrl(String url) { + if (url == "/likeList") { + _Dio.options.baseUrl = Config.ApiUrl['VideoBaseUrl']; + } else { + _Dio.options.baseUrl = Config.ApiUrl['PhotoBaseUrl']; + } + } + + /// 下载文件 + Future downloadFile(String urlPath, String savePath, { ProgressCallback onReceiveProgress }) async { + Response response = await _Dio.download( + urlPath, + savePath, + onReceiveProgress: onReceiveProgress, + options: Options(sendTimeout: 25000, receiveTimeout: 25000)); + return response; + } + +} diff --git a/untitled/lib/main.dart b/untitled/lib/main.dart new file mode 100644 index 0000000..8302ee2 --- /dev/null +++ b/untitled/lib/main.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:peach/router/AppRouter.dart'; +import 'package:peach/Configure.dart'; +/* + * 程序的核心入口 + */ +void main() async { + await Configure.init(); + runApp(ModularApp(module: AppRouter())); +} diff --git a/untitled/lib/router/.pydio b/untitled/lib/router/.pydio new file mode 100644 index 0000000..e94f396 --- /dev/null +++ b/untitled/lib/router/.pydio @@ -0,0 +1 @@ +20417602-3855-4ff6-ab44-b3fb62c8fd5b \ No newline at end of file diff --git a/untitled/lib/router/AppNode.dart b/untitled/lib/router/AppNode.dart new file mode 100644 index 0000000..832f986 --- /dev/null +++ b/untitled/lib/router/AppNode.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +/* + * 根组件 + */ +class AppNode extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ScreenUtilInit( + designSize: Size(375, 667), + allowFontScaling: false, + child: MaterialApp( + initialRoute: "/", + navigatorKey: Modular.navigatorKey, + onGenerateRoute: Modular.generateRoute, + debugShowCheckedModeBanner: false, + ), + ); + } +} \ No newline at end of file diff --git a/untitled/lib/router/AppRouter.dart b/untitled/lib/router/AppRouter.dart new file mode 100644 index 0000000..0be09cd --- /dev/null +++ b/untitled/lib/router/AppRouter.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:peach/router/AppNode.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/views/User/AgentRegister.dart'; + +import 'package:peach/views/Welcome.dart'; +import 'package:peach/views/Details/index.dart'; +import 'package:peach/views/App.dart'; + +import 'package:peach/views/Me/Like.dart'; +import 'package:peach/views/Me/Agreement.dart'; +import 'package:peach/views/Me/Recently.dart'; +import 'package:peach/views/Me/SingleGraph.dart'; +import 'package:peach/views/Me/About.dart'; +import 'package:peach/views/Me/Vip/Vip.dart'; +import 'package:peach/views/Me/Vip/BuyStatus.dart'; + +import 'package:peach/views/Me/Agent.dart'; +import 'package:peach/views/Me/Video/Video.dart'; +// import 'package:peach/views/Me/Video/VideoDetails.dart'; + +import 'package:peach/views/Home/Edit.dart'; +import 'package:peach/views/Home/Search.dart'; + +import 'package:peach/views/Model/ModelInfo.dart'; +import 'package:peach/views/Mechanism/MechanismList.dart'; + +import 'package:peach/views/User/Login.dart'; +import 'package:peach/views/User/Register.dart'; +import 'package:peach/views/User/AgentRegister.dart'; +/* + * 路由配置 + */ +class AppRouter extends MainModule { + + @override + List get binds => []; + + @override + List get routers => [ + ModularRouter('/', child: (_, __) => Config.isFirstOpen ? Welcome() : Config.isLogin ? Login() : App(), + transition: TransitionType.fadeIn, + ), + ModularRouter('/init', child: (_, __) => App(), transition: TransitionType.fadeIn,), + ModularRouter('/like', child: (_, __) => Like(), transition: TransitionType.fadeIn,), + ModularRouter('/edit', child: (_, __) => Edit(), transition: TransitionType.fadeIn,), + ModularRouter('/agreement', child: (_, __) => Agreement(), transition: TransitionType.fadeIn,), + ModularRouter('/about', child: (_, __) => About(), transition: TransitionType.fadeIn,), + ModularRouter('/video', child: (_, __) => Video(), transition: TransitionType.fadeIn,), + ModularRouter('/singlegraph', child: (_, __) => SingleGraph(), transition: TransitionType.fadeIn,), + ModularRouter('/recently', child: (_, __) => Recently(), transition: TransitionType.fadeIn,), + ModularRouter('/search', child: (_, __) => Search(), transition: TransitionType.fadeIn,), + ModularRouter('/login', child: (_, __) => Login(), transition: TransitionType.fadeIn,), + ModularRouter('/reg', child: (_, __) => Register(), transition: TransitionType.fadeIn,), + ModularRouter('/vip', child: (_, __) => Vip(), transition: TransitionType.fadeIn,), + ModularRouter('/status', child: (_, __) => BuyStatus(), transition: TransitionType.fadeIn,), + ModularRouter('/agent', child: (_, __) => Agent(), transition: TransitionType.fadeIn,), + ModularRouter('/agentReg', child: (_, __) => AgentRegister(), transition: TransitionType.fadeIn,), + // ModularRouter('/videoDetails/:title/:mp4/:m3u8/:gif', child: (_, args) => VideoDetails( + // title: args.params['title'], + // mp4: args.params['mp4'], + // m3u8: args.params['m3u8'], + // gif: args.params['gif'], + // ), transition: TransitionType.fadeIn,), + + ModularRouter('/modelInfo/:id/:title', child: (_, args) => ModelInfo( + id: args.params['id'], + title: args.params['title'], + ), transition: TransitionType.fadeIn,), + + ModularRouter('/mechanismList/:id/:title/:type', child: (_, args) => MechanismList( + id: args.params['id'], + title: args.params['title'], + type: args.params['type'] + ), transition: TransitionType.fadeIn,), + + ModularRouter('/details/:id', child: (_, args) => DetailsIndex( + id: args.params['id'] + ), transition: TransitionType.fadeIn, + ), + ]; + + @override + Widget get bootstrap => AppNode(); +} \ No newline at end of file diff --git a/untitled/lib/service/.pydio b/untitled/lib/service/.pydio new file mode 100644 index 0000000..963440a --- /dev/null +++ b/untitled/lib/service/.pydio @@ -0,0 +1 @@ +00f50071-d360-4bcc-aaeb-8c1a183444f7 \ No newline at end of file diff --git a/untitled/lib/service/ClassService.dart b/untitled/lib/service/ClassService.dart new file mode 100644 index 0000000..a6c86d8 --- /dev/null +++ b/untitled/lib/service/ClassService.dart @@ -0,0 +1,48 @@ +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/db/SQLite.dart'; +import 'package:peach/service/_.dart'; + +class ClassService { + + static String tableNamePrincipal = "Principal"; // 默认菜单 + static String tableNameAdditional = "Additional";// 可选菜单 + + /// 向指定表插入List数据 + static Future addList(String tableName, List res) async { + List> data = await ClassService.findAll(tableName); + // 如果表中没有数据,执行插入 + if (data.isEmpty) { + var _db = await SQLite().db; + res.forEach((e) async { + await _db.insert(tableName, e.toJson()); + }); + } + } + + /// 查询指定表中菜单数据 + static Future>> findAll(String tableName) async { + var _db = await await SQLite().db; + List> result = await _db.query(tableName, orderBy: "id DESC"); + return result.isNotEmpty + ? result + : []; + } + + /// 添加菜单到指定表 + static Future add({ String tableName , Principal item }) async { + var _db = await SQLite().db; + return await _db.insert(tableName, item.toJson()); + } + + /// 从指定表删除菜单 + static Future delete({ String tableName , Principal item }) async { + var _db = await await SQLite().db; + return await _db.delete( + tableName, + where: 'id = ?', + whereArgs: [item.id] + ); + } + +} diff --git a/untitled/lib/service/DownloadService.dart b/untitled/lib/service/DownloadService.dart new file mode 100644 index 0000000..8ed24ff --- /dev/null +++ b/untitled/lib/service/DownloadService.dart @@ -0,0 +1,14 @@ +import 'package:dio/dio.dart'; +import 'package:peach/http/Dio.dart'; + +class DownloadService { + + /// 下载图片 + static Future downImage({ String url, Map params}) async { + return await HttpApi().get( + url: url, + params: params, + options: Options(responseType: ResponseType.bytes) + ); + } +} diff --git a/untitled/lib/service/HomeService.dart b/untitled/lib/service/HomeService.dart new file mode 100644 index 0000000..13102f2 --- /dev/null +++ b/untitled/lib/service/HomeService.dart @@ -0,0 +1,105 @@ +import 'package:peach/config/_.dart'; +import 'package:peach/http/Dio.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/ClassService.dart'; + +class HomeService { + + /// 获取分类菜单 + static Future GetClassData({ Map params }) async { + List> a = await ClassService.findAll("Principal"); + + // 如果数据库有数据,那么直接返回数据库的数据 + if (a.isNotEmpty) { + print("如果数据库有分类的数据,那么直接"); + List> b = await ClassService.findAll("Additional"); + return ClassResult.fromJson({ + 'principal': a, + 'additional': b, + }); + // 没有数据调接口请求新的分类 + } else { + print("如果数据库没有分类的数据,那么掉接口"); + var res = await HttpApi().get( + url: Config.ApiUrl['ApiList']['class'], + params: params + ); + var resJson = ClassEntity.fromJson(res).result; + resJson.principal.forEach((v) { + print("principal =============== ${v.id}"); + }); + + resJson.additional.forEach((v) { + print("additional ++++++++++++++++++ ${v.id}"); + }); + await ClassService.addList("Principal",resJson.principal); + await ClassService.addList("Additional",resJson.additional); + return resJson; + } + } + + /// 获取分类下的数据列表 + static Future GetClassListData({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['agentClassList'], + params: params + ); + return AgentClassListEntity.fromJson(res).data; + } + + /// 获取详情页数据 + static Future GetInfoData({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['agentInfo'], + params: params + ); + return AgentInfoEntity.fromJson(res).data; + } + + /// 获取首页数据 + static Future GetHomeData({ Map params }) async { + var res = await HttpApi().get( + url: Config.ApiUrl['ApiList']['index'], + params: params + ); + return HomeEntity.fromJson(res).result; + } + + /// App更新接口 + static Future update({ Map params }) async { + var res = await HttpApi().get( + url: Config.ApiUrl['ApiList']['update'], + params: params + ); + return UpdateVersionEntity.fromJson(res); + } + + + static Future GetRecently({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['agentRecently'], + params: params + ); + return AgentClassListEntity.fromJson(res).data; + } + + /// 获取搜索的数据 + static Future> GetSearchData({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['agentSearch'], + params: params + ); + return SearchEntity.fromJson(res).data; + } + + // 获取随机数据 + static Future GetAgentRandom({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['agentRandom'], + params: params + ); + return AgentClassListEntity.fromJson(res).data; + } + + +} diff --git a/untitled/lib/service/LikeService.dart b/untitled/lib/service/LikeService.dart new file mode 100644 index 0000000..ef78a42 --- /dev/null +++ b/untitled/lib/service/LikeService.dart @@ -0,0 +1,93 @@ +import 'package:peach/entity/_.dart'; +import 'package:peach/db/SQLite.dart'; + +class LikeService { + + static String TableName = "Like"; + static String tabsNameSingleGraph = "SingleGraph"; + + ///====================== 写真收藏 ======================/// + + /// 添加喜欢 + static Future addLike(LikeEntity user) async { + var _db = await SQLite().db; + return await _db.insert(LikeService.TableName, user.toJson()); + } + + /// 查询所有喜欢数据 + static Future> findAll() async { + var _db = await await SQLite().db; + List> result = await _db.query(LikeService.TableName); + + return result.isNotEmpty + ? result.map((e) { + return LikeEntity.fromJson(e); + }).toList() + :[]; + } + + /// 根据id查询数据,注意这里返回 true,false, + /// 主要为了在详情页控制收藏按钮的样式,如果需要返回数据 + /// 需要修改类型为: Future> 和 return的结果 + /// LikeEntity.fromJson(e); + static Future find(int id) async { + var _db = await SQLite().db; + List> result = await _db.query( + LikeService.TableName, + where: 'id = ?', + whereArgs: [id] + ); + return result.isNotEmpty ? true : false; + } + + /// 根据id删除数据 + static Future delete(int id) async { + var _db = await await SQLite().db; + return await _db.delete( + LikeService.TableName, + where: 'id = ?', + whereArgs: [id] + ); + } + + ///====================== 单图收藏 ====================== + + // 查询所有收藏的图片 + static Future> findAllImg() async { + var _db = await await SQLite().db; + List> result = await _db.query(LikeService.tabsNameSingleGraph, orderBy: "id DESC"); + return result.isNotEmpty + ? result.map((e) { + return SingleGraphEntity.fromJson(e); + }).toList() + :[]; + } + + // 添加图片 + static Future addImg(SingleGraphEntity Img) async { + var _db = await SQLite().db; + return await _db.insert(LikeService.tabsNameSingleGraph, Img.toJson()); + } + + // 检测图片是否已经收藏过 + static Future checkIsLike(String src) async { + var _db = await SQLite().db; + List> result = await _db.query( + LikeService.tabsNameSingleGraph, + where: 'src = ?', + whereArgs: [src] + ); + return result.isNotEmpty ? true : false; + } + + // 根据 地址删除收藏的图片 + static Future deleteImg(String src) async { + var _db = await await SQLite().db; + return await _db.delete( + LikeService.tabsNameSingleGraph, + where: 'src = ?', + whereArgs: [src] + ); + } + +} diff --git a/untitled/lib/service/MechanismService.dart b/untitled/lib/service/MechanismService.dart new file mode 100644 index 0000000..22656ce --- /dev/null +++ b/untitled/lib/service/MechanismService.dart @@ -0,0 +1,25 @@ +import 'package:peach/config/_.dart'; +import 'package:peach/http/Dio.dart'; +import 'package:peach/entity/_.dart'; + +class MechanismService { + + /// 获取分类列表的数据 + static Future> GetMechanismData({ Map params }) async { + var res = await HttpApi().get( + url: Config.ApiUrl['ApiList']['mechanism'], + params: params + ); + return MechanismEntity.fromJson(res).result; + } + + /// 机构列表点击进入详情 + static Future GetmechanismList({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['agentMechanismList'], + params: params + ); + return AgentClassListEntity.fromJson(res).data; + } + +} diff --git a/untitled/lib/service/ModelService.dart b/untitled/lib/service/ModelService.dart new file mode 100644 index 0000000..53c5a58 --- /dev/null +++ b/untitled/lib/service/ModelService.dart @@ -0,0 +1,27 @@ +import 'package:peach/config/_.dart'; +import 'package:peach/http/Dio.dart'; +import 'package:peach/entity/_.dart'; + +class ModelService { + + /// 模特列表 + static Future GetModelData({ Map params }) async { + var res = await HttpApi().get( + url: Config.ApiUrl['ApiList']['allModel'], + params: params + ); + return ModelEntity.fromJson(res).result; + } + + + /// 进入模特主页 + static Future GetModelInfo({ Map params }) async { + var res = await HttpApi().get( + url: Config.ApiUrl['ApiList']['modelList'], + params: params + ); + print(" ===== > ${res}"); + return ModelInfoEntity.fromJson(res).result; + } + +} diff --git a/untitled/lib/service/UserService.dart b/untitled/lib/service/UserService.dart new file mode 100644 index 0000000..62afe53 --- /dev/null +++ b/untitled/lib/service/UserService.dart @@ -0,0 +1,60 @@ +import 'package:peach/config/_.dart'; +import 'package:peach/http/Dio.dart'; +import 'package:peach/entity/_.dart'; + +class UserService { + + /// 用户登录接口 + static Future userLogin({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['login'], + params: params + ); + return LoginEntity.fromJson(res); + } + + /// 用户注册接口 + static Future userRegister({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['register'], + params: params + ); + return RegisterEntity.fromJson(res); + } + + /// 代理用户注册 + static Future agentUserRegister({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['agentreg'], + params: params + ); + return RegisterEntity.fromJson(res); + } + + /// 免费试看的次数限制 + static Future freeUse({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['freeUse'], + params: params + ); + return FreeUseEntity.fromJson(res); + } + + /// 办理会员的时候的 下单接口 + static Future placeOrder({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['place'], + params: params + ); + return RegisterEntity.fromJson(res); + } + + /// 办理会员的时候的 下单接口 + static Future orderStatus({ Map params }) async { + var res = await HttpApi().post( + url: Config.ApiUrl['ApiList']['orderStatus'], + params: params + ); + return orderStatusEntity.fromJson(res); + } +} diff --git a/untitled/lib/service/VideoService.dart b/untitled/lib/service/VideoService.dart new file mode 100644 index 0000000..528d040 --- /dev/null +++ b/untitled/lib/service/VideoService.dart @@ -0,0 +1,17 @@ +import 'package:dio/dio.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/http/Dio.dart'; +import 'package:peach/entity/_.dart'; + +class VideoService { + + /// 视频列表 + static Future GetVideoList({ Map params }) async { + var res = await HttpApi().get( + url: Config.ApiUrl['ApiList']['videoType'], + params: params + ); + return VideoListEntity.fromJson(res); + } + +} diff --git a/untitled/lib/service/_.dart b/untitled/lib/service/_.dart new file mode 100644 index 0000000..53b0085 --- /dev/null +++ b/untitled/lib/service/_.dart @@ -0,0 +1,10 @@ +library Service; + +export 'HomeService.dart'; +export 'MechanismService.dart'; +export 'ModelService.dart'; +export 'LikeService.dart'; +export 'DownloadService.dart'; +export 'ClassService.dart'; +export 'VideoService.dart'; +export 'UserService.dart'; diff --git a/untitled/lib/static/.pydio b/untitled/lib/static/.pydio new file mode 100644 index 0000000..ee0c571 --- /dev/null +++ b/untitled/lib/static/.pydio @@ -0,0 +1 @@ +769ddd7d-bc0a-4cbf-8b4b-9bd0452966ce \ No newline at end of file diff --git a/untitled/lib/static/fonts/.pydio b/untitled/lib/static/fonts/.pydio new file mode 100644 index 0000000..b1ab798 --- /dev/null +++ b/untitled/lib/static/fonts/.pydio @@ -0,0 +1 @@ +fa247bc9-574e-451b-96d2-f5b4aafdd46a \ No newline at end of file diff --git a/untitled/lib/static/fonts/iconfont.ttf b/untitled/lib/static/fonts/iconfont.ttf new file mode 100644 index 0000000..cddfdb9 Binary files /dev/null and b/untitled/lib/static/fonts/iconfont.ttf differ diff --git a/untitled/lib/static/img/.pydio b/untitled/lib/static/img/.pydio new file mode 100644 index 0000000..2e40348 --- /dev/null +++ b/untitled/lib/static/img/.pydio @@ -0,0 +1 @@ +cdb19a1b-12d2-411a-9fc9-f98200576e60 \ No newline at end of file diff --git a/untitled/lib/static/img/back.png b/untitled/lib/static/img/back.png new file mode 100644 index 0000000..b5090d0 Binary files /dev/null and b/untitled/lib/static/img/back.png differ diff --git a/untitled/lib/static/img/logo.png b/untitled/lib/static/img/logo.png new file mode 100644 index 0000000..45f0395 Binary files /dev/null and b/untitled/lib/static/img/logo.png differ diff --git a/untitled/lib/static/img/taxi.png b/untitled/lib/static/img/taxi.png new file mode 100755 index 0000000..ab77796 Binary files /dev/null and b/untitled/lib/static/img/taxi.png differ diff --git a/untitled/lib/static/img/update_bg_app_top.png b/untitled/lib/static/img/update_bg_app_top.png new file mode 100644 index 0000000..f06468f Binary files /dev/null and b/untitled/lib/static/img/update_bg_app_top.png differ diff --git a/untitled/lib/static/img/update_ic_close.png b/untitled/lib/static/img/update_ic_close.png new file mode 100644 index 0000000..29e55e9 Binary files /dev/null and b/untitled/lib/static/img/update_ic_close.png differ diff --git a/untitled/lib/static/img/vipLogo.png b/untitled/lib/static/img/vipLogo.png new file mode 100644 index 0000000..cfffc4d Binary files /dev/null and b/untitled/lib/static/img/vipLogo.png differ diff --git a/untitled/lib/static/img/welcome2.png b/untitled/lib/static/img/welcome2.png new file mode 100644 index 0000000..ee1e705 Binary files /dev/null and b/untitled/lib/static/img/welcome2.png differ diff --git a/untitled/lib/static/img/welcome3.png b/untitled/lib/static/img/welcome3.png new file mode 100644 index 0000000..29a1102 Binary files /dev/null and b/untitled/lib/static/img/welcome3.png differ diff --git a/untitled/lib/utils/.pydio b/untitled/lib/utils/.pydio new file mode 100644 index 0000000..7858e96 --- /dev/null +++ b/untitled/lib/utils/.pydio @@ -0,0 +1 @@ +3ab93c5c-ff68-4b41-87a2-fbcbc04b6bdd \ No newline at end of file diff --git a/untitled/lib/utils/AuthorityApplication.dart b/untitled/lib/utils/AuthorityApplication.dart new file mode 100644 index 0000000..08db05b --- /dev/null +++ b/untitled/lib/utils/AuthorityApplication.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:peach/config/_.dart'; + +/* + * 动态申请App的权限 + */ +class AuthorityApplication { + /// App需要动态申请的权限 + static List permissionList = [ Permission.storage, Permission.photos ]; + + static Future init(BuildContext context) async { + if (Config.isAndroid) { + Map status = await permissionList.request(); + if (status[Permission.storage].isGranted) { + print("用户同意了权限"); + return true; + } else if (status[Permission.storage].isDenied) { + print("用户拒绝了权限"); + AuthorityApplication.ShowTips( + context: context, content: "请允许App获取权限,否则App功能不能正常使用!", + isShowcancel: false, + confirmCall: () async { + AuthorityApplication.init(context); + }, + ); + return false; + } else if (status[Permission.storage].isPermanentlyDenied) { + print("用户永久拒绝了权限"); + AuthorityApplication.ShowTips( + context: context, content: "您禁用了应用的必要权限,请到设置里开启!", + isShowcancel: false, confirmText: '打开设置', + confirmCall: () async { + await openAppSettings(); + }, + ); + return false; + } + } + } + + static Future ShowTips({ + BuildContext context, String content, + bool isShowcancel: true, Function confirmCall, + confirmText = "重新请求", title = '提示' + }) async { + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) => WillPopScope( + onWillPop: () async => false, + child: AlertDialog( + title: Text(title), + content: Text(content), + actions: [ + isShowcancel + ? FlatButton( + child: Text('取消', style: TextStyle(color: ColorConfig.NoActiveColor),), + onPressed: () { + Navigator.of(context).pop(); + }) + : Text(''), + FlatButton( + child: Text(confirmText, style: TextStyle(color: ColorConfig.ThemeColor),), + onPressed: () async { + confirmCall(); + Navigator.of(context).pop(); + }), + ], + ), + ) + ); + } +} diff --git a/untitled/lib/utils/CLearCache.dart b/untitled/lib/utils/CLearCache.dart new file mode 100644 index 0000000..52a5be3 --- /dev/null +++ b/untitled/lib/utils/CLearCache.dart @@ -0,0 +1,94 @@ +import 'dart:io'; +import 'package:path_provider/path_provider.dart'; + +/* + * 计算清除缓存 + */ +class ClearCache { + + ///加载缓存 + static Future loadCache() async { + try { + Directory tempDir = await getTemporaryDirectory(); + double value = await ClearCache._getTotalSizeOfFilesInDir(tempDir); + // tempDir.list(followLinks: false,recursive: true).listen((file){ + // //打印每个缓存文件的路径 + // print(file.path); + // }); + return ClearCache._renderSize(value); + } catch (err) { + print(err); + } + } + + // 清理缓存 + static Future clearCache() async { + //此处展示加载loading + try { + Directory tempDir = await getTemporaryDirectory(); + //删除缓存目录 + await ClearCache.delDir(tempDir); + await ClearCache.loadCache(); + return true; + } catch (e) { + print(e); + return false; + } finally { + //此处隐藏加载loading + } + } + + /// 递归方式 计算文件的大小 + static Future _getTotalSizeOfFilesInDir(final FileSystemEntity file) async { + try { + if (file is File) { + int length = await file.length(); + return double.parse(length.toString()); + } + if (file is Directory) { + final List children = file.listSync(); + double total = 0; + if (children != null) + for (final FileSystemEntity child in children) + total += await ClearCache._getTotalSizeOfFilesInDir(child); + return total; + } + return 0; + } catch (e) { + print(e); + return 0; + } + } + + ///递归方式删除目录 + static Future delDir(FileSystemEntity file) async { + try { + if (file is Directory) { + final List children = file.listSync(); + for (final FileSystemEntity child in children) { + await delDir(child); + } + } + await file.delete(); + } catch (e) { + print(e); + } + } + + /// 格式化文件大小 + static String _renderSize(double value) { + if (null == value) { + return '0'; + } + List unitArr = List()..add('B')..add('K')..add('M')..add('G'); + int index = 0; + while (value > 1024) { + index++; + // value = value / 1024; + value = value / 8024; + } + String size = value.toStringAsFixed(2); + return size + unitArr[index]; + } + +} \ No newline at end of file diff --git a/untitled/lib/utils/CheckUpdate.dart b/untitled/lib/utils/CheckUpdate.dart new file mode 100644 index 0000000..6f737d1 --- /dev/null +++ b/untitled/lib/utils/CheckUpdate.dart @@ -0,0 +1,119 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_update_dialog/update_dialog.dart'; +import 'package:install_plugin/install_plugin.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:peach/R.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/http/Dio.dart'; +import 'package:peach/service/_.dart'; + +/* + * 检测新版本 + */ +class CheckUpdate { + // 保存升级弹窗 + UpdateDialog _dialog; + double _progress = 0.0; + File _apkFile; + + Future check(BuildContext context) async { + // 检查版本 + UpdateVersionEntity res = await HomeService.update(params: {}); + + // 如果需要升级 + if (int.parse(Config.packageInfo.buildNumber) < res.versionCode) { + if (_dialog != null && _dialog.isShowing()) { + return false; + } + // 升级的内容信息 + String updateContent = ""; + res.updateMsg.forEach((v) => updateContent = updateContent + "${v}\n"); + + // 显示弹窗 + _dialog = UpdateDialog.showUpdate(context, + title: "发现新版本v${res.version},请升级!", + updateContent: updateContent, + width: 250, + topImage: Image.asset(R.libStaticImgUpdateBgAppTopPng), + themeColor: ColorConfig.ThemeColor, + updateButtonText: '升级', + isForce: true, + onUpdate: () async { + // 如果是android 那么下载app + if (Config.isAndroid) { + // 获取临时下载地址 + _apkFile = await getApkFileByUpdateEntity(res); + await onUpdate(res); + // 如果是ios 那么打开appstore + } else { + InstallPlugin.gotoAppStore(Config.iosDownApkUrl); + } + } + ); + return true; + } else { + return false; + } + } + + // 下载文件,更新进度条 + Future onUpdate(UpdateVersionEntity res) async { + await HttpApi().downloadFile( + res.downUrl, _apkFile.path, + onReceiveProgress: (int count, int total) { + _progress = count.toDouble() / total; + if (_progress <= 1.0001) { + _dialog.update(_progress); + } + }).then((value) { + _dialog.dismiss(); + installAPP(); + }).catchError((value) { + _dialog.dismiss(); + }); + } + + /// android 安装app + void installAPP() async { + String packageName = Config.packageInfo.packageName; + InstallPlugin.installApk(_apkFile.path, packageName); + } + + /// 根据更新信息获取apk安装文件 + Future getApkFileByUpdateEntity(UpdateVersionEntity res) async { + // 获取app文件名 + String appName = getApkNameByDownloadUrl(res.downUrl); + // 获取下载的缓存路径 + String dirPath = await getDownloadDirPath(); + return File("$dirPath/${res.versionCode}/$appName"); + } + + ///获取下载缓存路径 + Future getDownloadDirPath() async { + Directory directory = Config.isAndroid + ? await getExternalStorageDirectory() + : await getApplicationDocumentsDirectory(); + return directory.path; + } + + ///根据下载地址获取文件名 + String getApkNameByDownloadUrl(String downloadUrl) { + if (downloadUrl.isEmpty) { + return "temp_${currentTimeMillis()}.apk"; + } else { + String appName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1); + if (!appName.endsWith(".apk")) { + appName = "temp_${currentTimeMillis()}.apk"; + } + return appName; + } + } + + /// 返回随机文件名 + int currentTimeMillis() { + return DateTime.now().millisecondsSinceEpoch; + } +} diff --git a/untitled/lib/utils/Core.dart b/untitled/lib/utils/Core.dart new file mode 100644 index 0000000..eb4555d --- /dev/null +++ b/untitled/lib/utils/Core.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:peach/config/Colors.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import '_.dart'; + +/* + * 核心的utils,主要封装UI相关的操作 + */ +class Core { + + static FreeUseEntity freeUseStatus; + + /// 修改状态栏颜色 + static void SetStatusThemeColor({Color color : ColorConfig.ThemeColor}) { + SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( + statusBarColor: ColorConfig.ThemeColor + )); + } + + static void deleteDialog(BuildContext context, Function callback,{ String content: "确认删除该收藏吗?" }) async { + return await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('提示'), + content: Text(content), + actions: [ + FlatButton( + child: Text('取消',style: TextStyle(color: ColorConfig.NoActiveColor),), + onPressed: () { + Navigator.of(context).pop(); + } + ), + FlatButton( + child: Text('确认',style: TextStyle(color: ColorConfig.ThemeColor),), + onPressed: () async { + callback(); + Navigator.of(context).pop(); + } + ), + ], + ); + }); + } + + /// 调用接口,减少免费试看的次数 + static Future freeUse(BuildContext context, Function vipCallBack) async { + freeUseStatus = await UserService.freeUse(params: { 'objectId': Tool.userInfo()['objectId'] }); + // 如果已经没有免费试看的次数了,弹窗提醒 + if (freeUseStatus.freeNumber == 0) { + await showDialog( + context: context, + builder: (context) { + return WillPopScope( + onWillPop: () async => false, + child: AlertDialog( + title: Text('温馨提示'), + content: Text("免费体验到期,请开通VIP,享受更多特权和功能!"), + actions: [ + FlatButton( + child: Text('取消',style: TextStyle(color: ColorConfig.NoActiveColor),), + onPressed: () { + Modular.to.pop(); + Modular.to.pop(); + } + ), + FlatButton( + child: Text('开通VIP',style: TextStyle(color: ColorConfig.ThemeColor),), + onPressed: () async { + Modular.to.pushNamed('/vip'); + } + ), + ], + ), + ); + }); + } else { + vipCallBack(); + } + } + + // -1 表示已经开通了vip + static bool isVip(BuildContext context) { + print("freeUseStatus.freeNumber ======= ${freeUseStatus.freeNumber}"); + if (freeUseStatus.freeNumber == -1) { + return true; + } else { + return false; + } + } + + /// 复制文字到剪切板 + static void copy (String message) { + Clipboard.setData(ClipboardData(text: message)); + } + + +} \ No newline at end of file diff --git a/untitled/lib/utils/IconFont.dart b/untitled/lib/utils/IconFont.dart new file mode 100644 index 0000000..bad0e6b --- /dev/null +++ b/untitled/lib/utils/IconFont.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:peach/config/_.dart'; + +/* + * IconFont 字体图标 + */ +class IconFont { + + static Icon LogoIcon ({double size = 24.0, Color color = ColorConfig.WhiteBackColor}) { + return Icon( + const IconData(0xe61c, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon ModelIcon ({double size = 24.0, Color color = ColorConfig.WhiteBackColor}) { + return Icon( + const IconData(0xe61f, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon MeIcon ({double size = 24.0, Color color = ColorConfig.WhiteBackColor}) { + return Icon( + const IconData(0xe611, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon MechanismIcon ({double size = 24.0, Color color = ColorConfig.WhiteBackColor}) { + return Icon( + const IconData(0xe61a, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon HomeIcon ({double size = 24.0, Color color = ColorConfig.WhiteBackColor}) { + return Icon( + const IconData(0xe617, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon HistoryIcon ({double size = 24.0, Color color = ColorConfig.WhiteBackColor}) { + return Icon( + const IconData(0xe600, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon VipIcon ({double size = 24.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe6ba, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon DaLiIcon ({double size = 24.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe618, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon UpdateIcon ({double size = 24.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe63c, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon ClearIcon ({double size = 22.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe616, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon XieYiIcon ({double size = 22.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe6b2, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon AboutIcon ({double size = 22.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe637, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon NewsIcon ({double size = 22.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe6c0, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon VideoIcon ({double size = 22.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe60c, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon PictureIcon ({double size = 20.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe61e, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon BuyIcon ({double size = 20.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe73b, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon StatusIcon ({double size = 20.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe655, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon OrderIcon ({double size = 20.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe620, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } + + static Icon WeiXinIcon ({double size = 20.0, Color color = ColorConfig.TextColor}) { + return Icon( + const IconData(0xe64f, fontFamily: 'iconfont'), + size: size, + color: color, + ); + } +} \ No newline at end of file diff --git a/untitled/lib/utils/JiGuangPush.dart b/untitled/lib/utils/JiGuangPush.dart new file mode 100644 index 0000000..9039b4e --- /dev/null +++ b/untitled/lib/utils/JiGuangPush.dart @@ -0,0 +1,42 @@ + +import 'package:jpush_flutter/jpush_flutter.dart'; +import 'package:peach/config/_.dart'; + +/* + * 极光消息推送 + */ +class JiGuangPush { + JPush _jpush; + static JiGuangPush _instance = JiGuangPush.instance(); + factory JiGuangPush() => _instance; + + JiGuangPush.instance() { + if (null == _jpush) { + _jpush = new JPush(); + addEventHandler(); + _jpush.setup( + appKey: Config.JgConfig['appKey'], + channel: Config.JgConfig['channel'], + production: Config.JgConfig['production'], + debug: Config.JgConfig['debug'], + ); + } + } + + addEventHandler() { + _jpush.addEventHandler( + // 接收通知回调方法。 + onReceiveNotification: (Map message) async { + print("收到的消息为:: $message"); + }, + // 点击通知回调方法。 + onOpenNotification: (Map message) async { + print("消息被点击了: $message"); + }, + // 接收自定义消息回调方法。 + onReceiveMessage: (Map message) async { + print("flutter onReceiveMessage: $message"); + }, + ); + } +} \ No newline at end of file diff --git a/untitled/lib/utils/Screen.dart b/untitled/lib/utils/Screen.dart new file mode 100644 index 0000000..31787b4 --- /dev/null +++ b/untitled/lib/utils/Screen.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +/* + * 尺寸兼容,类似前端的rem + */ +class Screen { + static double setWidth (double width) { + return ScreenUtil().setWidth(width); + } + + static double setHeight (double height) { + return ScreenUtil().setHeight(height); + } + + static double setFontSize(double Size) { + return ScreenUtil().setSp(Size, allowFontScalingSelf: true); + } + + static double width(BuildContext context) { + return MediaQuery.of(context).size.width; + } + + static double height(BuildContext context) { + return MediaQuery.of(context).size.height; + } +} \ No newline at end of file diff --git a/untitled/lib/utils/SharedPreferences.dart b/untitled/lib/utils/SharedPreferences.dart new file mode 100644 index 0000000..7519f50 --- /dev/null +++ b/untitled/lib/utils/SharedPreferences.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +/* + * shared_preferences 配置 + */ +class SPreferences { + + static final SPreferences _instance = SPreferences._(); + factory SPreferences() => _instance; + SPreferences._(); + static SharedPreferences _prefs; + + + static Future init() async { + if (_prefs == null) { + _prefs = await SharedPreferences.getInstance(); + } + } + + // 设置数字类型 + Future setInt(String key, int value) async { + return await _prefs.setInt(key, value); + } + + // 设置bool + Future setBool(String key, bool value) async { + return await _prefs.setBool(key, value); + } + + // 设置String + Future setString(String key, String value) async { + return await _prefs.setString(key, value); + } + + String getString(String key) { + return _prefs.getString(key); + } + + bool getIsLogin() { + if (_prefs.containsKey("isLogin")) { + return _prefs.getBool("isLogin"); + } + return false; + } + + bool getBool(String key) { + if (!(_prefs.containsKey(key))) { + _prefs.setBool(key, true); + return false; + } + return _prefs.getBool(key); + } + +} \ No newline at end of file diff --git a/untitled/lib/utils/Tool.dart b/untitled/lib/utils/Tool.dart new file mode 100644 index 0000000..997e86e --- /dev/null +++ b/untitled/lib/utils/Tool.dart @@ -0,0 +1,105 @@ +import 'dart:convert'; +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; +import 'dart:io'; +import 'dart:math'; + +import 'package:path_provider/path_provider.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/utils/_.dart'; + +/* + * 工具函数,主要给dart逻辑使用 + */ +class Tool { + + /// 按照指定下标将数组分割为二维数组 + static List> splitList(List list, int len) { + if (len <= 1) { + return [list]; + } + + List> result = List(); + int index = 1; + + while (true) { + if (index * len < list.length) { + List temp = list.skip((index - 1) * len).take(len).toList(); + result.add(temp); + index++; + continue; + } + List temp = list.skip((index - 1) * len).toList(); + result.add(temp); + break; + } + return result; + } + + /// 生成N位随机数 + static String randomBit([int len = 15]) { + String scopeF = '123456789'; //首位 + String scopeC = '0123456789'; //中间 + String result = ''; + for (int i = 0; i < len; i++) { + if (i == 0) { + result = scopeF[Random().nextInt(scopeF.length)]; + } else { + result = result + scopeC[Random().nextInt(scopeC.length)]; + } + } + return result; + } + + /// 检查用户是否有权限打开【单手模式】 + /// 权限规则: + /// 1:对弹窗给的 androidid 进行 MD5 加密 + /// 2:在 com.example.untitled/files 文件夹中 用第一步的密文来创建文件 + /// 3:向文件中 写入 设备的 androidid + /// 通过验证,正常访问.. + static Future checkIsOpen() async { + String androidId = Config.androidDeviceInfo.androidId; + Directory filesPath = await getExternalStorageDirectory(); + File completePath = File("${filesPath.path}/${generateMd5(androidId)}"); + if (completePath.existsSync()) { + String textMessage = await completePath.readAsString(); + return textMessage == androidId ? true : false; + } else { + return false; + } + } + + /* + * md5 加密 + */ + static String generateMd5(String data) { + var content = new Utf8Encoder().convert(data); + var digest = md5.convert(content); + // 这里其实就是 digest.toString() + return hex.encode(digest.bytes); + } + + /// 从本地读取用户信息 + static Map userInfo() { + String username = SPreferences().getString("username"); + String objectId = SPreferences().getString("objectId"); + String createdAt = SPreferences().getString("createdAt"); + String userType = SPreferences().getString("userType"); + String userWeiXin = SPreferences().getString("userWeiXin"); + Map info = new Map(); + info.addAll({ + 'username': username, + 'objectId': objectId, + 'createdAt': createdAt, + 'userType': userType, + 'userWeiXin': userWeiXin, + }); + return info; + } + + /// 验证是否为合法的手机号 + static bool isPhone(String str) { + return new RegExp('^((13[0-9])|(15[^4])|(166)|(17[0-8])|(18[0-9])|(19[8-9])|(147,145))\\d{8}\$').hasMatch(str); + } + +} \ No newline at end of file diff --git a/untitled/lib/utils/_.dart b/untitled/lib/utils/_.dart new file mode 100644 index 0000000..9b8cfd7 --- /dev/null +++ b/untitled/lib/utils/_.dart @@ -0,0 +1,11 @@ +library utils; + +export 'Screen.dart'; +export 'IconFont.dart'; +export 'Core.dart'; +export 'Tool.dart'; +export 'AuthorityApplication.dart'; +export 'CLearCache.dart'; +export 'SharedPreferences.dart'; +export 'CheckUpdate.dart'; +export 'JiGuangPush.dart'; \ No newline at end of file diff --git a/untitled/lib/views/.pydio b/untitled/lib/views/.pydio new file mode 100644 index 0000000..59d8933 --- /dev/null +++ b/untitled/lib/views/.pydio @@ -0,0 +1 @@ +2e1182b3-5819-46c1-8a60-e06c23722b1e \ No newline at end of file diff --git a/untitled/lib/views/App.dart b/untitled/lib/views/App.dart new file mode 100644 index 0000000..647ddb5 --- /dev/null +++ b/untitled/lib/views/App.dart @@ -0,0 +1,96 @@ +import 'package:fancy_bottom_navigation/fancy_bottom_navigation.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/utils/_.dart'; + +import 'package:peach/views/Home/Home.dart'; +import 'package:peach/views/Mechanism/Mechanism.dart'; +import 'package:peach/views/Model/Model.dart'; +import 'package:peach/views/Me/Me.dart'; + +/* + * App的页面框架,底部tabs切换在这实现 + */ +class App extends StatefulWidget { + @override + State createState() => _App(); +} + +class _App extends State with AutomaticKeepAliveClientMixin { + // 显示第几个页面的下标 + int currentIndex = 0; + // fancy_bottom_navigation 需要的唯一key + GlobalKey bottomNavigationKey = GlobalKey(); + // 存储从 bottomNavigationKey 中获取当前底部导航条的组件 + FancyBottomNavigationState fState; + List tabBodies = [ Home(), Mechanism(), Model(), Me() ]; + + @override + bool get wantKeepAlive => true; + + @override + void initState() { + super.initState(); + + CheckUpdate().check(context); + Config.tabController = PageController(initialPage: currentIndex); + } + + @override + void dispose() { + Config.tabController.dispose(); + super.dispose(); + } + + /// 中间内容的组件 + Widget BodyWidget () { + return PageView( + controller: Config.tabController, + children: tabBodies, + // 整个页面滑动的时候,联动切换底部导航 + onPageChanged: (int index) { + setState(() { + currentIndex = index; + fState = bottomNavigationKey.currentState; + fState.setPage(currentIndex); + }); + }, + ); + } + + /// 底部导航 + Widget BottomNavigationWidget() { + return FancyBottomNavigation( + key: bottomNavigationKey, + initialSelection: 0, + textColor: ColorConfig.ThemeColor, + inactiveIconColor: ColorConfig.ThemeColor, + activeIconColor: ColorConfig.WhiteBackColor, + circleColor: ColorConfig.ThemeColor, + onTabChangedListener: (position) { + setState(() { + currentIndex = position; + /// 带动画的去切换 + Config.tabController.jumpToPage(currentIndex); + }); + }, + tabs: [ + TabData(iconData: IconFont.HomeIcon().icon, title: "首页"), + TabData(iconData: IconFont.MechanismIcon().icon, title: "机构"), + TabData(iconData: IconFont.ModelIcon().icon, title: "模特"), + TabData(iconData: IconFont.MeIcon().icon, title: "我的") + ], + ); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return Scaffold( + extendBodyBehindAppBar: false, + body: BodyWidget(), + bottomNavigationBar: BottomNavigationWidget(), + ); + } +} diff --git a/untitled/lib/views/Details/.pydio b/untitled/lib/views/Details/.pydio new file mode 100644 index 0000000..f2b6d78 --- /dev/null +++ b/untitled/lib/views/Details/.pydio @@ -0,0 +1 @@ +7c2e172d-e970-4e88-8a58-11925c8c6062 \ No newline at end of file diff --git a/untitled/lib/views/Details/index.dart b/untitled/lib/views/Details/index.dart new file mode 100644 index 0000000..2711295 --- /dev/null +++ b/untitled/lib/views/Details/index.dart @@ -0,0 +1,230 @@ +import 'dart:typed_data'; +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:image_gallery_saver/image_gallery_saver.dart'; +import 'package:image_pickers/image_pickers.dart'; +import 'package:toast/toast.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/widget/_.dart'; +import 'package:share_extend/share_extend.dart'; + +class DetailsIndex extends StatefulWidget { + final String id; + DetailsIndex({Key key, this.id }): super(key: key); + + @override + State createState() => _DetailsIndex(); +} + +class _DetailsIndex extends State { + + List imagePaths = []; + AgentInfo Res; + FreeUseEntity freeUseStatus; + String title = ""; + bool LikeStatus = false; + + @override + void initState() { + super.initState(); + checkIdStatus(); + Core.freeUse(context, () { + GetInfoData(); + }); + } + + Future GetInfoData() async { + Res = await HomeService.GetInfoData(params: { 'id': widget.id }); + setState(() { + imagePaths = Res.imgs; + title = Res.title; + }); + } + + + /// 检查写真是否被收藏 + Future checkIdStatus () async { + var status = await LikeService.find(int.parse(widget.id)); + setState(() { + LikeStatus = status; + }); + } + + /// 检查是否被收藏,爱心的改变样式 + Widget LikeStatusWidget () { + return + LikeStatus + ? IconButton(icon: Icon(Icons.favorite, color: ColorConfig.WhiteBackColor,),iconSize: 24,) + : IconButton( + iconSize: 24, + icon: LikeStatus ? Icon(Icons.favorite_border) : Icon(Icons.favorite_border), + onPressed: () async { + if (imagePaths.isNotEmpty) { + if (Core.isVip(context)) { + var User = LikeEntity( + id: int.parse(widget.id), + preview: imagePaths[0], + source: Res.jigoulist[0].name, + title: Res.title, + totals: Res.shuliang, + user: Res.renwulist[0].name + ); + + int result = await LikeService.addLike(User); + if (result > 0) { + Toast.show("写真收藏成功!", context, duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM); + setState(() => LikeStatus = true); + } else { + Toast.show("写真收藏失败: ${result}", context, duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM); + } + } else { + Toast.show("您还未开通VIP,无法使用【收藏图片】【收藏写真】【保存到相册】【成人视频】等功能", context, duration: Toast.LENGTH_LONG, gravity: Toast.CENTER); + } + } else { + Toast.show("请稍后收藏,数据正在加载中...", context, duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM); + } + }, + ); + } + + /// 长按的弹出框 + actionDiaLog (String url) async { + if (Core.isVip(context)) { + await showDialog( + context: context, + builder: (context) { + return SimpleDialog( + titlePadding: EdgeInsets.all(15), + contentPadding: EdgeInsets.all(15), + title: Container( + alignment: Alignment.centerLeft, + child: Row( + children: [ + Icon(Icons.touch_app,size: 30,color: ColorConfig.ThemeColor,), + SizedBox(width: 5,), + Text("请选择操作",style: TextStyle(fontSize: 17),) + ], + ), + ), + children: [ + FlatButton( + child: Text("保存到相册"), + onPressed: () { + Navigator.of(context).pop(); + saveGallery(url); + } + ), + FlatButton( + child: Text("收藏此图片"), + onPressed: () async { + Navigator.of(context).pop(); + singleLike(url); + } + ), + ], + ); + } + ); + } else { + Toast.show("您还未开通VIP,无法使用【收藏图片】【收藏写真】【保存到相册】【成人视频】等功能", context, duration: Toast.LENGTH_LONG, gravity: Toast.CENTER); + } + } + + /// 保存图片到相册 + saveGallery(String url) async { + // var path = await ImagePickers.saveImageToGallery(url); + // path.length != 0 + // ? Toast.show("图片存储在 ${path}", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM) + // : Toast.show("保存失败", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM); + + var response = await DownloadService.downImage(url: url); + String fileName = Tool.randomBit(); + final result = await ImageGallerySaver.saveImage( + Uint8List.fromList(response), + quality: 100, + name: fileName + ); + result['isSuccess'] + ? Toast.show("图片存储在 ${result['filePath']}", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM) + : Toast.show("保存失败", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM); + } + + /// 分享给好友 + shareImg() async { + ShareExtend.share( + "[有人@你]\n高清模特写真你要不要??\n\n写真集名称:${Res.title}\n\n写真访问地址:${Config.h5IpUrl}info.html?id=${Res.id}\n\n浏览更多高清模特写真请下载应用:【屁桃儿】", + "text", + sharePanelTitle: "111", + ); + } + + /// 单张图的收藏功能 + singleLike(String url) async { + // false 可以收藏,true 收藏过了 + bool status = await LikeService.checkIsLike(url); + print("status statusstatusstatusstatus : ${status}"); + if (status) { + Toast.show("此图片已经收藏过啦!!", context, duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM); + } else { + var add = SingleGraphEntity( + id: int.parse(widget.id) + int.parse(Tool.randomBit()), + src: url + ); + int result = await LikeService.addImg(add); + if (result > 0) { + Toast.show("图片收藏成功!", context, duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM); + } else { + Toast.show("图片收藏失败!", context, duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM); + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(title), + backgroundColor: ColorConfig.ThemeColor, + elevation: 0, + actions: [ + LikeStatusWidget(), + IconButton( + icon: Icon(Icons.share_outlined,color: ColorConfig.WhiteBackColor,),iconSize: 24, + onPressed: () { + shareImg(); + }, + ) + ], + ), + body: imagePaths.isEmpty + ? SpinKitWave(color: ColorConfig.ThemeColor, itemCount: 3, size: 40) + : ListView.builder( + itemCount: imagePaths.length, + cacheExtent: double.maxFinite, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onLongPress: () => actionDiaLog(imagePaths[index]), + onTap: () async { + ImagePickers.previewImages(imagePaths,index); + // Navigator.of(context).push(new MaterialPageRoute(builder: (_) { + // return PhotoViewGalleryScreen( + // images: imagePaths, + // index: index, + // title: Res.title, + // time: Res.shijian, + // heroTag: index.toString(), + // ); + // })); + }, + child: CachedNetworkImg(imagePaths[index]), + ); + }, + ) + ); + } + +} \ No newline at end of file diff --git a/untitled/lib/views/Home/.pydio b/untitled/lib/views/Home/.pydio new file mode 100644 index 0000000..682c020 --- /dev/null +++ b/untitled/lib/views/Home/.pydio @@ -0,0 +1 @@ +0c5d82c8-0a08-4f49-94e2-57df03cd7df2 \ No newline at end of file diff --git a/untitled/lib/views/Home/ClassList.dart b/untitled/lib/views/Home/ClassList.dart new file mode 100644 index 0000000..f7d992c --- /dev/null +++ b/untitled/lib/views/Home/ClassList.dart @@ -0,0 +1,83 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/widget/_.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:toast/toast.dart'; + +/* + * 横向菜单除首页外的布局 + */ +class ClassList extends StatefulWidget { + int id; + int totalPage = 0; + List result = []; + + EasyRefreshController _controller; // EasyRefresh控制器 + + ClassList({Key key, @required this.id }) : super(key: key); + + @override + State createState() => _ClassList(); +} + +class _ClassList extends State with AutomaticKeepAliveClientMixin { + + int page = 1; + + @override + void initState() { + super.initState(); + widget._controller = EasyRefreshController(); + new Future.delayed(Duration(milliseconds: 500), () async { + getClassListData(); + }); + } + + /// 请求数据,类型是根据ajax生成的数据实体类 + Future getClassListData() async { + AgentClassListData res = await HomeService.GetClassListData(params: { + 'id': widget.id, + 'page': page + }); + setState(() { + widget.result.addAll(res.list); + widget.totalPage = int.parse(res.total); + page = int.parse(res.page); + }); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return EasyRefresh( + header: BezierCircleHeader(backgroundColor: ColorConfig.ThemeColor), + footer: BezierBounceFooter(backgroundColor: ColorConfig.ThemeColor), + onRefresh: () async { + // widget.page = 0; + // widget.result = []; + // await getClassListData(); + }, + onLoad: () async { + page += 1; + if (page > widget.totalPage) { + Toast.show("没有数据", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM); + } else { + await getClassListData(); + widget._controller.finishRefresh(); + } + }, + child: ItemWidget( + data: widget.result, + title: '', + longPress: () {} + ), + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/untitled/lib/views/Home/Default.dart b/untitled/lib/views/Home/Default.dart new file mode 100644 index 0000000..8fb0699 --- /dev/null +++ b/untitled/lib/views/Home/Default.dart @@ -0,0 +1,66 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/widget/_.dart'; +import 'package:peach/service/_.dart'; + +/* + * 首页的布局 + */ +class DefaultLayout extends StatefulWidget { + @override + State createState() => _Default(); + +} + +class _Default extends State with AutomaticKeepAliveClientMixin { + + @override + void initState() { + super.initState(); + } + + /// 请求数据,被异步数据组件 FutureBuilder 调用 + Future GetHomeData() async { + return await HomeService.GetHomeData(params: {}); + } + + /// 首页的列表 + Widget DeaultPageList(Result result) { + var Models = Tool.splitList(result.model.res, 4); + return SingleChildScrollView( + scrollDirection: Axis.vertical, + physics: BouncingScrollPhysics(), + child: Column( + children: [ + SizedBox(height: Screen.setHeight(18),), + // SwiperWidget( + // autoplayDelay: 4000, + // autoplay: false, + // child: [ + // ModelWidget(data: Models[0]), + // ModelWidget(data: Models[1]), + // ] + // ), + OldItemWidget(icon: Icons.new_releases_sharp, title: '最新收录', data: result.newest.data), + OldItemWidget(icon: Icons.thumb_up_alt,title: '推荐写真', data: result.recommended.data,) + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return FutureBuilderWidget( + future: GetHomeData, + success: DeaultPageList, + ); + } + + @override + bool get wantKeepAlive => true; + +} \ No newline at end of file diff --git a/untitled/lib/views/Home/Edit.dart b/untitled/lib/views/Home/Edit.dart new file mode 100644 index 0000000..f5f3e7e --- /dev/null +++ b/untitled/lib/views/Home/Edit.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:toast/toast.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/event/_.dart'; + +/* + * 菜单编辑页面 + */ +class Edit extends StatefulWidget { + @override + State createState() => _Edit(); +} + +class _Edit extends State { + + // 已选菜单 + List principal = []; + // 未选菜单 + List additional = []; + bool isEdit = false; + + @override + void initState() { + GetList(); + } + + void GetList () { + new Future.delayed(Duration(milliseconds: 280),() async { + var a = await ClassService.findAll("Principal"); + var b = await ClassService.findAll("Additional"); + + setState(() { + principal = a.map((e) => Principal.fromJson(e) ).toList(); + additional = b.map((e)=> Principal.fromJson(e)).toList(); + }); + }); + } + + // 已选菜单 被点击的时候 + principalClick(Principal item) { + // 删除原本的数据 + principal = principal.where((v) => v.id != item.id).toList(); + + var isHave = additional.where((v) => v.id == item.id).toList(); + if (isHave.length == 0) { + // 向 未选菜单 添加数据 + additional.addAll([item]); + ClassService.add(tableName: 'Additional', item: item); + } + + isEdit = true; + setState(() {}); + ClassService.delete(tableName: 'Principal', item: item); + } + + // 未选菜单 被点击的时候 + additionalClick(Principal item) { + // 删除原本的数据 + additional = additional.where((v) => v.id != item.id).toList(); + // 向 已选菜单 添加数据 + principal.addAll([item]); + isEdit = true; + setState(() {}); + ClassService.delete(tableName: 'Additional', item: item); + ClassService.add(tableName: 'Principal', item: item); + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + child: Scaffold( + appBar: AppBar( + title: Text("分类编辑"), + backgroundColor: ColorConfig.ThemeColor, + leading: new IconButton( + icon: new Icon(Icons.arrow_back), + onPressed: () { + Config.eventBus.fire(ClassEditEvent(isEdit)); + Modular.to.pop(); + }, + ), + ), + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.only(top: 15,right: 15,bottom: 0,left: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only(bottom: 20), + padding: EdgeInsets.all(8), + color: Color(0XFFe1e1e3), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("注意",style: TextStyle(fontSize: 16,fontWeight: FontWeight.w500),), + SizedBox(height: Screen.setHeight(10),), + Text("1:如果编辑了分类,首页之前的浏览进度将丢失。",style: TextStyle(),), + SizedBox(height: Screen.setHeight(5),), + Text("2:如果没有编辑分类,那么返回首页,之前的浏览进度都还会在。",style: TextStyle(),), + SizedBox(height: Screen.setHeight(5),), + Text("3:如果你删除【已选菜单】的所有分类,那么将默认从服务器请求最新菜单",style: TextStyle(),), + ], + ), + ), + Container( + margin: EdgeInsets.only(bottom: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("已选菜单",style: TextStyle(fontSize: Screen.setFontSize(16),fontWeight: FontWeight.w400),), + SizedBox(height: Screen.setHeight(5),), + Wrap( + spacing: Screen.setFontSize(13), + children: principal.map((e) => RawChip( + label: Text(e.title,style: TextStyle(fontSize: 12,color: ColorConfig.WhiteBackColor)), + padding: EdgeInsets.all(1), + backgroundColor: ColorConfig.ThemeOtherColor, + selectedColor: ColorConfig.ThemeColor, + checkmarkColor: Colors.white, + onPressed: () { + principalClick(e); + }, + )).toList(), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(bottom: Screen.setFontSize(20)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("未选菜单",style: TextStyle(fontSize: Screen.setFontSize(16),fontWeight: FontWeight.w400),), + SizedBox(height: Screen.setHeight(5),), + Wrap( + spacing: Screen.setFontSize(18), + children: additional.map((e) => RawChip( + label: Text(e.title,style: TextStyle(fontSize: Screen.setFontSize(12),color: ColorConfig.WhiteBackColor)), + padding: EdgeInsets.all(1), + backgroundColor: ColorConfig.ThemeOtherColor, + selectedColor: ColorConfig.ThemeColor, + checkmarkColor: Colors.white, + onPressed: () { + additionalClick(e); + }, + )).toList(), + ) + ], + ), + ), + ], + ), + ), + ), + onWillPop: () async { + Config.eventBus.fire(ClassEditEvent(isEdit)); + return true; + }); + } +} \ No newline at end of file diff --git a/untitled/lib/views/Home/Home.dart b/untitled/lib/views/Home/Home.dart new file mode 100644 index 0000000..5bf50d4 --- /dev/null +++ b/untitled/lib/views/Home/Home.dart @@ -0,0 +1,189 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/event/_.dart'; +import 'package:peach/views/Home/Default.dart'; +import 'package:peach/views/Home/ClassList.dart'; +import 'package:peach/views/Home/Random.dart'; + +/* + * 首页 + */ +class Home extends StatefulWidget { + @override + State createState() => _Home(); +} + +class _Home extends State with AutomaticKeepAliveClientMixin { + + /// 保存横向菜单的数据 + ClassResult Tabs = ClassResult.fromJson({ + 'principal': [], 'additional': [] + }); + + int _currentIndex = 0; + + @override + bool get wantKeepAlive => true; + + TabController _tabController; + @override + void initState() { + super.initState(); + /// 请求权限 + AuthorityApplication.init(context); + _GetClassData(); + _EditOnListen(); + } + + void _EditOnListen () { + Config.eventBus.on().listen((event){ + print("事件监听 ClassEditEvent ============== :${event.update}"); + if (event.update) { + print("true"); + _currentIndex = 0; + Tabs = ClassResult.fromJson({ 'principal': [], 'additional': [] }); + _GetClassData(); + } else { + print("false"); + } + }); + } + + void _GetClassData() async { + if (Tabs.principal.length == 0) { + Tabs = await HomeService.GetClassData(params: {}); + // 插入首页 + Tabs.principal.insert(0, Principal.fromJson({ 'id': 0, 'title': '随机展示','page': 0, })); + Tabs.principal.insert(0, Principal.fromJson({ 'id': 1, 'title': '首页','page': 0,})); + setState(() {}); + } + } + + /// 横向滑动分类菜单边上的右侧编辑按钮 + Widget RightEdit() { + return Container( + width: Screen.setWidth(50), + child: IconButton( + iconSize: Screen.setFontSize(20.0), + icon: const Icon(Icons.edit, color: ColorConfig.NoActiveColor,), + onPressed: () { + Modular.to.pushNamed('/edit'); + } + ), + ); + } + + /// 横向滑动分类菜单 + Widget MenuList() { + return Expanded( + child: TabBar( + isScrollable: true, + unselectedLabelColor: ColorConfig.NoActiveColor, + indicatorColor: ColorConfig.ThemeColor, + tabs: Tabs.principal.map((e) => Tab(text: e.title,)).toList(), + onTap: (int index) { + print("你点击的下标为 ============== :$index"); + }, + ), + ); + } + + /// 左侧Logo按钮 + Widget Leading () { + return Builder( + builder: (BuildContext context) { + return IconButton( + icon: IconFont.LogoIcon(), + onPressed: () { + + } + ); + }, + ); + } + + /// 标题的容器 + Widget TitleWidget() { + return InkWell( + onTap: () { + Modular.to.pushNamed("/search"); + }, + child: Container( + height: Screen.setHeight(30.0), + alignment: Alignment.center, + width: double.infinity, + decoration: BoxDecoration( + color: ColorConfig.WhiteBackColor, + borderRadius: BorderRadius.all(Radius.circular(25.0)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon(Icons.search, color: Color(0XFF999999), size: 14), + SizedBox(width: Screen.setWidth(2.0)), + Text("198万张图,有你想要的...", style: TextStyle(color: Color(0xFf999999), fontSize: Screen.setFontSize(13))) + ], + ), + ), + ); + } + + /// 返回不同的布局 + List TabView() { + return Tabs.principal.map((e) => + e.id == 1 + ? DefaultLayout() + : e.id == 0 ? Random() : ClassList(id: e.id,key: GlobalKey(),) + ).toList(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return DefaultTabController( + key: GlobalKey(), + length: Tabs.principal.length != 0 ? Tabs.principal.length : 0, + initialIndex: _currentIndex, + child: Scaffold( + appBar: PreferredSize( + preferredSize: Size.fromHeight(90.0), + child: AppBar( + primary: true, + titleSpacing: 0.0, + backgroundColor: ColorConfig.ThemeColor, + leading: Leading(), + title: TitleWidget(), + elevation: 0, + actions: [ + IconButton( + iconSize: 24, + icon: Icon(Icons.supervisor_account), + onPressed: () { + Config.tabController.jumpToPage(3); + }, + ) + ], + bottom: PreferredSize( + preferredSize: Size.fromHeight(40.0), + child: Row( + children: [ + MenuList(), + RightEdit() + ], + ) + ), + ), + ), + body: TabBarView( + children: TabView() + ), + ), + ); + } +} diff --git a/untitled/lib/views/Home/Random.dart b/untitled/lib/views/Home/Random.dart new file mode 100644 index 0000000..6e423fd --- /dev/null +++ b/untitled/lib/views/Home/Random.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/widget/_.dart'; + + +/* + * 随机展示 + */ +class Random extends StatefulWidget { + + @override + State createState() => _Random(); +} + +class _Random extends State with AutomaticKeepAliveClientMixin{ + + AgentClassListData result; + List list = []; + EasyRefreshController _controller; // EasyRefresh控制器 + + + @override + void initState() { + random(); + } + + Future random() async { + result = await HomeService.GetAgentRandom(params: {}); + setState(() { + list.addAll(result.list); + }); + } + + void Refresh() { + list = []; + setState(() {}); + random(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return Scaffold( + body: EasyRefresh( + header: BezierCircleHeader(backgroundColor: ColorConfig.ThemeColor), + footer: BezierBounceFooter(backgroundColor: ColorConfig.ThemeColor), + onRefresh: () async { + Refresh(); + }, + onLoad: () async { + random(); + }, + child: ItemWidget( + data: list, + title: '', + longPress: () {} + ), + ), + floatingActionButton: FloatingActionButton( + backgroundColor: ColorConfig.ThemeColor, + child: Icon(Icons.refresh,color: ColorConfig.WhiteBackColor,), + onPressed: () { + Refresh(); + }, + ), + ); + } + + @override + bool get wantKeepAlive => true; +} \ No newline at end of file diff --git a/untitled/lib/views/Home/Search.dart b/untitled/lib/views/Home/Search.dart new file mode 100644 index 0000000..d402d32 --- /dev/null +++ b/untitled/lib/views/Home/Search.dart @@ -0,0 +1,150 @@ +import 'package:flutter/material.dart'; +import 'package:toast/toast.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/widget/_.dart'; + +class Search extends StatefulWidget { + @override + State createState() => _Search(); +} + +class _Search extends State { + + // 搜索框控制器 + TextEditingController _controller = TextEditingController(); + FocusNode _userFocusNode = FocusNode(); + + // 搜索建议 + List proposalList = [ + 'JK制服','医生','豹纹','清纯','空姐','大胸','黑丝','美腿','主播','香车','教室','学生装','老师', '风骚','蜜桃社','秀人网' + ]; + + List result = []; + + @override + void initState() { + _controller.addListener(() {}); + // 监听输入框是否获得焦点,动态返回页面 + _userFocusNode.addListener(() { + SearchProposal(); + setState(() => {}); + }); + } + + // 顶部搜索输入框 + Widget SearchItem () { + return Container( + height: Screen.setHeight(30.0), + alignment: Alignment.center, + decoration: BoxDecoration( + color: ColorConfig.WhiteBackColor, + borderRadius: BorderRadius.all(Radius.circular(25.0)), + ), + child: TextField( + controller: _controller, + focusNode: _userFocusNode, + autofocus: true, + showCursor: true, + cursorWidth: 2, + style: TextStyle(fontSize: 14), + cursorRadius: Radius.circular(10), + cursorColor: ColorConfig.ThemeColor, + textInputAction: TextInputAction.search, + onSubmitted: (String val) { + GetSearchData(); + }, + decoration: InputDecoration( + isDense: true, + border: InputBorder.none, + contentPadding: EdgeInsets.only(left: 15), + hintText: '输入搜索关键字', + hintStyle: TextStyle(color: ColorConfig.NoActiveColor,fontSize: 14), + ), + ), + ); + } + + // 顶部右侧的搜索按钮 + Widget SearchButton() { + return IconButton( + icon: Icon(Icons.search, color: ColorConfig.WhiteBackColor,), + onPressed: () { + GetSearchData(); + }, + ); + } + + // 如果输入框获得了焦点,那么返回搜索建议,否则返回搜索列表 + Widget SearchProposal() { + if (_userFocusNode.hasFocus) { + return Container( + padding: EdgeInsets.all(15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("搜索建议",style: TextStyle(fontWeight: FontWeight.w500,fontSize: Screen.setFontSize(15)),), + SizedBox(height: Screen.setHeight(10),), + Wrap( + children: proposalList.map((e) => InkWell( + onTap: () { + _controller.text = e; + GetSearchData(); + }, + child: Container( + margin: EdgeInsets.only(bottom: Screen.setFontSize(5),right: Screen.setFontSize(5)), + decoration: BoxDecoration( + color: ColorConfig.ThemeColor, + borderRadius: BorderRadius.all(Radius.circular(25.0)), + ), + padding: EdgeInsets.only(left: Screen.setFontSize(8),right: Screen.setFontSize(8),bottom: Screen.setFontSize(3),top: Screen.setFontSize(2)), + child: Text(e, style: TextStyle(color: ColorConfig.WhiteBackColor,fontSize: Screen.setFontSize(12)),), + ), + )).toList(), + ) + ], + ), + ); + }else{ + return ItemWidget( + data: result, + title: '', + longPress: () {} + ); + } + } + + // 如果输入框不为空,那么输入框失去焦点并关闭键盘展示搜索列表页面 + GetSearchData() async { + if (_controller.text.length != 0) { + _userFocusNode.unfocus(); + List res = await HomeService.GetSearchData(params: { "keyword": _controller.text }); + setState(() => result = res); + } else { + FocusScope.of(context).requestFocus(_userFocusNode); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + titleSpacing: 0.0, + title: SearchItem(), + elevation: 0, + backgroundColor: ColorConfig.ThemeColor, + actions: [ SearchButton() ], + ), + body: SearchProposal(), + ); + } + + @override + dispose() { + super.dispose(); + _controller.dispose(); + _userFocusNode.dispose(); + } +} \ No newline at end of file diff --git a/untitled/lib/views/Me/.pydio b/untitled/lib/views/Me/.pydio new file mode 100644 index 0000000..86ebabf --- /dev/null +++ b/untitled/lib/views/Me/.pydio @@ -0,0 +1 @@ +44fb7f85-0472-4263-8b56-e19b0e817612 \ No newline at end of file diff --git a/untitled/lib/views/Me/About.dart b/untitled/lib/views/Me/About.dart new file mode 100644 index 0000000..65fde8c --- /dev/null +++ b/untitled/lib/views/Me/About.dart @@ -0,0 +1,82 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:peach/R.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class About extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("关于我们"), + backgroundColor: ColorConfig.ThemeColor, + ), + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + physics: AlwaysScrollableScrollPhysics(), + child: Container( + margin: EdgeInsets.only(top: 110), + padding: EdgeInsets.all(15), + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + R.libStaticImgLogoPng, + width: Screen.setWidth(70), + height: Screen.setWidth(70), + ), + SizedBox(height: 10,), + Text(Config.appName, style: TextStyle(fontSize: 17,fontWeight: FontWeight.w400),), + SizedBox(height: 6,), + Text("十分专业的模特写真App,倾心为您提供国内外共计约198万张的写真图,满足您各种的口味和喜好是我们最初衷的动力!", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),textAlign: TextAlign.center), + + // Container( + // margin: EdgeInsets.only(top: 30), + // child: ButtonBar( + // alignment: MainAxisAlignment.center, + // mainAxisSize: MainAxisSize.max, + // children: [ + // MaterialButton( + // color: ColorConfig.ThemeColor, + // textColor: Colors.white, + // onPressed: () async { + // await launch("tel:15155145354"); + // }, + // child: Row( + // children: [ + // Icon(Icons.phone_callback,size: 14,), + // SizedBox(width: 2,), + // Text("电话联系",style: TextStyle(fontSize: 16)) + // ], + // ), + // ), + // SizedBox(width: 10,), + // MaterialButton( + // color: ColorConfig.ThemeColor, + // textColor: Colors.white, + // onPressed: () async { + // await launch("sms:15155145354"); + // }, + // child: Row( + // children: [ + // Icon(Icons.sms_outlined,size: 14,), + // SizedBox(width: 2,), + // Text("短信联系",style: TextStyle(fontSize: 16)) + // ], + // ), + // ), + // ], + // ), + // ) + ], + ), + ), + ) + ); + } + +} \ No newline at end of file diff --git a/untitled/lib/views/Me/Agent.dart b/untitled/lib/views/Me/Agent.dart new file mode 100644 index 0000000..d590f2f --- /dev/null +++ b/untitled/lib/views/Me/Agent.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:peach/config/_.dart'; + +class Agent extends StatefulWidget { + + @override + State createState() => _Agent(); +} + +class _Agent extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: ColorConfig.ThemeColor, + title: Text("代理操作教程"), + ), + body: Text("代理操作教程"), + ); + } + +} \ No newline at end of file diff --git a/untitled/lib/views/Me/Agreement.dart b/untitled/lib/views/Me/Agreement.dart new file mode 100644 index 0000000..7e13c49 --- /dev/null +++ b/untitled/lib/views/Me/Agreement.dart @@ -0,0 +1,58 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:peach/config/_.dart'; + +class Agreement extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("用户协议"), + backgroundColor: ColorConfig.ThemeColor, + ), + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + physics: BouncingScrollPhysics(), + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.all(15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("用户须知",style: TextStyle(fontSize: 17,fontWeight: FontWeight.w700),), + SizedBox(height: 15,), + Text("1:图片和视频都来源于互联网,如果存在版权问题和纠纷,请通过邮箱(codehelp123456@protonmail.com)联系,我们也会停止相应资源的展示下载等一切行为!", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + SizedBox(height: 10,), + Text("2:使用过程有任何的问题可以及时给予我们反馈。", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + SizedBox(height: 10,), + Text("3:本App内部分的内容少儿不宜,如果您未满18岁,请立即停止使用!", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + SizedBox(height: 10,), + Text("4:如果您想成为代理赚取更多的收益,请加客服微信获取代理码,即可成为代理", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + + SizedBox(height: 15,), + Text("产品特点",style: TextStyle(fontSize: 17,fontWeight: FontWeight.w700),), + SizedBox(height: 15,), + Text("1:海量的超高清图集,图片画质超清晰、全部超大尺寸或原尺寸的图片。目前已经收录35804套图集,共计:197.4394万张高清图片,每周新增约100套+图集!", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + SizedBox(height: 10,), + Text("2:在线浏览超高品质的图集,超一流的用户体验!一个帐号,电脑、手机、平板任性浏览!还可以收藏自己喜欢的图集,方便下次仔细欣赏。当然您也可以一键下载图集!", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + SizedBox(height: 10,), + Text("3:全网最专业的图集收集整理网站!中国的、日韩的、欧美的、泰国的,应有尽有。全部都是我们精心整理的,按人物、机构、标签的精准确分类!", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + SizedBox(height: 10,), + Text("4:特意开发的巧遇功能,随机从我们精心筛选的数千套图集里推送给你直接浏览体验。最贴心、好用、好看的功能!!", + style: TextStyle(fontSize: 15,color: ColorConfig.TextColor),), + SizedBox(height: 10,), + ], + ), + ), + ) + ); + } + +} \ No newline at end of file diff --git a/untitled/lib/views/Me/Like.dart b/untitled/lib/views/Me/Like.dart new file mode 100644 index 0000000..0d19afd --- /dev/null +++ b/untitled/lib/views/Me/Like.dart @@ -0,0 +1,223 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/widget/_.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; + +class Like extends StatefulWidget { + @override + State createState() => _Like(); +} + +class _Like extends State { + + List LikeList = []; + String initialValue = "default"; + final SlidableController slidableController = SlidableController(); + + @override + void initState() { + getLikeList(); + } + + /// TODO 解决思路,再存数据的时候使用 HomeEntityData + void getLikeList() async { + var likeData = await LikeService.findAll(); + setState(() => LikeList = likeData); + } + + Future deleteAlertDialog(int id) async { + await Core.deleteDialog(context, () async { + await LikeService.delete(id); + getLikeList(); + }); + } + + Widget UseLayout() { + if (LikeList.isNotEmpty) { + switch(initialValue) { + case 'default': + return OldItemWidget( + data: LikeList, + longPress: (int id) { + deleteAlertDialog(id); + }, + ); + break; + case 'column': + return Container( + padding: EdgeInsets.only(left: 10,right: 10, top: 5), + alignment: Alignment.centerLeft, + child: ListView.builder( + shrinkWrap: true, + itemCount: LikeList.length, + physics: BouncingScrollPhysics(), + itemBuilder: (BuildContext contenx,int index) { + return Slidable( + key: Key(index.toString()), + controller: slidableController, + actionPane: SlidableDrawerActionPane(), + actionExtentRatio: 0.25, + child: InkWell( + onLongPress: () => deleteAlertDialog(LikeList[index].id), + onTap: () => Modular.to.pushNamed("/details/${LikeList[index].id}"), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + LikeList[index].preview, + width: Screen.setWidth(120), + height: Screen.setHeight(80), + ), + SizedBox(width: 10,), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 5,), + Text(LikeList[index].title, style: TextStyle(color: ColorConfig.TitleColor,fontSize: 15),), + Container( + margin: EdgeInsets.only(top: 10), + child: Wrap( + children: [ + Container(margin: EdgeInsets.only(right: 5),child: Text("模特:${LikeList[index].user}",style: TextStyle(color: ColorConfig.TextColor,fontSize: 13)),), + Container(margin: EdgeInsets.only(right: 5),child: Text("来源:${LikeList[index].source}",style: TextStyle(color: ColorConfig.TextColor,fontSize: 13)),), + Container(margin: EdgeInsets.only(right: 5),child: Text("图片:${LikeList[index].totals}P",style: TextStyle(color: ColorConfig.TextColor,fontSize: 13)),), + ], + ), + ) + ], + ), + ) + ], + ), + ), + secondaryActions: [//右侧按钮列表 + IconSlideAction( + caption: '删除', + color: ColorConfig.ThemeColor, + foregroundColor: ColorConfig.WhiteBackColor, + icon: Icons.delete, + closeOnTap: false, + onTap: () { + Slidable.of(context)?.close(); + deleteAlertDialog(LikeList[index].id); + }, + ), + ], + ); + } + ), + ); + break; + case 'big': + return Container( + alignment: Alignment.centerLeft, + child: ListView.builder( + shrinkWrap: true, + itemCount: LikeList.length, + physics: BouncingScrollPhysics(), + itemBuilder: (BuildContext contenx,int index) { + return InkWell( + onLongPress: () => deleteAlertDialog(LikeList[index].id), + onTap: () => Modular.to.pushNamed("/details/${LikeList[index].id}"), + child: Column( + children: [ + Image.network( + LikeList[index].preview, + width: MediaQuery.of(context).size.width, + fit: BoxFit.cover, + ), + ], + ), + ); + }, + ), + ); + break; + } + } else { + return Container( + height: Screen.setHeight(300), + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.error_outline_outlined,size: 50,color: ColorConfig.ThemeColor,), + SizedBox(height: 10,), + Text("暂无收藏", style: TextStyle(color: ColorConfig.TextColor)) + ], + ), + ); + } + + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: ColorConfig.ThemeColor, + title: Text("我的收藏"), + actions: [ + Row( + children: [ + Text(initialValue == "default" ? '默认布局' : initialValue == "column" ? "多列布局" : "大图布局"), + new PopupMenuButton( + initialValue: initialValue, + itemBuilder: (BuildContext context) => >[ + PopupMenuItem( + value: 'default', + child: new Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + new Icon(Icons.grid_view, color: ColorConfig.ThemeColor), + new Text("默认布局"), + ], + ) + ), + PopupMenuItem( + value: 'column', + child: new Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + new Icon(Icons.table_rows_outlined, color: ColorConfig.ThemeColor), + new Text("多列布局"), + ], + ) + ), + PopupMenuItem( + value: 'big', + child: new Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + new Icon(Icons.image_outlined, color: ColorConfig.ThemeColor), + new Text("大图模式"), + ], + ) + ) + ], + onSelected: (String action) { + print("action ===== ${action}"); + setState(() { + initialValue = action; + }); + }, + ) + ], + ) + ], + ), + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + physics: BouncingScrollPhysics(), + child: UseLayout(), + ) + ); + } + + +} \ No newline at end of file diff --git a/untitled/lib/views/Me/Me.dart b/untitled/lib/views/Me/Me.dart new file mode 100644 index 0000000..ed4353d --- /dev/null +++ b/untitled/lib/views/Me/Me.dart @@ -0,0 +1,324 @@ +import 'dart:io'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:peach/R.dart'; +import 'package:share_extend/share_extend.dart'; +import 'package:toast/toast.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/widget/_.dart'; + +class Me extends StatefulWidget { + @override + State createState() => _Me(); +} + +class _Me extends State { + String cacheSize = "0.00B"; + + @override + void initState() { + ComputeCache(); + } + + Future ComputeCache() async { + String size = await ClearCache.loadCache(); + setState(() { + cacheSize = size; + }); + } + + /// 分享给好友 + shareText() async { + ShareExtend.share( + "[有人@你]\n您的朋友给你分享了一个成人写真App。\n点击查看:${Config.shareIpUrl}?objectId=${Tool.userInfo()['objectId']}", + "text", + sharePanelTitle: "111", + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + toolbarHeight: 0, + elevation: 0.0, + backgroundColor: ColorConfig.ThemeColor, + ), + body: Stack( + alignment: AlignmentDirectional.center, + children: [ + Positioned( + width: Screen.width(context), + left: 0, + top: 0, + child: Container( + padding: EdgeInsets.only(top: Screen.setHeight(40)), + alignment: Alignment.topCenter, + height: Screen.setHeight(150), + color: ColorConfig.ThemeColor, + child: Tool.userInfo()['userType'] == "0" + ? Text("我 的", style: TextStyle(fontSize: Screen.setFontSize(18),color: ColorConfig.WhiteBackColor),) + : Text("欢 迎 代 理", style: TextStyle(fontSize: Screen.setFontSize(18),color: ColorConfig.WhiteBackColor),), + ), + ), + + Positioned( + width: Screen.width(context) / 1.1, + top: Screen.setHeight(80), + child: Container( + height: Tool.userInfo()['userType'] == "1" ? Screen.setHeight(100) : Screen.setHeight(80), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: [ + BoxShadow( + color: Colors.black12, + offset: Offset(1.0, 10.0), //阴影xy轴偏移量 + blurRadius: 15.0, //阴影模糊程度 + spreadRadius: 1.0 //阴影扩散程度 + ) + ]), + padding: EdgeInsets.only(left: Screen.setFontSize(15), right: Screen.setFontSize(15),top: Screen.setFontSize(10)), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + ClipOval( + child: Image.asset( + R.libStaticImgLogoPng, + width: Screen.setWidth(60), + height: Screen.setWidth(60), + fit: BoxFit.cover, + ), + ), + SizedBox(width: Screen.setWidth(10),), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(Tool.userInfo()['username'],style: TextStyle(fontSize: Screen.setFontSize(18),color: ColorConfig.TitleColor),), + Text("注册时间: ${Tool.userInfo()['createdAt']}",style: TextStyle(fontSize: Screen.setFontSize(12),color: ColorConfig.NoActiveColor),), + ], + ) + ) + ], + ), + Tool.userInfo()['userType'] == "1" + ? Column( + children: [ + CellWidget( + leftIcon: IconFont.DaLiIcon(), + leftText: Text("代理操作教程", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + rightText: Text("必看!",style: TextStyle(fontSize: Screen.setFontSize(12),color: Color.fromARGB(87, 0, 0, 0))), + onTap: () { + Modular.to.pushNamed('/agent'); + }, + ), + ], + ) + : Container(), + ], + ), + ), + ), + + Positioned( + left: 0, + right: 0, + top: Tool.userInfo()['userType'] == "1" ? Screen.setHeight(180) : Screen.setHeight(160), + bottom: 0, + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + physics: BouncingScrollPhysics(), + child: Column( + children: [ + Container( + height: 15, + ), + CellWidget( + leftIcon: IconFont.VipIcon(), + leftText: Text("办理会员", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/vip'); + }, + ), + CellWidget( + leftIcon: IconFont.BuyIcon(), + leftText: Text("会员状态", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/status'); + }, + ), + Container( + height: 10, + color: ColorConfig.LineColor, + ), + + // CellWidget( + // leftIcon: IconFont.VideoIcon(), + // leftText: Text("成人视频", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + // onTap: () { + // Modular.to.pushNamed('/video'); + // }, + // ), + CellWidget( + leftIcon: IconFont.VideoIcon(), + leftText: Text("快手视频", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/video'); + }, + ), + CellWidget( + leftIcon: IconFont.NewsIcon(), + leftText: Text("最新写真", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/recently'); + }, + ), + Container( + height: 10, + color: ColorConfig.LineColor, + ), + + CellWidget( + leftIcon: IconFont.PictureIcon(), + leftText: Text("图片收藏", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/singlegraph'); + }, + ), + CellWidget( + leftIcon: IconFont.ModelIcon(color: ColorConfig.TextColor,size: Screen.setFontSize(20)), + leftText: Text("写真收藏", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/like'); + }, + ), + Container( + height: 10, + color: ColorConfig.LineColor, + ), + + CellWidget( + leftIcon: IconFont.AboutIcon(), + leftText: Text("关于我们", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/about'); + }, + ), + CellWidget( + leftIcon: IconFont.XieYiIcon(), + leftText: Text("用户协议", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + onTap: () { + Modular.to.pushNamed('/agreement'); + }, + ), + CellWidget( + leftIcon: IconFont.UpdateIcon(), + leftText: Text("检测升级", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + rightText: Text("v"+Config.packageInfo.version,style: TextStyle(fontSize: Screen.setFontSize(12),color: Color.fromARGB(87, 0, 0, 0))), + onTap: () async { + bool status = await CheckUpdate().check(context); + if (!status) { + Toast.show("已是最新版", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM); + } + }, + ), + CellWidget( + leftIcon: IconFont.ClearIcon(), + leftText: Text("清除缓存", style: TextStyle(fontSize: Screen.setFontSize(14),color: ColorConfig.TextColor)), + rightText: Text(cacheSize,style: TextStyle(fontSize: Screen.setFontSize(12),color: Color.fromARGB(87, 0, 0, 0))), + onTap: () async { + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) => WillPopScope( + onWillPop: () async => false, + child: AlertDialog( + title: Text("清除缓存"), + content: Container( + height: 110, + child: Column( + children: [ + Text("此操作将删除您的【分类菜单】【图片缓存】【收藏记录】等所有内容,请慎重考虑!!"), + SizedBox(height: 10,), + Text("清除成功后将强制关闭应用,请自行重启",style: TextStyle(color: ColorConfig.NoActiveColor,fontSize: 14)) + ], + ), + ), + actions: [ + FlatButton( + child: Text('取消', style: TextStyle(color: ColorConfig.ThemeColor),), + onPressed: () { + Navigator.of(context).pop(); + } + ), + FlatButton( + child: Text("清除", style: TextStyle(color: ColorConfig.NoActiveColor),), + onPressed: () async { + Navigator.of(context).pop(); + bool status = await ClearCache.clearCache(); + await ComputeCache(); + if (status) { + exit(0); + } + } + ), + ], + ), + ) + ); + }, + ), + SizedBox(height: 40,), + InkWell( + onTap: () async { + await SPreferences().setBool("isLogin", false); + Modular.to.pushReplacementNamed('/login'); + }, + child: Container( + margin: EdgeInsets.only(left: Screen.setFontSize(15),right: Screen.setFontSize(15)), + height: Screen.setHeight(35), + alignment: Alignment.center, + width: Screen.width(context), + decoration: BoxDecoration( + color: ColorConfig.ThemeColor, + borderRadius: BorderRadius.circular(5) + ), + child: Text( + "退 出 登 录", + style: TextStyle( + color: ColorConfig.WhiteBackColor, fontSize: Screen.setFontSize(16) + ), + ), + ), + ), + SizedBox(height: Screen.setHeight(40),), + ], + ), + ) + ), + + Tool.userInfo()['userType'] == "1" ? Positioned( + right: 15, + top: 10, + child: InkWell( + onTap: () { + shareText(); + }, + child: Row( + children: [ + Text("分享赚钱", style: TextStyle(color: ColorConfig.WhiteBackColor,fontSize: 15)), + ], + ), + ), + ) : Container() + ], + ), + ); + } +} diff --git a/untitled/lib/views/Me/Recently.dart b/untitled/lib/views/Me/Recently.dart new file mode 100644 index 0000000..c40cddf --- /dev/null +++ b/untitled/lib/views/Me/Recently.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/widget/_.dart'; + +class Recently extends StatefulWidget { + @override + State createState() => _Recently(); +} + +class _Recently extends State { + + List result = []; + int page = 1; + + @override + void initState() { + GetRecentlyData(); + } + + + Future GetRecentlyData() async { + AgentClassListData res = await HomeService.GetRecently(params: { "page": page }); + print("========= ${res.total}"); + setState(() { + result.addAll(res.list); + page = int.parse(res.page); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("最近更新"), + backgroundColor: ColorConfig.ThemeColor, + ), + body: EasyRefresh( + header: BezierCircleHeader(backgroundColor: ColorConfig.ThemeColor), + footer: BezierBounceFooter(backgroundColor: ColorConfig.ThemeColor), + onRefresh: () async { + print("刷新"); + }, + onLoad: () async { + setState(() { + page+=1; + GetRecentlyData(); + }); + }, + child: ItemWidget( + data: result, + title: '', + longPress: () {} + ), + ), + ); + } +} \ No newline at end of file diff --git a/untitled/lib/views/Me/SingleGraph.dart b/untitled/lib/views/Me/SingleGraph.dart new file mode 100644 index 0000000..ba3431f --- /dev/null +++ b/untitled/lib/views/Me/SingleGraph.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/widget/_.dart'; + +class SingleGraph extends StatefulWidget { + @override + State createState() => _SingleGraph(); +} + +class _SingleGraph extends State { + + List result = []; + List imgArr = []; + + @override + void initState() { + singleImg(); + } + + Future>> singleImg () async { + List res = await LikeService.findAllImg(); + setState(() { + result = res; + res.forEach((v) { + imgArr.add(v.src); + }); + }); + } + + Future deleteAlertDialog(String url) async { + await Core.deleteDialog(context, () async { + await LikeService.deleteImg(url); + singleImg(); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("单图收藏"), + backgroundColor: ColorConfig.ThemeColor, + actions: [ + Container( + alignment:Alignment.center, + padding: EdgeInsets.only(right: 15), + child: Text("共 ${result.length ?? 0} 张"), + ) + ], + ), + body: result.isNotEmpty ? ListView.builder( + itemCount: result.length ?? 0, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onLongPress: () => deleteAlertDialog(result[index].src), + onTap: () async { + Navigator.of(context).push(new MaterialPageRoute(builder: (_) { + return PhotoViewGalleryScreen( + images: imgArr, + index: index, + title: "", + time: "", + heroTag: index.toString(), + ); + })); + }, + child: CachedNetworkImg(result[index].src), + ); + }, + ) : Container( + height: Screen.setHeight(300), + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.error_outline_outlined,size: 50,color: ColorConfig.ThemeColor,), + SizedBox(height: 10,), + Text("暂无收藏", style: TextStyle(color: ColorConfig.TextColor)) + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/untitled/lib/views/Me/Video/.pydio b/untitled/lib/views/Me/Video/.pydio new file mode 100644 index 0000000..5f4fd15 --- /dev/null +++ b/untitled/lib/views/Me/Video/.pydio @@ -0,0 +1 @@ +fc0c81c7-b1ce-4324-bfd3-3e74b84b3bc1 \ No newline at end of file diff --git a/untitled/lib/views/Me/Video/Video.dart b/untitled/lib/views/Me/Video/Video.dart new file mode 100644 index 0000000..760d610 --- /dev/null +++ b/untitled/lib/views/Me/Video/Video.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/views/Me/Video/player.dart'; +import 'package:peach/config/_.dart'; +import 'package:peach/entity/_.dart'; +import 'package:peach/utils/_.dart'; +import 'package:peach/service/_.dart'; +import 'package:peach/widget/_.dart'; + +class Video extends StatefulWidget { + @override + State createState() => _Video(); +} + +// 短视频模块 +class _Video extends State