From 51785b6761933571761062beef9cff2bb6ac1e50 Mon Sep 17 00:00:00 2001 From: kevin <328471290@qq.com> Date: Wed, 8 May 2024 18:00:07 +0800 Subject: [PATCH] first commit --- .gitignore | 29 + .hbuilderx/launch.json | 16 + App.vue | 29 + index.html | 29 + main.js | 33 + manifest.json | 75 + package.json | 15 + pages.json | 430 +++ pages/all/all.vue | 596 ++++ pages/all/dynamicdetails.vue | 130 + pages/index/addshoppingcart.vue | 135 + pages/index/customerservice.vue | 27 + pages/index/index.vue | 702 +++++ pages/index/outsourcing/outsourcing.vue | 1113 +++++++ pages/index/searchfor.vue | 237 ++ pages/index/test.vue | 14 + pages/index/testcrowdsourc/companyInfo.vue | 381 +++ .../testcrowdsourc/crowdsourcingdetails.vue | 995 +++++++ pages/index/testcrowdsourc/testcrowdsourc.vue | 2618 ++++++++++++++++ .../testcrowdsourc/testcrowdsourcChange.vue | 2625 +++++++++++++++++ pages/index/testtraining/signup.vue | 695 +++++ pages/index/testtraining/testtraining.old2vue | 926 ++++++ pages/index/testtraining/testtraining.vue | 2193 ++++++++++++++ pages/index/testtraining/testtrainingold.vue | 670 +++++ pages/index/toolleasing/tooldetails.vue | 746 +++++ pages/index/toolleasing/tooldetailsold.vue | 26 + pages/index/toolleasing/toolleasing.vue | 295 ++ pages/index/toolleasing/toolleasingold.vue | 19 + pages/message/message.vue | 63 + pages/personal/leavemessage/index.vue | 247 ++ pages/personal/login.vue | 177 ++ pages/personal/mycrowdtest/mycrowdtest.vue | 367 +++ pages/personal/mysignup/notice.vue | 93 + pages/personal/mytestkit/mytestkit.vue | 63 + pages/personal/ordernumber/ordernumber.vue | 444 +++ pages/personal/personal - 副本.vue | 474 +++ pages/personal/personal.vue | 545 ++++ pages/personal/personalresume/advantage.vue | 77 + pages/personal/personalresume/basicinform.vue | 323 ++ .../personalresume/personalresume.vue | 245 ++ .../personalresume/projectexperience.vue | 179 ++ .../personalresume/workexperience.vue | 90 + pages/personal/phonelogin.vue | 180 ++ pages/personal/privacy.vue | 266 ++ pages/personal/setup/Information.vue | 316 ++ pages/personal/setup/Withdrawal.vue | 216 ++ pages/personal/setup/aboutus.vue | 53 + pages/personal/setup/accountoverview.vue | 502 ++++ pages/personal/setup/certification.vue | 435 +++ pages/personal/setup/guide.vue | 61 + pages/personal/setup/index.vue | 114 + pages/personal/setup/myreview.vue | 126 + pages/personal/setup/oldcertification.vue | 442 +++ pages/personal/setup/pclogin.vue | 161 + pages/personal/setup/pcweb.vue | 46 + pages/personal/setup/peixunban.vue | 113 + pages/personal/setup/tranpassword.vue | 213 ++ pages/personal/setup/transaction.vue | 168 ++ pages/personal/setup/usepeople.vue | 157 + pages/personal/userAgreemen.vue | 381 +++ pages/shoppingtrolley/shoppingtrolley.vue | 378 +++ pages/shoppingtrolley/shoppingtrolleyold.vue | 56 + project.config.json | 33 + project.private.config.json | 7 + static/crowd/PAYB.png | Bin 0 -> 1697 bytes static/crowd/add.png | Bin 0 -> 1749 bytes static/crowd/bankcad.png | Bin 0 -> 986 bytes static/crowd/commny.png | Bin 0 -> 948 bytes static/crowd/daxue.png | Bin 0 -> 513 bytes static/crowd/defaultAva.jpg | Bin 0 -> 2775 bytes static/crowd/email.png | Bin 0 -> 1511 bytes static/crowd/fjupload.png | Bin 0 -> 1177 bytes static/crowd/lesftt.png | Bin 0 -> 584 bytes static/crowd/like.png | Bin 0 -> 1042 bytes static/crowd/noemail.png | Bin 0 -> 887 bytes static/crowd/nophone.png | Bin 0 -> 1574 bytes static/crowd/phone.png | Bin 0 -> 996 bytes static/crowd/reeamil.png | Bin 0 -> 275 bytes static/crowd/rihhj.png | Bin 0 -> 585 bytes static/crowd/setpx.png | Bin 0 -> 1167 bytes static/crowd/setyr.png | Bin 0 -> 1230 bytes static/crowd/success.png | Bin 0 -> 1163 bytes static/crowd/tubiao1.png | Bin 0 -> 723 bytes static/crowd/upload.png | Bin 0 -> 1020 bytes static/crowd/zhuanye.png | Bin 0 -> 324 bytes static/crowd/zhuyi.png | Bin 0 -> 435 bytes static/index/actcedt.png | Bin 0 -> 2023 bytes static/index/activeall.png | Bin 0 -> 1565 bytes static/index/activeindex.png | Bin 0 -> 1336 bytes static/index/activemessage.png | Bin 0 -> 1821 bytes static/index/activeperson.png | Bin 0 -> 1317 bytes static/index/activeshopping.png | Bin 0 -> 1292 bytes static/index/all.png | Bin 0 -> 1392 bytes static/index/baoming.png | Bin 0 -> 1757 bytes static/index/cedt.png | Bin 0 -> 1990 bytes static/index/dd.png | Bin 0 -> 1527 bytes static/index/downarrow.png | Bin 0 -> 363 bytes static/index/duihuazixun.png | Bin 0 -> 1853 bytes static/index/grxx.png | Bin 0 -> 503 bytes static/index/gzjl.png | Bin 0 -> 532 bytes static/index/index.png | Bin 0 -> 882 bytes static/index/jnzs.png | Bin 0 -> 613 bytes static/index/kf.png | Bin 0 -> 1646 bytes static/index/logo.png | Bin 0 -> 2562 bytes static/index/message.png | Bin 0 -> 1819 bytes static/index/myper.png | Bin 0 -> 424 bytes static/index/mysignup.png | Bin 0 -> 1805 bytes static/index/person.png | Bin 0 -> 1075 bytes static/index/rnotice.png | Bin 0 -> 968 bytes static/index/shopping.png | Bin 0 -> 1043 bytes static/index/success.png | Bin 0 -> 245 bytes static/index/testkit.png | Bin 0 -> 1451 bytes static/index/tj.png | Bin 0 -> 562 bytes static/index/xiala.png | Bin 0 -> 4447 bytes static/index/zc.png | Bin 0 -> 1540 bytes uni.promisify.adaptor.js | 10 + uni.scss | 76 + uni_modules/uni-number-box/changelog.md | 29 + .../uni-number-box/uni-number-box.vue | 223 ++ uni_modules/uni-number-box/package.json | 82 + uni_modules/uni-number-box/readme.md | 13 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 ++ .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + utils/comstemutil.js | 311 ++ utils/encrypt.js | 22 + utils/http.js | 152 + utils/mixin/index.js | 19 + utils/mixin/tootype.js | 19 + utils/share.js | 21 + utils/util.js | 320 ++ utils/validate.js | 260 ++ uview-ui/LICENSE | 21 + uview-ui/README.md | 106 + .../u-action-sheet/u-action-sheet.vue | 190 ++ .../components/u-alert-tips/u-alert-tips.vue | 256 ++ .../u-avatar-cropper/u-avatar-cropper.vue | 290 ++ .../components/u-avatar-cropper/weCropper.js | 1265 ++++++++ uview-ui/components/u-avatar/u-avatar.vue | 244 ++ uview-ui/components/u-back-top/u-back-top.vue | 153 + uview-ui/components/u-badge/u-badge.vue | 216 ++ uview-ui/components/u-button/u-button.vue | 596 ++++ uview-ui/components/u-calendar/u-calendar.vue | 639 ++++ .../u-car-keyboard/u-car-keyboard.vue | 257 ++ uview-ui/components/u-card/u-card.vue | 299 ++ .../components/u-cell-group/u-cell-group.vue | 70 + .../components/u-cell-item/u-cell-item.vue | 316 ++ .../u-checkbox-group/u-checkbox-group.vue | 123 + uview-ui/components/u-checkbox/u-checkbox.vue | 284 ++ .../u-circle-progress/u-circle-progress.vue | 220 ++ uview-ui/components/u-col/u-col.vue | 156 + .../u-collapse-item/u-collapse-item.vue | 204 ++ uview-ui/components/u-collapse/u-collapse.vue | 99 + .../u-column-notice/u-column-notice.vue | 237 ++ .../components/u-count-down/u-count-down.vue | 318 ++ uview-ui/components/u-count-to/u-count-to.vue | 241 ++ uview-ui/components/u-divider/u-divider.vue | 153 + .../u-dropdown-item/u-dropdown-item.vue | 132 + uview-ui/components/u-dropdown/u-dropdown.vue | 298 ++ uview-ui/components/u-empty/u-empty.vue | 193 ++ uview-ui/components/u-field/u-field.vue | 384 +++ .../components/u-form-item/u-form-item.vue | 431 +++ uview-ui/components/u-form/u-form.vue | 134 + .../u-full-screen/u-full-screen.vue | 52 + uview-ui/components/u-gap/u-gap.vue | 54 + .../components/u-grid-item/u-grid-item.vue | 126 + uview-ui/components/u-grid/u-grid.vue | 108 + uview-ui/components/u-icon/u-icon.vue | 336 +++ uview-ui/components/u-image/u-image.vue | 266 ++ .../u-index-anchor/u-index-anchor.vue | 89 + .../components/u-index-list/u-index-list.vue | 315 ++ uview-ui/components/u-input/u-input.vue | 387 +++ uview-ui/components/u-keyboard/u-keyboard.vue | 217 ++ .../components/u-lazy-load/u-lazy-load.vue | 244 ++ .../u-line-progress/u-line-progress.vue | 147 + uview-ui/components/u-line/u-line.vue | 84 + uview-ui/components/u-link/u-link.vue | 89 + .../u-loading-page/u-loading-page.vue | 25 + uview-ui/components/u-loading/u-loading.vue | 103 + uview-ui/components/u-loadmore/u-loadmore.vue | 203 ++ uview-ui/components/u-mask/u-mask.vue | 123 + .../u-message-input/u-message-input.vue | 311 ++ uview-ui/components/u-modal/u-modal.vue | 283 ++ uview-ui/components/u-navbar/u-navbar.vue | 315 ++ .../components/u-no-network/u-no-network.vue | 233 ++ .../components/u-notice-bar/u-notice-bar.vue | 272 ++ .../components/u-number-box/u-number-box.vue | 363 +++ .../u-number-keyboard/u-number-keyboard.vue | 158 + .../components/u-parse/libs/CssHandler.js | 100 + .../components/u-parse/libs/MpHtmlParser.js | 580 ++++ uview-ui/components/u-parse/libs/config.js | 80 + uview-ui/components/u-parse/libs/handler.wxs | 22 + uview-ui/components/u-parse/libs/trees.vue | 505 ++++ uview-ui/components/u-parse/u-parse.vue | 645 ++++ uview-ui/components/u-picker/u-picker.vue | 676 +++++ uview-ui/components/u-popup/u-popup.vue | 456 +++ .../u-radio-group/u-radio-group.vue | 128 + uview-ui/components/u-radio/u-radio.vue | 271 ++ uview-ui/components/u-rate/u-rate.vue | 275 ++ .../components/u-read-more/u-read-more.vue | 179 ++ .../components/u-row-notice/u-row-notice.vue | 269 ++ uview-ui/components/u-row/u-row.vue | 84 + uview-ui/components/u-search/u-search.vue | 342 +++ uview-ui/components/u-section/u-section.vue | 154 + uview-ui/components/u-select/u-select.vue | 417 +++ uview-ui/components/u-skeleton/u-skeleton.vue | 199 ++ uview-ui/components/u-slider/u-slider.vue | 257 ++ uview-ui/components/u-steps/u-steps.vue | 200 ++ uview-ui/components/u-sticky/u-sticky.vue | 157 + .../components/u-subsection/u-subsection.vue | 355 +++ .../u-swipe-action/u-swipe-action.vue | 255 ++ uview-ui/components/u-swiper/u-swiper.vue | 340 +++ uview-ui/components/u-switch/u-switch.vue | 163 + uview-ui/components/u-tabbar/u-tabbar.vue | 330 +++ uview-ui/components/u-table/u-table.vue | 84 + .../u-tabs-swiper/u-tabs-swiper.vue | 488 +++ uview-ui/components/u-tabs/u-tabs.vue | 368 +++ uview-ui/components/u-tag/u-tag.vue | 294 ++ uview-ui/components/u-td/u-td.vue | 66 + uview-ui/components/u-th/u-th.vue | 62 + .../u-time-line-item/u-time-line-item.vue | 83 + .../components/u-time-line/u-time-line.vue | 43 + uview-ui/components/u-toast/u-toast.vue | 220 ++ uview-ui/components/u-top-tips/u-top-tips.vue | 121 + uview-ui/components/u-tr/u-tr.vue | 25 + uview-ui/components/u-upload/u-upload.vue | 654 ++++ .../u-verification-code.vue | 164 + .../components/u-waterfall/u-waterfall.vue | 176 ++ uview-ui/iconfont.css | 910 ++++++ uview-ui/index.js | 141 + uview-ui/index.scss | 23 + uview-ui/libs/config/config.js | 15 + uview-ui/libs/config/zIndex.js | 20 + uview-ui/libs/css/color.scss | 155 + uview-ui/libs/css/common.scss | 176 ++ uview-ui/libs/css/style.components.scss | 7 + uview-ui/libs/css/style.h5.scss | 8 + uview-ui/libs/css/style.mp.scss | 72 + uview-ui/libs/css/style.nvue.scss | 3 + uview-ui/libs/css/style.vue.scss | 175 ++ uview-ui/libs/function/$parent.js | 18 + uview-ui/libs/function/addUnit.js | 8 + uview-ui/libs/function/bem.js | 5 + uview-ui/libs/function/color.js | 37 + uview-ui/libs/function/colorGradient.js | 134 + uview-ui/libs/function/debounce.js | 29 + uview-ui/libs/function/deepClone.js | 23 + uview-ui/libs/function/deepMerge.js | 30 + uview-ui/libs/function/getParent.js | 47 + uview-ui/libs/function/guid.js | 41 + uview-ui/libs/function/md5.js | 385 +++ uview-ui/libs/function/queryParams.js | 58 + uview-ui/libs/function/random.js | 10 + uview-ui/libs/function/randomArray.js | 7 + uview-ui/libs/function/route.js | 122 + uview-ui/libs/function/sys.js | 9 + uview-ui/libs/function/test.js | 232 ++ uview-ui/libs/function/throttle.js | 32 + uview-ui/libs/function/timeFormat.js | 51 + uview-ui/libs/function/timeFrom.js | 47 + uview-ui/libs/function/toast.js | 9 + uview-ui/libs/function/trim.js | 15 + uview-ui/libs/function/type2icon.js | 35 + uview-ui/libs/mixin/mixin.js | 64 + uview-ui/libs/mixin/mpShare.js | 18 + uview-ui/libs/request/index.js | 169 ++ uview-ui/libs/store/index.js | 19 + uview-ui/libs/util/area.js | 1 + uview-ui/libs/util/async-validator.js | 1356 +++++++++ uview-ui/libs/util/city.js | 1 + uview-ui/libs/util/emitter.js | 51 + uview-ui/libs/util/province.js | 1 + uview-ui/package.json | 39 + uview-ui/theme.scss | 38 + 286 files changed, 54459 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/all/all.vue create mode 100644 pages/all/dynamicdetails.vue create mode 100644 pages/index/addshoppingcart.vue create mode 100644 pages/index/customerservice.vue create mode 100644 pages/index/index.vue create mode 100644 pages/index/outsourcing/outsourcing.vue create mode 100644 pages/index/searchfor.vue create mode 100644 pages/index/test.vue create mode 100644 pages/index/testcrowdsourc/companyInfo.vue create mode 100644 pages/index/testcrowdsourc/crowdsourcingdetails.vue create mode 100644 pages/index/testcrowdsourc/testcrowdsourc.vue create mode 100644 pages/index/testcrowdsourc/testcrowdsourcChange.vue create mode 100644 pages/index/testtraining/signup.vue create mode 100644 pages/index/testtraining/testtraining.old2vue create mode 100644 pages/index/testtraining/testtraining.vue create mode 100644 pages/index/testtraining/testtrainingold.vue create mode 100644 pages/index/toolleasing/tooldetails.vue create mode 100644 pages/index/toolleasing/tooldetailsold.vue create mode 100644 pages/index/toolleasing/toolleasing.vue create mode 100644 pages/index/toolleasing/toolleasingold.vue create mode 100644 pages/message/message.vue create mode 100644 pages/personal/leavemessage/index.vue create mode 100644 pages/personal/login.vue create mode 100644 pages/personal/mycrowdtest/mycrowdtest.vue create mode 100644 pages/personal/mysignup/notice.vue create mode 100644 pages/personal/mytestkit/mytestkit.vue create mode 100644 pages/personal/ordernumber/ordernumber.vue create mode 100644 pages/personal/personal - 副本.vue create mode 100644 pages/personal/personal.vue create mode 100644 pages/personal/personalresume/advantage.vue create mode 100644 pages/personal/personalresume/basicinform.vue create mode 100644 pages/personal/personalresume/personalresume.vue create mode 100644 pages/personal/personalresume/projectexperience.vue create mode 100644 pages/personal/personalresume/workexperience.vue create mode 100644 pages/personal/phonelogin.vue create mode 100644 pages/personal/privacy.vue create mode 100644 pages/personal/setup/Information.vue create mode 100644 pages/personal/setup/Withdrawal.vue create mode 100644 pages/personal/setup/aboutus.vue create mode 100644 pages/personal/setup/accountoverview.vue create mode 100644 pages/personal/setup/certification.vue create mode 100644 pages/personal/setup/guide.vue create mode 100644 pages/personal/setup/index.vue create mode 100644 pages/personal/setup/myreview.vue create mode 100644 pages/personal/setup/oldcertification.vue create mode 100644 pages/personal/setup/pclogin.vue create mode 100644 pages/personal/setup/pcweb.vue create mode 100644 pages/personal/setup/peixunban.vue create mode 100644 pages/personal/setup/tranpassword.vue create mode 100644 pages/personal/setup/transaction.vue create mode 100644 pages/personal/setup/usepeople.vue create mode 100644 pages/personal/userAgreemen.vue create mode 100644 pages/shoppingtrolley/shoppingtrolley.vue create mode 100644 pages/shoppingtrolley/shoppingtrolleyold.vue create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 static/crowd/PAYB.png create mode 100644 static/crowd/add.png create mode 100644 static/crowd/bankcad.png create mode 100644 static/crowd/commny.png create mode 100644 static/crowd/daxue.png create mode 100644 static/crowd/defaultAva.jpg create mode 100644 static/crowd/email.png create mode 100644 static/crowd/fjupload.png create mode 100644 static/crowd/lesftt.png create mode 100644 static/crowd/like.png create mode 100644 static/crowd/noemail.png create mode 100644 static/crowd/nophone.png create mode 100644 static/crowd/phone.png create mode 100644 static/crowd/reeamil.png create mode 100644 static/crowd/rihhj.png create mode 100644 static/crowd/setpx.png create mode 100644 static/crowd/setyr.png create mode 100644 static/crowd/success.png create mode 100644 static/crowd/tubiao1.png create mode 100644 static/crowd/upload.png create mode 100644 static/crowd/zhuanye.png create mode 100644 static/crowd/zhuyi.png create mode 100644 static/index/actcedt.png create mode 100644 static/index/activeall.png create mode 100644 static/index/activeindex.png create mode 100644 static/index/activemessage.png create mode 100644 static/index/activeperson.png create mode 100644 static/index/activeshopping.png create mode 100644 static/index/all.png create mode 100644 static/index/baoming.png create mode 100644 static/index/cedt.png create mode 100644 static/index/dd.png create mode 100644 static/index/downarrow.png create mode 100644 static/index/duihuazixun.png create mode 100644 static/index/grxx.png create mode 100644 static/index/gzjl.png create mode 100644 static/index/index.png create mode 100644 static/index/jnzs.png create mode 100644 static/index/kf.png create mode 100644 static/index/logo.png create mode 100644 static/index/message.png create mode 100644 static/index/myper.png create mode 100644 static/index/mysignup.png create mode 100644 static/index/person.png create mode 100644 static/index/rnotice.png create mode 100644 static/index/shopping.png create mode 100644 static/index/success.png create mode 100644 static/index/testkit.png create mode 100644 static/index/tj.png create mode 100644 static/index/xiala.png create mode 100644 static/index/zc.png create mode 100644 uni.promisify.adaptor.js create mode 100644 uni.scss create mode 100644 uni_modules/uni-number-box/changelog.md create mode 100644 uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue create mode 100644 uni_modules/uni-number-box/package.json create mode 100644 uni_modules/uni-number-box/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 utils/comstemutil.js create mode 100644 utils/encrypt.js create mode 100644 utils/http.js create mode 100644 utils/mixin/index.js create mode 100644 utils/mixin/tootype.js create mode 100644 utils/share.js create mode 100644 utils/util.js create mode 100644 utils/validate.js create mode 100644 uview-ui/LICENSE create mode 100644 uview-ui/README.md create mode 100644 uview-ui/components/u-action-sheet/u-action-sheet.vue create mode 100644 uview-ui/components/u-alert-tips/u-alert-tips.vue create mode 100644 uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue create mode 100644 uview-ui/components/u-avatar-cropper/weCropper.js create mode 100644 uview-ui/components/u-avatar/u-avatar.vue create mode 100644 uview-ui/components/u-back-top/u-back-top.vue create mode 100644 uview-ui/components/u-badge/u-badge.vue create mode 100644 uview-ui/components/u-button/u-button.vue create mode 100644 uview-ui/components/u-calendar/u-calendar.vue create mode 100644 uview-ui/components/u-car-keyboard/u-car-keyboard.vue create mode 100644 uview-ui/components/u-card/u-card.vue create mode 100644 uview-ui/components/u-cell-group/u-cell-group.vue create mode 100644 uview-ui/components/u-cell-item/u-cell-item.vue create mode 100644 uview-ui/components/u-checkbox-group/u-checkbox-group.vue create mode 100644 uview-ui/components/u-checkbox/u-checkbox.vue create mode 100644 uview-ui/components/u-circle-progress/u-circle-progress.vue create mode 100644 uview-ui/components/u-col/u-col.vue create mode 100644 uview-ui/components/u-collapse-item/u-collapse-item.vue create mode 100644 uview-ui/components/u-collapse/u-collapse.vue create mode 100644 uview-ui/components/u-column-notice/u-column-notice.vue create mode 100644 uview-ui/components/u-count-down/u-count-down.vue create mode 100644 uview-ui/components/u-count-to/u-count-to.vue create mode 100644 uview-ui/components/u-divider/u-divider.vue create mode 100644 uview-ui/components/u-dropdown-item/u-dropdown-item.vue create mode 100644 uview-ui/components/u-dropdown/u-dropdown.vue create mode 100644 uview-ui/components/u-empty/u-empty.vue create mode 100644 uview-ui/components/u-field/u-field.vue create mode 100644 uview-ui/components/u-form-item/u-form-item.vue create mode 100644 uview-ui/components/u-form/u-form.vue create mode 100644 uview-ui/components/u-full-screen/u-full-screen.vue create mode 100644 uview-ui/components/u-gap/u-gap.vue create mode 100644 uview-ui/components/u-grid-item/u-grid-item.vue create mode 100644 uview-ui/components/u-grid/u-grid.vue create mode 100644 uview-ui/components/u-icon/u-icon.vue create mode 100644 uview-ui/components/u-image/u-image.vue create mode 100644 uview-ui/components/u-index-anchor/u-index-anchor.vue create mode 100644 uview-ui/components/u-index-list/u-index-list.vue create mode 100644 uview-ui/components/u-input/u-input.vue create mode 100644 uview-ui/components/u-keyboard/u-keyboard.vue create mode 100644 uview-ui/components/u-lazy-load/u-lazy-load.vue create mode 100644 uview-ui/components/u-line-progress/u-line-progress.vue create mode 100644 uview-ui/components/u-line/u-line.vue create mode 100644 uview-ui/components/u-link/u-link.vue create mode 100644 uview-ui/components/u-loading-page/u-loading-page.vue create mode 100644 uview-ui/components/u-loading/u-loading.vue create mode 100644 uview-ui/components/u-loadmore/u-loadmore.vue create mode 100644 uview-ui/components/u-mask/u-mask.vue create mode 100644 uview-ui/components/u-message-input/u-message-input.vue create mode 100644 uview-ui/components/u-modal/u-modal.vue create mode 100644 uview-ui/components/u-navbar/u-navbar.vue create mode 100644 uview-ui/components/u-no-network/u-no-network.vue create mode 100644 uview-ui/components/u-notice-bar/u-notice-bar.vue create mode 100644 uview-ui/components/u-number-box/u-number-box.vue create mode 100644 uview-ui/components/u-number-keyboard/u-number-keyboard.vue create mode 100644 uview-ui/components/u-parse/libs/CssHandler.js create mode 100644 uview-ui/components/u-parse/libs/MpHtmlParser.js create mode 100644 uview-ui/components/u-parse/libs/config.js create mode 100644 uview-ui/components/u-parse/libs/handler.wxs create mode 100644 uview-ui/components/u-parse/libs/trees.vue create mode 100644 uview-ui/components/u-parse/u-parse.vue create mode 100644 uview-ui/components/u-picker/u-picker.vue create mode 100644 uview-ui/components/u-popup/u-popup.vue create mode 100644 uview-ui/components/u-radio-group/u-radio-group.vue create mode 100644 uview-ui/components/u-radio/u-radio.vue create mode 100644 uview-ui/components/u-rate/u-rate.vue create mode 100644 uview-ui/components/u-read-more/u-read-more.vue create mode 100644 uview-ui/components/u-row-notice/u-row-notice.vue create mode 100644 uview-ui/components/u-row/u-row.vue create mode 100644 uview-ui/components/u-search/u-search.vue create mode 100644 uview-ui/components/u-section/u-section.vue create mode 100644 uview-ui/components/u-select/u-select.vue create mode 100644 uview-ui/components/u-skeleton/u-skeleton.vue create mode 100644 uview-ui/components/u-slider/u-slider.vue create mode 100644 uview-ui/components/u-steps/u-steps.vue create mode 100644 uview-ui/components/u-sticky/u-sticky.vue create mode 100644 uview-ui/components/u-subsection/u-subsection.vue create mode 100644 uview-ui/components/u-swipe-action/u-swipe-action.vue create mode 100644 uview-ui/components/u-swiper/u-swiper.vue create mode 100644 uview-ui/components/u-switch/u-switch.vue create mode 100644 uview-ui/components/u-tabbar/u-tabbar.vue create mode 100644 uview-ui/components/u-table/u-table.vue create mode 100644 uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue create mode 100644 uview-ui/components/u-tabs/u-tabs.vue create mode 100644 uview-ui/components/u-tag/u-tag.vue create mode 100644 uview-ui/components/u-td/u-td.vue create mode 100644 uview-ui/components/u-th/u-th.vue create mode 100644 uview-ui/components/u-time-line-item/u-time-line-item.vue create mode 100644 uview-ui/components/u-time-line/u-time-line.vue create mode 100644 uview-ui/components/u-toast/u-toast.vue create mode 100644 uview-ui/components/u-top-tips/u-top-tips.vue create mode 100644 uview-ui/components/u-tr/u-tr.vue create mode 100644 uview-ui/components/u-upload/u-upload.vue create mode 100644 uview-ui/components/u-verification-code/u-verification-code.vue create mode 100644 uview-ui/components/u-waterfall/u-waterfall.vue create mode 100644 uview-ui/iconfont.css create mode 100644 uview-ui/index.js create mode 100644 uview-ui/index.scss create mode 100644 uview-ui/libs/config/config.js create mode 100644 uview-ui/libs/config/zIndex.js create mode 100644 uview-ui/libs/css/color.scss create mode 100644 uview-ui/libs/css/common.scss create mode 100644 uview-ui/libs/css/style.components.scss create mode 100644 uview-ui/libs/css/style.h5.scss create mode 100644 uview-ui/libs/css/style.mp.scss create mode 100644 uview-ui/libs/css/style.nvue.scss create mode 100644 uview-ui/libs/css/style.vue.scss create mode 100644 uview-ui/libs/function/$parent.js create mode 100644 uview-ui/libs/function/addUnit.js create mode 100644 uview-ui/libs/function/bem.js create mode 100644 uview-ui/libs/function/color.js create mode 100644 uview-ui/libs/function/colorGradient.js create mode 100644 uview-ui/libs/function/debounce.js create mode 100644 uview-ui/libs/function/deepClone.js create mode 100644 uview-ui/libs/function/deepMerge.js create mode 100644 uview-ui/libs/function/getParent.js create mode 100644 uview-ui/libs/function/guid.js create mode 100644 uview-ui/libs/function/md5.js create mode 100644 uview-ui/libs/function/queryParams.js create mode 100644 uview-ui/libs/function/random.js create mode 100644 uview-ui/libs/function/randomArray.js create mode 100644 uview-ui/libs/function/route.js create mode 100644 uview-ui/libs/function/sys.js create mode 100644 uview-ui/libs/function/test.js create mode 100644 uview-ui/libs/function/throttle.js create mode 100644 uview-ui/libs/function/timeFormat.js create mode 100644 uview-ui/libs/function/timeFrom.js create mode 100644 uview-ui/libs/function/toast.js create mode 100644 uview-ui/libs/function/trim.js create mode 100644 uview-ui/libs/function/type2icon.js create mode 100644 uview-ui/libs/mixin/mixin.js create mode 100644 uview-ui/libs/mixin/mpShare.js create mode 100644 uview-ui/libs/request/index.js create mode 100644 uview-ui/libs/store/index.js create mode 100644 uview-ui/libs/util/area.js create mode 100644 uview-ui/libs/util/async-validator.js create mode 100644 uview-ui/libs/util/city.js create mode 100644 uview-ui/libs/util/emitter.js create mode 100644 uview-ui/libs/util/province.js create mode 100644 uview-ui/package.json create mode 100644 uview-ui/theme.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14a19d5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# 忽略以下文件和目录 +node_modules/ +/dist/ +/dev/ +/.DS_Store + +# 忽略UniApp编译生成的小程序相关目录 +/unpackage/ + +# 忽略本地配置文件(请根据实际情况修改) +/manifest.local.json + +# 忽略编辑器自动生成的文件 +.idea/ +.vscode/ + +# 忽略日志文件 +/logs/ + +# 忽略临时文件 +/temp/ + +# 忽略构建工具自动生成的文件 +/build/ + +# 忽略npm安装的包文件 +/package-lock.json +/yarn.lock + diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..81f13f4 --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,16 @@ +{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ + // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 + "version": "0.0", + "configurations": [{ + "default" : + { + "launchtype" : "local" + }, + "mp-weixin" : + { + "launchtype" : "local" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..dd29bdb --- /dev/null +++ b/App.vue @@ -0,0 +1,29 @@ + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..38974df --- /dev/null +++ b/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..5978e7f --- /dev/null +++ b/main.js @@ -0,0 +1,33 @@ +import App from './App' + +// #ifndef VUE3 +import Vue from 'vue' +import uView from "uview-ui"; +// import ElementUI from "element-ui"; +// import "element-ui/lib/theme-chalk/index.css"; +import './uni.promisify.adaptor'; +import http from "./utils/http"; +// 导入并挂载全局的分享方法 +import share from './utils/share.js' +Vue.mixin(share) +Vue.use(uView); +// 使用element +// Vue.use(ElementUI) +Vue.config.productionTip = false +Vue.prototype.http=http +App.mpType = 'app' +const app = new Vue({ + ...App +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { createSSRApp } from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..bb07154 --- /dev/null +++ b/manifest.json @@ -0,0 +1,75 @@ +{ + "name" : "CloudTesting", + "appid" : "__UNI__6D30C35", + "description" : "云测试平台", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : {} + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "wx0606cba78611e49b", + "setting" : { + "urlCheck" : false, + "minified" : true, + "postcss" : true, + "es6" : false + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "2" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..faf6e20 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "cloudtesting", + "version": "1.0.0", + "description": "", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "crypto-js": "^4.2.0" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..86974b5 --- /dev/null +++ b/pages.json @@ -0,0 +1,430 @@ +{ + "easycom": { + "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + }, + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "首页", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/mytestkit/mytestkit", + "style" : + { + "navigationBarTitleText" : "我的测试宝", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/setup/Information", + "style" : + { + "navigationBarTitleText" : "个人信息", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/personalresume/personalresume", + "style" : + { + "navigationBarTitleText" : "个人简历", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/personalresume/advantage", + "style" : + { + "navigationBarTitleText" : "我的优势", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/personalresume/workexperience", + "style" : + { + "navigationBarTitleText" : "", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/privacy", + "style" : + { + "navigationBarTitleText" : "隐私政策", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/userAgreemen", + "style" : + { + "navigationBarTitleText" : "用户协议", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/personal/personalresume/projectexperience", + "style" : + { + "navigationBarTitleText" : "", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/setup/index", + "style" : + { + "navigationBarTitleText" : "设置", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + // "path": "pages/all/all", + // "style": { + // "navigationBarTitleText": "全部", + // "navigationBarBackgroundColor": "#284CD1" + // } + },{ + // "path": "pages/shoppingtrolley/shoppingtrolley", + // "style": { + // "navigationBarTitleText": "购物车", + // "navigationBarBackgroundColor": "#284CD1" + // } + },{ + "path": "pages/personal/personal", + "style": { + "navigationBarTitleText": "我的", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + // "path" : "pages/index/searchfor", + // "style" : + // { + // "navigationBarTitleText" : "搜索", + // "navigationBarBackgroundColor": "#284CD1" + // } + }, + + { + // "path" : "pages/index/addshoppingcart", + // "style" : + // { + // "navigationBarTitleText" : "加入购物车", + // "navigationBarBackgroundColor": "#284CD1" + // } + },{ + "path" : "pages/personal/mysignup/notice", + "style" : + { + "navigationBarTitleText" : "我的报名", + "navigationBarBackgroundColor": "#284CD1" + } + }, + + { + "path" : "pages/personal/ordernumber/ordernumber", + "style" : + { + "navigationBarTitleText" : "我的订单", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/index/testtraining/testtraining", + "style" : + { + "navigationBarTitleText" : "培训服务", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/index/outsourcing/outsourcing", + "style" : + { + "navigationBarTitleText" : "人力服务", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/index/toolleasing/toolleasing", + "style" : + { + "navigationBarTitleText" : "工具服务", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/index/toolleasing/tooldetails", + "style" : + { + "navigationBarTitleText" : "工具详情", + "navigationBarBackgroundColor": "#284CD1", + "app-plus":{ + "scrollIndicator":"none" + } + } + }, + { + "path" : "pages/index/testcrowdsourc/testcrowdsourc", + "style" : + { + "navigationBarTitleText" : "众包服务", + "navigationBarBackgroundColor": "#284CD1" + // "enablePullDownRefresh": true, //设置参数为true + // "onReachBottomDistance":100 //距离底部多远时触发 单位为px + } + }, + { + "path" : "pages/index/testcrowdsourc/crowdsourcingdetails", + "style" : + { + "navigationBarTitleText" : "", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/index/customerservice", + "style" : + { + "navigationBarTitleText" : "客服", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + // "path" : "pages/all/dynamicdetails", + // "style" : + // { + // "navigationBarTitleText" : "动态详情", + // "navigationBarBackgroundColor": "#284CD1" + // } + },{ + "path" : "pages/personal/login", + "style" : + { + "navigationBarTitleText" : "登录关键测试宝", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/phonelogin", + "style" : + { + "navigationBarTitleText" : "关键测试宝", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/index/testtraining/signup", + "style" : + { + "navigationBarTitleText" : "", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/personal/leavemessage/index", + "style" : + { + "navigationBarTitleText" : "我的留言", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/setup/aboutus", + "style" : + { + "navigationBarTitleText" : "关于我们", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/personal/setup/certification", + "style" : + { + "navigationBarTitleText" : "实名认证", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/message/message", + "style" : + { + "navigationBarTitleText" : "消息中心", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/setup/pcweb", + "style" : + { + "navigationBarTitleText" : "关键测试宝", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/personal/mycrowdtest/mycrowdtest", + "style" : + { + "navigationBarTitleText" : "我的众包", + "navigationBarBackgroundColor": "#284CD1" + } + }, + + { + "path" : "pages/personal/setup/transaction", + "style" : + { + "navigationBarTitleText" : "交易记录", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/personal/setup/tranpassword", + "style" : + { + "navigationBarTitleText" : "交易密码", + "navigationBarBackgroundColor": "#284CD1" + } + }, + + { + "path" : "pages/personal/setup/pclogin", + "style" : + { + "navigationBarTitleText" : "设置密码", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/setup/Withdrawal", + "style" : + { + "navigationBarTitleText" : "金额提现", + "navigationBarBackgroundColor": "#284CD1" + } + },{ + "path" : "pages/personal/setup/accountoverview", + "style" : + { + "navigationBarTitleText" : "", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path" : "pages/personal/personalresume/basicinform", + "style" : + { + "navigationBarTitleText" : "基本信息", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path": "pages/index/test", + "style": { + "navigationBarTitleText": "", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path": "pages/personal/setup/peixunban", + "style": { + "navigationBarTitleText": "培训班", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path": "pages/personal/setup/usepeople", + "style": { + "navigationBarTitleText": "用人需求", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path": "pages/personal/setup/myreview", + "style": { + "navigationBarTitleText": "我的评价", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path": "pages/index/testcrowdsourc/companyInfo", + "style": { + "navigationBarTitleText": "发布者主页", + "navigationBarBackgroundColor": "#284CD1" + } + }, + { + "path": "pages/personal/setup/guide", + "style": { + "navigationBarTitleText": "PC端使用指南", + "navigationBarBackgroundColor": "#284CD1" + } + } + + + + + + + + + + + + + + + + + + + + + + + + + ], + "globalStyle": { + "navigationBarTextStyle": "white", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "tabBar": { + "color" : "#7A7E83", + // "selectedColor" : "#7A7E83", + "selectedColor" : "#1578ED", + "borderStyle" : "black", + "backgroundColor" : "#F8F8F8", + "list":[ + { + "pagePath" : "pages/index/index", + "iconPath" : "static/index/index.png", + "selectedIconPath" : "static/index/activeindex.png", + "text" : "首页" + }, + // { + // "pagePath" : "pages/message/message", + // "iconPath" : "static/index/message.png", + // "selectedIconPath" : "static/index/activemessage.png", + // "text" : "消息" + // }, + { + "pagePath" : "pages/index/testcrowdsourc/testcrowdsourc", + "iconPath" : "static/index/cedt.png", + "selectedIconPath" : "static/index/actcedt.png", + "text" : "众包大厅" + }, + // { + // "pagePath" : "pages/all/all", + // "iconPath" : "static/index/all.png", + // "selectedIconPath" : "static/index/activeall.png", + // "text" : "全部" + // }, + + // { + // "pagePath" : "pages/shoppingtrolley/shoppingtrolley", + // "iconPath" : "static/index/shopping.png", + // "selectedIconPath" : "static/index/activeshopping.png", + // "text" : "购物车" + // }, + { + "pagePath" : "pages/personal/personal", + "iconPath" : "static/index/person.png", + "selectedIconPath" : "static/index/activeperson.png", + "text" : "我的" + } + ] + }, + "uniIdRouter": {} +} diff --git a/pages/all/all.vue b/pages/all/all.vue new file mode 100644 index 0000000..31e45fe --- /dev/null +++ b/pages/all/all.vue @@ -0,0 +1,596 @@ + + + + + diff --git a/pages/all/dynamicdetails.vue b/pages/all/dynamicdetails.vue new file mode 100644 index 0000000..bc7defc --- /dev/null +++ b/pages/all/dynamicdetails.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/pages/index/addshoppingcart.vue b/pages/index/addshoppingcart.vue new file mode 100644 index 0000000..698a994 --- /dev/null +++ b/pages/index/addshoppingcart.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/pages/index/customerservice.vue b/pages/index/customerservice.vue new file mode 100644 index 0000000..3bc5e7e --- /dev/null +++ b/pages/index/customerservice.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..db9b2e7 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,702 @@ + + + + + \ No newline at end of file diff --git a/pages/index/outsourcing/outsourcing.vue b/pages/index/outsourcing/outsourcing.vue new file mode 100644 index 0000000..8a66734 --- /dev/null +++ b/pages/index/outsourcing/outsourcing.vue @@ -0,0 +1,1113 @@ + + + + + \ No newline at end of file diff --git a/pages/index/searchfor.vue b/pages/index/searchfor.vue new file mode 100644 index 0000000..dee7065 --- /dev/null +++ b/pages/index/searchfor.vue @@ -0,0 +1,237 @@ + + + + + + + + + diff --git a/pages/index/test.vue b/pages/index/test.vue new file mode 100644 index 0000000..98811cb --- /dev/null +++ b/pages/index/test.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/pages/index/testcrowdsourc/companyInfo.vue b/pages/index/testcrowdsourc/companyInfo.vue new file mode 100644 index 0000000..26819c4 --- /dev/null +++ b/pages/index/testcrowdsourc/companyInfo.vue @@ -0,0 +1,381 @@ + + + + + \ No newline at end of file diff --git a/pages/index/testcrowdsourc/crowdsourcingdetails.vue b/pages/index/testcrowdsourc/crowdsourcingdetails.vue new file mode 100644 index 0000000..8612aeb --- /dev/null +++ b/pages/index/testcrowdsourc/crowdsourcingdetails.vue @@ -0,0 +1,995 @@ + + + + + \ No newline at end of file diff --git a/pages/index/testcrowdsourc/testcrowdsourc.vue b/pages/index/testcrowdsourc/testcrowdsourc.vue new file mode 100644 index 0000000..2a167d9 --- /dev/null +++ b/pages/index/testcrowdsourc/testcrowdsourc.vue @@ -0,0 +1,2618 @@ + + + + + \ No newline at end of file diff --git a/pages/index/testcrowdsourc/testcrowdsourcChange.vue b/pages/index/testcrowdsourc/testcrowdsourcChange.vue new file mode 100644 index 0000000..235881c --- /dev/null +++ b/pages/index/testcrowdsourc/testcrowdsourcChange.vue @@ -0,0 +1,2625 @@ + + + + + \ No newline at end of file diff --git a/pages/index/testtraining/signup.vue b/pages/index/testtraining/signup.vue new file mode 100644 index 0000000..5f412f6 --- /dev/null +++ b/pages/index/testtraining/signup.vue @@ -0,0 +1,695 @@ + + + + + + diff --git a/pages/index/testtraining/testtraining.old2vue b/pages/index/testtraining/testtraining.old2vue new file mode 100644 index 0000000..b40de78 --- /dev/null +++ b/pages/index/testtraining/testtraining.old2vue @@ -0,0 +1,926 @@ + + + + + diff --git a/pages/index/testtraining/testtraining.vue b/pages/index/testtraining/testtraining.vue new file mode 100644 index 0000000..fbc24c1 --- /dev/null +++ b/pages/index/testtraining/testtraining.vue @@ -0,0 +1,2193 @@ + + + + + \ No newline at end of file diff --git a/pages/index/testtraining/testtrainingold.vue b/pages/index/testtraining/testtrainingold.vue new file mode 100644 index 0000000..57602a5 --- /dev/null +++ b/pages/index/testtraining/testtrainingold.vue @@ -0,0 +1,670 @@ + + + + + diff --git a/pages/index/toolleasing/tooldetails.vue b/pages/index/toolleasing/tooldetails.vue new file mode 100644 index 0000000..dcd352e --- /dev/null +++ b/pages/index/toolleasing/tooldetails.vue @@ -0,0 +1,746 @@ + + + + + \ No newline at end of file diff --git a/pages/index/toolleasing/tooldetailsold.vue b/pages/index/toolleasing/tooldetailsold.vue new file mode 100644 index 0000000..f7586eb --- /dev/null +++ b/pages/index/toolleasing/tooldetailsold.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/pages/index/toolleasing/toolleasing.vue b/pages/index/toolleasing/toolleasing.vue new file mode 100644 index 0000000..ef375c9 --- /dev/null +++ b/pages/index/toolleasing/toolleasing.vue @@ -0,0 +1,295 @@ + + + + + \ No newline at end of file diff --git a/pages/index/toolleasing/toolleasingold.vue b/pages/index/toolleasing/toolleasingold.vue new file mode 100644 index 0000000..342f4e1 --- /dev/null +++ b/pages/index/toolleasing/toolleasingold.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/pages/message/message.vue b/pages/message/message.vue new file mode 100644 index 0000000..6f4d84d --- /dev/null +++ b/pages/message/message.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/pages/personal/leavemessage/index.vue b/pages/personal/leavemessage/index.vue new file mode 100644 index 0000000..6245d01 --- /dev/null +++ b/pages/personal/leavemessage/index.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/pages/personal/login.vue b/pages/personal/login.vue new file mode 100644 index 0000000..3b709da --- /dev/null +++ b/pages/personal/login.vue @@ -0,0 +1,177 @@ + + + + + \ No newline at end of file diff --git a/pages/personal/mycrowdtest/mycrowdtest.vue b/pages/personal/mycrowdtest/mycrowdtest.vue new file mode 100644 index 0000000..5ad7866 --- /dev/null +++ b/pages/personal/mycrowdtest/mycrowdtest.vue @@ -0,0 +1,367 @@ + + + + + \ No newline at end of file diff --git a/pages/personal/mysignup/notice.vue b/pages/personal/mysignup/notice.vue new file mode 100644 index 0000000..5249952 --- /dev/null +++ b/pages/personal/mysignup/notice.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/pages/personal/mytestkit/mytestkit.vue b/pages/personal/mytestkit/mytestkit.vue new file mode 100644 index 0000000..0876365 --- /dev/null +++ b/pages/personal/mytestkit/mytestkit.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/pages/personal/ordernumber/ordernumber.vue b/pages/personal/ordernumber/ordernumber.vue new file mode 100644 index 0000000..2621ab7 --- /dev/null +++ b/pages/personal/ordernumber/ordernumber.vue @@ -0,0 +1,444 @@ + + + + + \ No newline at end of file diff --git a/pages/personal/personal - 副本.vue b/pages/personal/personal - 副本.vue new file mode 100644 index 0000000..5bee51c --- /dev/null +++ b/pages/personal/personal - 副本.vue @@ -0,0 +1,474 @@ + + + + + diff --git a/pages/personal/personal.vue b/pages/personal/personal.vue new file mode 100644 index 0000000..1eb8638 --- /dev/null +++ b/pages/personal/personal.vue @@ -0,0 +1,545 @@ + + + + + diff --git a/pages/personal/personalresume/advantage.vue b/pages/personal/personalresume/advantage.vue new file mode 100644 index 0000000..7963561 --- /dev/null +++ b/pages/personal/personalresume/advantage.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/pages/personal/personalresume/basicinform.vue b/pages/personal/personalresume/basicinform.vue new file mode 100644 index 0000000..8ec1a3b --- /dev/null +++ b/pages/personal/personalresume/basicinform.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/pages/personal/personalresume/personalresume.vue b/pages/personal/personalresume/personalresume.vue new file mode 100644 index 0000000..6d727ee --- /dev/null +++ b/pages/personal/personalresume/personalresume.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/pages/personal/personalresume/projectexperience.vue b/pages/personal/personalresume/projectexperience.vue new file mode 100644 index 0000000..e5c8bbf --- /dev/null +++ b/pages/personal/personalresume/projectexperience.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/pages/personal/personalresume/workexperience.vue b/pages/personal/personalresume/workexperience.vue new file mode 100644 index 0000000..7314df5 --- /dev/null +++ b/pages/personal/personalresume/workexperience.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/pages/personal/phonelogin.vue b/pages/personal/phonelogin.vue new file mode 100644 index 0000000..adc4214 --- /dev/null +++ b/pages/personal/phonelogin.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/pages/personal/privacy.vue b/pages/personal/privacy.vue new file mode 100644 index 0000000..5c7e620 --- /dev/null +++ b/pages/personal/privacy.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/pages/personal/setup/Information.vue b/pages/personal/setup/Information.vue new file mode 100644 index 0000000..70d759b --- /dev/null +++ b/pages/personal/setup/Information.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/pages/personal/setup/Withdrawal.vue b/pages/personal/setup/Withdrawal.vue new file mode 100644 index 0000000..d633211 --- /dev/null +++ b/pages/personal/setup/Withdrawal.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/pages/personal/setup/aboutus.vue b/pages/personal/setup/aboutus.vue new file mode 100644 index 0000000..cec4c62 --- /dev/null +++ b/pages/personal/setup/aboutus.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/pages/personal/setup/accountoverview.vue b/pages/personal/setup/accountoverview.vue new file mode 100644 index 0000000..60f46dc --- /dev/null +++ b/pages/personal/setup/accountoverview.vue @@ -0,0 +1,502 @@ + + + + + diff --git a/pages/personal/setup/certification.vue b/pages/personal/setup/certification.vue new file mode 100644 index 0000000..bfe5880 --- /dev/null +++ b/pages/personal/setup/certification.vue @@ -0,0 +1,435 @@ + + + + + diff --git a/pages/personal/setup/guide.vue b/pages/personal/setup/guide.vue new file mode 100644 index 0000000..95fbd03 --- /dev/null +++ b/pages/personal/setup/guide.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/pages/personal/setup/index.vue b/pages/personal/setup/index.vue new file mode 100644 index 0000000..d790d63 --- /dev/null +++ b/pages/personal/setup/index.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/pages/personal/setup/myreview.vue b/pages/personal/setup/myreview.vue new file mode 100644 index 0000000..774f8ac --- /dev/null +++ b/pages/personal/setup/myreview.vue @@ -0,0 +1,126 @@ + + + + + \ No newline at end of file diff --git a/pages/personal/setup/oldcertification.vue b/pages/personal/setup/oldcertification.vue new file mode 100644 index 0000000..c474652 --- /dev/null +++ b/pages/personal/setup/oldcertification.vue @@ -0,0 +1,442 @@ + + + + + diff --git a/pages/personal/setup/pclogin.vue b/pages/personal/setup/pclogin.vue new file mode 100644 index 0000000..e7ec680 --- /dev/null +++ b/pages/personal/setup/pclogin.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/pages/personal/setup/pcweb.vue b/pages/personal/setup/pcweb.vue new file mode 100644 index 0000000..94d2dee --- /dev/null +++ b/pages/personal/setup/pcweb.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/pages/personal/setup/peixunban.vue b/pages/personal/setup/peixunban.vue new file mode 100644 index 0000000..2b71436 --- /dev/null +++ b/pages/personal/setup/peixunban.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/pages/personal/setup/tranpassword.vue b/pages/personal/setup/tranpassword.vue new file mode 100644 index 0000000..8b97fc2 --- /dev/null +++ b/pages/personal/setup/tranpassword.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/pages/personal/setup/transaction.vue b/pages/personal/setup/transaction.vue new file mode 100644 index 0000000..9698d26 --- /dev/null +++ b/pages/personal/setup/transaction.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/pages/personal/setup/usepeople.vue b/pages/personal/setup/usepeople.vue new file mode 100644 index 0000000..1596587 --- /dev/null +++ b/pages/personal/setup/usepeople.vue @@ -0,0 +1,157 @@ + + + + + \ No newline at end of file diff --git a/pages/personal/userAgreemen.vue b/pages/personal/userAgreemen.vue new file mode 100644 index 0000000..ed36ac2 --- /dev/null +++ b/pages/personal/userAgreemen.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/pages/shoppingtrolley/shoppingtrolley.vue b/pages/shoppingtrolley/shoppingtrolley.vue new file mode 100644 index 0000000..3c98bcb --- /dev/null +++ b/pages/shoppingtrolley/shoppingtrolley.vue @@ -0,0 +1,378 @@ + + + + + diff --git a/pages/shoppingtrolley/shoppingtrolleyold.vue b/pages/shoppingtrolley/shoppingtrolleyold.vue new file mode 100644 index 0000000..00ada96 --- /dev/null +++ b/pages/shoppingtrolley/shoppingtrolleyold.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..a01554e --- /dev/null +++ b/project.config.json @@ -0,0 +1,33 @@ +{ + "appid": "wx0606cba78611e49b", + "compileType": "miniprogram", + "libVersion": "3.2.2", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "ignoreDevUnusedFiles": false, + "ignoreUploadUnusedFiles": false, + "coverView": true, + "es6": true, + "postcss": true, + "minified": true, + "enhance": true, + "showShadowRootInWxmlPanel": true, + "packNpmRelationList": [], + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "condition": false + }, + "miniprogramRoot": "unpackage/dist/dev/mp-weixin/", + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "srcMiniprogramRoot": "unpackage/dist/dev/mp-weixin/" +} \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json new file mode 100644 index 0000000..7bd6e6a --- /dev/null +++ b/project.private.config.json @@ -0,0 +1,7 @@ +{ + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "keysaas-app", + "setting": { + "compileHotReLoad": true + } +} \ No newline at end of file diff --git a/static/crowd/PAYB.png b/static/crowd/PAYB.png new file mode 100644 index 0000000000000000000000000000000000000000..56a6bce288c4ae768082b08c64e0a3b4a8786fb3 GIT binary patch literal 1697 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 literal 0 HcmV?d00001 diff --git a/static/crowd/bankcad.png b/static/crowd/bankcad.png new file mode 100644 index 0000000000000000000000000000000000000000..d8007b07d707b47e996de8ab51956a318bb40f07 GIT binary patch literal 986 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 literal 0 HcmV?d00001 diff --git a/static/crowd/email.png b/static/crowd/email.png new file mode 100644 index 0000000000000000000000000000000000000000..fac0c4764041d2c472f861f31fd447fb40ebd8ca GIT binary patch literal 1511 zcmaJ>e@qi+7`~|^8_G6yPRE>{r--QSwO2UlNx{-9^t7#|bbb#aDR+l^4<3%&-1*` z`+je}JvM7YAvdYN7WjIN=>M6B5nmd`XO>O zfypB5WXfnPd8b2MlH?^&)aUaleHtY%WTR@WR@T5!3{%Jmg_zGtv|quA3&#{lAUXxs zE3rHWhZN~8e4eC3WT($k@OZ~%IdQa1a=}nP?M2l}RVbw~pvCh4P>*LEElPIq-0y!1 zi;jFRKm=S`- zLQtG2(VP=dqz;iKlq|~-IIhv)7-=x5<5SdXqfxJthZZ+rS`BHyH2N_v$vg8rfRo0! z%yTX|Ave?u9#0`!)cn)Y#w$OVm+yX9 z+Y>c?{_^ms9R)8hjVwN5>#6M-=ny;CxSnh_7hyr$y6Lmh^tLxh5iS?;A$tAe`t!fpdMQOr^j1utSXxt_RG52beT(|4wJze$ z2hHh1`OU>*)=YNs&%MnXvE=;+D|c6v;#b!umfiYm&L4~T_Kfa8nDEgCM7c8XictLp zNzW*L%xpi?x_2Gb-}u6d_o1`7jDy-?#9EFmD{RG5W>d3DzItE=?)z@*C$U|oAPBa- zZ?8x{oj9ADyY$ko_Kq8et`)ga=NYS6s@$1ScS!7ZGWg-fbE{jgy6*Ggln%tzeCP)i zDS>0>&4$~@$4e%^!+q-@H_ z32xY9-gRNokS(J0o)NEV-84ht*1cNx2&pnvOzN(0yBNK(RrzN_=1kTV_T>qIRh>eS zeM#-$`n?)$l`Wb}op(@Mr#x%vE~Pc}wNPx(Q%OWYR7gvem49eeWf;ew_nfgX`Xk?@{jG)4+Sd$Vd@{h^gIq&oR)_d-~+ss{^ z=bv+U&-*-|^E~h8eUFjrxE6GTX-ku_YC4auNvy1d&S~du#mF{WayB5I3V*VK?%y`u zc)BvjOqBCzR?`Y(ECmYl%+Z$FyE9&1bjV@Q#}|A<&{u zO#{qW5Gp3UqYzj~ zaJUS4U}uDnxPP;1T$z7UOmLZfNzp_-x{P)7N zg>jWYiQxOSlj8CJU(>c1kAP+#DbH2~E!{l^q7ob`Lmuu3)2gl#fmIWHx3&Zy7xdcj zn-JLu%Eoa)4c(fCYZpuH`eH>X*@$&<8%=PmwKP6w2kVMnw9QiX{<0x?yaJuNz4#$% zR*+`(6`*C^nzod<_YevCmY0%^wa(H6U%xa8i4sv>A@wSf{ds+Im771~Ro+tc!(TzU zSw!x+4799A(}cv801Q4UL#kQlDnYUgffR;mQ>Ql64&Ld;ZI}n89+WQ!w@z9-0&429 z0ck#hg9w91dO`U729UR%PK`#yxTnx(F zJx%@w_hM<6u2Nw~$*xiB9Hbc8cug!!Vb}{(CtGU=T^lc%s9XsPW>{0F%8(e;vY)rA z#d%Wx67{Bc2WF@t$CIW3aMD<)+CZEA#p{|JJXD0 zK-r#a^tYBlTLHFNa>wT_HJcp7H=4J~dZj6d^;7-jO2)Hpyv^$>S|&6-q_lT8`me;G zF5U~HKPZK&a!4t6D`c9pOQSNRignda3DdNXvpwJhCkv+in; zQN8!t7f90y${#e|gL@mz+3^BX?Yv1Q*{>|*{;}3w3o-)QwvFED89WH`F;Fg8a@~cg zesBLH#>PoVvoLEHTFOqP+%?v^i9kj`?qOw?wL`Vo4UvY@FPRsWGGHMQATt#*#UlPi zf1{ds;z+BxFj2^5pi0nlIlBn()&rQQltf7caYy-y5O{z7pEY~jT3ruhTu>!J!+uW2 rklY?dq3_ou&wbWn{<+@dW9R=1u1|iOqqG`A00000NkvXXu0mjfEN?I+ literal 0 HcmV?d00001 diff --git a/static/crowd/lesftt.png b/static/crowd/lesftt.png new file mode 100644 index 0000000000000000000000000000000000000000..03e42f023917151bf7cda04a49b3db93794912cc GIT binary patch literal 584 zcmV-O0=NB%P)Px%0!c(cR9Hvtm`iRGK@dP+_ZWg;>n#@magi*tLE#8t%@H^NTMmJ@EI9-#&Va7c$TX48Q%nd#N955PI= z+Y44NH?ygxB|6!GeaHpyCm=xh#(L90&wP09L%s*NR@OkzoUvW4eoO*xpyv+Q@-LA8 z3b=uuJLtgG&o|J02jU}&5uh#w%2I@o<#sNh34-qjd-n^b7x%HZcee|v_+@+lG`nE2 z`#~N;LR5$(ghW(9qWKoTKtfdrS!Qt(LCsdcWz|MwPnUHg|G}@+VX>=Cj%&8D#I%)b zHy_K#zArC<&UI#^!a{|9;XYQE#nQy$N!dq9Y*ct^^_c!lIFqtB-By((!t)oxt?y%> zc&5s=D9bxx-77aY!mHQT3;1Zc2CY}}d*JgwKv!rxxCKa+S6~m}jzF5dLmog5L*PyE z^W3~VETw@1d~0BqIaCK24gN43X&-V1QNRs@kee_bgt4CwtNW?;yCHPQHODbz8@k?d z?+S2(duO1u&$8-cVC$-&x03!Fuso%*v&<*hM9X&yhL;rXg=yTS~%XW)CL25^)Gz~civFCMuLvF{+JMahV Wzq%dgk)|O40000Px&%t=H+R9HvFmS1RGMHI%r*}b`Ull0FjR!dCN6a{S&sT3cysHviP5EcIfA6ji~ z5oxKh(qhDJx-4m;RIvJB>_b7T*kVKpT4^gmu$DFtB9hu_u@AQT^iUV_oQ_bTG z7(F&*gM${>V9Bq~?(`bV2LJ9wr+dxYtWyp8MKRR3%Ux1d`0D+P8wSIo80p*P#{XA% zLuc@X5|4yw4v2 zW>GjPoEJ9w(VsuvVlFgw(Y^AwY*gS)Q7*QEGnL}33!^S9c*k4*_o7&%%oiR48WtfE zp-qV+3$459e9HLYoFe?$Bl;PYPiW|@<_1DZ2tg5?P~dh^)JSe&o`7+l?s>tCOpfHv zeO#I~{&vFD+I;0B0ZUeghf@iUYTijF-5o{vGas_rIC_PIRhX|r0CNt=Ekbkag!j1! zepNLc$DfZLf-x-RIu*v$bp&fEdWytYEbd-=vDsvEk#BmRarJbV#K=eMqs2S=)CZDK zuuT=C1Rq-6@ARfpCQQz(+OjtPPm(uKWZ567s&uLFq3+F2Nmc7=UezZV7stOGW;Ygh z7tSQ|Im4H?XC78HN2%ydC%wChdtO4?=M1lJ%f2B%3yFQ{Jzh&$;mg}Hrxa$bC?6e6 z#=a~YygtboEBp~9Drnv7(kXMfZ15Ew!9A*aQi*c|t=?^gLs^#7zM>=hnkw2AJTQ=m zZ7nanJ$qb)AJ3??B^kNN^HWMBl=!7T;jNrj)ixfMy-Mt! zMp(vGQ8^(f7!qPss5!Z`1=R|5K!G5yW|LHHu`1#@RZ~3K-|BrnEj%|=r*lJ+ zPGv2Y(!v2U$mCbb6gmj41>;1Y5%n*$R1aQlt4fB?Xs=5gJg@No0H@OoO)zYJcK`qY M07*qoM6N<$f;cegOaK4? literal 0 HcmV?d00001 diff --git a/static/crowd/noemail.png b/static/crowd/noemail.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8724364f024251915e82a862ed03fb68e52d20 GIT binary patch literal 887 zcmV--1Bm>IP)Px&F-b&0R7gv$mP=?8Q5c2KKPhdK2{oBel2|o;SZ!4l@wHMnii#H0g}QQ4RK$(a zwL8}?R9sjQ7lI(vjiQ3}wXlL3M5$P<;zDRUNt;Y;GZWh;_m`W}lE%q2t+}g7IQM+_ z{P#&Hvke=W2my^?;Uz_x6xr<1aKQUxE75d07UU!vO_^JSz-a)77-+E3ngCuh)18p! zzE4ECQhv4|J(X#K5LYAsfa73hjfrSbFkc93>JvNIKPEB5I?60=15{T|Ns2TK=4(Ms z?J7<;52Po|PEyd#4A&AMb6uFx6Vf~<3Sn~~J(b=AK{9sL|3C_8S3?2s`MJ`{55q8g zlUzLjAXE{^j0rQ)5!Td4@<%>V%&;yqb5{i+Ggd_3gFbh=EFtC7i0UB_JQWA!bJ2-V zz;loEgn0^to5hf9HizeZQB0&Wj(j3uU27xSTN_L19)~pbAnD2UJ%ElCtEQ%=(HHH< z&tJoipxT;hY}?e1HO(ta>8zmN9pT0nkC+A6AE(IIb zHs{lf#1m+V*c}`*U4*DwM|#q<0Jw`m@i7ArpY>ryxE@ietsqr*gn^s`+ zhBX)(8O4XsgK*c@;K=@6rIRblUI`L*$IL8fwznLyG?#OdNd88&{~N|9zX+U~oU^u;2-;RhY-I%82x{tC zVrG|aSU>W&XXP7<9JVj7SEKo}E^e5ef^n3BHc>6z^~?}i;oOspqTo&s3DSmy$LmWj`V z{odP!9{;=<#w@F0`j5CvODm&J%qN2ZZ*TEHZC^NY&SFWc6NHN>Yc-MyLignO)TKzo zXV_K4@hK&je$24sK0CmS9Yknmpbnr6vlu2)K7zToM)CCc{giSl_g}7+O+5&$dWrx5 N002ovPDHLkV1k$fkzoJ; literal 0 HcmV?d00001 diff --git a/static/crowd/nophone.png b/static/crowd/nophone.png new file mode 100644 index 0000000000000000000000000000000000000000..b30e54a66d7a98b581e84c4e3bc0a3acd6541c16 GIT binary patch literal 1574 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xd_B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#6rQ`QqR!L z#K720N5ROz&{E&PLf_C>*TB%qz|6|jTmcG{fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8fo2%#8yV>WRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab zT4JjNbScCOxdm`z^NOLt1Pn0!io^naLp=kKmtYEgeeo;J&4sHjE(uCSxEHIz#UYgi zsro^w#rdU0$-sz9QwCX8VC7ttnpl!w6q28x0}I7~jQo=P;*9(P1tXx76g0v!^HTE5 zi#5R-e0{Av^NLFn^O93NU2K(rM(AZ`rdXL-Sels|I~qD0TDTb+y1H688@XD#IJ%k} zIhvXoxLCsUy5uL9=BDPA!1Sgd^cvyR3rY*Q1wfl!Qj0RnQd8WD@^clyezwZQ=@v^j zoaRCGrr>sq0ZzU8K*#8VViqZ;VM4&<17gC{Esz6G`Kfup(9k3y+S}XqV`7GgpIlF;T3j#t-i#~F;rVhs z9}|*H=9#$hepI*^{MX}Xv#6@5sEa~~iwjq4#O+`6zlwU_yqh=O?~`}j=Vx#0)6=a! z^IYtdyp&NEz<=ielbWNv#Py;ZbJFiK_B9?(=x(ZKxx;+@p!iaDNf9NZCgBH*Ivl!H z511A(`eX_|@-LAtnPB&rv#{xX^VcmU#f^RsrVCr~ zZwvm|v;Ul~pZ~T1QH#|jNmXio&4&ZK&Yu(2+9oV>O7DH}0k!8pOP@&F)_$86^wMOe zkJ_#4+oqoKj&1Fj%UIr{v`X14?%_TENgUBeGnbUh|Kje=QjR#TqtDjvzofDRo7qQrVMQf|pRU0#tD_%PjwM(r}J}r46xGH6#kSYJ_ zt4_V8tCxQL@S^-xXU#R`l+=ZtdkW33P28KZbIUtE_Z9gG8Fl^M|DLDxTw0Vc<)32A zz2?g3JvUu;GtXY}`DF3RPfZIAjwTgqrY|(#JIP~aI_ul~+iE{gMcA8%%8Mx*)#guh zJzf_OzG1ddr~QAcO$Rq9OgivPZPogZr)6zV@%MMB&A46@$6xw}cf#?fQ|g}AtxM5T zE$_Mis!*+KcGTuqB{x>eCRs<#KAE=l&-@7|5_|VMy*uG-Fm0y$oYmhKth-PoB_XA1 zeCq!5(#c2nWH6|^rdMR2<9fd(<87N$%c|93t8(MhCf+gp$PuIUXa+}9v6t{P^L1j5 zPgE^9>a;nR9$orGWyWRABIY+t`>(v?k=(81_A7S6C5;bVyG<EEg{ppx6u)z4*}Q$iB}SHx8> literal 0 HcmV?d00001 diff --git a/static/crowd/phone.png b/static/crowd/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..81b2bf654f0aa52957e0821e73211faa31482112 GIT binary patch literal 996 zcmVPx&o=HSOR7gv$mRo2XWfaH%=bPy!n@hL5GgE1`r7ac;4PGJ$0UuJq3wU{`#P}4f z4;EUo#gMuaTUbR6n@CWwilQx8eTZ#ru_C^-w1~A52~7o|^nywY0cU32Y_rX7W@nDf zY?Iw2yW3skJkIz3pWiw2ojKn}sPVa{pPL5(!7J*s^(n=%S=K!?*C&(QW z1JmsClh&|0J|CwDinFX`lV?GAY$cEdFT-?Xv?t$HZg}q&K&o!NNkII6ffR%MXe1(? z0I?5>^jRCE0ImRNEC*U25@=f|;o{9aj2W&k7e==+q#W}>YRnoTLSMNEJGQREmpv^A z$b^|3HmPaRYh>q08_b> zT@``(C}}bCAc)?s%>}l!+^j z_flKOCK*S2S`i8s28st1CDSrGHiOZLLZzjTOQOe@X?k)J;0NzkmAAe{75JpP1rOa< zZ25WL{*xJeF}`^J7_hSxxVHd`nR`KWs1}f?@v7)<4`APpAhsxyZ@XqVc>3cs(%B_D z#TYY&l&(VIuiXf$4NaE`*jOuUUgwP{Z!}-{!(O&O%y9A$kEDjemx|MSz<8EiaSBwN z==DOE>KPa@6H34Le$m0F>1G0;*h&F+{O679Q;*|#o8KKvj&k)d}Ow z{Dw8Go+&4*dav^gq5jlnS;}__P$v_%6L>9yBm$BET>;~~OYR9Pq5fJek$(aA4MpD- S@0o1?0000Px#%}GQ-R5(wqk}+z-U<`%d6Fx=OtX;dOnPlIhlt7y~TcMenDR*f%d27#5$WrK* zGX#pUU-=CVO$f%g6=;$^y@w=XWN;*h6EGrXeS`8mfA8u?uq;arP~W-xRqAWOh`1)X z0Fd%xNcxhrDvILuH#j3Xsq6aF%X)2Nr0B$=6yZ};-|2N-btla|rH Z`U6-xVh^Fm2g?8e002ovPDHLkV1fd4bAJE; literal 0 HcmV?d00001 diff --git a/static/crowd/rihhj.png b/static/crowd/rihhj.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e896517a1d6809b4e77e9645cacef629da93e0 GIT binary patch literal 585 zcmV-P0=E5$P)Px%14%?dR9Hvtm`_d=K@`Tn_o^Wf!ooyM-~cTAa|-ncn3%ZLa0~At;Q%04Fx&uF z7_UGyv(t!n*E8R%uIZ+yF)Y}0Ta#2$^XmPr-`6vf5tP?FZs6cF;Nz=iY#5oxg#Y;z zhl{6(%^4bdjpIk3hqqB6PhB7H7SCYyCy4C8ut2mIL(m2Clp*&4=Q&0|7sykEJO=m{ z&;{}oA^!_-AGF{lKI~kykWKI&!Oy>3Dz>&14=Ta;HO00Heu*Gf0YMcTBKY}3eZNk- z2B;{mRUy~v``@D26!kL^Mg2!%lJ;EOS9L($doNI+34kad%*lQNEC%q5F?5&CwcVcb@YHj*Hm{X^a(oPkZJvlUt63YvcvKK$T}}1<9#bE1 zKiVYq>~;m{@Aknm>E`elO)(&+ymF1ZJfL5(`|wEz`2dQ?kb8r?-UFQBX21@u;pJ6W zqX=5Cv{le_sXfRpkPO5Drb`s5(tZRo;VuDMCyXUzBBo#lkh54AA8jB6)*?6ungJ%5 zxkvWX!O1>70jxkKgP~sr+KD8KrGuRw%G+O8u=+WUb}#RuhADoa&A;cj-}V8VL$Eh8 z>=H1~3gjuvVI1@gzyJV0yJ;<9bEqLnhV&KIsBKojg9vg XdGfc8&!aZt00000NkvXXu0mjfUiS*H literal 0 HcmV?d00001 diff --git a/static/crowd/setpx.png b/static/crowd/setpx.png new file mode 100644 index 0000000000000000000000000000000000000000..8de194b73afd372612e7b5f34b4c746f9ffa6ea2 GIT binary patch literal 1167 zcmV;A1aSL_P)Px(Nl8ROR7gv`mTPDnRTRhnXEyCNkD0Wz4Qkp3p+2jUnT;k$HJRBWsGt@h+9syr z16m_OKq-Qfs3@rUP!X)vXljEkwvZ}FMdQwp&`K@cnMCn{jUpCQWLulP8O>iWRM6rgi`g0G2G!nFN6jA%GX+_38=V)&-z! zI`;#70Kg&urvaQ?AaD(UWdPz5yZT7D#`f%`fy?@imnQ?#?*J4AZ%YhlUFaZpK|sqY zl6h$xz;6KfQ4FXzdp6TR#fmmFQx5?<VHYakIp3$cr)qj6^$_sGW%) zPUxXeE(TP-c5Y>fTj!Kx?ib-u_f#;{6gSkpGk_r4D0KDHQp>59n70B{oiWOTF44QA zx;p6nDvQ`#iLi4nAOrgnhPGL@oCm;skeJ)z;n0pWP_~>cVBRIMdwWWvyNT%)zrNFq zo^N1&F`pB`-iS}QzqShI&Wg z5l%|_Y0Fce9${!L)9+->JupZBmmVQ4SU3s`E};Q-Lh!0L=5{l?%k1grxP%*-dc z#HnDbUt`&FdcnMrSgMVOtGynWaq>5f<);87MQpfYdR?bxG)L1+F5@Ga2>2lp4js&u(oDUQUjTFyGrt8; zFA@4dI3RSbF_+Hl2$@N-9Gd}eQ9mvW?Zdg|YqDD%02Ks87zod$Hw##5*&8HAAAlpm z(AF0;%%=SqfDe4xWFWa_tp2u~FN9e@#kAjHU>h+u$HUsbLV!4QA}B8rf2E%gjGshU zyD^`h5{W*|L~n!WNujG!StZb2a-=#Hl61Iel5@aXN$%sT29|n7r$h{r4hR-Mcm4a#Xgike-k7# hdl_7k2Px(h)G02R7gv`mTPQORS?I2v)j@_3DUiLx5`5i&=?~`0bgJNF(inIAB@jLqX9K4 zLH$tJ-8RNmL-(#kQH)PsCgKMnM2SlLfDjBKn)=`aK2ReF0lIhZtxzq6cJIhpwx;OP z7m-Oe+3cP(znMAznRA4*u$sEVRXRw9W*cjo`|3vey0B~A@Knq2^7h~*;Cf&fXjqXp zfqkMRvl(kgPd@tvw3B|Vs=gy|QPF9u2py_a1IAYiB5U1rdj!T7d$Tpnydba3 z!dm8OIR6L_a4ffz~`=G-Owx0PIw;!b3wPcPIRW(5KDL|g{Oh9UB{ZzlM3ym zzXa8KgeEs_UEM1%mhe7Rn1!&;OsQ7)e>sWL9G-+aS zZ>kFG3Rx(BsPGdi%R2|lrtE_J9^2NZqem<)3LmG_3-IHkw!NiX^17g zI#rgUeCKAYs|E@y98JRCsOYVzY;`k{S;aFflyrs)b-A?lVl?h86~Wx#C9jzN1Yjp} zuYx>ggy%X|Z2=goZ>~`d&vAdT*0Nsm-GDnfDnn*A4%o_%>$9jXRQNLISl5+&V%YKA z0z_T`{wjV335YlEA`Kp~^Q6KGrDgY-m6Lw1v=l%}#W4kFT~!${RMQJ!A&+ sfbB#OboxUg2T6$mpX$SNY3CgHHw@(SEWEb~?f?J)07*qoM6N<$g0lEX9RL6T literal 0 HcmV?d00001 diff --git a/static/crowd/success.png b/static/crowd/success.png new file mode 100644 index 0000000000000000000000000000000000000000..35bd79d9a7233151ad2fb3af915fdcf39f320a50 GIT binary patch literal 1163 zcmV;61a$j}P)Px(MM*?KR9HvFm|bWbRTRhn=gfozMIr`j#RNjDrVpals8v+lxsyhVf?(ZN9}0aa zQa`HTi@rpY*5@LoY6X!hf+o@8iLQK+~d+goa#NEkc zcXqSjeVjSx|2t>TnS0M&!vDBvEo||;Ef68fV}I_8x8O+fGZ-PId~7Z-dztt=0U1Md)R~(bHEnG#gXop2nGwCjVfdb5-UA>F;P#09VMpty zE8wzq>y0K1f2txp10V!&eT|=W8o*Tm+E=l=#ID;(naug+%tOx`s+m>NV%D~M-qCt^ z8J_q36C`p+ZNIf!5YcfCf`bn7y2N#}fPo!~An1w7^Oq;nQ;zEfl*#;F(JcM_T_y~7iO9oLoXgrGqH_dHiQT<`52H}&@9zrpd7p?j zLu4I*vs9|Doi;nm#Dsux5*eaw_N!>*l1jN?zSa<(uK)_Mz=-5GHV|Lb$T{S+Kn-%?S+AfHc=4# zQu<0NYF;`S?L_nkGv5|1Q(c=(xpCg}b`a4BfaU8>H1klYw*l-Gk)3WfJ6daFN|br2 zTkV#6P(;35Ivk?#yytBvqWf6u7pc(T)mLJ8oJ^=xVd!+U-c$?JP{UOd72m(bzNa9t de-_le{sl6Xt=$ATxI+K{002ovPDHLkV1o3mEOP(= literal 0 HcmV?d00001 diff --git a/static/crowd/tubiao1.png b/static/crowd/tubiao1.png new file mode 100644 index 0000000000000000000000000000000000000000..43b0f8da23a024135433612ef8adbcf837ab2843 GIT binary patch literal 723 zcmV;^0xbQBP)Px%jY&j7R7gv;mCsAlaTv#6&wiMa;D*~2O2HNc8Fa`)_T!NMfDuUq5pHdht{pn4 zx6(@&Z`OC#1Sz6*sO|~-&73AMdYF z?er}*;Apr2dKRGzXe~%%sLY|+r~FJkB--|SD}-#x9Y|b4^;RAxX~@0>na^w0i&~B$ zS_j0?>~+E|Q=2*E;6AnDOxy+nAS<9Fq-_x^RI6RZhjP8xGmXe` zG<$iYEcuMhptF7fXoPep#=bAxX1Y1(TWQ0deTV8Q$yA4#R302m^dlMp8NqN3?+Ush z4lR#>43bqp6P`!`9Djn)i*?=0c&nND&L_CiN%HGQqDRs>u`hN2yLBGr8DV#C9vn(6 znRA5UYTucd)87OgLiGw^&%NTEP<#=vVz~Dg!0|QU4Tk%4Q4~n@VquJ|Tx6noHs6a! zRvc%>5rQc9kwqUySEdB~3h2gg+p2>@-`in*24pXq?VZgYt$PaxTWC9_c8yyCd&D28XK;#Mf>MKVtAxaX=iH<-AA=y3VCl`crea+pZ7 zIVH89staNw{$-_|4bMTlD_6R>Jp~hj*QB*?M-vMCYQeJl7-Sn0%FSu5w)xpXU866z zBuEXmxsiFP(W|79oY8;EhxOp@jlQ&9|K-`#R002ovPDHLk FV1if`Rh9q% literal 0 HcmV?d00001 diff --git a/static/crowd/upload.png b/static/crowd/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..b217cd1f99b12c88f46217dfcbc1677af5fa2cb4 GIT binary patch literal 1020 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 FV1mqw-&_Cy literal 0 HcmV?d00001 diff --git a/static/index/activeall.png b/static/index/activeall.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0244d76ff849c39397f550d513ca08a717e3ff GIT binary patch literal 1565 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 DKw^q@ literal 0 HcmV?d00001 diff --git a/static/index/activemessage.png b/static/index/activemessage.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec470193dff81483542930d17993c591cee6c3d GIT binary patch literal 1821 zcmaJ?c~BE~7)>xy1Wyo&D7c1GBDo1kNJ>Hinm`a^LNz zNoPcKkO6QqDpgPp!Y86i--n<#exNnL<7q+@MzJW36dIZ83~9npCi{O=z5atWjL5-{ zdjFFcR^%B$iX4QY9FrO?T!z2Xm60nlfl352DIjRmL>3dZ5CXwk$OzC;NkGV2ok0Vc z;iY2$nT#tjz=+bI1|?!X5v3sObQ&&|EfR4UqUh)tHj_q+iHW8$Vq)pkSavL3#EuB3 zPhiE6I!6y0kO{2jBUUsi*4YbsBkEZUnsm9KCe{S$fw7pmy2-V0CgmH)Y9`kroD@qz z#Za7;{a2+YuF&>zZa?%bdic=!paE@n6WZ4TX-_sfE@cw2P+_q@O}Vw_Aa%~oJS#eK zd7ahS_-!Qi`nGH@Lezsk2kgfVrS@Qt12si=F7b*zR^WGkv&<9pw@J4jzFg0UG^^)J z4!_o|ZNB#`x4FIvAUR?+*mIb_S3YbR+%odAd6#2@)lVBX`|;bgf2J1hFNjcqv8(S@EV_!TJ7S>+odl?81Z&(TGO$c5x6r`kw?Q7 z1G}^8Bxl|J=o2o?eBCmw;0rbOd|}Dn_B#nIUT{Np5o>ky=*=x@ww*T_EqLjg%Pk6< zV^-th{-SQI&yun?X?+4VA%*_3ym>phMdsfiHhzqz~4>U!cyC7a_t_x{Q1 zlr>(q;Jc$5RcB{NdBe^%?zKA{8QhWM6Nn zXC~ssdyqm~ve1Z2xKuHBFnJqXWv6xYT7v|Vml9zQ?dfNok)$ILunnssdjQM#9ej3e z2IvZZ#jlH297~H3&U=}O^C%5|;+bX=Pm{Bv_FnM4&n&6Ve9(D+LE(jB7_5lLmVE!V zY{C3JVbh--R=laK*m>pGoKJ&X7M^K!&%rnL3-R`OHO4n#et9eJZ45YTw8FKNzSg6^ zxXMG#f|`rF=dEt>X5LwEf3hN+uaHn)61*W$g4 zl5)d^9$h2Xj=6ZxNeWE=yk(VkN>bM=?511$-}TQ33O{sy1Ur-zux>7GpNSdNF!bi# z96>>4MNf4~;&<;zU9Itcc&OUU^`8qY-`WJ@`@FUIdADX*q-TQ6zkU12 k-G+bcf}rElNNL3pFr<4=i>p^jN}WF}Nlb#+8l7JB4{1uid;kCd literal 0 HcmV?d00001 diff --git a/static/index/activeperson.png b/static/index/activeperson.png new file mode 100644 index 0000000000000000000000000000000000000000..2197be66f5708ed31795557d1bda8f48bd1021a3 GIT binary patch literal 1317 zcmV+=1={+FP)Px(-$_J4R9M69*hy>~WfTD5=}uz1*-28I#?4+kixCn6goFi1aHv#DDN=z0n|h#> z+VM7NwrS#cO`^~X9Ff{n1ylmT0fb6(=>bk4Q2{Cvi(=2>IB~{fkC#0D-yV-6(ImDr zZaL(ao)oG1Ctu&py!ZYgh~4#oS91VVx~a8i+Al}nX`}ezw(;ojk@3jeEn^W=ql48v zFj$XEc)Z&c`@C~17C&~G2OYHrM<=78omhoO##f+qGy*N7D`NA=@>dNc_w41_yVIIJZ~hU>VA~L^AZqh?Ch-Kz8g+K=iUb6Wb*WD=oQZ<{{XP+L8BBb!1E41l zRGAs0q8T*!#EkR|ep~h}wsQ-4pxPSND}0L+v;_RM>@7|8;y^j*c@VuLq%zEEc3<0aQY8+S^sgI4+@<$JIj8Vp`h$N>dbM?r1z z0|vDh73v@IK+Q1yR7KjI-jn<=--}VJyISnNCXyQ|^kR0AsMP9nM;maVmZzC%VZI35 z`;BBclbvSlT(Z_4F%p$ryd~) zu|GS!P_xApqd~xbWT2h>LxU!pis1S^aT9t;BJw=wiv83zDQLIbSBtWUZt)%Y8MLus zjg@&?*%IRy&!SeB*f4H=*Wp|)y3iiB{9Rw~2rtTI#zx20R^}B&aD#!A9gSLz2k&uK+21y?`T`F8^MC&R0vtkx`g*?A9kwzVl{IA9(cx%lHhpCD z&%4=(uS4gO{GmxZw&K6{MPU!R#dA3zjq4$(ETIMbw@M!G5$?00Knf&a+TcsPx78kW zs=FZr$5(D_dCP6g2PlJS3{+b}P;H? zw-N9*0{Z@Uz;f4)fT#wV`vY+k?!!3x@-ZDZbxp73f?6}_q|j0klXff@`1>H5W=xGF zD+emlQUpzE9Oj@&Wez$@0wUb$LYa{ZHRM}eVPKWNZWZ_WtuU~{#!iy2gIVB3`t-KI z$I#&h0dL)JV3nD^MV$NbKvB;HMjGeRX9fZ(=YU@%aiCccg+TVX1+oW+OCY;kJlQeD zle$S9Q4#@3^n#GBI7XLA^mUbN!r|md1SIS13|WK2%8(jsh}2j@q-r?mtg-}OEgHAG bN?iW}ZZ9c{Q>v5x00000NkvXXu0mjf4jgM0 literal 0 HcmV?d00001 diff --git a/static/index/activeshopping.png b/static/index/activeshopping.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6e0f8b929022e93ad81fd17316af08f6d1c046 GIT binary patch literal 1292 zcmV+n1@roeP)Px(#z{m$R9M69m`!X{RTRg6=e?OuKeW_R5QRnpm4L8NqJ;@);)2AeEL<8OAtA=Z zNQ?qOMYJMc5}O(qEQlnA5H&`0o_1;Kx0VJ~!Kw&lur4h<>~J`ckvlQ+v(39YFJFz0+njsI5r!S4Tl|%cj;2 ztaN|xfEhOK_-YfX=7d@*8DJ!+U)*#w9SsLV(@9HPcUw2p}SDF;k4WnX6toH%*|yMaoY! ziH-=Mr$Kw9O@HjotmTzUV!Aw3G}RR}=tUY7wK3PAN5TJ83K3j1z>{yKeg&?(Ts8KA zV!G6woy|z@$jCK_7|`yxv3^cdciotQTYsraL>_gcR$A)&O8^K0Z3RE{#!QP<%HohP zWQhM2M|BZDT6-a=y-ypq_I9d)sl|w231yn+K7z0qP*4mrjfw+Dd6P9N6ug6@0I0`f z3a`hgml(%JoNBSLa}F~D0SSS`s)E=F<^_6aMD^ehQkJ>f`>z_*s-b4~w;8Ui%7ar^ z0R%CbsSYW(D3n~db&47Kd2h=D>r2)kBF6UqW0);N5I~*e_Oo(hAjSog| zGMWokbi8{{JHYHMy%)j4%l_2g-k)^%W}EBY?s`tl#HGEKu3c01IABMs*IjuMm}AIO zC2LU3D#L!Zyy|ikGJ#x)1yK30A23bD;;eHBzqv@b@L2La}78(3hXZx}qTif5*W2T3%a-<&#C z)B$TPHMyemCB>e_>^?K;FyymqAJzSM_o4fL-TnnV*u{_PWqfG>0000JV07}8R z$ZWVEG6T+rS_bwJvPE!lh~ZdCxO!w)!BxT;$g&W7AtG=EaC0CGAc<80nlel;AdA4+ zaHEi&0Ws<>)5_z(6tlA=$S;_Ik%^gwm6eU1gOiJ!myeHMKu}mzOk6@zT1G}zPF_V# zO+!;lM^{hZ(AdP(+}y&-%GS=_(b?6_-NVDv%g4_@ATT5}EFwBCAu%~4E3crisI0ua zqOzv8uD+qMxvitKtFM3J-OzCcke%V_~_B&r_Y|heD(Ux+js9je)|0R%hzw;zJLGm z>(`&ZfB)Gp-eM0-{@R`{jv*GOuTJ?H?Gq?-jDPAxm&r3YCcfF!t7Glw6G@7aInd(FA(dByL4*1cDJlCNF6 zw>$H2i16u{=UdeI`y*|ocwSBw<`vohmQ%WZ|F#QLq(3uw^#@CAx+|Xiwt?#%`!Dai zK1=@|@bn7$>+oSk^37?h6d!c(ls$50+aAm&xP+g-;I0&_cAVq(?gf3(MHhJ!Y)*C^ zFrUR-&2lzLXvMUHSqHrMnD~S*UQTAs{$S}hNl8IJYy+q5tKjQQ>mm-W{vo9AX*fZ< zd8^R%4G;2Kj(Y{M>-OFjm)KBXy^4SSqmHE&ooCiw4AifYyj#7lH`7lvz;Mm3zVZuV z-3Om6SlRMEU8=zS^-SNN(b5_>7f(BzJ$>iCrE|6xepq{CkK>_Z$;)T-?G|D^)nDdy zV)EbDa=y{?tnYtX&O5JorLw?>=QB<$5!OA=9O5tC?WPrFBvSkS@|AUOY>uB;H2sx~ z)FhX@seCLo`*v?$xu0Q)(4;>+5;-3Ox4JeM3GVSdpT+Y1c_in_vIoyBm~|?6&mL1h z{NeO=gQn??l1(yfTq(g7^;}hrF2VM@>a}0|Q*TP#B2*e87VB7m-rRib)&wPf z^%d(PV*eYS+IR2vnUiZiZ9isvqg12wkNz)4v!|9N7pv4y0@FT&r>mdKI;Vst0Csr^ AMF0Q* literal 0 HcmV?d00001 diff --git a/static/index/baoming.png b/static/index/baoming.png new file mode 100644 index 0000000000000000000000000000000000000000..8112169c94c177e9d36db172603c1483ae10574f GIT binary patch literal 1757 zcmV<31|s>1P)Px*mq|oHR9HvV*=cN4RTKyC|9S6qrYtVt2N6V21PQX0ML^8I`^?hnO z_n!NEXHL((@0IXByQpk0)9@YQWnxTXpeX^KDBhn6(3gN%z9muFR@ypcf`{iA8^9PB zMP$jL3F%uC<(VaYSSonvHmw(t^kHxk;}!^NwD1gg38-PlXMh<-=bWLQ&%@U%18i&p zFxm=0$jnKUrh$l~1@4~8O8sVH12K}EH8Qpjlc!f0oVZmS0&yQ}f^Kxk8Ra<}Eo>m} zOWX9`GU%|CB<3AEhAW8`1`pmUd;rIr6Aaym+nwb3BHG{~TeWzGMaPT0k@#Vunk1CLe#`lA0&d6F-g ziUME?0q>0jJaDt_V<*Fa3$6lWsUZfKH4Hn$4CL-liXg+!Z_<4rrzCU{w{Lv(yTpKO zEuNej21N+&Z-Si+8-|EG{2ze(WVNPDI{_ISboe|q>->%Y+!+B)@eN@BD23X`q!f5g3UvUr-7Kkf}2H(3m?x!=Z}t; zRs;@J&#cqpCAY1G4CikIW8|?3F?kmF*|lmMgYp1)OGeOcqfkpZ{#p%dM~cSPV@=^> z63LkWdY2OarXeXEE%4K8v=12QXAk7>!8ik=z5r^4OfF)^DxH*tCtsl(RfX=f{O0{N zJ)Tq$nLB7qFfQQ_V)ijf-N4+yvF)_LPp#H&I=CWIln0N$Ouu$t&GkUWd?w@}m`L65T*K%WK{X4K#zWElo z+bYdEm=jUKCli%or?9T8_;HE!C198t53Q?fV4izovS+(_+Ndyk7t7tQ8>0bE1H)a5 zz+k+ulQKJRB3%uQ*KM`t2O}21EeqUrr3*eesW><=vFi%02PC8e=unIeoMS>t-lUjg z<)J%g>HTHm#Q<7_jWthyDW{S>pOqA&>#8ttmn<6$qJq51C4-$BqApqLV1O0^6uxmB z5kky7J;iJF)X=L-mih!h=FL78_AOl|mS%nWs@AAQ;{zV#5i%6tIBQ1X_ogQRS~T9|ez zrFKC@p@DH7mYZOX1;_@+y={XDRB&!;D7fWP7kqI>^#iwDYG;@N8E%p8f-j|1KX8lmFmUrFF8K1y>IZJV zBn;eavD+oSo>l$8%@&9K(KUU`1z(w6{lHD%a=_$ti6)EOlK6H`^#eCq6qeyf78W@> z9SXjiV>>Pd`npcz$LVfGSx4^(3Q@v%LPooVCjo)y-KZzi{+sWXo|*yh z)Zjouk@diG=P&bRjr*@QlIB|AIx~N}r&i5cCqZa==Zz%`nE7Ok@b(P8NU593cgM== zYyw_npgt9UQobYi!9)g_uaShDeBG0QG%EZDg(cD*%?cD`00000NkvXXu0mjf1@<_z literal 0 HcmV?d00001 diff --git a/static/index/cedt.png b/static/index/cedt.png new file mode 100644 index 0000000000000000000000000000000000000000..e147b418cad4a54a9d0056b6ab6372034b8f6ca4 GIT binary patch literal 1990 zcmV;%2RZnOP)Px+fJsC_R9HvNm}`(6RTanor)OrDL{JxYOT{WN`vD4{!DvvjWksrj6%qpp#j~V} zxCmArR!L&A)6?B|x^GYSh9qijf{%b9JOVCCp-F{OqJ;&eR!}}rLKUDQf)SJr;gQm? zJAIG2Jw3Ctlbz|_H6QFRGu8K;|NWiY=iYnnCH$X1G+RC)#F-KD3z?}0j2Q7(zWwXj>eu~d1gN2^Tv*CbD*?J9t#bmNQA~Rx=KZ(&_H$|W)3s*;6hfRn zt_tgjcpZQb&ZZ+K-Wf%-bEcrFfF z&ZX1%tQ?|V#e9K5Siy`-8-9#8$>1G%MACKL@hpLM1S~r8J_4?-3o+xD2GK~xv-W2Z z*ET~U?9U;(nVB~=`5Y=x;VRc1dMQn(EuiUm&jEC9BJebrw+GVMlP1`%y=Z%j0NO-^ z6^TuinFm7Y9O|SwEuiVh*8uctMykXaUv7PTp zfGq;w3p{&GmX2p)V>xoQ0(K`phYM8wnCrT4q|V}!@Fg=_HACeFo+!_xHj(A`BFMhWd$@H8R!@%6=`?iT7y~r?{V7_T;0@Do@&$_GC z$F{vsMuaT@eX%Lqf21PZHSAA*zGlCY@b6^i8vs65ps3Gv-Q#h5rXzJ^3jjJ8c-AHD zqAWS`ZU(Ne4GJDs3Ul@UP}*OZ(vjn?WaL(Z@G^j>i23WaN{C)8(8L1Qbzg7oBbmt$ z0eEk%jbBiT*6Lt1pmykCqMe~@t#1ctipqSj+C`u(0AE&v<>v#>Ij`BrbmRsA+cZ$% zS@VPtUE`{-(IEV-;#qrJ^@}3-2yygG>w5ymNMRr|U<*W?FAUrtdiHfwM=&V{i1q}o zwK{czIPy0DE~-zE+6e0KX4BdtnB^w@-}t z=^7@Gj^6rU+TLv-TBFxR$}&l&j*x#PgCCfDM+bSrxHb&UBbJbtD#n3E8}sV48nUVG zd^_;$cgKK^d<(!C0PWW!*jQ%XF`~Zhjks7>MjAeqg70gwl9j$RrHl)rickw82X z8_$!0XMehrUQzfvh~u-)$q(}&nU1>zFlw7S^I#yIdYyKXgITG30PiS0>(3_QZH(Mr zDD@afM+*tSj-80U59S+n0K~MpBCT6H2Q420{H6@MIHFPL|v zok3cI$W(4kfdfCw6Zru>DUyV4z%k>IE~C1vUX2V1@nKT=JBhGZCw$;p^#fC9G7sPb1&S`8E{Kzkokd$dTFaUE2?NhIPZd;MXY=sz zdvgDtNRFBG=PskVs9Y}pD|H0x29qm!yhhy3K68=_ZZj|4% zxjZV`-i3yNSYBcb~WVMrlG8159-6{rsC`79a#wsSXJswQ< zOHUJHl$b}`t#fINGXiWDD;9&kTvxQ9Mvj$8PK2`1i Y1?Td7bMJ^gcK`qY07*qoM6N<$f{9?idH?_b literal 0 HcmV?d00001 diff --git a/static/index/dd.png b/static/index/dd.png new file mode 100644 index 0000000000000000000000000000000000000000..6635fbba5f71873fd8afc0b4c71037fe86b18f1b GIT binary patch literal 1527 zcmVPx)u}MThR9HvNm|biXRTRhn=g#hSm-1EEQd(PD3azy@;s)?|7!@^AOADpY(zUcu=+|uL;~q0Rv+eHE z?c8lFVP5Bd?)lCCoO5U967KSgT)yYOWbJO`{OSdA76KTH*>WeCw}P-l>A@INAUb7) z#8Ci-QVf8y0j)_aTN;t42zXF6NxqJOKPF7EHC%~tm3U>q%qS|BF2hD4on0W>;Vn)> zVE$Jn5s20TT$9x@ACp2mJTZ<7(JD;O7as^1w$Ml{-(%o80I}R+1UfGyJ(7tcqXHPs zASwm_#^8JN^acT6Gl_jx7?ni06*g|bQYj1Du4j5n}wrqL41lp z&oc8CuUl}-GR4E%vO*_I0rww#y()ly{RD#|J$Hd`}{WGcQ(4M3&;ryns^^&;|Q|j8t^_ z;sR#IoFvEtl%yq=r~pEGfDEK67a4GJ%t;b_2ZajYP3V$5K%zSX$bN|hYl$T*14?}B zCUnY`7)ULzTHF$kjXFvA4l-$p6+wX4Z`!&h;gy(Vs;VkdFeD?_tj$`84iXfbeDS*GIgBEaj`Ap*U+kcnmRk@)KH z>-n)GBW9Aw1B9jmIBe^ZJU|JVswo1zF=BQ|76+J6Sq>yICI!hotKyNFea?*^8Znas z9-v?(R#yi&I5ceQU=I*1Q#Cb(4weI@q8%DClgK$pNYn%Y4h-A6@OzLTQ?-i>m>x2d z>^mq067_+AXW?8rUq>IzFdkj`_Ek*Kc?C~;rf z)`eeUcZwTt19T1nyr3Zg_{h4t!Xdewo}FSzNHnPca&DVpnQE>tbg*~O+ANq30<8AK zG}DMQC5d-8*A;Fvy#upTOhN&$r{C5EvG*nc-v+4C_~mF^Kn8j5Vx~k(LqLgLK)?e8 zajK=r!E%zTXnO|CB-jH46afF}w{>D4kU7=XSXkoj{^<=;(mn`Lavx;oF=^X-JDOux zgCM&uyF=muGEw5bAO~GQc4i%HF9PiBvpxavT2Nwu_O~~M-VM@qx`4ieq?G_f-qA-} zudS2cgUp=jYA$rJt%QtdKpT{}r~)W*JxF&3Fjrzp3V=-)tj!wmv+ub&Z2}Ub`8i}78*6WNB2qQj_C4!VJLo#_f8;_gR*dmflQiCu(?0Xin- z$nL@R+S|_x=L5{atm(4u4}o7K-~lj~^_gGtfrus<_{#=;eyuJ1cS)TJ;3BxDzT^y` dddMAD{s-6*`A7fu*lYj*002ovPDHLkV1hTJ$1MN= literal 0 HcmV?d00001 diff --git a/static/index/downarrow.png b/static/index/downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..91b4474b37dcfe8c835be132a7239fc9b8196710 GIT binary patch literal 363 zcmV-x0hIoUP)Px$B}qg+Q9K@`C8|C7W*1d)V*U}s@z;{_t-23Bcf7LVWoY;plXEX3ME zgI0pz1=5IxUAhP+vTZQxli4B3ZZb33fLqSK`R)5!;Xj^8i$XN$0v+N~og4XD%8hz! zXyFc#J)!yWh)4~%CoUi5#tcI70jQ$1h4evQ%yCDOQkKCyu@=gU1wJ^17GVpr7NY(w zq8%Mda3KySbz^iu3jTLBrZ4Xj?E)nZS|+k_FVojw2n literal 0 HcmV?d00001 diff --git a/static/index/duihuazixun.png b/static/index/duihuazixun.png new file mode 100644 index 0000000000000000000000000000000000000000..fda75e2aa79d90abf57232d472278f1cc054eca7 GIT binary patch literal 1853 zcmV-D2g3M?P)Px*_en%SRA@uhn0ss#RTRd*GyCXDh#DSIAtEt8K!KnY3ZxVYiabKIh)@twD`3%5 zS`bhONq6yyR=2X{QRPvv0i!_>6bTwF6vY(+;$%`yHh&_ z3&Z@^+jH+ZzkJ`Edv*vWpGlkk>EcAvW-#>!Aer2D6~gGO0(CB#&HVT#rGOY7v+-9o zj&aH~*wl@Rj~V$_wP2IU38*&>Hf5vYgC48~pgNPe+B}TFJs5C_M6CjwT&DO4F~w9? z(?6K%C~xzMO(uA(OsxjE$0dPj6=PTnY_b63O90EiB`P*{jRDx0 z)mkf3;Irx00UNbic1zHJ5qWkPfQ=DgVJk)z8~vUhY{v`>ftAQ^l44*0d3MZ5RBZHn z28xY*S7Sv`;PYp!12&>Wc1s#7g2=Pe0Bq#D24EvfG>Q=gc3BJz8Y>FLc4a3jHljoW z7U_x)tqR53Jt6Q#w!<>bWB7`oTau($^B{P>%uc+=9x4e{gV8inQFx>pzA^?zgus_G ztpx_sfB~Mbo=pUMa8;<9qhR3+I(>ykF(B~ubIpULEe{QnKwT8OZSObPbjs*jNGYnj zsa=vQl~t}S&#~_XC~*KNU}JPeEYem3Qk&~#{kmaFjAY#QZSX!~hia=oZtVFQX z;)babXoEH}0q5%+_FI0)rcmR00ZVC}mEQpFqAQSiW<`#(B(j#~56uJNO+5tHRLpYT z84ottA9Rz(iXdaKv|@foKhs0R3AU-iG_S^R6(+RPjT*#fSOOnsV#}K&q zn_OpZWPPx|p_D;S#>bszyQ^k41-0t}j5SsS;MtR#s937s0Bq1QJy>OKqGAJ=1t$}v zjd~?;#(B=(wcJZ`<2o}9Dh~Y$rdzdf44zgs+qpKfHqfu+5vxUUXH{3`I_`;w9Visz z*gGZ^t26)`v@8Zjk#;{o117p+l>wNrSxU!H8G$B;lh?6CnfqqhcW8?lSj@v&l{W*p zA>4YmxX#%oM&SY6v5b>CL;i$;hr@f%6CN*BAMu5Vzx(?5Mu#L1VB*^Svz-Tx zV#Hd1KR*CP?&t{GEBC%Ye;dX1_XXV)*F3(%BDS zhQ^BG)4-AWCKbE)4ZUJNEwBz)&!wU(YMKX;=crk*o=bILHLNN#n!9`IZOXA<7PLPd z`G3z>g1uN$J2e-7x$9(;Qo;06cu@_7#)@ouzlZCT9|Px$u}MThR5(wS(lKZgaTEsd@B8P{_O8^bIEkpagh1U?TttVWg5Y9>u7YB(Rw{_Q zgWw<-=~#PGkZy|NCN5oyYw4tjg|kc43Sv=vcS$e*Pcoz?#6tS!_x*Uh_gK0SA8Hsq zAb18q9zB$R28CtI>>mBeWKkBz3fHs#fnPo3;nosYIXsqdf`uUdLf}ypdNaL*TRp{K z^RmF#oxr$qh2cMAFuAirHoF$?`M4AMU!WKyqXM1)xDRM93cVpn^l#Q)3O3imX!VxF zx2_3}OvGb`xVB|5)hDh-bFSA69iH0oZJnkC4644KIo`Q0;MlnO(tYU?pi_XRqi}Gx z9OyuXxE6Y)bs-Vs%$aL`Fn`n2FxOSjeEzKh}7vfaSQr49gc-htVI zt*;+ndsaw`x6+a_tyrrI#^?>ee}?pdM5O}|?0dqw7=;6Oo1G^E<$o&q5v{uW%jMsD z+b3|Gp|qC8=ey6ii$`cbV->>8=cis}7kT)T@f8TK=m(qg0!JxTB-7I?gVrT5E#fiOz{x1@i=(aJbRuBLH002ovPDHLkV1kp->}vo3 literal 0 HcmV?d00001 diff --git a/static/index/gzjl.png b/static/index/gzjl.png new file mode 100644 index 0000000000000000000000000000000000000000..7806f7045fa09480d34f7f949b9eedc60af82427 GIT binary patch literal 532 zcmV+v0_**WP)Px$&PhZ;R47wzkw0h?aTLeD-%C@QU*b^2idt;$#7v^#Bt@-*4!UX(6rn=ykRpOm zaL`5Y&mf%?hr1>!b+Utln^Ol-a8MK#Gv9I(T7B28%bNQ(`-D+HM*c>w`T;L3OseL z5AL>CO2f>&33jS6+@kJ+#p$TXto{(x)pjf~?#`U>sv$V+d+Pk)bnkroD~Tn*_|w~} z&*((v8r8zn4WQ6;q5#5Ipqz!sOArSs8Q1ql9u2?=JDfDgg}}}2wd}C2q059(B5=j` z)Uge&!v~4Xc=_!P{m`!p+SCu!(8-&F^?Ztc~nMyv1^i(H?mv`-rbZU=7u5G^OFL6W-f74B_H zB^AeI$SOt45*tTT@Czh)_CIjP#nmyD%eVDsk9ixw>cGB$492qf39U%zF`mK{5GtXsDZC+_mXT9bR?*TiGB!3fx3IJgiHMF*NKDVj%P%M`udJ?b z?CI;DHGA&7`3qL8T)lql_8t2V96WsV*zpsm&zwDb{>s&B*Kgdqd++}J2ag^vpJUE?Ve|u_=e`@@^0)rTw`an^4+pxj;XW5iqF}^ zzuT(+>D;e#p%0Q{7E9JHf3WJg&4)Jv@@;Yl7r)t4VE*H`MFDr*(%6p&w{D&CYuy3$ z-TrUuI=)WX{8Z-8+pXsWnlju|mn(BAI&U?WcMQ;f`?9$pW!kr@#~aqK{ufow@bTWM zK3&e}TetpS%yYgJcJ7;r&B=UMu1nv73ifa;pFOdC`k~e0$Kx%Q6)fg4X7%%8|8BB- zB~SVD`0J;4%1wE~l@WF0W~9l=!w=V3?6@gtdgHH_&n@FUks%ADr$t9iJFu4Na7>4H z&jv0VRRujpzyHR2@_DL$yqnbA=5MA_z;kYnvC~qIH5^kFRG01K@bO%Jq}}OlXm9ZA vQ_V7`*PXhbP0l+XkKg_+^a literal 0 HcmV?d00001 diff --git a/static/index/jnzs.png b/static/index/jnzs.png new file mode 100644 index 0000000000000000000000000000000000000000..d83cf8e5216f597eb9ae516c5a9a9bb2623ea2c4 GIT binary patch literal 613 zcmV-r0-F7aP)Px%A4x<(R5(wKlTT<9VGzaN%;w*2YA|4JqY|6d9@L&I7CZ>z&7`Ch6`sk`$xyANj8H{ocHJ%+P*I zQcUhB2}0=R2`f>!<=oU)C}Vl^1e^ub;|^9>Kq~lCkB$kj=oF31Waiujfcor$ezBXz z8LOHHu-hrdvu&6fGAm)a4?z37h=2kV1lTI@sK06DS_J8 z0e5TLw7jdGuuyM^W!6_{hSo}505EvreKA%zI3ZD0|JG-xl56HCcSbbc>lAcrduAoO z>`?uGr>;iWQdw&6gw@)}2)wz*}SX`TcrD79vn;^iO0rsY0^$b?;rzi7kh zJ;vC|dTm4_updAwLFHva>p2R-w4I8b!W^mIap~FNd+z`Y+ePE!e{2gK$krYyQVkOJ z0eK~aGXzu>A^)LZ+-boglyr)E?$?>k3$;N+)l*g14{^k^Md&)91~p$z24Q|shcQ9} zmS-{K1^}OkTH7TetAM-(=nDkLg|$hi5WSnpx{Dx039=6GZEAiV7_an)8r;4rX1}&v zOnhzDOv_!4rSzdUbJR#@H;-uGb51Ef)2w|5sj>@!d%8bt00000NkvXXu0mjfyFwW~ literal 0 HcmV?d00001 diff --git a/static/index/kf.png b/static/index/kf.png new file mode 100644 index 0000000000000000000000000000000000000000..ad91c18a248e269145dd459aa5e5aba0e452d650 GIT binary patch literal 1646 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 literal 0 HcmV?d00001 diff --git a/static/index/message.png b/static/index/message.png new file mode 100644 index 0000000000000000000000000000000000000000..497b865c5430a08a6b652fb2d8b027faffb979b7 GIT binary patch literal 1819 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 atP%`znZI~4lNrK66_lr|pUXO@geCy{Imlc9 literal 0 HcmV?d00001 diff --git a/static/index/person.png b/static/index/person.png new file mode 100644 index 0000000000000000000000000000000000000000..bde743d40c5edb60e6e1745092efdc72fe19031c GIT binary patch literal 1075 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU3?z3ec*FxK#^NA%Cx&(BWL^T3 zK+}aRi)j>G7A^%8kz3089T-pDB|(0{42(?7EUawo9GqO-y!`wELc%h#3JR*~8d}*+t=o3(-n;+6!9&MSU%Gtl`psK+?>&6<~P2`u*qc-+xzj*kl5e(K1gL#}JFtTd%%04+)ew{_*&X!sUxrOjuFqIVD7C zmQSI`uo3Yl#AX?t=@h2 zdG)Jvzxh|sxXIpd|NZJKOyF9$t2s(aGxHyQaQzg~%k=l7;fKQw9UV(} z85!GCxt1w@(h+PD@X@hWHkg{a>kI3R%n6eN-n~EMw5w{heO?!z*Hbf-f8KE`#BHZk zeOPrNm;L=5#xLvF{P1U8JC$c|-t1RliNczzPs%J_8j^Q%DNjuCdGFb;DqmPFpMOAb Y!se}MHEMre022~}r>mdKI;Vst0PG=D_5c6? literal 0 HcmV?d00001 diff --git a/static/index/rnotice.png b/static/index/rnotice.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca63f6bd6018ecdbe75d650d0b837e0375387a9 GIT binary patch literal 968 zcmV;(12_DMP)Px&f=NU{R9HvtnN3JkQ546|eZG046(tpI`d9>&Nkq^hYSBVk6c*BEATld5$v(ie z#E(LY7PW|=qD8qaN-3Q(F``T<$D~;lebJ^xi&kPEP&4n{b56Vub;=nXXP!@`c`)O?BEU;};ert*UgPYK4D_nZtAS4j+fyJ)Y67}|! z10V0?`B5M(2y{t&@=3XNIaTPSfKT+u zLLz7;gjqId%D{GAhNcAzeTP~C0w)SSE^tk^QGg&ik-%rdx&ll9OmL&?m{#U0aD6u~ zl?uKgf?TIdT>~~>Tp}EKUZGu^2=tf=*FKkziDApIzq+Wf(`G~{nBQ|O=X0{q34!Zh z$Rc8BBOY=C`|g%Y42ggUExnamAZ_5fUfIh88z&o>2-qOX>#s^~x{IsusSvLw#`kP0 zI>`!Ky~cb#ROzoxM&-D`^)IoSkuP`$4DUjf+M1MsPxr|-Bq;I_7Z1eSy5-0LYYD?36}YI~}{--uwIr@+KJLnr)g8DO^;4trVy z^DCq9q%6%Dg}qstGd}F>(HJ1`U=gJ36U_cE5S zo@MT)8FV7P7_Rl##fvMf@UpSr*bG8+TcB)JvMYPG<8Yp31Dgy+xJJ_w0yp&WTu|jJ zAhBXv02AB{*J{NHfz6EOX3l!I92SECikXfMm5$hkbF+-dNXkh&g{{1iD-x6V%Z_O< zw!B%{pzLV4UVKdyW{!LEGhTe^b^iYYT;8ddB8nv>?ExyCQ9f+P{GO$#S6cUq0XKRh zWrYuS$SachXcEV*gFim2i=Leka!P^A9!2v&DsKqEm-qzUQvU3NeZB@aV9hpCR@kh3 zutPt{Qd}Pc_^Fz$ZgcbRue5+o=mSAxD=}O`g1lk(K=?@nSB0iFx(S=M!m-_49E_}j qXx1_&{;4az*DV3@+buVUZRZcgFWiMXoyB0{UU%wux7$^<|TfhLw015&DkO$NPR09;jBq4?X^#YXvWg&(GRl-Fe z1_Gsk0Kx{Ugc}7{29br3Kv@WY3j!Gs02GI4hckfUa1o#&Tp5r7;lfFXGPq)h0=O)Y z0R%uwde@T#EFaskKGb=j>Cl@y_zmSNi zsDy;HjI5lzqOyvrhNh0bfw8fPshNePy@Qjpi<^hHkB@IaP*8A4Xk=_$QgTXKc1}S_ zMP*e@eN%ILdq;Oq|KvGy=gnWVc=6KZE7q)Cw*lz=ZQHi**tP%g@#7~?pFMx!(v>S$ zuiw0V|Iwqz&z`?}`}Y0EPoKYh{r3IG&tJd){QVadn|>XbtjauH977}|j~=YF4oPHa ze|Z1G0@uh%W`UDV2}Ol=oSGozJ&7y#mfPwep{^Aw&wrkpQFwMv`MKK`|99NkZg$|_ zwF|3WvqrhM%n*+{UYk_6RC}wg`>8MjTW|W?ND6JT;R`n^Mg;=^o5>!!agTgiFZByB=ITr^URqhJGVHm z)hSAd$a}7!(!KeD*7jNhm2N)^z3m5d9&f5R>$HqVUol!PTDC1f@GpDKT-PbzxjpaGBpM}Dwo;oYA_*?UAmnuJ@T+h-ipFTz92jlAf z?y0+27GGU%=ja|8(t9{2In&%`(n~#=Nqo-zi&ia+FVdQ&MBb@0NS59uK)l5 literal 0 HcmV?d00001 diff --git a/static/index/success.png b/static/index/success.png new file mode 100644 index 0000000000000000000000000000000000000000..cacd2bdb7a0ed3772666e912e26db4249e97c95b GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k#^NA%Cx&(BWL^R}>pfi@Lo|Zt zPO{}eM}Q)9KPX1Dl#^2Ubet&&Lu^I;oTASqwo0L68e7Im1;Vs8%a#C=sPnCL(0sS`Sb9WFBwIf&u}& z6i2f>&3NF5B3Z%g;&oEd>5~-P?4qp4J6|TTV2F=o5mc^-q_hAunf@Q@b}yp6d?|S9 z_dkWbmRc4drNGPV;wZ6kj+96!7R%!R$updVVX79YXm&C@<8?ADtQ0N5>E*P?&IsO& zIfBWA89iQ}^iaS^=%k{AoTlvE22~?l0AoQvQF2PW{ z+`z*xaP3dI=#t#XEVx-QG66Wc2H5jC#tqNqjL}PaQ5u%io9Eh>^rFmPl8cCDkVt3$ z)#-&RaeN}%#kmy^i<1vL;<$6-TpMM{i4YX^s*%uJd_N2x+MG_5B!0UOb@rEzp4uiE zFPScE?e}+NjDLD4P*T>|8CX+$VEu=!)7DTZ<9hu!RUzNOi~W9MMsxG`Gdb6U$*VKx zy}i{_<-K=;!kuHYL$jA}9o;ja4JY8&>R%)N{D^T)+E)L#^QuS_i0Hzmm0ONK!}^Zr-SciGqh_5Fs69nh-k*tl5NNL(OT-}uY+HznGxM>hPN zKke=F^DGN_p9{Io2RJ} zAblKu;nK&$m#_2$FJHa=pkgd(ThiG}C)1K~r6X4o`g^=5cKA7LunTLBa>rYC+lFJN za}#E6B*j3j?PId$N1w}9U8nq+wtkXKwJg8gx3*JH5naDGI(DcUW-|cy;<05t=|V0x zpx!bR#+#4VrSEs_ojR_vJX2FR-7@@A`dK<;_k#l)UpBqfJ46MW+nUapkB;07tif8% zhw~io1QRZ?4d#;xjY31yc1bv!m?)F{rX?nFC9-V7xkIv?CIhOPtwW!bO%|V_TLvZ0 zsMB@r1rNUKjJG{*X?V0&8MSHV=&5%$e?k literal 0 HcmV?d00001 diff --git a/static/index/tj.png b/static/index/tj.png new file mode 100644 index 0000000000000000000000000000000000000000..cd301fbf20000a3e407af48d4b954dbae86547fb GIT binary patch literal 562 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 P6A=2mE$WrIN5cOBwn{YE literal 0 HcmV?d00001 diff --git a/static/index/zc.png b/static/index/zc.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e789f3a07a549450fb28ad5c1573008148feca GIT binary patch literal 1540 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!1|;QLq8NdcWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cX64L~h>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v(@i!su~0C#)H5_Q zF)%jMQ7|$vwA44S&^I*JH88X?Ftai>SAYT~plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2pczK`Mn<|o6}rWhc_oPzx_QOQFcVx-i<65o3raHc^AtcPCMM;V zme?u*T?+9+ZUNlbykclD0Rv3GBC$Z(F8Rr&xv6<2Fuf@Vy-qmwg3>~60nlcb)S}F?)D*X({9FaFpRF=+yTt;h zc~HG6xZPrjQ?EYIG5VmGMT%*d5HR_GnDBH9thQ%85o$#JzX3_ zDsH`*>F*&LC~_=aMbyPmeBl$Pl8G+dQyp|}v$k%TcwninON@&WhnCkC0nf<-UJK3i ziV~M}a|y0=JuUW6`OKA8jU<;w59!vRXWwLPnVo zd$#PI_E|gE*9&6Ztvk!iH&_2&k@&(!f~nO|>O#~7o^7QQGrDF*UUI$gV*0~XGmd@R zHUHtB8B*s=FV8ZpnN%t9Yl6w)S~a0#1z9RpNpC(cJXf%_)8!D4eiNI)RFT8$4_H;q zXF2@)f%fc5&H{&Zu>l?P&hq-GWlqWcB{@eXxcbomklV=nkU@*Hr z|KMZ|-u%X}53^r$KhV^VTRP43XK5+7jlfs;4>nwfyWGEtU$?ZeVx9H=T=pmJQt>;& zU!x7Aw>^~IcPjQS$BcC)Kfh+355Ao!eeT)BLf7*3h4RYYjElXcnAf|;vafTSn0V@5 zZs7h4Yl2R^xzBL8WRbpWEb}{eOYf47|H1+5ejof|_<8;6{F;ecf~&W!SZ;dimU6%` z)3b|})z7@2GoxI)!oKWEo9E02h8jD=8yz>W>2;ph zu83NF@el9al(xe$N|wuIK9-z+F{!F@*$Ix1jJ`izAEk3xZ+AAUJ~G|JM(}dz#VPY2 zZrm{4Sg~WCsavzro%7`j7fH;x`^AP&Chgpx4H-PkU(IJ=W-w&kXuJFRmp7nt+0)g} JWt~$(69BmDO633m literal 0 HcmV?d00001 diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js new file mode 100644 index 0000000..47fbce1 --- /dev/null +++ b/uni.promisify.adaptor.js @@ -0,0 +1,10 @@ +uni.addInterceptor({ + returnValue (res) { + if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) { + return res; + } + return new Promise((resolve, reject) => { + res.then((res) => res[0] ? reject(res[0]) : resolve(res[1])); + }); + }, +}); \ No newline at end of file diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..625a190 --- /dev/null +++ b/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ +@import 'uview-ui/theme.scss'; +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/uni_modules/uni-number-box/changelog.md b/uni_modules/uni-number-box/changelog.md new file mode 100644 index 0000000..aab060d --- /dev/null +++ b/uni_modules/uni-number-box/changelog.md @@ -0,0 +1,29 @@ +## 1.2.3(2023-05-23) +更新示例工程 +## 1.2.2(2023-05-08) +- 修复 change 事件执行顺序错误的问题 +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-number-box](https://uniapp.dcloud.io/component/uniui/uni-number-box) +## 1.1.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-20) +- 修复 uni-number-box 浮点数运算不精确的 bug +- 修复 uni-number-box change 事件触发不正确的 bug +- 新增 uni-number-box v-model 双向绑定 +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 + +## 1.0.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 v-model +- 新增 支持 focus、blur 事件 +- 新增 支持 PC 端 diff --git a/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue new file mode 100644 index 0000000..5876be2 --- /dev/null +++ b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue @@ -0,0 +1,223 @@ + + + diff --git a/uni_modules/uni-number-box/package.json b/uni_modules/uni-number-box/package.json new file mode 100644 index 0000000..743d2e4 --- /dev/null +++ b/uni_modules/uni-number-box/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-number-box", + "displayName": "uni-number-box 数字输入框", + "version": "1.2.3", + "description": "NumberBox 带加减按钮的数字输入框组件,用户可以控制每次点击增加的数值,支持小数。", + "keywords": [ + "uni-ui", + "uniui", + "数字输入框" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-number-box/readme.md b/uni_modules/uni-number-box/readme.md new file mode 100644 index 0000000..affc56f --- /dev/null +++ b/uni_modules/uni-number-box/readme.md @@ -0,0 +1,13 @@ + + +## NumberBox 数字输入框 +> **组件名:uni-number-box** +> 代码块: `uNumberBox` + + +带加减按钮的数字输入框。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-number-box) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/utils/comstemutil.js b/utils/comstemutil.js new file mode 100644 index 0000000..9304088 --- /dev/null +++ b/utils/comstemutil.js @@ -0,0 +1,311 @@ +import http from "./http"; +function wxloginmethod(data) { + let wxloginurl = '/wx/auth/wxlogin'; + return new Promise((resolve, reject) => { + uni.login({ + provider: 'weixin', + success: function(loginRes) { + uni.showLoading('正在登录中...'); + console.log('loginRes--',loginRes) + data.code=loginRes.code + console.log('data组织传给后台接口--',data) + // 获取 sessionKey openid unionid + // return; + http.quickPost(`${wxloginurl}`, data).then(res => { + console.log('登录成功1',res) + uni.hideLoading(); + if(res.data.code === 0) { + console.log('登录成功',res.data) + let {sessionKey, openid, unionid} = res.data.data; + resolve({sessionKey, openid, unionid}) + uni.setStorageSync('sessionKey', sessionKey); + uni.setStorageSync('openid', openid) + uni.setStorageSync('unionid', unionid) + } else { + reject(res.data) + } + }).catch((err)=>{ + reject(err) + }); + }, + fail(res) { + reject(res) + } + }); + }) +} +function saveWxUserInfoLocal (userInfo) { + uni.setStorageSync('wxUserInfo', userInfo) +} +//获取用户信息info +function getWxUserInfoServer (sessionKey, signature, rawData, encryptedData, iv) { + let wxinfourl = '/equestrianinfo/wxma/info/wx9d9f429ba1775063'; + return new Promise((resolve, reject) => { + http.quickPost(`${wxinfourl}`, + {sessionKey, signature, rawData, encryptedData, iv}) + .then(res => { + if (res.data.code === 0) { + uni.setStorageSync('wxUserInfo', res.data.data) + resolve(res.data.data) + } else { + reject(res.data) + } + }).catch((err)=>{ + reject(err) + }) + }) +} +//获取用户手机号信息 +function getWxUserPhoneServer (sessionKey, signature, encryptedData, iv) { + let wxphoneurl = '/equestrianinfo/wxma/phone/wx9d9f429ba1775063'; + return new Promise((resolve, reject) => { + http.quickPost(`${wxphoneurl}`, + {sessionKey, signature, encryptedData, iv}) + .then(res => { + if (res.data.code === 0) { + uni.setStorageSync('wxPhoneInfo', res.data.data) + resolve(res.data.data) + } else { + reject(res.data) + } + }).catch((err)=>{ + reject(err) + }) + }) +} +function registerUserInfo() { + let regurl = '/equestrianinfo/wxma/register'; + if (http.devStatus) { + regurl = http.devUrl + regurl + } + let wxUserInfo = uni.getStorageSync('wxUserInfo'); + let wxPhoneInfo = uni.getStorageSync('wxPhoneInfo'); + let {avatarUrl,city, country, gender,language,nickName, openId,province,unionId} = wxUserInfo + let {phoneNumber,countryCode, purePhoneNumber} = wxPhoneInfo; + return new Promise((resolve, reject) => { + http.quickPost(regurl, + {avatarUrl,city, country, gender,language,nickName, openId,province,unionId, phoneNumber,countryCode, purePhoneNumber}).then((res)=>{ + console.log('registerUserInfo:', res.data); + if(res.data.code === 0) { resolve(res.data.data) } + else { reject(res.data)} + }).catch((err)=>{ reject(err); }) + }) +} +/*function refreshToken(){ + let rturl = '/auth/oauth/token'; + if (http.devStatus) { + rturl = http.devUrl + rturl + } + let refresh_token = uni.getStorageSync('refreshToken') + return new Promise((resolve, reject) => { + http.post(rturl, + {refresh_token, grant_type:'refresh_token', scope:'server' }).then((res)=>{ + if(res.data.code === 0) { + let {access_token,refresh_token,expires_in,username} = res.data.data; + console.log('access_token:', access_token,'refresh_token:', refresh_token, 'expires_in:', expires_in); + uni.setStorageSync('accessToken', access_token) + uni.setStorageSync('refreshToken', refresh_token) + uni.setStorageSync('expiresIn', expires_in) + // uni.setStorageSync('username', user_name) + resolve() + } else { + reject(res.data) + } + }).catch((err)=>{ + reject(err) + }) + }) +}*/ + +function refreshToken(){ + let rturl = '/auth/oauth/token'; + if (http.devStatus) { + rturl = http.devUrl + rturl + } + let refresh_token = uni.getStorageSync('refreshToken'); + /*http.post(rturl, + {refresh_token, grant_type:'refresh_token', scope:'server' }).then((res)=>{ + if(res.data.code === 0) { + let {access_token,refresh_token,expires_in,username} = res.data.data; + console.log('access_token:', access_token,'refresh_token:', refresh_token, 'expires_in:', expires_in); + uni.setStorageSync('accessToken', access_token) + uni.setStorageSync('refreshToken', refresh_token) + uni.setStorageSync('expiresIn', expires_in) + // uni.setStorageSync('username', user_name) + resolve() + } else { + reject(res.data) + } + }).catch((err)=>{ + reject(err) + })*/ + return new Promise((resolve, reject) => { + uni.request({ + url: rturl, + data: {refresh_token, grant_type:'refresh_token', scope:'server' }, + method:'POST', + header:{isToken: false}, + success(res) { + // resolve(res) + if(res.data.code === 0) { + let {access_token,refresh_token,expires_in,username} = res.data.data; + console.log('access_token:', access_token,'refresh_token:', refresh_token, 'expires_in:', expires_in); + uni.setStorageSync('accessToken', access_token) + uni.setStorageSync('refreshToken', refresh_token) + uni.setStorageSync('expiresIn', expires_in) + // uni.setStorageSync('username', user_name) + resolve() + } else { + reject(res.data) + } + }, + fail(err) { + reject(err) + }, + complete() { + //不管请求成没成功都会走这一步 然后隐藏 加载中的效果 + } + }) + }) +} +//退出登录 清空信息 +function systemLogOut() { + uni.setStorageSync('accessToken', '') + uni.setStorageSync('refreshToken', '') + uni.setStorageSync('expiresIn', '') + uni.setStorageSync('personalInfo', null) + uni.setStorageSync('organInfo', null) + uni.setStorageSync('wxUserInfo', null) +} +function systemLogin() { + let adlogurl = '/admin/register/mobile'; + let adsmsurl = '/auth/mobile/token/sms'; + if (http.devStatus) { + adlogurl = http.devUrl + adlogurl + adsmsurl = http.devUrl + adsmsurl + } + return new Promise((resolve, reject) => { + let wxPhoneInfo = uni.getStorageSync('wxPhoneInfo'); + if (!wxPhoneInfo) (reject({ msg:'手机号未授权'})) + let mobile = wxPhoneInfo.purePhoneNumber; + if (!mobile)(reject({msg:'未授权手机号'})) + http.get(`${adlogurl}/${mobile}`,{force:false,debug:true}).then((codeRes)=>{ + let codeData = codeRes.data; + let data = {mobile: 'SMS@' + mobile, code: codeData.msg, grant_type:'mobile'}; + if (codeData.data) { + http.post(adsmsurl, data, null).then((logRes)=>{ + let logResData = logRes.data + if(logResData) { + // logResData = typeof logResData === 'string'? JSON.parse(logResData) : logResData; + let {access_token,refresh_token,expires_in,username} = logResData; + console.log('access_token:', access_token,'refresh_token:', refresh_token, 'expires_in:', expires_in); + + uni.setStorageSync('accessToken', access_token) + uni.setStorageSync('refreshToken', refresh_token) + uni.setStorageSync('expiresIn', expires_in) + uni.setStorageSync('username', username) + uni.setStorageSync('expiresTimeStamp', expires_in * 1000 + new Date().getTime()); + // console.log(access_token,refresh_token,expires_in,'信息:',logResData); + resolve(logResData) + } else { + reject(logRes) + } + }).catch((err)=>{ + reject(err) + }) + } else { + reject({msg:'验证码错误'}) + } + + }) + }); +} +function getSystemUserInfo() { + let sysurl = '/equestrianinfo/wxma/userinfo'; + if (http.devStatus) { + sysurl = http.devUrl + sysurl + } + return new Promise((resolve, reject) => { + http.quickPost(sysurl,null).then((res)=>{ + console.log('logRes', res.data); + if(res.data.code === 0) { + uni.setStorageSync('organInfo', res.data.data.organInfo) + let personalInfo = res.data.data.personalInfo; + uni.setStorageSync('personalInfo', personalInfo) + // console.log('sync:',personalInfo) + // uni.setStorageSync('personalInfo', res.data.data.personalInfo) + resolve(res.data.data) + } else { + reject(res.data); + } + }).catch((err)=>{ + reject(err); + }) + }) +} +function checkSystemLogin() { + return uni.getStorageSync('accessToken'); +} +function checkusernameLogin() { + return uni.getStorageSync('username'); +} +function checkPersonalInfo() { + return uni.getStorageSync('personalInfo'); +} +function checkOrganInfo() { + return uni.getStorageSync('organInfo'); +} +function checkWxUserInfo() { + return uni.getStorageSync('wxUserInfo'); +} +function checkPersonalBaseInfo() { + let personalInfo = uni.getStorageSync('personalInfo'); + if (personalInfo) { + let {id,card,phone,email,fullName, familyPy,namePy,birthday,sex,accountOwner, certificateType,certificateNumber, + idPhoto,province,city,county,postal,addr,country, + certificateImg,otherImg,resumeImg} = personalInfo + // console.log('个人信息:',personalInfo) + let idPhotoList = []; + if (idPhoto && idPhoto.indexOf('http') ===0) { + idPhotoList.push({url: idPhoto}) + } + if(certificateImg&&certificateImg.length>0) { + if(certificateImg[0] && certificateImg[0].path) { certificateImg = []} + } else { certificateImg = []} + if(otherImg&&otherImg.length>0) { + if(otherImg[0] && otherImg[0].path) { otherImg = []} + } else { otherImg = []} + if(resumeImg&&resumeImg.length>0) { + if(resumeImg[0] && resumeImg[0].path) { resumeImg = []} + } else { resumeImg = []} + return {id,card,phone,email,fullName, familyPy,namePy,birthday,sex,accountOwner, certificateType,certificateNumber, + idPhoto,province,city,county,postal,addr,country, + certificateImg,otherImg,resumeImg, idPhotoList}; + } + return personalInfo; +} +function checkPersonalRoleList() { + let personalInfo = uni.getStorageSync('personalInfo'); + if (personalInfo) { + return personalInfo.roleList; + } + return []; +} +export default { + wxloginmethod, + getWxUserInfoServer, + saveWxUserInfoLocal, + getWxUserPhoneServer, + registerUserInfo, + systemLogin, + refreshToken, + systemLogOut, + getSystemUserInfo, + checkSystemLogin, + checkOrganInfo, + checkPersonalInfo, + checkWxUserInfo, + checkPersonalBaseInfo, + checkPersonalRoleList, + checkusernameLogin, +} diff --git a/utils/encrypt.js b/utils/encrypt.js new file mode 100644 index 0000000..ab3e8c7 --- /dev/null +++ b/utils/encrypt.js @@ -0,0 +1,22 @@ +import CryptoJS from 'crypto-js' + +const SECRET_KEY = CryptoJS.enc.Utf8.parse('KeyWareSecretKey'); + + +// 加密 +export function encrypt(data) { + const encrypted = CryptoJS.AES.encrypt(data, SECRET_KEY, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); + return encrypted.toString(); +} + +// 解密 +export function decrypt(data) { + const decrypted = CryptoJS.AES.decrypt(data, SECRET_KEY, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + return decrypted.toString(CryptoJS.enc.Utf8) +} \ No newline at end of file diff --git a/utils/http.js b/utils/http.js new file mode 100644 index 0000000..73aa915 --- /dev/null +++ b/utils/http.js @@ -0,0 +1,152 @@ +import comstemutil from "./comstemutil"; + +//es6 +const baseUrl = 'http://192.168.0.229:9999'; +// const baseUrl = 'http://172.16.36.180:9999'; +// const baseUrl = 'https://www.keyitest.cn/test-api'; +// const baseUrl = 'https://www.keyitest.cn/prod-api'; +// const devUrl = 'http://cloud-gateway:9999'; +const devStatus = false; +const commonhttp = (params, header) => { + return new Promise((resolve, reject) => { + uni.showLoading({ + title: "加载中" + }) + uni.request({ + ...params, + header, + success(res) { + resolve(res) + }, + fail(err) { + reject(err) + }, + complete(res) { + // console.log('--请求-',res) + let statusCode = res.data.code; + // console.log('---',statusCode) + if (statusCode==401){ + // comstemutil.systemLogOut(); + // reject({code:1,msg:'未授权'}) + uni.setStorageSync('accessToken', null) + uni.setStorageSync('wxUserInfo', null) + if(res.data.msg.includes('/my/shoppingCart')||res.data.msg.includes('message/my')){ + uni.setStorageSync('accessToken', null) + uni.setStorageSync('wxUserInfo', null) + }else{ + uni.showToast({ title:'登录失效,请重新登录', icon: 'none', duration:1000 }); + setTimeout(()=>{ + uni.navigateTo({ + url: '/pages/personal/login' + }) + },1000) + } + + } + // 不管请求成没成功都会走这一步 然后隐藏 加载中的效果 + uni.hideLoading() + } + }) + }) +} + // fial:(err)=>{} + // { + // // fail(err) { + // // reject(err) + // // }, + // complete(hide){ + // console.log('--报错-',hide); //可以看到错误信息被打印出来了 + // if(statusCode ==401){ + // reject({code:1,msg:'未授权'}) + // } else { + // uni.showToast({ title: res.data.msg, icon: 'none', duration: 2000 }); + // } + // } + // } + +const request = (params) => { + return new Promise((resolve, reject) => { + let header = {'TENANT-ID': 3}; + // console.log('params',params,) + // header['Authorization'] = 'Basic cGlnOnBpZw=='; + // 身份token信息 + // let {notToken} = {...params} + // console.log('====',notToken) + // if (notToken) { + // header['isToken'] = false; + // } + // const isToken = (header || {}).isToken === false + // if(!isToken){ + // header={isToken:false}; + // } + // console.log('==header==',header) + let accessToken = uni.getStorageSync('accessToken'); + // console.log('tpken--',accessToken) + if (accessToken && params.requireToken) { + // console.log('11111',res) + header['Authorization'] = 'Bearer ' + accessToken; + // let expiresTimeStamp = uni.getStorageSync('expiresTimeStamp'); + // let stamp = expiresTimeStamp - new Date().getTime(); + // if (stamp < 5000) { + // // 刷新 token + // reject({code: 1, msg: '需要刷新token重新登录'}); + /*comstemutil.refreshToken().then(()=>{ + accessToken = uni.getStorageSync('accessToken'); + header['Authorization'] = 'Bearer ' + accessToken; + commonhttp(params, header).then((res)=>{ + resolve(res) + }).catch((err)=>{ + reject(err) + }) + }).catch((err)=>{ + reject(err) + })*/ + // } + } + commonhttp(params, header).then((res)=>{ + resolve(res) + }).catch((err)=>{ + reject(err) + }) + }) +} +const buildQueryStr = (params) => { + if(typeof params === 'string') { return params; } + if(typeof params === 'function') { return ''; } + if(Object.keys(params).length === 0) { return ''; } + let paramArr = []; + Object.keys(params).forEach(kk=>{ paramArr.push(kk + '=' + params[kk]); }) + return paramArr.join('&'); +} +const buildUrl = (baseUrl, url) => { + if(url.indexOf("http") > -1) { + return url; + } + return baseUrl + url; +} +export default { + quickPost(url, data,requireToken){ + console.log('url/',url, data,requireToken) + return request({url: buildUrl(baseUrl , url), data, method:'POST',requireToken}) + }, + post(url, params, data,requireToken){ + let queryStr = params ? '?'+buildQueryStr(params) : ''; + return request({url: buildUrl(baseUrl , url) + queryStr, data, method:'POST',requireToken}) + }, + quickGet(url,requireToken) { + return request({url: baseUrl + url, method:'GET',requireToken}) + }, + get(url,params,requireToken) { + let queryStr = params ? '?'+buildQueryStr(params) : ''; + return request({url: buildUrl(baseUrl , url) + queryStr, method:'GET',requireToken}) + }, + quickDelete(url,requireToken) { + return request({url: buildUrl(baseUrl , url), method:'DELETE',requireToken}) + }, + quickPut(url, data,requireToken) { + return request({url: buildUrl(baseUrl , url), data, method:'PUT',requireToken}) + }, + devStatus, + baseUrl + // devUrl +} diff --git a/utils/mixin/index.js b/utils/mixin/index.js new file mode 100644 index 0000000..9100826 --- /dev/null +++ b/utils/mixin/index.js @@ -0,0 +1,19 @@ +let mixin = { + data(){ + return{ + tasktypelist:[] + } + }, + created() { + this.getDictType() + }, + methods: { + async getDictType() { + const res = await this.http.quickGet('/system/dict/data/type/crowdsourcing_task_type',false) + this.tasktypelist = res.data.data + }, + }, +} + +// 记住,最后一定要导出 +export default mixin diff --git a/utils/mixin/tootype.js b/utils/mixin/tootype.js new file mode 100644 index 0000000..fb0ba52 --- /dev/null +++ b/utils/mixin/tootype.js @@ -0,0 +1,19 @@ +let mixin = { + data(){ + return{ + tooltypelist:[] + } + }, + created() { + this.getToolType() + }, + methods: { + async getToolType() { + const res = await this.http.quickGet('/system/dict/data/type/sys_tool_type',false) + this.tooltypelist = res.data.data + }, + }, +} + +// 记住,最后一定要导出 +export default mixin diff --git a/utils/share.js b/utils/share.js new file mode 100644 index 0000000..ed4cd47 --- /dev/null +++ b/utils/share.js @@ -0,0 +1,21 @@ +export default { + data() { + return {} + }, + //1.配置发送给朋友 + onShareAppMessage() { + return { + title: '关键测试宝', //分享的标题 + path: 'pages/index/index', //点击分享链接之后进入的页面路径 + // imageUrl: '/static/index/logo.png' //分享发送的链接图片地址 + }; + }, + //2.配置分享到朋友圈 + onShareTimeline() { + return { + title: '关键测试宝', //分享的标题 + query: 'pages/index/index', //点击分享链接之后进入的页面路径 + // imageUrl: '/static/index/logo.png' //分享发送的链接图片地址 + } + }, +} \ No newline at end of file diff --git a/utils/util.js b/utils/util.js new file mode 100644 index 0000000..bc5e1eb --- /dev/null +++ b/utils/util.js @@ -0,0 +1,320 @@ +import { + validatenull +} from './validate' + + +// 表单序列化 +export const serialize = data => { + const list = [] + Object.keys(data).forEach(ele => { + list.push(`${ele}=${data[ele]}`) + }) + return list.join('&') +} +export const getObjType = obj => { + var toString = Object.prototype.toString + var map = { + '[object Boolean]': 'boolean', + '[object Number]': 'number', + '[object String]': 'string', + '[object Function]': 'function', + '[object Array]': 'array', + '[object Date]': 'date', + '[object RegExp]': 'regExp', + '[object Undefined]': 'undefined', + '[object Null]': 'null', + '[object Object]': 'object' + } + if (obj instanceof Element) { + return 'element' + } + return map[toString.call(obj)] +} +/** + * 对象深拷贝 + */ +export const deepClone = data => { + var type = getObjType(data) + var obj + if (type === 'array') { + obj = [] + } else if (type === 'object') { + obj = {} + } else { + // 不再具有下一层次 + return data + } + if (type === 'array') { + for (var i = 0, len = data.length; i < len; i++) { + obj.push(deepClone(data[i])) + } + } else if (type === 'object') { + for (var key in data) { + obj[key] = deepClone(data[key]) + } + } + return obj +} +/** + * 判断路由是否相等 + */ +export const diff = (obj1, obj2) => { + delete obj1.close + var o1 = obj1 instanceof Object + var o2 = obj2 instanceof Object + if (!o1 || !o2) { + /* 判断不是对象 */ + return obj1 === obj2 + } + + if (Object.keys(obj1).length !== Object.keys(obj2).length) { + return false + // Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2; + } + + for (var attr in obj1) { + var t1 = obj1[attr] instanceof Object + var t2 = obj2[attr] instanceof Object + if (t1 && t2) { + return diff(obj1[attr], obj2[attr]) + } else if (obj1[attr] !== obj2[attr]) { + return false + } + } + return true +} +/** + * 设置灰度模式 + */ +export const toggleGrayMode = (status) => { + if (status) { + document.body.className = document.body.className + ' grayMode' + } else { + document.body.className = document.body.className.replace(' grayMode', '') + } +} +/** + * 设置主题 + */ +export const setTheme = (name) => { + document.body.className = name +} +/** + * 递归寻找子类的父类 + */ + +export const findParent = (menu, id) => { + for (let i = 0; i < menu.length; i++) { + if (menu[i].children.length !== 0) { + for (let j = 0; j < menu[i].children.length; j++) { + if (menu[i].children[j].id === id) { + return menu[i] + } else { + if (menu[i].children[j].children.length !== 0) { + return findParent(menu[i].children[j].children, id) + } + } + } + } + } +} + +/** + * 动态插入css + */ + +export const loadStyle = url => { + const link = document.createElement('link') + link.type = 'text/css' + link.rel = 'stylesheet' + link.href = url + const head = document.getElementsByTagName('head')[0] + head.appendChild(link) +} +/** + * 判断路由是否相等 + */ +export const isObjectValueEqual = (a, b) => { + let result = true + Object.keys(a).forEach(ele => { + const type = typeof(a[ele]) + if (type === 'string' && a[ele] !== b[ele]) result = false + else if (type === 'object' && JSON.stringify(a[ele]) !== JSON.stringify(b[ele])) result = false + }) + return result +} + +export const findLabelValueByProp = (dic, value, propl, label) => { + // console.log(dic, value, propl,label) + propl = propl ? propl : 'value'; + label = label ? label : 'label'; + let result = '' + if (validatenull(dic)) return value + let idx = dic.findIndex(item => item[propl] == value); + if (idx > -1) { + return dic[idx][label] + } + return value +} +/** + * 根据字典的value显示label + */ +export const findByvalue = (dic, value) => { + let result = '' + if (validatenull(dic)) return value + if (typeof(value) === 'string' || typeof(value) === 'number' || typeof(value) === 'boolean') { + let index = 0 + index = findArray(dic, value) + if (index !== -1) { + result = dic[index].label + } else { + result = value + } + } else if (value instanceof Array) { + result = [] + let index = 0 + value.forEach(ele => { + index = findArray(dic, ele) + if (index !== -1) { + result.push(dic[index].label) + } else { + result.push(value) + } + }) + result = result.toString() + console.log('ddd', result) + } + return result +} +/** + * 根据字典的value查找对应的index + */ +export const findArray = (dic, value) => { + for (let i = 0; i < dic.length; i++) { + if (dic[i].value === value) { + return i + } + } + return -1 +} +/** + * 生成随机len位数字 + */ +export const randomLenNum = (len, date) => { + let random = '' + random = Math.ceil(Math.random() * 100000000000000).toString().substr(0, len || 4) + if (date) random = random + Date.now() + return random +} +/** + * 打开小窗口 + */ +export const openWindow = (url, title, w, h) => { + // Fixes dual-screen position Most browsers Firefox + const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left + const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top + + const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document + .documentElement.clientWidth : screen.width + const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document + .documentElement.clientHeight : screen.height + + const left = ((width / 2) - (w / 2)) + dualScreenLeft + const top = ((height / 2) - (h / 2)) + dualScreenTop + const newWindow = window.open(url, title, + 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + + w + ', height=' + h + ', top=' + top + ', left=' + left) + + // Puts focus on the newWindow + if (window.focus) { + newWindow.focus() + } +} + +/** + * src 处理 + * @returns {PromiseLike | Promise} + */ + +export function buildQueryString(params) { + let str = ''; + Object.keys(params).forEach((key) => { + str += `${key}=${params[key]}&`; + }); + str.substr(0, str.length - 1); + return str; +} +export function getQueryString(url, paraName) { + const arrObj = url.split('?') + if (arrObj.length > 1) { + const arrPara = arrObj[1].split('&') + let arr + for (let i = 0; i < arrPara.length; i++) { + arr = arrPara[i].split('=') + // eslint-disable-next-line eqeqeq + if (arr != null && arr[0] == paraName) { + return arr[1] + } + } + return '' + } else { + return '' + } +} +export function dateFormat(date, format) { + if (!format) { + format = 'yyyy-MM-dd hh:mm:ss'; + } + if (date !== 'Invalid Date') { + var o = { + 'M+': date.getMonth() + 1, // month + 'd+': date.getDate(), // day + 'h+': date.getHours(), // hour + 'm+': date.getMinutes(), // minute + 's+': date.getSeconds(), // second + 'q+': Math.floor((date.getMonth() + 3) / 3), // quarter + 'S': date.getMilliseconds() // millisecond + } + if (/(y+)/.test(format)) { + format = format.replace(RegExp.$1, + (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + for (var k in o) { + if (new RegExp('(' + k + ')').test(format)) { + format = format.replace(RegExp.$1, + RegExp.$1.length === 1 ? o[k] : + ('00' + o[k]).substr(('' + o[k]).length)) + } + } + return format + } + return '' +} +export function dillFeSiteStaticurl(url) { + if (typeof url !== 'string') { + return url; + } + if (url.indexOf('/fencingapi') === 0) { + return '/fencinginfo' + url; + } + return url; +} + + +// 处理任务类型 +export function findLabelValueByPropnew(dic, value, propl, label) { + if (!value) return "" + const valueArr = value.split(',') + propl = propl ? propl : 'value'; + label = label ? label : 'label'; + let resultArr = [] + if (validatenull(dic)) return value + + valueArr.forEach((it, i) => { + const index = dic.findIndex(item => item[propl] == valueArr[i]) + if (index != -1) { + resultArr.push(dic[index][label]) + } + }) + return resultArr.join(',') +} \ No newline at end of file diff --git a/utils/validate.js b/utils/validate.js new file mode 100644 index 0000000..e512f9b --- /dev/null +++ b/utils/validate.js @@ -0,0 +1,260 @@ +/** + * 邮箱 + * @param {*} s + */ +export function isEmail(s) { + return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s) +} + +/** + * 手机号码 + * @param {*} s + */ +export function isMobile(s) { + return /^1[0-9]{10}$/.test(s) +} + +/** + * 电话号码 + * @param {*} s + */ +export function isPhone(s) { + return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s) +} + +/** + * URL地址 + * @param {*} s + */ +export function isURL(s) { + return /^http[s]?:\/\/.*/.test(s) +} + +export function isvalidUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} + +/* 合法uri */ +export function validateURL(textval) { + const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return urlregex.test(textval) +} + +/* 小写字母 */ +export function validateLowerCase(str) { + const reg = /^[a-z]+$/ + return reg.test(str) +} + +/* 大写字母 */ +export function validateUpperCase(str) { + const reg = /^[A-Z]+$/ + return reg.test(str) +} + +/* 大小写字母 */ +export function validatAlphabets(str) { + const reg = /^[A-Za-z]+$/ + return reg.test(str) +} + +/* 验证pad还是pc */ +export const vaildatePc = function() { + const userAgentInfo = navigator.userAgent + const Agents = ['Android', 'iPhone', + 'SymbianOS', 'Windows Phone', + 'iPad', 'iPod' + ] + let flag = true + for (var v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false + break + } + } + return flag +} + +/** + * validate email + * @param email + * @returns {boolean} + */ +export function validateEmail(email) { + const re = /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return re.test(email) +} + +/** + * 判断身份证号码 + */ +export function cardid(code) { + const list = [] + let result = true + let msg = '' + var city = { + 11: '北京', + 12: '天津', + 13: '河北', + 14: '山西', + 15: '内蒙古', + 21: '辽宁', + 22: '吉林', + 23: '黑龙江 ', + 31: '上海', + 32: '江苏', + 33: '浙江', + 34: '安徽', + 35: '福建', + 36: '江西', + 37: '山东', + 41: '河南', + 42: '湖北 ', + 43: '湖南', + 44: '广东', + 45: '广西', + 46: '海南', + 50: '重庆', + 51: '四川', + 52: '贵州', + 53: '云南', + 54: '西藏 ', + 61: '陕西', + 62: '甘肃', + 63: '青海', + 64: '宁夏', + 65: '新疆', + 71: '台湾', + 81: '香港', + 82: '澳门', + 91: '国外 ' + } + if (!validatenull(code)) { + if (code.length === 18) { + if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) { + msg = '证件号码格式错误' + } else if (!city[code.substr(0, 2)]) { + msg = '地址编码错误' + } else { + result = false + } + /* else { + // 18位身份证需要验证最后一位校验位 + code = code.split('') + // ∑(ai×Wi)(mod 11) + // 加权因子 + var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] + // 校验位 + var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x'] + var sum = 0 + var ai = 0 + var wi = 0 + for (var i = 0; i < 17; i++) { + ai = code[i] + wi = factor[i] + sum += ai * wi + } + if (parity[sum % 11] !== code[17]) { + msg = '证件号码校验位错误' + } else { + result = false + } + }*/ + } else if(code.length === 15) { + result = false + } else { + msg = '证件号码长度不为18位' + } + } else { + msg = '证件号码不能为空' + } + list.push(result) + list.push(msg) + return list +} + +/** + * 判断手机号码是否正确 + */ +export function isvalidatemobile(phone) { + const list = [] + let result = true + let msg = '' + var isPhone = /^0\d{2,3}-?\d{7,8}$/ + // 增加134 减少|1349[0-9]{7},增加181,增加145,增加17[678] + if (!validatenull(phone)) { + if (phone.length === 11) { + if (isPhone.test(phone)) { + msg = '手机号码格式不正确' + } else { + result = false + } + } else { + msg = '手机号码长度不为11位' + } + } else { + msg = '手机号码不能为空' + } + list.push(result) + list.push(msg) + return list +} + +/** + * 判断姓名是否正确 + */ +export function validatename(name) { + var regName = /^[\u4e00-\u9fa5]{2,4}$/ + if (!regName.test(name)) return false + return true +} + +/** + * 判断是否为整数 + */ +export function validatenum(num, type) { + let regName = /[^\d.]/g + if (type === 1) { + if (!regName.test(num)) return false + } else if (type === 2) { + regName = /[^\d]/g + if (!regName.test(num)) return false + } + return true +} + +/** + * 判断是否为小数 + */ +export function validatenumord(num, type) { + let regName = /[^\d.]/g + if (type === 1) { + if (!regName.test(num)) return false + } else if (type === 2) { + regName = /[^\d.]/g + if (!regName.test(num)) return false + } + return true +} + +/** + * 判断是否为空 + */ +export function validatenull(val) { + if (typeof val === 'boolean') { + return false + } + if (typeof val === 'number') { + return false + } + if (val instanceof Array) { + if (val.length === 0) return true + } else if (val instanceof Object) { + if (JSON.stringify(val) === '{}') return true + } else { + if (val === 'null' || val == null || val === 'undefined' || val === undefined || val === '') return true + return false + } + return false +} diff --git a/uview-ui/LICENSE b/uview-ui/LICENSE new file mode 100644 index 0000000..8e39ead --- /dev/null +++ b/uview-ui/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 www.uviewui.com + +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. \ No newline at end of file diff --git a/uview-ui/README.md b/uview-ui/README.md new file mode 100644 index 0000000..06d5676 --- /dev/null +++ b/uview-ui/README.md @@ -0,0 +1,106 @@ +

+ logo +

+

uView

+

多平台快速开发的UI框架

+ + +## 说明 + +uView UI,是[uni-app](https://uniapp.dcloud.io/)生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 + +## 特性 + +- 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序 +- 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用 +- 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨 +- 众多的常用页面和布局,让您专注逻辑,事半功倍 +- 详尽的文档支持,现代化的演示效果 +- 按需引入,精简打包体积 + + +## 安装 + +```bash +# npm方式安装 +npm i uview-ui +``` + +## 快速上手 + +1. `main.js`引入uView库 +```js +// main.js +import uView from 'uview-ui'; +Vue.use(uView); +``` + +2. `App.vue`引入基础样式(注意style标签需声明scss属性支持) +```css +/* App.vue */ + +``` + +3. `uni.scss`引入全局scss变量文件 +```css +/* uni.scss */ +@import "uview-ui/theme.scss"; +``` + +4. `pages.json`配置easycom规则(按需引入) + +```js +// pages.json +{ + "easycom": { + // npm安装的方式不需要前面的"@/",下载安装的方式需要"@/" + // npm安装方式 + "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" + // 下载安装方式 + // "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + }, + // 此为本身已有的内容 + "pages": [ + // ...... + ] +} +``` + +请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 + +## 使用方法 +配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。 + +```html + +``` + +请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 + +## 链接 + +- [官方文档](https://uviewui.com/) +- [更新日志](https://uviewui.com/components/changelog.html) +- [升级指南](https://uviewui.com/components/changelog.html) +- [关于我们](https://uviewui.com/cooperation/about.html) + +## 预览 + +您可以通过**微信**扫码,查看最佳的演示效果。 +
+
+ + + +## 版权信息 +uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。 diff --git a/uview-ui/components/u-action-sheet/u-action-sheet.vue b/uview-ui/components/u-action-sheet/u-action-sheet.vue new file mode 100644 index 0000000..722b668 --- /dev/null +++ b/uview-ui/components/u-action-sheet/u-action-sheet.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/uview-ui/components/u-alert-tips/u-alert-tips.vue b/uview-ui/components/u-alert-tips/u-alert-tips.vue new file mode 100644 index 0000000..e81fc37 --- /dev/null +++ b/uview-ui/components/u-alert-tips/u-alert-tips.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue new file mode 100644 index 0000000..a48dd54 --- /dev/null +++ b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/uview-ui/components/u-avatar-cropper/weCropper.js b/uview-ui/components/u-avatar-cropper/weCropper.js new file mode 100644 index 0000000..df02483 --- /dev/null +++ b/uview-ui/components/u-avatar-cropper/weCropper.js @@ -0,0 +1,1265 @@ +/** + * we-cropper v1.3.9 + * (c) 2020 dlhandsome + * @license MIT + */ +(function(global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.WeCropper = factory()); +}(this, (function() { + 'use strict'; + + var device = void 0; + var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended']; + + function firstLetterUpper(str) { + return str.charAt(0).toUpperCase() + str.slice(1) + } + + function setTouchState(instance) { + var arg = [], + len = arguments.length - 1; + while (len-- > 0) arg[len] = arguments[len + 1]; + + TOUCH_STATE.forEach(function(key, i) { + if (arg[i] !== undefined) { + instance[key] = arg[i]; + } + }); + } + + function validator(instance, o) { + Object.defineProperties(instance, o); + } + + function getDevice() { + if (!device) { + device = uni.getSystemInfoSync(); + } + return device + } + + var tmp = {}; + + var ref = getDevice(); + var pixelRatio = ref.pixelRatio; + + var DEFAULT = { + id: { + default: 'cropper', + get: function get() { + return tmp.id + }, + set: function set(value) { + if (typeof(value) !== 'string') { + console.error(("id:" + value + " is invalid")); + } + tmp.id = value; + } + }, + width: { + default: 750, + get: function get() { + return tmp.width + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("width:" + value + " is invalid")); + } + tmp.width = value; + } + }, + height: { + default: 750, + get: function get() { + return tmp.height + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("height:" + value + " is invalid")); + } + tmp.height = value; + } + }, + pixelRatio: { + default: pixelRatio, + get: function get() { + return tmp.pixelRatio + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("pixelRatio:" + value + " is invalid")); + } + tmp.pixelRatio = value; + } + }, + scale: { + default: 2.5, + get: function get() { + return tmp.scale + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("scale:" + value + " is invalid")); + } + tmp.scale = value; + } + }, + zoom: { + default: 5, + get: function get() { + return tmp.zoom + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("zoom:" + value + " is invalid")); + } else if (value < 0 || value > 10) { + console.error("zoom should be ranged in 0 ~ 10"); + } + tmp.zoom = value; + } + }, + src: { + default: '', + get: function get() { + return tmp.src + }, + set: function set(value) { + if (typeof(value) !== 'string') { + console.error(("src:" + value + " is invalid")); + } + tmp.src = value; + } + }, + cut: { + default: {}, + get: function get() { + return tmp.cut + }, + set: function set(value) { + if (typeof(value) !== 'object') { + console.error(("cut:" + value + " is invalid")); + } + tmp.cut = value; + } + }, + boundStyle: { + default: {}, + get: function get() { + return tmp.boundStyle + }, + set: function set(value) { + if (typeof(value) !== 'object') { + console.error(("boundStyle:" + value + " is invalid")); + } + tmp.boundStyle = value; + } + }, + onReady: { + default: null, + get: function get() { + return tmp.ready + }, + set: function set(value) { + tmp.ready = value; + } + }, + onBeforeImageLoad: { + default: null, + get: function get() { + return tmp.beforeImageLoad + }, + set: function set(value) { + tmp.beforeImageLoad = value; + } + }, + onImageLoad: { + default: null, + get: function get() { + return tmp.imageLoad + }, + set: function set(value) { + tmp.imageLoad = value; + } + }, + onBeforeDraw: { + default: null, + get: function get() { + return tmp.beforeDraw + }, + set: function set(value) { + tmp.beforeDraw = value; + } + } + }; + + var ref$1 = getDevice(); + var windowWidth = ref$1.windowWidth; + + function prepare() { + var self = this; + + // v1.4.0 版本中将不再自动绑定we-cropper实例 + self.attachPage = function() { + var pages = getCurrentPages(); + // 获取到当前page上下文 + var pageContext = pages[pages.length - 1]; + // 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问 + Object.defineProperty(pageContext, 'wecropper', { + get: function get() { + console.warn( + 'Instance will not be automatically bound to the page after v1.4.0\n\n' + + 'Please use a custom instance name instead\n\n' + + 'Example: \n' + + 'this.mycropper = new WeCropper(options)\n\n' + + '// ...\n' + + 'this.mycropper.getCropperImage()' + ); + return self + }, + configurable: true + }); + }; + + self.createCtx = function() { + var id = self.id; + var targetId = self.targetId; + + if (id) { + self.ctx = self.ctx || uni.createCanvasContext(id); + self.targetCtx = self.targetCtx || uni.createCanvasContext(targetId); + } else { + console.error("constructor: create canvas context failed, 'id' must be valuable"); + } + }; + + self.deviceRadio = windowWidth / 750; + } + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== + 'undefined' ? self : {}; + + + + + + function createCommonjsModule(fn, module) { + return module = { + exports: {} + }, fn(module, module.exports), module.exports; + } + + var tools = createCommonjsModule(function(module, exports) { + /** + * String type check + */ + exports.isStr = function(v) { + return typeof v === 'string'; + }; + /** + * Number type check + */ + exports.isNum = function(v) { + return typeof v === 'number'; + }; + /** + * Array type check + */ + exports.isArr = Array.isArray; + /** + * undefined type check + */ + exports.isUndef = function(v) { + return v === undefined; + }; + + exports.isTrue = function(v) { + return v === true; + }; + + exports.isFalse = function(v) { + return v === false; + }; + /** + * Function type check + */ + exports.isFunc = function(v) { + return typeof v === 'function'; + }; + /** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ + exports.isObj = exports.isObject = function(obj) { + return obj !== null && typeof obj === 'object' + }; + + /** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ + var _toString = Object.prototype.toString; + exports.isPlainObject = function(obj) { + return _toString.call(obj) === '[object Object]' + }; + + /** + * Check whether the object has the property. + */ + var hasOwnProperty = Object.prototype.hasOwnProperty; + exports.hasOwn = function(obj, key) { + return hasOwnProperty.call(obj, key) + }; + + /** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/) + */ + exports.noop = function(a, b, c) {}; + + /** + * Check if val is a valid array index. + */ + exports.isValidArrayIndex = function(val) { + var n = parseFloat(String(val)); + return n >= 0 && Math.floor(n) === n && isFinite(val) + }; + }); + + var tools_7 = tools.isFunc; + var tools_10 = tools.isPlainObject; + + var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad']; + + function observer() { + var self = this; + + self.on = function(event, fn) { + if (EVENT_TYPE.indexOf(event) > -1) { + if (tools_7(fn)) { + event === 'ready' ? + fn(self) : + self[("on" + (firstLetterUpper(event)))] = fn; + } + } else { + console.error(("event: " + event + " is invalid")); + } + return self + }; + } + + function wxPromise(fn) { + return function(obj) { + var args = [], + len = arguments.length - 1; + while (len-- > 0) args[len] = arguments[len + 1]; + + if (obj === void 0) obj = {}; + return new Promise(function(resolve, reject) { + obj.success = function(res) { + resolve(res); + }; + obj.fail = function(err) { + reject(err); + }; + fn.apply(void 0, [obj].concat(args)); + }) + } + } + + function draw(ctx, reserve) { + if (reserve === void 0) reserve = false; + + return new Promise(function(resolve) { + ctx.draw(reserve, resolve); + }) + } + + var getImageInfo = wxPromise(uni.getImageInfo); + + var canvasToTempFilePath = wxPromise(uni.canvasToTempFilePath); + + var base64 = createCommonjsModule(function(module, exports) { + /*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */ + (function(root) { + + // Detect free variables `exports`. + var freeExports = 'object' == 'object' && exports; + + // Detect free variable `module`. + var freeModule = 'object' == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, and use + // it as `root`. + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var InvalidCharacterError = function(message) { + this.message = message; + }; + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + var error = function(message) { + // Note: the error messages used throughout this file match those used by + // the native `atob`/`btoa` implementation in Chromium. + throw new InvalidCharacterError(message); + }; + + var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // http://whatwg.org/html/common-microsyntaxes.html#space-character + var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g; + + // `decode` is designed to be fully compatible with `atob` as described in the + // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob + // The optimized base64-decoding algorithm used is based on @atk’s excellent + // implementation. https://gist.github.com/atk/1020396 + var decode = function(input) { + input = String(input) + .replace(REGEX_SPACE_CHARACTERS, ''); + var length = input.length; + if (length % 4 == 0) { + input = input.replace(/==?$/, ''); + length = input.length; + } + if ( + length % 4 == 1 || + // http://whatwg.org/C#alphanumeric-ascii-characters + /[^+a-zA-Z0-9/]/.test(input) + ) { + error( + 'Invalid character: the string to be decoded is not correctly encoded.' + ); + } + var bitCounter = 0; + var bitStorage; + var buffer; + var output = ''; + var position = -1; + while (++position < length) { + buffer = TABLE.indexOf(input.charAt(position)); + bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer; + // Unless this is the first of a group of 4 characters… + if (bitCounter++ % 4) { + // …convert the first 8 bits to a single ASCII character. + output += String.fromCharCode( + 0xFF & bitStorage >> (-2 * bitCounter & 6) + ); + } + } + return output; + }; + + // `encode` is designed to be fully compatible with `btoa` as described in the + // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa + var encode = function(input) { + input = String(input); + if (/[^\0-\xFF]/.test(input)) { + // Note: no need to special-case astral symbols here, as surrogates are + // matched, and the input is supposed to only contain ASCII anyway. + error( + 'The string to be encoded contains characters outside of the ' + + 'Latin1 range.' + ); + } + var padding = input.length % 3; + var output = ''; + var position = -1; + var a; + var b; + var c; + var buffer; + // Make sure any padding is handled outside of the loop. + var length = input.length - padding; + + while (++position < length) { + // Read three bytes, i.e. 24 bits. + a = input.charCodeAt(position) << 16; + b = input.charCodeAt(++position) << 8; + c = input.charCodeAt(++position); + buffer = a + b + c; + // Turn the 24 bits into four chunks of 6 bits each, and append the + // matching character for each of them to the output. + output += ( + TABLE.charAt(buffer >> 18 & 0x3F) + + TABLE.charAt(buffer >> 12 & 0x3F) + + TABLE.charAt(buffer >> 6 & 0x3F) + + TABLE.charAt(buffer & 0x3F) + ); + } + + if (padding == 2) { + a = input.charCodeAt(position) << 8; + b = input.charCodeAt(++position); + buffer = a + b; + output += ( + TABLE.charAt(buffer >> 10) + + TABLE.charAt((buffer >> 4) & 0x3F) + + TABLE.charAt((buffer << 2) & 0x3F) + + '=' + ); + } else if (padding == 1) { + buffer = input.charCodeAt(position); + output += ( + TABLE.charAt(buffer >> 2) + + TABLE.charAt((buffer << 4) & 0x3F) + + '==' + ); + } + + return output; + }; + + var base64 = { + 'encode': encode, + 'decode': decode, + 'version': '0.1.0' + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof undefined == 'function' && + typeof undefined.amd == 'object' && + undefined.amd + ) { + undefined(function() { + return base64; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = base64; + } else { // in Narwhal or RingoJS v0.7.0- + for (var key in base64) { + base64.hasOwnProperty(key) && (freeExports[key] = base64[key]); + } + } + } else { // in Rhino or a web browser + root.base64 = base64; + } + + }(commonjsGlobal)); + }); + + function makeURI(strData, type) { + return 'data:' + type + ';base64,' + strData + } + + function fixType(type) { + type = type.toLowerCase().replace(/jpg/i, 'jpeg'); + var r = type.match(/png|jpeg|bmp|gif/)[0]; + return 'image/' + r + } + + function encodeData(data) { + var str = ''; + if (typeof data === 'string') { + str = data; + } else { + for (var i = 0; i < data.length; i++) { + str += String.fromCharCode(data[i]); + } + } + return base64.encode(str) + } + + /** + * 获取图像区域隐含的像素数据 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param done 完成回调 + */ + function getImageData(canvasId, x, y, width, height, done) { + uni.canvasGetImageData({ + canvasId: canvasId, + x: x, + y: y, + width: width, + height: height, + success: function success(res) { + done(res, null); + }, + fail: function fail(res) { + done(null, res); + } + }); + } + + /** + * 生成bmp格式图片 + * 按照规则生成图片响应头和响应体 + * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData + * @returns {*} base64字符串 + */ + function genBitmapImage(oData) { + // + // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx + // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx + // + var biWidth = oData.width; + var biHeight = oData.height; + var biSizeImage = biWidth * biHeight * 3; + var bfSize = biSizeImage + 54; // total header size = 54 bytes + + // + // typedef struct tagBITMAPFILEHEADER { + // WORD bfType; + // DWORD bfSize; + // WORD bfReserved1; + // WORD bfReserved2; + // DWORD bfOffBits; + // } BITMAPFILEHEADER; + // + var BITMAPFILEHEADER = [ + // WORD bfType -- The file type signature; must be "BM" + 0x42, 0x4D, + // DWORD bfSize -- The size, in bytes, of the bitmap file + bfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff, + // WORD bfReserved1 -- Reserved; must be zero + 0, 0, + // WORD bfReserved2 -- Reserved; must be zero + 0, 0, + // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits. + 54, 0, 0, 0 + ]; + + // + // typedef struct tagBITMAPINFOHEADER { + // DWORD biSize; + // LONG biWidth; + // LONG biHeight; + // WORD biPlanes; + // WORD biBitCount; + // DWORD biCompression; + // DWORD biSizeImage; + // LONG biXPelsPerMeter; + // LONG biYPelsPerMeter; + // DWORD biClrUsed; + // DWORD biClrImportant; + // } BITMAPINFOHEADER, *PBITMAPINFOHEADER; + // + var BITMAPINFOHEADER = [ + // DWORD biSize -- The number of bytes required by the structure + 40, 0, 0, 0, + // LONG biWidth -- The width of the bitmap, in pixels + biWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff, + // LONG biHeight -- The height of the bitmap, in pixels + biHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff, + // WORD biPlanes -- The number of planes for the target device. This value must be set to 1 + 1, 0, + // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap + // has a maximum of 2^24 colors (16777216, Truecolor) + 24, 0, + // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed + 0, 0, 0, 0, + // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps + biSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff, + // LONG biXPelsPerMeter, unused + 0, 0, 0, 0, + // LONG biYPelsPerMeter, unused + 0, 0, 0, 0, + // DWORD biClrUsed, the number of color indexes of palette, unused + 0, 0, 0, 0, + // DWORD biClrImportant, unused + 0, 0, 0, 0 + ]; + + var iPadding = (4 - ((biWidth * 3) % 4)) % 4; + + var aImgData = oData.data; + + var strPixelData = ''; + var biWidth4 = biWidth << 2; + var y = biHeight; + var fromCharCode = String.fromCharCode; + + do { + var iOffsetY = biWidth4 * (y - 1); + var strPixelRow = ''; + for (var x = 0; x < biWidth; x++) { + var iOffsetX = x << 2; + strPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) + + fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) + + fromCharCode(aImgData[iOffsetY + iOffsetX]); + } + + for (var c = 0; c < iPadding; c++) { + strPixelRow += String.fromCharCode(0); + } + + strPixelData += strPixelRow; + } while (--y) + + var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData); + + return strEncoded + } + + /** + * 转换为图片base64 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param type 转换图片类型 + * @param done 完成回调 + */ + function convertToImage(canvasId, x, y, width, height, type, done) { + if (done === void 0) done = function() {}; + + if (type === undefined) { + type = 'png'; + } + type = fixType(type); + if (/bmp/.test(type)) { + getImageData(canvasId, x, y, width, height, function(data, err) { + var strData = genBitmapImage(data); + tools_7(done) && done(makeURI(strData, 'image/' + type), err); + }); + } else { + console.error('暂不支持生成\'' + type + '\'类型的base64图片'); + } + } + + var CanvasToBase64 = { + convertToImage: convertToImage, + // convertToPNG: function (width, height, done) { + // return convertToImage(width, height, 'png', done) + // }, + // convertToJPEG: function (width, height, done) { + // return convertToImage(width, height, 'jpeg', done) + // }, + // convertToGIF: function (width, height, done) { + // return convertToImage(width, height, 'gif', done) + // }, + convertToBMP: function(ref, done) { + if (ref === void 0) ref = {}; + var canvasId = ref.canvasId; + var x = ref.x; + var y = ref.y; + var width = ref.width; + var height = ref.height; + if (done === void 0) done = function() {}; + + return convertToImage(canvasId, x, y, width, height, 'bmp', done) + } + }; + + function methods() { + var self = this; + + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度 + + var id = self.id; + var targetId = self.targetId; + var pixelRatio = self.pixelRatio; + + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + self.updateCanvas = function(done) { + if (self.croperTarget) { + // 画布绘制图片 + self.ctx.drawImage( + self.croperTarget, + self.imgLeft, + self.imgTop, + self.scaleWidth, + self.scaleHeight + ); + } + tools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self); + + self.setBoundStyle(self.boundStyle); // 设置边界样式 + + self.ctx.draw(false, done); + return self + }; + + self.pushOrigin = self.pushOrign = function(src) { + self.src = src; + + tools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self); + + return getImageInfo({ + src: src + }) + .then(function(res) { + var innerAspectRadio = res.width / res.height; + var customAspectRadio = width / height; + + self.croperTarget = res.path; + + if (innerAspectRadio < customAspectRadio) { + self.rectX = x; + self.baseWidth = width; + self.baseHeight = width / innerAspectRadio; + self.rectY = y - Math.abs((height - self.baseHeight) / 2); + } else { + self.rectY = y; + self.baseWidth = height * innerAspectRadio; + self.baseHeight = height; + self.rectX = x - Math.abs((width - self.baseWidth) / 2); + } + + self.imgLeft = self.rectX; + self.imgTop = self.rectY; + self.scaleWidth = self.baseWidth; + self.scaleHeight = self.baseHeight; + + self.update(); + + return new Promise(function(resolve) { + self.updateCanvas(resolve); + }) + }) + .then(function() { + tools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self); + }) + }; + + self.removeImage = function() { + self.src = ''; + self.croperTarget = ''; + return draw(self.ctx) + }; + + self.getCropperBase64 = function(done) { + if (done === void 0) done = function() {}; + + CanvasToBase64.convertToBMP({ + canvasId: id, + x: x, + y: y, + width: width, + height: height + }, done); + }; + + self.getCropperImage = function(opt, fn) { + var customOptions = opt; + + var canvasOptions = { + canvasId: id, + x: x, + y: y, + width: width, + height: height + }; + + var task = function() { + return Promise.resolve(); + }; + + if ( + tools_10(customOptions) && + customOptions.original + ) { + // original mode + task = function() { + self.targetCtx.drawImage( + self.croperTarget, + self.imgLeft * pixelRatio, + self.imgTop * pixelRatio, + self.scaleWidth * pixelRatio, + self.scaleHeight * pixelRatio + ); + + canvasOptions = { + canvasId: targetId, + x: x * pixelRatio, + y: y * pixelRatio, + width: width * pixelRatio, + height: height * pixelRatio + }; + + return draw(self.targetCtx) + }; + } + + return task() + .then(function() { + if (tools_10(customOptions)) { + canvasOptions = Object.assign({}, canvasOptions, customOptions); + } + + if (tools_7(customOptions)) { + fn = customOptions; + } + + var arg = canvasOptions.componentContext ? + [canvasOptions, canvasOptions.componentContext] : + [canvasOptions]; + + return canvasToTempFilePath.apply(null, arg) + }) + .then(function(res) { + var tempFilePath = res.tempFilePath; + + return tools_7(fn) ? + fn.call(self, tempFilePath, null) : + tempFilePath + }) + .catch(function(err) { + if (tools_7(fn)) { + fn.call(self, null, err); + } else { + throw err + } + }) + }; + } + + /** + * 获取最新缩放值 + * @param oldScale 上一次触摸结束后的缩放值 + * @param oldDistance 上一次触摸结束后的双指距离 + * @param zoom 缩放系数 + * @param touch0 第一指touch对象 + * @param touch1 第二指touch对象 + * @returns {*} + */ + var getNewScale = function(oldScale, oldDistance, zoom, touch0, touch1) { + var xMove, yMove, newDistance; + // 计算二指最新距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + newDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + return oldScale + 0.001 * zoom * (newDistance - oldDistance) + }; + + function update() { + var self = this; + + if (!self.src) { + return + } + + self.__oneTouchStart = function(touch) { + self.touchX0 = Math.round(touch.x); + self.touchY0 = Math.round(touch.y); + }; + + self.__oneTouchMove = function(touch) { + var xMove, yMove; + // 计算单指移动的距离 + if (self.touchended) { + return self.updateCanvas() + } + xMove = Math.round(touch.x - self.touchX0); + yMove = Math.round(touch.y - self.touchY0); + + var imgLeft = Math.round(self.rectX + xMove); + var imgTop = Math.round(self.rectY + yMove); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__twoTouchStart = function(touch0, touch1) { + var xMove, yMove, oldDistance; + + self.touchX1 = Math.round(self.rectX + self.scaleWidth / 2); + self.touchY1 = Math.round(self.rectY + self.scaleHeight / 2); + + // 计算两指距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + oldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + self.oldDistance = oldDistance; + }; + + self.__twoTouchMove = function(touch0, touch1) { + var oldScale = self.oldScale; + var oldDistance = self.oldDistance; + var scale = self.scale; + var zoom = self.zoom; + + self.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1); + + // 设定缩放范围 + self.newScale <= 1 && (self.newScale = 1); + self.newScale >= scale && (self.newScale = scale); + + self.scaleWidth = Math.round(self.newScale * self.baseWidth); + self.scaleHeight = Math.round(self.newScale * self.baseHeight); + var imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2); + var imgTop = Math.round(self.touchY1 - self.scaleHeight / 2); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__xtouchEnd = function() { + self.oldScale = self.newScale; + self.rectX = self.imgLeft; + self.rectY = self.imgTop; + }; + } + + var handle = { + // 图片手势初始监测 + touchStart: function touchStart(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, true, null, null); + + // 计算第一个触摸点的位置,并参照改点进行缩放 + self.__oneTouchStart(touch0); + + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchStart(touch0, touch1); + } + }, + + // 图片手势动态缩放 + touchMove: function touchMove(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, null, true); + + // 单指手势时触发 + if (e.touches.length === 1) { + self.__oneTouchMove(touch0); + } + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchMove(touch0, touch1); + } + }, + + touchEnd: function touchEnd(e) { + var self = this; + + if (!self.src) { + return + } + + setTouchState(self, false, false, true); + self.__xtouchEnd(); + } + }; + + function cut() { + var self = this; + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; + // 裁剪框默认高度,即整个画布高度 + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + /** + * 设置边界 + * @param imgLeft 图片左上角横坐标值 + * @param imgTop 图片左上角纵坐标值 + */ + self.outsideBound = function(imgLeft, imgTop) { + self.imgLeft = imgLeft >= x ? + x : + self.scaleWidth + imgLeft - x <= width ? + x + width - self.scaleWidth : + imgLeft; + + self.imgTop = imgTop >= y ? + y : + self.scaleHeight + imgTop - y <= height ? + y + height - self.scaleHeight : + imgTop; + }; + + /** + * 设置边界样式 + * @param color 边界颜色 + */ + self.setBoundStyle = function(ref) { + if (ref === void 0) ref = {}; + var color = ref.color; + if (color === void 0) color = '#04b00f'; + var mask = ref.mask; + if (mask === void 0) mask = 'rgba(0, 0, 0, 0.3)'; + var lineWidth = ref.lineWidth; + if (lineWidth === void 0) lineWidth = 1; + + var half = lineWidth / 2; + var boundOption = [{ + start: { + x: x - half, + y: y + 10 - half + }, + step1: { + x: x - half, + y: y - half + }, + step2: { + x: x + 10 - half, + y: y - half + } + }, + { + start: { + x: x - half, + y: y + height - 10 + half + }, + step1: { + x: x - half, + y: y + height + half + }, + step2: { + x: x + 10 - half, + y: y + height + half + } + }, + { + start: { + x: x + width - 10 + half, + y: y - half + }, + step1: { + x: x + width + half, + y: y - half + }, + step2: { + x: x + width + half, + y: y + 10 - half + } + }, + { + start: { + x: x + width + half, + y: y + height - 10 + half + }, + step1: { + x: x + width + half, + y: y + height + half + }, + step2: { + x: x + width - 10 + half, + y: y + height + half + } + } + ]; + + // 绘制半透明层 + self.ctx.beginPath(); + self.ctx.setFillStyle(mask); + self.ctx.fillRect(0, 0, x, boundHeight); + self.ctx.fillRect(x, 0, width, y); + self.ctx.fillRect(x, y + height, width, boundHeight - y - height); + self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight); + self.ctx.fill(); + + boundOption.forEach(function(op) { + self.ctx.beginPath(); + self.ctx.setStrokeStyle(color); + self.ctx.setLineWidth(lineWidth); + self.ctx.moveTo(op.start.x, op.start.y); + self.ctx.lineTo(op.step1.x, op.step1.y); + self.ctx.lineTo(op.step2.x, op.step2.y); + self.ctx.stroke(); + }); + }; + } + + var version = "1.3.9"; + + var WeCropper = function WeCropper(params) { + var self = this; + var _default = {}; + + validator(self, DEFAULT); + + Object.keys(DEFAULT).forEach(function(key) { + _default[key] = DEFAULT[key].default; + }); + Object.assign(self, _default, params); + + self.prepare(); + self.attachPage(); + self.createCtx(); + self.observer(); + self.cutt(); + self.methods(); + self.init(); + self.update(); + + return self + }; + + WeCropper.prototype.init = function init() { + var self = this; + var src = self.src; + + self.version = version; + + typeof self.onReady === 'function' && self.onReady(self.ctx, self); + + if (src) { + self.pushOrign(src); + } else { + self.updateCanvas(); + } + setTouchState(self, false, false, false); + + self.oldScale = 1; + self.newScale = 1; + + return self + }; + + Object.assign(WeCropper.prototype, handle); + + WeCropper.prototype.prepare = prepare; + WeCropper.prototype.observer = observer; + WeCropper.prototype.methods = methods; + WeCropper.prototype.cutt = cut; + WeCropper.prototype.update = update; + + return WeCropper; + +}))); diff --git a/uview-ui/components/u-avatar/u-avatar.vue b/uview-ui/components/u-avatar/u-avatar.vue new file mode 100644 index 0000000..289b9b0 --- /dev/null +++ b/uview-ui/components/u-avatar/u-avatar.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/uview-ui/components/u-back-top/u-back-top.vue b/uview-ui/components/u-back-top/u-back-top.vue new file mode 100644 index 0000000..7970fc7 --- /dev/null +++ b/uview-ui/components/u-back-top/u-back-top.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/uview-ui/components/u-badge/u-badge.vue b/uview-ui/components/u-badge/u-badge.vue new file mode 100644 index 0000000..e85b133 --- /dev/null +++ b/uview-ui/components/u-badge/u-badge.vue @@ -0,0 +1,216 @@ + + + + + \ No newline at end of file diff --git a/uview-ui/components/u-button/u-button.vue b/uview-ui/components/u-button/u-button.vue new file mode 100644 index 0000000..82c3a6f --- /dev/null +++ b/uview-ui/components/u-button/u-button.vue @@ -0,0 +1,596 @@ + + + + + diff --git a/uview-ui/components/u-calendar/u-calendar.vue b/uview-ui/components/u-calendar/u-calendar.vue new file mode 100644 index 0000000..6602bd0 --- /dev/null +++ b/uview-ui/components/u-calendar/u-calendar.vue @@ -0,0 +1,639 @@ + + + + \ No newline at end of file diff --git a/uview-ui/components/u-car-keyboard/u-car-keyboard.vue b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue new file mode 100644 index 0000000..84b1467 --- /dev/null +++ b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/uview-ui/components/u-card/u-card.vue b/uview-ui/components/u-card/u-card.vue new file mode 100644 index 0000000..a3cb2aa --- /dev/null +++ b/uview-ui/components/u-card/u-card.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/uview-ui/components/u-cell-group/u-cell-group.vue b/uview-ui/components/u-cell-group/u-cell-group.vue new file mode 100644 index 0000000..3fbca72 --- /dev/null +++ b/uview-ui/components/u-cell-group/u-cell-group.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/uview-ui/components/u-cell-item/u-cell-item.vue b/uview-ui/components/u-cell-item/u-cell-item.vue new file mode 100644 index 0000000..055af3a --- /dev/null +++ b/uview-ui/components/u-cell-item/u-cell-item.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/uview-ui/components/u-checkbox-group/u-checkbox-group.vue b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue new file mode 100644 index 0000000..6a149b3 --- /dev/null +++ b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/uview-ui/components/u-checkbox/u-checkbox.vue b/uview-ui/components/u-checkbox/u-checkbox.vue new file mode 100644 index 0000000..9414461 --- /dev/null +++ b/uview-ui/components/u-checkbox/u-checkbox.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/uview-ui/components/u-circle-progress/u-circle-progress.vue b/uview-ui/components/u-circle-progress/u-circle-progress.vue new file mode 100644 index 0000000..46e7c18 --- /dev/null +++ b/uview-ui/components/u-circle-progress/u-circle-progress.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/uview-ui/components/u-col/u-col.vue b/uview-ui/components/u-col/u-col.vue new file mode 100644 index 0000000..3b6cc64 --- /dev/null +++ b/uview-ui/components/u-col/u-col.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/uview-ui/components/u-collapse-item/u-collapse-item.vue b/uview-ui/components/u-collapse-item/u-collapse-item.vue new file mode 100644 index 0000000..3b66bfa --- /dev/null +++ b/uview-ui/components/u-collapse-item/u-collapse-item.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/uview-ui/components/u-collapse/u-collapse.vue b/uview-ui/components/u-collapse/u-collapse.vue new file mode 100644 index 0000000..8572957 --- /dev/null +++ b/uview-ui/components/u-collapse/u-collapse.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/uview-ui/components/u-column-notice/u-column-notice.vue b/uview-ui/components/u-column-notice/u-column-notice.vue new file mode 100644 index 0000000..dd8bd31 --- /dev/null +++ b/uview-ui/components/u-column-notice/u-column-notice.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/uview-ui/components/u-count-down/u-count-down.vue b/uview-ui/components/u-count-down/u-count-down.vue new file mode 100644 index 0000000..7285d67 --- /dev/null +++ b/uview-ui/components/u-count-down/u-count-down.vue @@ -0,0 +1,318 @@ + + + + + diff --git a/uview-ui/components/u-count-to/u-count-to.vue b/uview-ui/components/u-count-to/u-count-to.vue new file mode 100644 index 0000000..053dc5f --- /dev/null +++ b/uview-ui/components/u-count-to/u-count-to.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/uview-ui/components/u-divider/u-divider.vue b/uview-ui/components/u-divider/u-divider.vue new file mode 100644 index 0000000..6f8d7e6 --- /dev/null +++ b/uview-ui/components/u-divider/u-divider.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/uview-ui/components/u-dropdown-item/u-dropdown-item.vue b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue new file mode 100644 index 0000000..ba60d8f --- /dev/null +++ b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/uview-ui/components/u-dropdown/u-dropdown.vue b/uview-ui/components/u-dropdown/u-dropdown.vue new file mode 100644 index 0000000..a62e469 --- /dev/null +++ b/uview-ui/components/u-dropdown/u-dropdown.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/uview-ui/components/u-empty/u-empty.vue b/uview-ui/components/u-empty/u-empty.vue new file mode 100644 index 0000000..2c77b24 --- /dev/null +++ b/uview-ui/components/u-empty/u-empty.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/uview-ui/components/u-field/u-field.vue b/uview-ui/components/u-field/u-field.vue new file mode 100644 index 0000000..b562798 --- /dev/null +++ b/uview-ui/components/u-field/u-field.vue @@ -0,0 +1,384 @@ +