From a4a1f356578d92085698dd33544bd635d9b787b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Sun, 24 Jul 2022 23:04:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + .hbuilderx/launch.json | 16 + App.vue | 65 + LICENSE | 21 + README.md | 133 ++ common/classify.data.js | 1087 +++++++++++++ common/demo.scss | 86 ++ common/http.api.js | 41 + common/http.interceptor.js | 71 + common/index.list.js | 585 +++++++ common/locales/en.js | 21 + common/locales/zh.js | 21 + common/vue-i18n.min.js | 6 + components/.DS_Store | Bin 0 -> 6148 bytes components/linzq-imgUpload/.DS_Store | Bin 0 -> 6148 bytes .../linzq-imgUpload/linzq-imgUpload.vue | 183 +++ components/linzq-imgUpload/shanchus2.png | Bin 0 -> 6291 bytes components/linzq-imgUpload/tupianadd.png | Bin 0 -> 5816 bytes components/page-nav/page-nav.vue | 98 ++ .../uni-segmented-control.vue | 141 ++ main.js | 64 + manifest.json | 97 ++ package.json | 13 + pages.json | 82 + pages/home/home.vue | 190 +++ pages/home/home_.vue | 112 ++ pages/login/code.vue | 112 ++ pages/login/login.vue | 271 ++++ pages/login/login_.vue | 130 ++ pages/login/login_password.vue | 176 +++ pages/my/my.vue | 129 ++ static/banner3.jpg | Bin 0 -> 59059 bytes static/common/excel.svg | 1 + static/common/file.svg | 1 + static/common/home.png | Bin 0 -> 1120 bytes static/common/homec.png | Bin 0 -> 816 bytes static/common/js/touch-emulator.js | 363 +++++ static/common/me.png | Bin 0 -> 1716 bytes static/common/mec.png | Bin 0 -> 1279 bytes static/common/pdf.svg | 1 + static/common/play.png | Bin 0 -> 1423 bytes static/common/playc.png | Bin 0 -> 1541 bytes static/common/ppt.svg | 1 + static/common/word.svg | 1 + static/uview/common/favicon.ico | Bin 0 -> 4286 bytes static/uview/common/logo.png | Bin 0 -> 15558 bytes static/uview/example/component.png | Bin 0 -> 3074 bytes static/uview/example/component_select.png | Bin 0 -> 1521 bytes static/uview/example/js.png | Bin 0 -> 4236 bytes static/uview/example/js_bak.png | Bin 0 -> 3212 bytes static/uview/example/js_select.png | Bin 0 -> 4278 bytes static/uview/example/js_select_bak.png | Bin 0 -> 2248 bytes static/uview/example/min_button.png | Bin 0 -> 2962 bytes static/uview/example/min_button_select.png | Bin 0 -> 2936 bytes static/uview/example/template.png | Bin 0 -> 4097 bytes static/uview/example/template_select.png | Bin 0 -> 4641 bytes store/$u.mixin.js | 27 + store/index.js | 94 ++ template.h5.html | 42 + uni.scss | 7 + uni_modules/uni-badge/changelog.md | 16 + .../components/uni-badge/uni-badge.vue | 252 +++ uni_modules/uni-badge/package.json | 84 + uni_modules/uni-badge/readme.md | 58 + uni_modules/uni-icons/changelog.md | 4 + .../uni-icons/components/uni-icons/icons.js | 132 ++ .../components/uni-icons/uni-icons.vue | 71 + .../uni-icons/components/uni-icons/uni.ttf | Bin 0 -> 26164 bytes uni_modules/uni-icons/package.json | 82 + uni_modules/uni-icons/readme.md | 46 + uni_modules/uni-list/changelog.md | 7 + .../components/uni-list-ad/uni-list-ad.vue | 107 ++ .../uni-list-chat/uni-list-chat.scss | 58 + .../uni-list-chat/uni-list-chat.vue | 533 +++++++ .../uni-list-item/uni-list-item.vue | 438 ++++++ .../uni-list/components/uni-list/uni-list.vue | 106 ++ .../components/uni-list/uni-refresh.vue | 65 + .../components/uni-list/uni-refresh.wxs | 87 ++ uni_modules/uni-list/package.json | 87 ++ uni_modules/uni-list/readme.md | 347 +++++ uni_modules/uni-search-bar/changelog.md | 18 + .../uni-search-bar/uni-search-bar.vue | 254 +++ uni_modules/uni-search-bar/package.json | 84 + uni_modules/uni-search-bar/readme.md | 86 ++ 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 +++ .../u-line-progress/u-line-progress.vue | 147 ++ 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 | 267 ++++ .../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 | 369 +++++ 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 + video.vue | 409 +++++ vue.config.js | 10 + 229 files changed, 36644 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 LICENSE create mode 100644 README.md create mode 100644 common/classify.data.js create mode 100644 common/demo.scss create mode 100644 common/http.api.js create mode 100644 common/http.interceptor.js create mode 100644 common/index.list.js create mode 100644 common/locales/en.js create mode 100644 common/locales/zh.js create mode 100644 common/vue-i18n.min.js create mode 100644 components/.DS_Store create mode 100644 components/linzq-imgUpload/.DS_Store create mode 100644 components/linzq-imgUpload/linzq-imgUpload.vue create mode 100644 components/linzq-imgUpload/shanchus2.png create mode 100644 components/linzq-imgUpload/tupianadd.png create mode 100644 components/page-nav/page-nav.vue create mode 100644 components/uni-segmented-control/uni-segmented-control.vue create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/home/home.vue create mode 100644 pages/home/home_.vue create mode 100644 pages/login/code.vue create mode 100644 pages/login/login.vue create mode 100644 pages/login/login_.vue create mode 100644 pages/login/login_password.vue create mode 100644 pages/my/my.vue create mode 100644 static/banner3.jpg create mode 100644 static/common/excel.svg create mode 100644 static/common/file.svg create mode 100644 static/common/home.png create mode 100644 static/common/homec.png create mode 100644 static/common/js/touch-emulator.js create mode 100644 static/common/me.png create mode 100644 static/common/mec.png create mode 100644 static/common/pdf.svg create mode 100644 static/common/play.png create mode 100644 static/common/playc.png create mode 100644 static/common/ppt.svg create mode 100644 static/common/word.svg create mode 100644 static/uview/common/favicon.ico create mode 100644 static/uview/common/logo.png create mode 100644 static/uview/example/component.png create mode 100644 static/uview/example/component_select.png create mode 100644 static/uview/example/js.png create mode 100644 static/uview/example/js_bak.png create mode 100644 static/uview/example/js_select.png create mode 100644 static/uview/example/js_select_bak.png create mode 100644 static/uview/example/min_button.png create mode 100644 static/uview/example/min_button_select.png create mode 100644 static/uview/example/template.png create mode 100644 static/uview/example/template_select.png create mode 100644 store/$u.mixin.js create mode 100644 store/index.js create mode 100644 template.h5.html create mode 100644 uni.scss create mode 100644 uni_modules/uni-badge/changelog.md create mode 100644 uni_modules/uni-badge/components/uni-badge/uni-badge.vue create mode 100644 uni_modules/uni-badge/package.json create mode 100644 uni_modules/uni-badge/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uni.ttf create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-list/changelog.md create mode 100644 uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue create mode 100644 uni_modules/uni-list/components/uni-list-item/uni-list-item.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-list.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.wxs create mode 100644 uni_modules/uni-list/package.json create mode 100644 uni_modules/uni-list/readme.md create mode 100644 uni_modules/uni-search-bar/changelog.md create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue create mode 100644 uni_modules/uni-search-bar/package.json create mode 100644 uni_modules/uni-search-bar/readme.md 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-circle-progress/u-line-progress/u-line-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 create mode 100644 video.vue create mode 100644 vue.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92fa10e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/* +deploy.sh +package-lock.json +unpackage/* \ No newline at end of file diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..9cba30d --- /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" : "remote" + }, + "mp-weixin" : + { + "launchtype" : "remote" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..2093d48 --- /dev/null +++ b/App.vue @@ -0,0 +1,65 @@ + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8e39ead --- /dev/null +++ b/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/README.md b/README.md new file mode 100644 index 0000000..2a9f00e --- /dev/null +++ b/README.md @@ -0,0 +1,133 @@ +

+ logo +

+

uView

+

多平台快速开发的UI框架

+ +[![star](https://gitee.com/xuqu/uView/badge/star.svg?theme=gvp)](https://gitee.com/xuqu/uView/stargazers) +[![fork](https://gitee.com/xuqu/uView/badge/fork.svg?theme=gvp)](https://gitee.com/xuqu/uView/members) +[![stars](https://img.shields.io/github/stars/YanxinNet/uView?style=flat-square&logo=GitHub)](https://github.com/YanxinNet/uView) +[![forks](https://img.shields.io/github/forks/YanxinNet/uView?style=flat-square&logo=GitHub)](https://github.com/YanxinNet/uView) +[![issues](https://img.shields.io/github/issues/YanxinNet/uView?style=flat-square&logo=GitHub)](https://github.com/YanxinNet/uView/issues) +[![Website](https://img.shields.io/badge/uView-up-blue?style=flat-square)](https://uviewui.com) +[![release](https://img.shields.io/github/v/release/YanxinNet/uView?style=flat-square)](https://gitee.com/xuqu/uView/releases) +[![license](https://img.shields.io/github/license/YanxinNet/uView?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License) + +## 说明 + +uView UI,是[uni-app](https://uniapp.dcloud.io/)生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 + +## [官方文档:https://www.uviewui.com](https://www.uviewui.com) + +### [点击加群交流反馈:1084514613](https://jq.qq.com/?_wv=1027&k=uyZUkSlo) + +## 特性 + +- 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序 +- 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用 +- 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨 +- 众多的常用页面和布局,让您专注逻辑,事半功倍 +- 详尽的文档支持,现代化的演示效果 +- 按需引入,精简打包体积 + + +## 预览 + +您可以通过**微信**扫码,查看最佳的演示效果。 +
+
+ + + +## 友情链接 + +#### **vue-admin-beautiful** —— [企业级、通用型中后台前端解决方案(基于vue/cli 4 最新版,同时支持电脑,手机,平板)](https://github.com/chuzhixin/vue-admin-beautiful) + +#### **vue-admin-beautiful** —— [在线演示](http://beautiful.panm.cn/vue-admin-beautiful/#/index) + +#### **pl-table** —— [ 完美解决 element 万级表格数据渲染卡顿问题](https://github.com/livelyPeng/pl-table) + +#### **luch-request** —— [基于 Promise 开发的 uni-app 跨平台、项目级别的请求库,它有更小的体积,易用的 api,方便简单的自定义能力](https://www.quanzhan.co/luch-request/) +
+ +## 链接 + +- [官方文档](https://uviewui.com/) +- [更新日志](https://uviewui.com/components/changelog.html) +- [升级指南](https://uviewui.com/components/changelog.html) +- [关于我们](https://uviewui.com/cooperation/about.html) + +## 交流反馈 + +欢迎加入我们的QQ群交流反馈:[点此跳转](https://www.uviewui.com/components/addQQGroup.html) + +## 安装 + +#### **下载地址** —— [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593) + +## 快速上手 + +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安装的方式无需"@/" + // 下载安装方式 + "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + // npm安装方式 + // "^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)了解更详细的内容 + + +## 捐赠uView的研发 + +uView文档和源码全部开源免费,如果您认为uView帮到了您的开发工作,您可以捐赠uView的研发工作,捐赠无门槛,哪怕是一杯可乐也好(相信这比打赏主播更有意义)。 + + + + +## 版权信息 +uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。 diff --git a/common/classify.data.js b/common/classify.data.js new file mode 100644 index 0000000..cb4f75a --- /dev/null +++ b/common/classify.data.js @@ -0,0 +1,1087 @@ +export default[ + { + "name": "女装", + "foods": [ + { + "name": "A字裙", + "key": "A字裙", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/1.jpg", + "cat": 10 + }, + { + "name": "T恤", + "key": "T恤", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/2.jpg", + "cat": 10 + }, + { + "name": "半身裙", + "key": "半身裙", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/3.jpg", + "cat": 10 + }, + { + "name": "衬衫", + "key": "衬衫", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/4.jpg", + "cat": 10 + }, + { + "name": "短裙", + "key": "短裙", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/5.jpg", + "cat": 10 + }, + { + "name": "阔腿裤", + "key": "阔腿裤", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/6.jpg", + "cat": 10 + }, + { + "name": "连衣裙", + "key": "连衣裙", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/7.jpg", + "cat": 10 + }, + { + "name": "妈妈装", + "key": "妈妈装", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/8.jpg", + "cat": 10 + }, + { + "name": "牛仔裤", + "key": "牛仔裤", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/9.jpg", + "cat": 10 + }, + { + "name": "情侣装", + "key": "情侣装", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/10.jpg", + "cat": 10 + }, + { + "name": "休闲裤", + "key": "休闲裤", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/11.jpg", + "cat": 10 + }, + { + "name": "雪纺衫", + "key": "雪纺衫", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/12.jpg", + "cat": 10 + }, + { + "name": "防晒衣", + "key": "防晒衣", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/13.jpg", + "cat": 10 + }, + { + "name": "礼服/婚纱", + "key": "礼服婚纱", + "icon": "https://cdn.uviewui.com/uview/common/classify/1/14.jpg", + "cat": 10 + } + ] + }, + { + "name": "美食", + "foods": [ + { + "name": "火锅", + "key": "火锅", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/1.jpg", + "cat": 6 + }, + { + "name": "糕点饼干", + "key": "糕点饼干", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/2.jpg", + "cat": 6 + }, + { + "name": "坚果果干", + "key": "坚果果干", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/3.jpg", + "cat": 6 + }, + { + "name": "酒类", + "key": "酒类", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/4.jpg", + "cat": 6 + }, + { + "name": "辣条", + "key": "辣条", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/5.jpg", + "cat": 6 + }, + { + "name": "大礼包", + "key": "大礼包", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/6.jpg", + "cat": 6 + }, + { + "name": "精品茗茶", + "key": "茶", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/7.jpg", + "cat": 6 + }, + { + "name": "休闲食品", + "key": "休闲食品", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/8.jpg", + "cat": 6 + }, + { + "name": "糖果巧克力", + "key": "糖果巧克力", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/9.jpg", + "cat": 6 + }, + { + "name": "方便速食", + "key": "方便速食", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/10.jpg", + "cat": 6 + }, + { + "name": "营养代餐", + "key": "营养代餐", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/11.jpg", + "cat": 6 + }, + { + "name": "粮油副食", + "key": "粮油", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/12.jpg", + "cat": 6 + }, + { + "name": "生鲜水果", + "key": "水果", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/13.jpg", + "cat": 6 + }, + { + "name": "饮品", + "key": "饮品", + "icon": "https://cdn.uviewui.com/uview/common/classify/2/14.jpg", + "cat": 6 + } + ] + }, + { + "name": "美妆", + "foods": [ + { + "name": "化妆刷", + "key": "化妆刷", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/1.jpg", + "cat": 3 + }, + { + "name": "粉底", + "key": "粉底", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/2.jpg", + "cat": 3 + }, + { + "name": "洗发护发", + "key": "洗发护发", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/3.jpg", + "cat": 3 + }, + { + "name": "美容工具", + "key": "美容工具", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/4.jpg", + "cat": 3 + }, + { + "name": "眼部护理", + "key": "眼部护理", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/5.jpg", + "cat": 3 + }, + { + "name": "眉妆", + "key": "眉妆", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/6.jpg", + "cat": 3 + }, + { + "name": "卸妆品", + "key": "卸妆品", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/7.jpg", + "cat": 3 + }, + { + "name": "基础护肤", + "key": "基础护肤", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/8.jpg", + "cat": 3 + }, + { + "name": "眼妆", + "key": "眼妆", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/9.jpg", + "cat": 3 + }, + { + "name": "唇妆", + "key": "唇妆", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/10.jpg", + "cat": 3 + }, + { + "name": "面膜", + "key": "面膜", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/11.jpg", + "cat": 3 + }, + { + "name": "沐浴用品", + "key": "沐浴用品", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/12.jpg", + "cat": 3 + }, + { + "name": "护肤套装", + "key": "护肤套装", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/13.jpg", + "cat": 3 + }, + { + "name": "防晒品", + "key": "防晒品", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/14.jpg", + "cat": 3 + }, + { + "name": "美甲", + "key": "美甲", + "icon": "https://cdn.uviewui.com/uview/common/classify/3/15.jpg", + "cat": 3 + } + + ] + }, + { + "name": "居家日用", + "foods": [ + { + "name": "垃圾袋", + "key": "垃圾袋", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/1.jpg", + "cat": 4 + }, + { + "name": "纸巾", + "key": "纸巾", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/2.jpg", + "cat": 4 + }, + { + "name": "驱蚊用品", + "key": "驱蚊用品", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/3.jpg", + "cat": 4 + }, + { + "name": "收纳神器", + "key": "收纳神器", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/4.jpg", + "cat": 4 + }, + { + "name": "厨房用品", + "key": "厨房用品", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/5.jpg", + "cat": 4 + }, + { + "name": "厨房烹饪", + "key": "烹饪", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/6.jpg", + "cat": 4 + }, + { + "name": "衣物晾晒", + "key": "衣物晾晒", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/7.jpg", + "cat": 4 + }, + { + "name": "衣物护理", + "key": "衣物护理", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/8.jpg", + "cat": 4 + }, + { + "name": "宠物用品", + "key": "宠物用品", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/9.jpg", + "cat": 4 + }, + { + "name": "医药保健", + "key": "医药", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/10.jpg", + "cat": 4 + }, + { + "name": "日用百货", + "key": "百货", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/11.jpg", + "cat": 4 + }, + { + "name": "清洁用品", + "key": "清洁", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/12.jpg", + "cat": 4 + }, + { + "name": "绿植园艺", + "key": "绿植", + "icon": "https://cdn.uviewui.com/uview/common/classify/4/13.jpg", + "cat": 4 + } + ] + }, + { + "name": "男装", + "foods": [ + { + "name": "爸爸装", + "key": "爸爸装", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/1.jpg", + "cat": 12 + }, + { + "name": "牛仔裤", + "key": "牛仔裤", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/2.jpg", + "cat": 12 + }, + { + "name": "衬衫", + "key": "衬衫", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/3.jpg", + "cat": 12 + }, + { + "name": "休闲裤", + "key": "休闲裤", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/4.jpg", + "cat": 12 + }, + { + "name": "外套", + "key": "外套", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/5.jpg", + "cat": 12 + }, + { + "name": "T恤", + "key": "T恤", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/6.jpg", + "cat": 12 + }, + { + "name": "套装", + "key": "套装", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/7.jpg", + "cat": 12 + }, + { + "name": "运动裤", + "key": "运动裤", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/8.jpg", + "cat": 12 + }, + { + "name": "马甲/背心", + "key": "马甲背心", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/9.jpg", + "cat": 12 + }, + { + "name": "POLO衫", + "key": "POLO衫", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/10.jpg", + "cat": 12 + }, + { + "name": "商务装", + "key": "商务装", + "icon": "https://cdn.uviewui.com/uview/common/classify/5/11.jpg", + "cat": 12 + } + ] + }, + { + "name": "鞋品", + "foods": [ + { + "name": "单鞋", + "key": "单鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/1.jpg", + "cat": 5 + }, + { + "name": "皮鞋", + "key": "皮鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/2.jpg", + "cat": 5 + }, + { + "name": "帆布鞋", + "key": "帆布鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/3.jpg", + "cat": 5 + }, + { + "name": "北京老布鞋", + "key": "北京老布鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/4.jpg", + "cat": 5 + }, + { + "name": "运动鞋", + "key": "运动鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/5.jpg", + "cat": 5 + }, + { + "name": "拖鞋", + "key": "拖鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/6.jpg", + "cat": 5 + }, + { + "name": "凉鞋", + "key": "凉鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/7.jpg", + "cat": 5 + }, + { + "name": "休闲鞋", + "key": "休闲鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/8.jpg", + "cat": 5 + }, + { + "name": "高跟鞋", + "key": "高跟鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/9.jpg", + "cat": 5 + }, + { + "name": "老人鞋", + "key": "老人鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/10.jpg", + "cat": 5 + }, + { + "name": "懒人鞋", + "key": "懒人鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/6/11.jpg", + "cat": 5 + } + ] + }, + { + "name": "数码家电", + "foods": [ + { + "name": "数据线", + "key": "数据线", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/1.jpg", + "cat": 8 + }, + { + "name": "耳机", + "key": "耳机", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/2.jpg", + "cat": 8 + }, + { + "name": "生活家电", + "key": "家电", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/3.jpg", + "cat": 8 + }, + { + "name": "电风扇", + "key": "电风扇", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/4.jpg", + "cat": 8 + }, + { + "name": "电吹风", + "key": "电吹风", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/5.jpg", + "cat": 8 + }, + { + "name": "手机壳", + "key": "手机壳", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/6.jpg", + "cat": 8 + }, + { + "name": "榨汁机", + "key": "榨汁机", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/7.jpg", + "cat": 8 + }, + { + "name": "小家电", + "key": "小家电", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/8.jpg", + "cat": 8 + }, + { + "name": "数码电子", + "key": "数码", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/9.jpg", + "cat": 8 + }, + { + "name": "电饭锅", + "key": "电饭锅", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/10.jpg", + "cat": 8 + }, + { + "name": "手机支架", + "key": "手机支架", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/11.jpg", + "cat": 8 + }, + { + "name": "剃须刀", + "key": "剃须刀", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/12.jpg", + "cat": 8 + }, + { + "name": "充电宝", + "key": "充电宝", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/13.jpg", + "cat": 8 + }, + { + "name": "手机配件", + "key": "手机配件", + "icon": "https://cdn.uviewui.com/uview/common/classify/7/14.jpg", + "cat": 8 + } + ] + }, + { + "name": "母婴", + "foods": [ + { + "name": "婴童服饰", + "key": "衣服", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/1.jpg", + "cat": 2 + }, + { + "name": "玩具乐器", + "key": "玩具乐器", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/2.jpg", + "cat": 2 + }, + { + "name": "尿不湿", + "key": "尿不湿", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/3.jpg", + "cat": 2 + }, + { + "name": "安抚牙胶", + "key": "安抚牙胶", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/4.jpg", + "cat": 2 + }, + { + "name": "奶瓶奶嘴", + "key": "奶瓶奶嘴", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/5.jpg", + "cat": 2 + }, + { + "name": "孕妈用品", + "key": "孕妈用品", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/6.jpg", + "cat": 2 + }, + { + "name": "宝宝用品", + "key": "宝宝用品", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/7.jpg", + "cat": 2 + }, + { + "name": "婴童湿巾", + "key": "湿巾", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/8.jpg", + "cat": 2 + }, + { + "name": "喂养洗护", + "key": "洗护", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/9.jpg", + "cat": 2 + }, + { + "name": "婴童鞋靴", + "key": "童鞋", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/10.jpg", + "cat": 2 + }, + { + "name": "口水巾", + "key": "口水巾", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/11.jpg", + "cat": 2 + }, + { + "name": "营养辅食", + "key": "营养", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/12.jpg", + "cat": 2 + }, + { + "name": "婴幼书籍", + "key": "书籍", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/13.jpg", + "cat": 2 + }, + { + "name": "婴儿车", + "key": "婴儿车", + "icon": "https://cdn.uviewui.com/uview/common/classify/8/14.jpg", + "cat": 2 + } + ] + }, + { + "name": "箱包", + "foods": [ + { + "name": "单肩包", + "key": "单肩包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/1.jpg", + "cat": 0 + }, + { + "name": "斜挎包", + "key": "斜挎包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/2.jpg", + "cat": 0 + }, + { + "name": "女包", + "key": "女包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/3.jpg", + "cat": 0 + }, + { + "name": "男包", + "key": "男包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/4.jpg", + "cat": 0 + }, + { + "name": "双肩包", + "key": "双肩包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/5.jpg", + "cat": 0 + }, + { + "name": "小方包", + "key": "小方包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/6.jpg", + "cat": 0 + }, + { + "name": "钱包", + "key": "钱包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/7.jpg", + "cat": 0 + }, + { + "name": "旅行箱包", + "key": "旅行箱包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/8.jpg", + "cat": 0 + }, + { + "name": "零钱包", + "key": "零钱包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/9.jpg", + "cat": 0 + }, + { + "name": "手提包", + "key": "手提包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/10.jpg", + "cat": 0 + }, + { + "name": "胸包", + "key": "胸包", + "icon": "https://cdn.uviewui.com/uview/common/classify/9/11.jpg", + "cat": 0 + } + ] + }, + { + "name": "内衣", + "foods": [ + { + "name": "袜子", + "key": "袜子", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/1.jpg", + "cat": 11 + }, + { + "name": "吊带背心", + "key": "吊带背心", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/2.jpg", + "cat": 11 + }, + { + "name": "抹胸", + "key": "抹胸", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/3.jpg", + "cat": 11 + }, + { + "name": "内裤", + "key": "内裤", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/4.jpg", + "cat": 11 + }, + { + "name": "文胸", + "key": "文胸", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/5.jpg", + "cat": 11 + }, + { + "name": "文胸套装", + "key": "文胸套装", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/6.jpg", + "cat": 11 + }, + { + "name": "打底塑身", + "key": "打底塑身", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/7.jpg", + "cat": 11 + }, + { + "name": "家居服", + "key": "家居服", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/8.jpg", + "cat": 11 + }, + { + "name": "船袜", + "key": "船袜", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/9.jpg", + "cat": 11 + }, + { + "name": "情侣睡衣", + "key": "情侣睡衣", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/10.jpg", + "cat": 11 + }, + { + "name": "丝袜", + "key": "丝袜", + "icon": "https://cdn.uviewui.com/uview/common/classify/10/11.jpg", + "cat": 11 + } + ] + }, + { + "name": "文娱车品", + "foods": [ + { + "name": "车市车品", + "key": "车市车品", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/1.jpg", + "cat": 7 + }, + { + "name": "办公文具", + "key": "办公文具", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/2.jpg", + "cat": 7 + }, + { + "name": "考试必备", + "key": "考试必备", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/3.jpg", + "cat": 7 + }, + { + "name": "笔记本", + "key": "笔记本", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/4.jpg", + "cat": 7 + }, + { + "name": "艺术礼品", + "key": "礼品", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/5.jpg", + "cat": 7 + }, + { + "name": "书写工具", + "key": "书写工具", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/6.jpg", + "cat": 7 + }, + { + "name": "车载电器", + "key": "车载电器", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/7.jpg", + "cat": 7 + }, + { + "name": "图书音像", + "key": "图书音像", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/8.jpg", + "cat": 7 + }, + { + "name": "画具画材", + "key": "画具画材", + "icon": "https://cdn.uviewui.com/uview/common/classify/11/9.jpg", + "cat": 7 + } + ] + }, + { + "name": "配饰", + "foods": [ + { + "name": "太阳镜", + "key": "太阳镜", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/1.jpg", + "cat": 0 + }, + { + "name": "皮带", + "key": "皮带", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/2.jpg", + "cat": 0 + }, + { + "name": "棒球帽", + "key": "棒球帽", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/3.jpg", + "cat": 0 + }, + { + "name": "手表", + "key": "手表", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/4.jpg", + "cat": 0 + }, + { + "name": "发饰", + "key": "发饰", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/5.jpg", + "cat": 0 + }, + { + "name": "项链", + "key": "项链", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/6.jpg", + "cat": 0 + }, + { + "name": "手饰", + "key": "手饰", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/7.jpg", + "cat": 0 + }, + { + "name": "耳环", + "key": "耳环", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/8.jpg", + "cat": 0 + }, + { + "name": "帽子丝巾", + "key": "帽子丝巾", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/9.jpg", + "cat": 0 + }, + { + "name": "眼镜墨镜", + "key": "眼镜墨镜", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/10.jpg", + "cat": 0 + }, + { + "name": "发带发箍", + "key": "发带发箍", + "icon": "https://cdn.uviewui.com/uview/common/classify/12/11.jpg", + "cat": 0 + } + ] + }, + { + "name": "家装家纺", + "foods": [ + { + "name": "家居饰品", + "key": "家居饰品", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/1.jpg", + "cat": 0 + }, + { + "name": "凉席", + "key": "凉席", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/2.jpg", + "cat": 0 + }, + { + "name": "背枕靠枕", + "key": "靠枕", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/3.jpg", + "cat": 0 + }, + { + "name": "床上用品", + "key": "床上用品", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/4.jpg", + "cat": 0 + }, + { + "name": "摆件", + "key": "摆件", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/5.jpg", + "cat": 0 + }, + { + "name": "四件套", + "key": "四件套", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/6.jpg", + "cat": 0 + }, + { + "name": "装饰品", + "key": "装饰品", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/7.jpg", + "cat": 0 + }, + { + "name": "卫浴用品", + "key": "卫浴", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/8.jpg", + "cat": 0 + }, + { + "name": "家居家装", + "key": "家具", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/9.jpg", + "cat": 0 + }, + { + "name": "蚊帐", + "key": "蚊帐", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/10.jpg", + "cat": 0 + }, + { + "name": "墙纸贴纸", + "key": "墙纸", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/11.jpg", + "cat": 0 + }, + { + "name": "空调被", + "key": "空调被", + "icon": "https://cdn.uviewui.com/uview/common/classify/13/12.jpg", + "cat": 0 + } + ] + }, + { + "name": "户外运动", + "foods": [ + { + "name": "游泳装备", + "key": "游泳", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/1.jpg", + "cat": 0 + }, + { + "name": "泳镜", + "key": "泳镜", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/2.jpg", + "cat": 0 + }, + { + "name": "户外装备", + "key": "户外", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/3.jpg", + "cat": 0 + }, + { + "name": "健身服饰", + "key": "健身", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/4.jpg", + "cat": 0 + }, + { + "name": "泳衣", + "key": "泳衣", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/5.jpg", + "cat": 0 + }, + { + "name": "瑜伽垫", + "key": "瑜伽垫", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/6.jpg", + "cat": 0 + }, + { + "name": "瑜伽用品", + "key": "瑜伽", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/7.jpg", + "cat": 0 + }, + { + "name": "健身装备", + "key": "健身", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/8.jpg", + "cat": 0 + }, + { + "name": "球迷用品", + "key": "球迷", + "icon": "https://cdn.uviewui.com/uview/common/classify/14/9.jpg", + "cat": 0 + } + ] + } +] \ No newline at end of file diff --git a/common/demo.scss b/common/demo.scss new file mode 100644 index 0000000..547d5d9 --- /dev/null +++ b/common/demo.scss @@ -0,0 +1,86 @@ +/* #ifndef APP-NVUE */ +view, +text { + box-sizing: border-box; +} +/* #endif */ + +/* start--演示页面使用的统一样式--start */ +.u-demo { + padding: 25px 20px; +} + +.u-demo-wrap { + border-width: 1px; + border-color: #ddd; + border-style: dashed; + background-color: rgb(250, 250, 250); + padding: 20px 10px; + border-radius: 3px; +} + +.u-demo-area { + text-align: center; +} + +.u-no-demo-here { + color: $u-tips-color; + font-size: 13px; +} + +.u-demo-result-line { + border-width: 1px; + border-color: #ddd; + border-style: dashed; + padding: 5px 20px; + margin-top: 30px; + border-radius: 5px; + background-color: rgb(240, 240, 240); + color: $u-content-color; + font-size: 16px; + /* #ifndef APP-NVUE */ + word-break: break-word; + display: inline-block; + /* #endif */ + text-align: left; + +} + +.u-demo-title, +.u-config-title { + text-align: center; + font-size: 16px; + font-weight: bold; + margin-bottom: 20px; +} + +.u-config-item { + margin-top: 25px; +} + +.u-config-title { + margin-top: 20px; + padding-bottom: 5px; +} + +.u-item-title { + position: relative; + font-size: 15px; + padding-left: 8px; + line-height: 1; + margin-bottom: 11px; +} + +.u-item-title:after { + position: absolute; + width: 4px; + top: -1px; + height: 16px; + /* #ifndef APP-NVUE */ + content: ''; + /* #endif */ + left: 0; + border-radius: 10px; + background-color: $u-content-color; +} +/* end--演示页面使用的统一样式--end */ diff --git a/common/http.api.js b/common/http.api.js new file mode 100644 index 0000000..8c47a49 --- /dev/null +++ b/common/http.api.js @@ -0,0 +1,41 @@ +// 如果没有通过拦截器配置域名的话,可以在这里写上完整的URL(加上域名部分) +let hotSearchUrl = '/ebapi/store_api/hot_search'; +let indexUrl = '/ebapi/public_api/index'; + +// 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作,更多内容详见uView对拦截器的介绍部分: +// https://uviewui.com/js/http.html#%E4%BD%95%E8%B0%93%E8%AF%B7%E6%B1%82%E6%8B%A6%E6%88%AA%EF%BC%9F +const install = (Vue, vm) => { + // 此处没有使用传入的params参数 + let getSearch = (params = {}) => vm.$u.get(hotSearchUrl, { + id: 2 + }); + // 此处使用了传入的params参数,一切自定义即可 + let getUserInfo = (params = {}) => vm.$u.get('/system/user/info/', params);//获取用户信息 + + let getCode = (data = {}) => vm.$u.post('/auth/sms_code/', data); //获取短信验证码 + + let codeLogin = (data = {}) => vm.$u.post('/auth/login_sms_code/', data); //短信验证码登录 + + let login = (data = {}) => vm.$u.post('auth/token/', data); //账户密码登录 + // 将各个定义的接口名称,统一放进对象挂载到vm.$u.api(因为vm就是this,也即this.$u.api)下 + + let wxmplogin = (data = {}) => vm.$u.post('auth/login_wxmp/', data); //微信登录 + + let bindmp = (data = {}) => vm.$u.post('/system/user/bind_wxmp/', data); //微信小程序绑定 + + let unbindmp = (data = {}) => vm.$u.post('/system/user/unbind_wxmp/', data); //微信小程序解绑 + let getDickey = (params={})=>vm.$u.get('/system/dict/', params);//查询字典 + vm.$u.api = {getUserInfo, + getCode, + codeLogin, + login, + wxmplogin, + bindmp, + unbindmp, + getDickey, + }; +} + +export default { + install +} \ No newline at end of file diff --git a/common/http.interceptor.js b/common/http.interceptor.js new file mode 100644 index 0000000..5521dca --- /dev/null +++ b/common/http.interceptor.js @@ -0,0 +1,71 @@ +// 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token +// 同时,我们也可以在此使用getApp().globalData,如果你把token放在getApp().globalData的话,也是可以使用的 +const install = (Vue, vm) => { + Vue.prototype.$u.http.setConfig({ + // baseUrl: 'https://api.youzixy.com', + baseUrl: vm.vuex_api, + // 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data + // 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值 + // originalData: true, + // 设置自定义头部content-type + // header: { + // 'content-type': 'xxx' + // } + showLoading: true, + loadingText: '请求中..', + originalData: true, + loadingTime: 800, + loadingMask: true + }); + // 请求拦截,配置Token等参数 + Vue.prototype.$u.http.interceptor.request = (config) => { + config.header.Authorization = 'Bearer ' + vm.vuex_token; + // 方式一,存放在vuex的token,假设使用了uView封装的vuex方式,见:https://uviewui.com/components/globalVariable.html + // config.header.token = vm.token; + + // 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取 + // config.header.token = vm.$store.state.token; + + // 方式三,如果token放在了globalData,通过getApp().globalData获取 + // config.header.token = getApp().globalData.username; + + // 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的,所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值 + // const token = uni.getStorageSync('token'); + // config.header.token = token; + + return config; + } + // 响应拦截,判断状态码是否通过 + Vue.prototype.$u.http.interceptor.response = (res) => { + // 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据 + // 判断可能变成了res.statueCode,或者res.data.code之类的,请打印查看结果 + if (res.statusCode < 400) { + return res.data + } + else if (res.statusCode == 401){ + if(res.data.err_code == 'no_active_account'){ + uni.showToast({ + title: '账户密码错误或已禁用', + icon: 'none' + }) + }else{ + uni.reLaunch({ + url:'/pages/login/login' + }) + } + } + else{ + if(res.data.err_msg){ + uni.showToast({ + title: res.data.err_msg, + icon: "none" + }) + } + return Promise.reject(res); + } + } +} + +export default { + install +} \ No newline at end of file diff --git a/common/index.list.js b/common/index.list.js new file mode 100644 index 0000000..7e0f5ed --- /dev/null +++ b/common/index.list.js @@ -0,0 +1,585 @@ +module.exports = { + list: [{ + "letter": "A", + "data": [{ + "name": "阿拉斯加", + "mobile": "13588889999", + "keyword": "阿拉斯加ABA13588889999" + }, + { + "name": "阿克苏", + "mobile": "0551-4386721", + "keyword": "阿克苏AKESU0551-4386721" + }, + { + "name": "阿拉善", + "mobile": "4008009100", + "keyword": "阿拉善ALASHAN4008009100" + }, + { + "name": "阿勒泰", + "mobile": "13588889999", + "keyword": "阿勒泰ALETAI13588889999" + }, + { + "name": "阿里", + "mobile": "13588889999", + "keyword": "阿里ALI13588889999" + }, + { + "name": "安阳", + "mobile": "13588889999", + "keyword": "13588889999安阳ANYANG" + } + ] + }, + { + "letter": "B", + "data": [{ + "name": "白城", + "mobile": "该主子没有留电话~", + "keyword": "白城BAICHENG" + }, + { + "name": "白山", + "mobile": "13588889999", + "keyword": "白山BAISHAN13588889999" + }, + { + "name": "白银", + "mobile": "13588889999", + "keyword": "白银BAIYIN13588889999" + }, + { + "name": "保定", + "mobile": "13588889999", + "keyword": "保定BAODING13588889999" + } + ] + }, + { + "letter": "C", + "data": [{ + "name": "沧州", + "mobile": "13588889999", + "keyword": "沧州CANGZHOU13588889999" + }, + { + "name": "长春", + "mobile": "13588889999", + "keyword": "长春CHANGCHUN13588889999" + } + ] + }, + { + "letter": "D", + "data": [{ + "name": "大理", + "mobile": "13588889999", + "keyword": "大理DALI13588889999" + }, + { + "name": "大连", + "mobile": "13588889999", + "keyword": "大连DALIAN13588889999" + } + ] + }, + { + "letter": "E", + "data": [{ + "name": "鄂尔多斯", + "mobile": "13588889999", + "keyword": "鄂尔多斯EERDUOSI13588889999" + }, + { + "name": "恩施", + "mobile": "13588889999", + "keyword": "恩施ENSHI13588889999" + }, + { + "name": "鄂州", + "mobile": "13588889999", + "keyword": "鄂州EZHOU13588889999" + } + ] + }, + { + "letter": "F", + "data": [{ + "name": "防城港", + "mobile": "该主子没有留电话~", + "keyword": "防城港FANGCHENGGANG" + }, + { + "name": "抚顺", + "mobile": "13588889999", + "keyword": "抚顺FUSHUN13588889999" + }, + { + "name": "阜新", + "mobile": "13588889999", + "keyword": "阜新FUXIN13588889999" + }, + { + "name": "阜阳", + "mobile": "13588889999", + "keyword": "阜阳FUYANG13588889999" + }, + { + "name": "抚州", + "mobile": "13588889999", + "keyword": "抚州FUZHOU13588889999" + }, + { + "name": "福州", + "mobile": "13588889999", + "keyword": "福州FUZHOU13588889999" + } + ] + }, + { + "letter": "G", + "data": [{ + "name": "甘南", + "mobile": "13588889999", + "keyword": "甘南GANNAN13588889999" + }, + { + "name": "赣州", + "mobile": "13588889999", + "keyword": "赣州GANZHOU13588889999" + }, + { + "name": "甘孜", + "mobile": "13588889999", + "keyword": "甘孜GANZI13588889999" + } + ] + }, + { + "letter": "H", + "data": [{ + "name": "哈尔滨", + "mobile": "13588889999", + "keyword": "哈尔滨HAERBIN13588889999" + }, + { + "name": "海北", + "mobile": "13588889999", + "keyword": "海北HAIBEI13588889999" + }, + { + "name": "海东", + "mobile": "13588889999", + "keyword": "海东HAIDONG13588889999" + }, + { + "name": "海口", + "mobile": "13588889999", + "keyword": "海口HAIKOU13588889999" + } + ] + }, + { + "letter": "I", + "data": [{ + "name": "ice", + "mobile": "13588889999", + "keyword": "佳木斯JIAMUSI13588889999" + }] + }, + { + "letter": "J", + "data": [{ + "name": "佳木斯", + "mobile": "13588889999", + "keyword": "佳木斯JIAMUSI13588889999" + }, + { + "name": "吉安", + "mobile": "13588889999", + "keyword": "吉安JIAN13588889999" + }, + { + "name": "江门", + "mobile": "13588889999", + "keyword": "江门JIANGMEN13588889999" + } + ] + }, + { + "letter": "K", + "data": [{ + "name": "开封", + "mobile": "13588889999", + "keyword": "开封KAIFENG13588889999" + }, + { + "name": "喀什", + "mobile": "13588889999", + "keyword": "喀什KASHI13588889999" + }, + { + "name": "克拉玛依", + "mobile": "13588889999", + "keyword": "克拉玛依KELAMAYI13588889999" + } + ] + }, + { + "letter": "L", + "data": [{ + "name": "来宾", + "mobile": "13588889999", + "keyword": "来宾LAIBIN13588889999" + }, + { + "name": "兰州", + "mobile": "13588889999", + "keyword": "兰州LANZHOU13588889999" + }, + { + "name": "拉萨", + "mobile": "13588889999", + "keyword": "拉萨LASA13588889999" + }, + { + "name": "乐山", + "mobile": "13588889999", + "keyword": "乐山LESHAN13588889999" + }, + { + "name": "凉山", + "mobile": "13588889999", + "keyword": "凉山LIANGSHAN13588889999" + }, + { + "name": "连云港", + "mobile": "13588889999", + "keyword": "连云港LIANYUNGANG13588889999" + }, + { + "name": "聊城", + "mobile": "18322223333", + "keyword": "聊城LIAOCHENG18322223333" + }, + { + "name": "辽阳", + "mobile": "18322223333", + "keyword": "辽阳LIAOYANG18322223333" + }, + { + "name": "辽源", + "mobile": "18322223333", + "keyword": "辽源LIAOYUAN18322223333" + }, + { + "name": "丽江", + "mobile": "18322223333", + "keyword": "丽江LIJIANG18322223333" + }, + { + "name": "临沧", + "mobile": "18322223333", + "keyword": "临沧LINCANG18322223333" + }, + { + "name": "临汾", + "mobile": "18322223333", + "keyword": "临汾LINFEN18322223333" + }, + { + "name": "临夏", + "mobile": "18322223333", + "keyword": "临夏LINXIA18322223333" + }, + { + "name": "临沂", + "mobile": "18322223333", + "keyword": "临沂LINYI18322223333" + }, + { + "name": "林芝", + "mobile": "18322223333", + "keyword": "林芝LINZHI18322223333" + }, + { + "name": "丽水", + "mobile": "18322223333", + "keyword": "丽水LISHUI18322223333" + } + ] + }, + { + "letter": "M", + "data": [{ + "name": "眉山", + "mobile": "15544448888", + "keyword": "眉山MEISHAN15544448888" + }, + { + "name": "梅州", + "mobile": "15544448888", + "keyword": "梅州MEIZHOU15544448888" + }, + { + "name": "绵阳", + "mobile": "15544448888", + "keyword": "绵阳MIANYANG15544448888" + }, + { + "name": "牡丹江", + "mobile": "15544448888", + "keyword": "牡丹江MUDANJIANG15544448888" + } + ] + }, + { + "letter": "N", + "data": [{ + "name": "南昌", + "mobile": "15544448888", + "keyword": "南昌NANCHANG15544448888" + }, + { + "name": "南充", + "mobile": "15544448888", + "keyword": "南充NANCHONG15544448888" + }, + { + "name": "南京", + "mobile": "15544448888", + "keyword": "南京NANJING15544448888" + }, + { + "name": "南宁", + "mobile": "15544448888", + "keyword": "南宁NANNING15544448888" + }, + { + "name": "南平", + "mobile": "15544448888", + "keyword": "南平NANPING15544448888" + } + ] + }, + { + "letter": "O", + "data": [{ + "name": "欧阳", + "mobile": "15544448888", + "keyword": "欧阳ouyang15544448888" + }] + }, + { + "letter": "P", + "data": [{ + "name": "盘锦", + "mobile": "15544448888", + "keyword": "盘锦PANJIN15544448888" + }, + { + "name": "攀枝花", + "mobile": "15544448888", + "keyword": "攀枝花PANZHIHUA15544448888" + }, + { + "name": "平顶山", + "mobile": "15544448888", + "keyword": "平顶山PINGDINGSHAN15544448888" + }, + { + "name": "平凉", + "mobile": "15544448888", + "keyword": "平凉PINGLIANG15544448888" + }, + { + "name": "萍乡", + "mobile": "15544448888", + "keyword": "萍乡PINGXIANG15544448888" + }, + { + "name": "普洱", + "mobile": "15544448888", + "keyword": "普洱PUER15544448888" + }, + { + "name": "莆田", + "mobile": "15544448888", + "keyword": "莆田PUTIAN15544448888" + }, + { + "name": "濮阳", + "mobile": "15544448888", + "keyword": "濮阳PUYANG15544448888" + } + ] + }, + { + "letter": "Q", + "data": [{ + "name": "黔东南", + "mobile": "15544448888", + "keyword": "黔东南QIANDONGNAN15544448888" + }, + { + "name": "黔南", + "mobile": "15544448888", + "keyword": "黔南QIANNAN15544448888" + }, + { + "name": "黔西南", + "mobile": "15544448888", + "keyword": "黔西南QIANXINAN15544448888" + } + ] + }, + { + "letter": "R", + "data": [{ + "name": "日喀则", + "mobile": "15544448888", + "keyword": "日喀则RIKAZE15544448888" + }, + { + "name": "日照", + "mobile": "15544448888", + "keyword": "日照RIZHAO15544448888" + } + ] + }, + { + "letter": "S", + "data": [{ + "name": "三门峡", + "mobile": "15544448888", + "keyword": "三门峡SANMENXIA15544448888" + }, + { + "name": "三明", + "mobile": "15544448888", + "keyword": "三明SANMING15544448888" + }, + { + "name": "三沙", + "mobile": "15544448888", + "keyword": "三沙SANSHA15544448888" + } + ] + }, + { + "letter": "T", + "data": [{ + "name": "塔城", + "mobile": "15544448888", + "keyword": "塔城TACHENG15544448888" + }, + { + "name": "漯河", + "mobile": "15544448888", + "keyword": "漯河TAHE15544448888" + }, + { + "name": "泰安", + "mobile": "15544448888", + "keyword": "泰安TAIAN15544448888" + } + ] + }, + { + "letter": "W", + "data": [{ + "name": "潍坊", + "mobile": "15544448888", + "keyword": "潍坊WEIFANG15544448888" + }, + { + "name": "威海", + "mobile": "15544448888", + "keyword": "威海WEIHAI15544448888" + }, + { + "name": "渭南", + "mobile": "15544448888", + "keyword": "渭南WEINAN15544448888" + }, + { + "name": "文山", + "mobile": "15544448888", + "keyword": "文山WENSHAN15544448888" + } + ] + }, + { + "letter": "X", + "data": [{ + "name": "厦门", + "mobile": "15544448888", + "keyword": "厦门XIAMEN15544448888" + }, + { + "name": "西安", + "mobile": "15544448888", + "keyword": "西安XIAN15544448888" + }, + { + "name": "湘潭", + "mobile": "15544448888", + "keyword": "湘潭XIANGTAN15544448888" + } + ] + }, + { + "letter": "Y", + "data": [{ + "name": "雅安", + "mobile": "15544448888", + "keyword": "雅安YAAN15544448888" + }, + { + "name": "延安", + "mobile": "15544448888", + "keyword": "延安YANAN15544448888" + }, + { + "name": "延边", + "mobile": "15544448888", + "keyword": "延边YANBIAN15544448888" + }, + { + "name": "盐城", + "mobile": "15544448888", + "keyword": "盐城YANCHENG15544448888" + } + ] + }, + { + "letter": "Z", + "data": [{ + "name": "枣庄", + "mobile": "15544448888", + "keyword": "枣庄ZAOZHUANG15544448888" + }, + { + "name": "张家界", + "mobile": "15544448888", + "keyword": "张家界ZHANGJIAJIE15544448888" + }, + { + "name": "张家口", + "mobile": "15544448888", + "keyword": "张家口ZHANGJIAKOU15544448888" + } + ] + }, + { + "letter": "#", + "data": [{ + "name": "其他.", + "mobile": "16666666666", + "keyword": "echo16666666666" + }] + } + ] +} diff --git a/common/locales/en.js b/common/locales/en.js new file mode 100644 index 0000000..5bd6f7a --- /dev/null +++ b/common/locales/en.js @@ -0,0 +1,21 @@ +export default { + // 可以以页面为单位来写,比如首页的内容,写在index字段,个人中心写在center,共同部分写在common部分 + components: { + desc: 'Numerous components cover the various requirements of the development process, and the components are rich in functions and compatible with multiple terminals. Let you integrate quickly, out of the box' + }, + js: { + desc: 'Numerous intimate gadgets are a weapon that you can call upon during the development process, allowing you to dart in your hand and pierce the Yang with a hundred steps' + }, + template: { + desc: 'Collection of many commonly used pages and layouts, reducing the repetitive work of developers, allowing you to focus on logic and get twice the result with half the effort' + }, + nav: { + components: 'Components', + js: 'JS', + template: 'Template' + }, + common: { + intro: 'UI framework for rapid development of multiple platforms', + title: 'uView UI', + }, +} \ No newline at end of file diff --git a/common/locales/zh.js b/common/locales/zh.js new file mode 100644 index 0000000..1c6b15c --- /dev/null +++ b/common/locales/zh.js @@ -0,0 +1,21 @@ +export default { + // 可以以页面为单位来写,比如首页的内容,写在index字段,个人中心写在center,共同部分写在common部分 + components: { + desc: '众多组件覆盖开发过程的各个需求,组件功能丰富,多端兼容。让你快速集成,开箱即用' + }, + js: { + desc: '众多的贴心小工具,是你开发过程中召之即来的利器,让你飞镖在手,百步穿杨' + }, + template: { + desc: '收集众多的常用页面和布局,减少开发者的重复工作,让你专注逻辑,事半功倍' + }, + nav: { + components: '组件', + js: '工具', + template: '模板' + }, + common: { + intro: '多平台快速开发的UI框架', + title: 'uView UI', + }, +} \ No newline at end of file diff --git a/common/vue-i18n.min.js b/common/vue-i18n.min.js new file mode 100644 index 0000000..8d0a5c0 --- /dev/null +++ b/common/vue-i18n.min.js @@ -0,0 +1,6 @@ +/*! + * vue-i18n v8.20.0 + * (c) 2020 kazuya kawaguchi + * Released under the MIT License. + */ +var t,e;t=this,e=function(){"use strict";var t=["style","currency","currencyDisplay","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","localeMatcher","formatMatcher","unit"];function e(t,e){"undefined"!=typeof console&&(console.warn("[vue-i18n] "+t),e&&console.warn(e.stack))}var n=Array.isArray;function r(t){return null!==t&&"object"==typeof t}function a(t){return"string"==typeof t}var i=Object.prototype.toString,o="[object Object]";function s(t){return i.call(t)===o}function l(t){return null==t}function c(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var n=null,a=null;return 1===t.length?r(t[0])||Array.isArray(t[0])?a=t[0]:"string"==typeof t[0]&&(n=t[0]):2===t.length&&("string"==typeof t[0]&&(n=t[0]),(r(t[1])||Array.isArray(t[1]))&&(a=t[1])),{locale:n,params:a}}function u(t){return JSON.parse(JSON.stringify(t))}function h(t,e){return!!~t.indexOf(e)}var f=Object.prototype.hasOwnProperty;function p(t,e){return f.call(t,e)}function m(t){for(var e=arguments,n=Object(t),a=1;a0;)e[n]=arguments[n+1];var r=this.$i18n;return r._t.apply(r,[t,r.locale,r._getMessages(),this].concat(e))},t.prototype.$tc=function(t,e){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];var a=this.$i18n;return a._tc.apply(a,[t,a.locale,a._getMessages(),this,e].concat(n))},t.prototype.$te=function(t,e){var n=this.$i18n;return n._te(t,n.locale,n._getMessages(),e)},t.prototype.$d=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this.$i18n).d.apply(e,[t].concat(n))},t.prototype.$n=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this.$i18n).n.apply(e,[t].concat(n))}}(F),F.mixin(g),F.directive("t",{bind:w,update:$,unbind:M}),F.component(v.name,v),F.component(k.name,k),F.config.optionMergeStrategies.i18n=function(t,e){return void 0===e?t:e}}var D=function(){this._caches=Object.create(null)};D.prototype.interpolate=function(t,e){if(!e)return[t];var n=this._caches[t];return n||(n=function(t){var e=[],n=0,r="";for(;n0)h--,u=R,f[W]();else{if(h=0,void 0===n)return!1;if(!1===(n=J(n)))return!1;f[j]()}};null!==u;)if("\\"!==(e=t[++c])||!p()){if(a=U(e),(i=(s=z[u])[a]||s.else||E)===E)return;if(u=i[0],(o=f[i[1]])&&(r=void 0===(r=i[2])?e:r,!1===o()))return;if(u===V)return l}}(t))&&(this._cache[t]=e),e||[]},q.prototype.getPathValue=function(t,e){if(!r(t))return null;var n=this.parsePath(e);if(0===n.length)return null;for(var a=n.length,i=t,o=0;o/,Z=/(?:@(?:\.[a-z]+)?:(?:[\w\-_|.]+|\([\w\-_|.]+\)))/g,K=/^@(?:\.([a-z]+))?:/,Q=/[()]/g,Y={upper:function(t){return t.toLocaleUpperCase()},lower:function(t){return t.toLocaleLowerCase()},capitalize:function(t){return""+t.charAt(0).toLocaleUpperCase()+t.substr(1)}},tt=new D,et=function(t){var e=this;void 0===t&&(t={}),!F&&"undefined"!=typeof window&&window.Vue&&I(window.Vue);var n=t.locale||"en-US",r=!1!==t.fallbackLocale&&(t.fallbackLocale||"en-US"),a=t.messages||{},i=t.dateTimeFormats||{},o=t.numberFormats||{};this._vm=null,this._formatter=t.formatter||tt,this._modifiers=t.modifiers||{},this._missing=t.missing||null,this._root=t.root||null,this._sync=void 0===t.sync||!!t.sync,this._fallbackRoot=void 0===t.fallbackRoot||!!t.fallbackRoot,this._formatFallbackMessages=void 0!==t.formatFallbackMessages&&!!t.formatFallbackMessages,this._silentTranslationWarn=void 0!==t.silentTranslationWarn&&t.silentTranslationWarn,this._silentFallbackWarn=void 0!==t.silentFallbackWarn&&!!t.silentFallbackWarn,this._dateTimeFormatters={},this._numberFormatters={},this._path=new q,this._dataListeners=[],this._componentInstanceCreatedListener=t.componentInstanceCreatedListener||null,this._preserveDirectiveContent=void 0!==t.preserveDirectiveContent&&!!t.preserveDirectiveContent,this.pluralizationRules=t.pluralizationRules||{},this._warnHtmlInMessage=t.warnHtmlInMessage||"off",this._postTranslation=t.postTranslation||null,this.getChoiceIndex=function(t,n){var r=Object.getPrototypeOf(e);if(r&&r.getChoiceIndex)return r.getChoiceIndex.call(e,t,n);var a,i;return e.locale in e.pluralizationRules?e.pluralizationRules[e.locale].apply(e,[t,n]):(a=t,i=n,a=Math.abs(a),2===i?a?a>1?1:0:1:a?Math.min(a,2):0)},this._exist=function(t,n){return!(!t||!n)&&(!l(e._path.getPathValue(t,n))||!!t[n])},"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||Object.keys(a).forEach(function(t){e._checkLocaleMessage(t,e._warnHtmlInMessage,a[t])}),this._initVM({locale:n,fallbackLocale:r,messages:a,dateTimeFormats:i,numberFormats:o})},nt={vm:{configurable:!0},messages:{configurable:!0},dateTimeFormats:{configurable:!0},numberFormats:{configurable:!0},availableLocales:{configurable:!0},locale:{configurable:!0},fallbackLocale:{configurable:!0},formatFallbackMessages:{configurable:!0},missing:{configurable:!0},formatter:{configurable:!0},silentTranslationWarn:{configurable:!0},silentFallbackWarn:{configurable:!0},preserveDirectiveContent:{configurable:!0},warnHtmlInMessage:{configurable:!0},postTranslation:{configurable:!0}};return et.prototype._checkLocaleMessage=function(t,n,r){var i=function(t,n,r,o){if(s(r))Object.keys(r).forEach(function(e){var a=r[e];s(a)?(o.push(e),o.push("."),i(t,n,a,o),o.pop(),o.pop()):(o.push(e),i(t,n,a,o),o.pop())});else if(Array.isArray(r))r.forEach(function(e,r){s(e)?(o.push("["+r+"]"),o.push("."),i(t,n,e,o),o.pop(),o.pop()):(o.push("["+r+"]"),i(t,n,e,o),o.pop())});else if(a(r)){if(X.test(r)){var l="Detected HTML in message '"+r+"' of keypath '"+o.join("")+"' at '"+n+"'. Consider component interpolation with '' to avoid XSS. See https://bit.ly/2ZqJzkp";"warn"===t?e(l):"error"===t&&function(t,e){"undefined"!=typeof console&&(console.error("[vue-i18n] "+t),e&&console.error(e.stack))}(l)}}};i(n,t,r,[])},et.prototype._initVM=function(t){var e=F.config.silent;F.config.silent=!0,this._vm=new F({data:t}),F.config.silent=e},et.prototype.destroyVM=function(){this._vm.$destroy()},et.prototype.subscribeDataChanging=function(t){this._dataListeners.push(t)},et.prototype.unsubscribeDataChanging=function(t){!function(t,e){if(t.length){var n=t.indexOf(e);if(n>-1)t.splice(n,1)}}(this._dataListeners,t)},et.prototype.watchI18nData=function(){var t=this;return this._vm.$watch("$data",function(){for(var e=t._dataListeners.length;e--;)F.nextTick(function(){t._dataListeners[e]&&t._dataListeners[e].$forceUpdate()})},{deep:!0})},et.prototype.watchLocale=function(){if(!this._sync||!this._root)return null;var t=this._vm;return this._root.$i18n.vm.$watch("locale",function(e){t.$set(t,"locale",e),t.$forceUpdate()},{immediate:!0})},et.prototype.onComponentInstanceCreated=function(t){this._componentInstanceCreatedListener&&this._componentInstanceCreatedListener(t,this)},nt.vm.get=function(){return this._vm},nt.messages.get=function(){return u(this._getMessages())},nt.dateTimeFormats.get=function(){return u(this._getDateTimeFormats())},nt.numberFormats.get=function(){return u(this._getNumberFormats())},nt.availableLocales.get=function(){return Object.keys(this.messages).sort()},nt.locale.get=function(){return this._vm.locale},nt.locale.set=function(t){this._vm.$set(this._vm,"locale",t)},nt.fallbackLocale.get=function(){return this._vm.fallbackLocale},nt.fallbackLocale.set=function(t){this._localeChainCache={},this._vm.$set(this._vm,"fallbackLocale",t)},nt.formatFallbackMessages.get=function(){return this._formatFallbackMessages},nt.formatFallbackMessages.set=function(t){this._formatFallbackMessages=t},nt.missing.get=function(){return this._missing},nt.missing.set=function(t){this._missing=t},nt.formatter.get=function(){return this._formatter},nt.formatter.set=function(t){this._formatter=t},nt.silentTranslationWarn.get=function(){return this._silentTranslationWarn},nt.silentTranslationWarn.set=function(t){this._silentTranslationWarn=t},nt.silentFallbackWarn.get=function(){return this._silentFallbackWarn},nt.silentFallbackWarn.set=function(t){this._silentFallbackWarn=t},nt.preserveDirectiveContent.get=function(){return this._preserveDirectiveContent},nt.preserveDirectiveContent.set=function(t){this._preserveDirectiveContent=t},nt.warnHtmlInMessage.get=function(){return this._warnHtmlInMessage},nt.warnHtmlInMessage.set=function(t){var e=this,n=this._warnHtmlInMessage;if(this._warnHtmlInMessage=t,n!==t&&("warn"===t||"error"===t)){var r=this._getMessages();Object.keys(r).forEach(function(t){e._checkLocaleMessage(t,e._warnHtmlInMessage,r[t])})}},nt.postTranslation.get=function(){return this._postTranslation},nt.postTranslation.set=function(t){this._postTranslation=t},et.prototype._getMessages=function(){return this._vm.messages},et.prototype._getDateTimeFormats=function(){return this._vm.dateTimeFormats},et.prototype._getNumberFormats=function(){return this._vm.numberFormats},et.prototype._warnDefault=function(t,e,n,r,i,o){if(!l(n))return n;if(this._missing){var s=this._missing.apply(null,[t,e,r,i]);if(a(s))return s}if(this._formatFallbackMessages){var u=c.apply(void 0,i);return this._render(e,o,u.params,e)}return e},et.prototype._isFallbackRoot=function(t){return!t&&!l(this._root)&&this._fallbackRoot},et.prototype._isSilentFallbackWarn=function(t){return this._silentFallbackWarn instanceof RegExp?this._silentFallbackWarn.test(t):this._silentFallbackWarn},et.prototype._isSilentFallback=function(t,e){return this._isSilentFallbackWarn(e)&&(this._isFallbackRoot()||t!==this.fallbackLocale)},et.prototype._isSilentTranslationWarn=function(t){return this._silentTranslationWarn instanceof RegExp?this._silentTranslationWarn.test(t):this._silentTranslationWarn},et.prototype._interpolate=function(t,e,n,r,i,o,c){if(!e)return null;var u,h=this._path.getPathValue(e,n);if(Array.isArray(h)||s(h))return h;if(l(h)){if(!s(e))return null;if(!a(u=e[n]))return null}else{if(!a(h))return null;u=h}return(u.indexOf("@:")>=0||u.indexOf("@.")>=0)&&(u=this._link(t,e,u,r,"raw",o,c)),this._render(u,i,o,n)},et.prototype._link=function(t,e,n,r,a,i,o){var s=n,l=s.match(Z);for(var c in l)if(l.hasOwnProperty(c)){var u=l[c],f=u.match(K),p=f[0],m=f[1],_=u.replace(p,"").replace(Q,"");if(h(o,_))return s;o.push(_);var g=this._interpolate(t,e,_,r,"raw"===a?"string":a,"raw"===a?void 0:i,o);if(this._isFallbackRoot(g)){if(!this._root)throw Error("unexpected error");var v=this._root.$i18n;g=v._translate(v._getMessages(),v.locale,v.fallbackLocale,_,r,a,i)}g=this._warnDefault(t,_,g,r,Array.isArray(i)?i:[i],a),this._modifiers.hasOwnProperty(m)?g=this._modifiers[m](g):Y.hasOwnProperty(m)&&(g=Y[m](g)),o.pop(),s=g?s.replace(u,g):s}return s},et.prototype._render=function(t,e,n,r){var i=this._formatter.interpolate(t,n,r);return i||(i=tt.interpolate(t,n,r)),"string"!==e||a(i)?i:i.join("")},et.prototype._appendItemToChain=function(t,e,n){var r=!1;return h(t,e)||(r=!0,e&&(r="!"!==e[e.length-1],e=e.replace(/!/g,""),t.push(e),n&&n[e]&&(r=n[e]))),r},et.prototype._appendLocaleToChain=function(t,e,n){var r,a=e.split("-");do{var i=a.join("-");r=this._appendItemToChain(t,i,n),a.splice(-1,1)}while(a.length&&!0===r);return r},et.prototype._appendBlockToChain=function(t,e,n){for(var r=!0,i=0;i0;)i[o]=arguments[o+4];if(!t)return"";var s=c.apply(void 0,i),l=s.locale||e,u=this._translate(n,l,this.fallbackLocale,t,r,"string",s.params);if(this._isFallbackRoot(u)){if(!this._root)throw Error("unexpected error");return(a=this._root).$t.apply(a,[t].concat(i))}return u=this._warnDefault(l,t,u,r,i,"string"),this._postTranslation&&null!=u&&(u=this._postTranslation(u,t)),u},et.prototype.t=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this)._t.apply(e,[t,this.locale,this._getMessages(),null].concat(n))},et.prototype._i=function(t,e,n,r,a){var i=this._translate(n,e,this.fallbackLocale,t,r,"raw",a);if(this._isFallbackRoot(i)){if(!this._root)throw Error("unexpected error");return this._root.$i18n.i(t,e,a)}return this._warnDefault(e,t,i,r,[a],"raw")},et.prototype.i=function(t,e,n){return t?(a(e)||(e=this.locale),this._i(t,e,this._getMessages(),null,n)):""},et.prototype._tc=function(t,e,n,r,a){for(var i,o=[],s=arguments.length-5;s-- >0;)o[s]=arguments[s+5];if(!t)return"";void 0===a&&(a=1);var l={count:a,n:a},u=c.apply(void 0,o);return u.params=Object.assign(l,u.params),o=null===u.locale?[u.params]:[u.locale,u.params],this.fetchChoice((i=this)._t.apply(i,[t,e,n,r].concat(o)),a)},et.prototype.fetchChoice=function(t,e){if(!t&&!a(t))return null;var n=t.split("|");return n[e=this.getChoiceIndex(e,n.length)]?n[e].trim():t},et.prototype.tc=function(t,e){for(var n,r=[],a=arguments.length-2;a-- >0;)r[a]=arguments[a+2];return(n=this)._tc.apply(n,[t,this.locale,this._getMessages(),null,e].concat(r))},et.prototype._te=function(t,e,n){for(var r=[],a=arguments.length-3;a-- >0;)r[a]=arguments[a+3];var i=c.apply(void 0,r).locale||e;return this._exist(n[i],t)},et.prototype.te=function(t,e){return this._te(t,this.locale,this._getMessages(),e)},et.prototype.getLocaleMessage=function(t){return u(this._vm.messages[t]||{})},et.prototype.setLocaleMessage=function(t,e){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(t,this._warnHtmlInMessage,e),this._vm.$set(this._vm.messages,t,e)},et.prototype.mergeLocaleMessage=function(t,e){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(t,this._warnHtmlInMessage,e),this._vm.$set(this._vm.messages,t,m({},this._vm.messages[t]||{},e))},et.prototype.getDateTimeFormat=function(t){return u(this._vm.dateTimeFormats[t]||{})},et.prototype.setDateTimeFormat=function(t,e){this._vm.$set(this._vm.dateTimeFormats,t,e),this._clearDateTimeFormat(t,e)},et.prototype.mergeDateTimeFormat=function(t,e){this._vm.$set(this._vm.dateTimeFormats,t,m(this._vm.dateTimeFormats[t]||{},e)),this._clearDateTimeFormat(t,e)},et.prototype._clearDateTimeFormat=function(t,e){for(var n in e){var r=t+"__"+n;this._dateTimeFormatters.hasOwnProperty(r)&&delete this._dateTimeFormatters[r]}},et.prototype._localizeDateTime=function(t,e,n,r,a){for(var i=e,o=r[i],s=this._getLocaleChain(e,n),c=0;c0;)e[n]=arguments[n+1];var i=this.locale,o=null;return 1===e.length?a(e[0])?o=e[0]:r(e[0])&&(e[0].locale&&(i=e[0].locale),e[0].key&&(o=e[0].key)):2===e.length&&(a(e[0])&&(o=e[0]),a(e[1])&&(i=e[1])),this._d(t,i,o)},et.prototype.getNumberFormat=function(t){return u(this._vm.numberFormats[t]||{})},et.prototype.setNumberFormat=function(t,e){this._vm.$set(this._vm.numberFormats,t,e),this._clearNumberFormat(t,e)},et.prototype.mergeNumberFormat=function(t,e){this._vm.$set(this._vm.numberFormats,t,m(this._vm.numberFormats[t]||{},e)),this._clearNumberFormat(t,e)},et.prototype._clearNumberFormat=function(t,e){for(var n in e){var r=t+"__"+n;this._numberFormatters.hasOwnProperty(r)&&delete this._numberFormatters[r]}},et.prototype._getNumberFormatter=function(t,e,n,r,a,i){for(var o=e,s=r[o],c=this._getLocaleChain(e,n),u=0;u0;)n[i]=arguments[i+1];var o=this.locale,s=null,l=null;return 1===n.length?a(n[0])?s=n[0]:r(n[0])&&(n[0].locale&&(o=n[0].locale),n[0].key&&(s=n[0].key),l=Object.keys(n[0]).reduce(function(e,r){var a;return h(t,r)?Object.assign({},e,((a={})[r]=n[0][r],a)):e},null)):2===n.length&&(a(n[0])&&(s=n[0]),a(n[1])&&(o=n[1])),this._n(e,o,s,l)},et.prototype._ntp=function(t,e,n,r){if(!et.availabilities.numberFormat)return[];if(!n)return(r?new Intl.NumberFormat(e,r):new Intl.NumberFormat(e)).formatToParts(t);var a=this._getNumberFormatter(t,e,this.fallbackLocale,this._getNumberFormats(),n,r),i=a&&a.formatToParts(t);if(this._isFallbackRoot(i)){if(!this._root)throw Error("unexpected error");return this._root.$i18n._ntp(t,e,n,r)}return i||[]},Object.defineProperties(et.prototype,nt),Object.defineProperty(et,"availabilities",{get:function(){if(!G){var t="undefined"!=typeof Intl;G={dateTimeFormat:t&&void 0!==Intl.DateTimeFormat,numberFormat:t&&void 0!==Intl.NumberFormat}}return G}}),et.install=I,et.version="8.20.0",et},"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueI18n=e(); \ No newline at end of file diff --git a/components/.DS_Store b/components/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5f98ef7375e37dd40e40f65b115204c6a8b54510 GIT binary patch literal 6148 zcmeHK&2AGh5FV!ioFLR3kP0_nkT?V>%OMp)NUO9QdP7=%4uINSHfmSeu0ygRq9JIX z1Kx-i;Bnv^+o?bS^+qc+BaOe=@r=Fxys~$QNR8%sMARc94P|U~(ELHTpLIi8!LtQa zZjATzfC@ULV|uX>Esm?m0Po#4mDsh4&gj?uo4{)+rTn0@@3PWnh~&@YG4%cqC$KKe z&K9#t$o`g1%3@Xz2H#a{t9|YI4XwMnd#n34IkAhRPV4z>lulps)3dZb$%6gd+Vb2^ zvzNtqaoD@PXRA6bs`1n%7x@?=Z(bEuZWkjvukx82C-EIxcXa2lcXzprb_Y@4M8n-x z-z*;uANI{KidL(R-nkb&IXF7~c((ks`uxSMj1<0VC))wn@D;`dtbItPRcWhZM6O3! zXA24g!hkSv*$jkpN#DHe7m@je0b$_EF~H}8filJc8;|bjK;udPU>j~Hu=yvEb4EG*r7bJ}^APoGU45;>gvOmJw!ri*DO1^6i^a#qragE3G6d3L*Ml4^&cc4z- YH*5gofQ?6ZAo3&NXplx2_@@l~1XpxtMF0Q* literal 0 HcmV?d00001 diff --git a/components/linzq-imgUpload/.DS_Store b/components/linzq-imgUpload/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..511f62b89441f8dd9a99b3df09e6630c87f3e1e4 GIT binary patch literal 6148 zcmeHKu}TCn6r8759EfmWp=C-N1#NAX<1DPjUhhs$VZB|^wXoXX@hf#EiQ?U*u@RB? zAeoosO_CkhBoBa%yZH$)0x)C|nw)~EyEwF!gSUwm=Xk^s?(u*Ht_lfna z#4EntSyfiDGgJ_HtFm9bA4 zj}BHb1t1RC9gV&o$Kr&HRmMIcM`)I)#6-26VpyWHKjgS7W1le5VLAD*yz*!AVsUlO zA7VJHO6avK;0mlNpxl=>(*1wVU#6Jk#}Kbv0axI^Dqw@jcj~SUEY~bD q#r1M%^j97MZ0H<0h=XZ7$Y)%Yu}`R3)F0_Ye+WcDymAG8L4gmA<2zvh literal 0 HcmV?d00001 diff --git a/components/linzq-imgUpload/linzq-imgUpload.vue b/components/linzq-imgUpload/linzq-imgUpload.vue new file mode 100644 index 0000000..a8604a8 --- /dev/null +++ b/components/linzq-imgUpload/linzq-imgUpload.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/components/linzq-imgUpload/shanchus2.png b/components/linzq-imgUpload/shanchus2.png new file mode 100644 index 0000000000000000000000000000000000000000..c2cb8e30cafdd0cf76a8a8184c27ab5b16f9ab9c GIT binary patch literal 6291 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 literal 0 HcmV?d00001 diff --git a/components/linzq-imgUpload/tupianadd.png b/components/linzq-imgUpload/tupianadd.png new file mode 100644 index 0000000000000000000000000000000000000000..3d032af9d240ab7d11585ef5cb640d2ab5c442e9 GIT binary patch literal 5816 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 I^_`;s3y&nSMF0Q* literal 0 HcmV?d00001 diff --git a/components/page-nav/page-nav.vue b/components/page-nav/page-nav.vue new file mode 100644 index 0000000..3f3c0f2 --- /dev/null +++ b/components/page-nav/page-nav.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/components/uni-segmented-control/uni-segmented-control.vue b/components/uni-segmented-control/uni-segmented-control.vue new file mode 100644 index 0000000..19f1328 --- /dev/null +++ b/components/uni-segmented-control/uni-segmented-control.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..2416414 --- /dev/null +++ b/main.js @@ -0,0 +1,64 @@ +import Vue from 'vue'; +import App from './App'; + +Vue.config.productionTip = false; + +App.mpType = 'app'; + +// 此处为演示Vue.prototype使用,非uView的功能部分 +Vue.prototype.vuePrototype = '枣红'; + +// 引入全局uView +import uView from 'uview-ui'; +Vue.use(uView); + +// 此处为演示vuex使用,非uView的功能部分 +import store from '@/store'; + +// 引入uView提供的对vuex的简写法文件 +let vuexStore = require('@/store/$u.mixin.js'); +Vue.mixin(vuexStore); + +// 引入uView对小程序分享的mixin封装 +let mpShare = require('uview-ui/libs/mixin/mpShare.js'); +Vue.mixin(mpShare); + +// i18n部分的配置 +// 引入语言包,注意路径 +import Chinese from '@/common/locales/zh.js'; +import English from '@/common/locales/en.js'; + +// VueI18n +import VueI18n from '@/common/vue-i18n.min.js'; + +// VueI18n +Vue.use(VueI18n); + +const i18n = new VueI18n({ + // 默认语言 + locale: 'zh', + // 引入语言文件 + messages: { + 'zh': Chinese, + 'en': English, + } +}); + +// 由于微信小程序的运行机制问题,需声明如下一行,H5和APP非必填 +Vue.prototype._i18n = i18n; + +const app = new Vue({ + i18n, + store, + ...App +}); + +// http拦截器,将此部分放在new Vue()和app.$mount()之间,才能App.vue中正常使用 +import httpInterceptor from '@/common/http.interceptor.js'; +Vue.use(httpInterceptor, app); + +// http接口API抽离,免于写url或者一些固定的参数 +import httpApi from '@/common/http.api.js'; +Vue.use(httpApi, app); + +app.$mount(); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..29b1ae7 --- /dev/null +++ b/manifest.json @@ -0,0 +1,97 @@ +{ + "name" : "共享平台", + "appid" : "__UNI__B00D419", + "description" : "共享平台", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "modules" : { + "OAuth" : {}, + "Payment" : {}, + "Push" : {}, + "Share" : {}, + "Speech" : {}, + "VideoPlayer" : {} + }, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "autoSdkPermissions" : true + }, + /* ios打包配置 */ + "ios" : { + "UIBackgroundModes" : [ "audio" ] + }, + /* SDK配置 */ + "sdkConfigs" : { + "speech" : { + "ifly" : {} + }, + "ad" : {} + }, + "orientation" : [ "portrait-primary" ] + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "wx0605643660b9b2ec", + "setting" : { + "urlCheck" : false, + "minified" : true + }, + "usingComponents" : true + }, + "h5" : { + "template" : "template.h5.html", + "router" : { + "mode" : "history", + "base" : "/h5/" + }, + "title" : "共享平台" + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7929b77 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "id": "uView-UI", + "name": "uView UI已发布Sketch和Axure设计资源", + "version": "1.8.4", + "description": "uView正在研发2.0版本,将会全面兼容Nvue,并引入大量激动人心的创新功能", + "keywords": [ + "uView", + "uViewUI", + "UI", + "UI框架", + "uni-app" + ] +} \ No newline at end of file diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..a5c2c2e --- /dev/null +++ b/pages.json @@ -0,0 +1,82 @@ +{ + "easycom": { + "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + }, + // "condition": { //模式配置,仅开发期间生效 + // "current": 0, //当前激活的模式(list 的索引项) + // "list": [{ + // "name": "test", //模式名称 + // "path": "pages/componentsC/test/index", //启动页面,必选 + // "query": "uuid=c4bba940-f69e-11ea-a419-6bafda9d095e&__id__=1" //启动参数,在页面的onLoad函数里面得到 + // }] + // }, + "pages": [ + { + "path" : "pages/login/login_password", + "style" : + { + "navigationBarTitleText": "密码登录", + "enablePullDownRefresh": false + } + + }, + { + "path" : "pages/login/login", + "style" : + { + "navigationBarTitleText": "验证码登录", + "enablePullDownRefresh": false + } + + }, + { + "path" : "pages/home/home", + "style" : + { + "navigationBarTitleText": "曲阳金隅智慧安全", + "enablePullDownRefresh": false + } + + }, + { + "path" : "pages/my/my", + "style" : + { + "navigationBarTitleText": "个人中心", + "enablePullDownRefresh": false + } + + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "曲阳金隅智慧安全", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "tabBar": { + "color": "#909399", + "selectedColor": "#909399", + "backgroundColor": "#FFFFFF", + "borderStyle": "black", + "list": [{ + "pagePath": "pages/home/home", + "iconPath": "static/common/home.png", + "selectedIconPath": "static/common/homec.png", + "text": "主页" + }, + /* { + "pagePath": "pages/vod/video", + "iconPath": "static/common/play.png", + "selectedIconPath": "static/common/playc.png", + "text": "点播" + }, */ + { + "pagePath": "pages/my/my", + "iconPath": "static/common/me.png", + "selectedIconPath": "static/common/mec.png", + "text": "个人中心" + } + ] + } +} diff --git a/pages/home/home.vue b/pages/home/home.vue new file mode 100644 index 0000000..85a8093 --- /dev/null +++ b/pages/home/home.vue @@ -0,0 +1,190 @@ + + + + + + + diff --git a/pages/home/home_.vue b/pages/home/home_.vue new file mode 100644 index 0000000..c12d14e --- /dev/null +++ b/pages/home/home_.vue @@ -0,0 +1,112 @@ + + + + + + + diff --git a/pages/login/code.vue b/pages/login/code.vue new file mode 100644 index 0000000..d8a81f4 --- /dev/null +++ b/pages/login/code.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..f5c816d --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/pages/login/login_.vue b/pages/login/login_.vue new file mode 100644 index 0000000..d73cfea --- /dev/null +++ b/pages/login/login_.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/pages/login/login_password.vue b/pages/login/login_password.vue new file mode 100644 index 0000000..f96b4b7 --- /dev/null +++ b/pages/login/login_password.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/pages/my/my.vue b/pages/my/my.vue new file mode 100644 index 0000000..3c70e9e --- /dev/null +++ b/pages/my/my.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/static/banner3.jpg b/static/banner3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd3b84f592e21c79fca345b519da2b5794e0c7cc GIT binary patch literal 59059 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 \ No newline at end of file diff --git a/static/common/file.svg b/static/common/file.svg new file mode 100644 index 0000000..478dc37 --- /dev/null +++ b/static/common/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/common/home.png b/static/common/home.png new file mode 100644 index 0000000000000000000000000000000000000000..47ac7328d69c5a52bf508ce8e71ef79ac6bdd6d0 GIT binary patch literal 1120 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU{UvUaSW-5dppZFBPLYjczyaD z!_vS%D>!s7wO(-*=bAZ_BhRFZLoa59;_5{+j?LWI7BJP~E=TMc9Tr7_wKK(|w3~LV z;MVkDaa_D0W6tzPP6C4Au_3N21Qny6$5t+$c=C+w``Y)Zb|vq0p3nPi|NPIpozL%{ z>^68LFZuCTAwvv%j|F2ni`yQ?I|3!{2?6d8wuSGg(>c4hG0CgNKeX#=Z{)tW<#x<3 z8)ABsIZ_`y=xb^{b&u!j*5fx{iFfQ{l2~6jokN{P?nTss4SE4<#VzjhbJQ{x96$Yr z+h~fY&J8iu0yJg! zA73_Rcx?Je@%yVXckSNalyY~O)mrv!Nd@!5N8&$kEnA^swwo{ElTNkS zb_>PCj~m=4pK%R5bH#hl{e5PYlfLM)TQolk?7h$La8-Yk$Wn*NZ`U!MxITkx`R=AY zW(7OCS?8Innr=K)+n7~$xUTo@ZY|f;$DDS?FK?`Q&(-iolh1qC&c_cc-~ZsKS+hW5 zYwKn?eGZ%D6ZZ(obw;mST$MMg&3ED593kctRXQi)o%7~zt9Y2P_rU7H$vNkQ5?Lj# zPx$M?8e-=g7FQuH9P?imq3b`QH6U#(Zbk{yE1tALzEyW$k{c9diBo z56!GKCm4$4*aN2s_LXY>vGz0!*WVyzDml6Kn@M}dhAU5%zFxiGe`dRn)!Nq+8Ct|= zxh=EYYkk`=BsApDq{9^;--OuR%+jUxQ)7L|4HD9z6 z1$R`o?=yHWUU5?7vXn#JOwXy04%f4^ZdEw@rB$-dg!Sdus*1*2cg`<55aYe3{Erg< z%p`TD2jV-9i!6wLy^D9#$@7dG?k?QXlKXY?t)pkpmp17BB#*QGtMwn>##YnWyKBO0 zz5nkkZD79eulQDJLt{fK_y6*Khv>%LcF8)7e0gjZ4A#r{ykD}sZCWk= zj@p^CjWqZ5&j~SSzbxP*;UTj5t5CX+(KQCAg?o-yvhvSzS$nOT)8U8d-lL7@pWifj zDg@-z*fpvAv(LHbX-*sc!5PN0r@|_RAvu*b}V0z5y|Ir2iRI=CF zr%lRe-RIcWy{$F>co(Ze=Ay$--ZSuA&f`%Mzs}gaz|O}omK}xbzK{7I%dFG(@o%ox RH3CZx22WQ%mvv4FO#t1o6uSTb literal 0 HcmV?d00001 diff --git a/static/common/homec.png b/static/common/homec.png new file mode 100644 index 0000000000000000000000000000000000000000..51669e371e5ee87b2fc0d132152111a454f15956 GIT binary patch literal 816 zcmV-01JC@4P)rh;)D-Ac3Y@sbk=_(%UBkEtuZ+X;+9aRi_NOBekgYO>Pyz=3Iu5EMmq@Qs*HQp-9Ro%C->-jVjRkAS9l$TjYuLOGtaQ3 zwy(IC?{U1EUP>H4Ol5I`t#%By4IoovMt&E$fp#1TB`dr%F6Ff%PeaK=_!P+9+3w{f zV>lhwcvNx*uBVz*R7Z+|a8BJS-rK8D*POgHk}@DsKM zkh{&Oad_dUFhT2&8wJk$`Sbq*5LOy_&L{vM0vZ8+A+o#v&(#1;0j&XA1horj8`L>K z2O+;UuY-^up{NHTasBf$lAEri4nmDW>&I}BO`HlKp_8CSfTn=ffR?RSi(pjG9<>W- z7f9yw0BwWX24iZ2VDoyr1GuMSy{2dYHET+if5KyNB{Xh|3r*{Wvr+ zYywU1ZCp0#p^5jo^WC2{Xud1*ycIle5)2F1P4n6I;JY?L0SN1066F*?60b^}K4}ER uNjr(QGy;-%RpRtXBOp%NNwn4V5%3EI!cS25i%%N>0000 2; // pointer events + } + + /** + * disable mouseevents on the page + * @param ev + */ + function preventMouseEvents(ev) { + // 注释启用默认事件 + // ev.preventDefault(); + // ev.stopPropagation(); + } + + /** + * only trigger touches when the left mousebutton has been pressed + * @param touchType + * @returns {Function} + */ + function onMouse(touchType) { + return function(ev) { + // prevent mouse events + preventMouseEvents(ev); + + if (ev.which !== 1) { + return; + } + + // The EventTarget on which the touch point started when it was first placed on the surface, + // even if the touch point has since moved outside the interactive area of that element. + // also, when the target doesnt exist anymore, we update it + if (ev.type == 'mousedown' || !eventTarget || (eventTarget && !eventTarget.dispatchEvent)) { + eventTarget = ev.target; + } + + // shiftKey has been lost, so trigger a touchend + if (isMultiTouch && !ev.shiftKey) { + triggerTouch('touchend', ev); + isMultiTouch = false; + } + + triggerTouch(touchType, ev); + + // we're entering the multi-touch mode! + if (!isMultiTouch && ev.shiftKey) { + isMultiTouch = true; + multiTouchStartPos = { + pageX: ev.pageX, + pageY: ev.pageY, + clientX: ev.clientX, + clientY: ev.clientY, + screenX: ev.screenX, + screenY: ev.screenY + }; + triggerTouch('touchstart', ev); + } + + // reset + if (ev.type == 'mouseup') { + multiTouchStartPos = null; + isMultiTouch = false; + eventTarget = null; + } + } + } + + /** + * trigger a touch event + * @param eventName + * @param mouseEv + */ + function triggerTouch(eventName, mouseEv) { + var touchEvent = document.createEvent('Event'); + touchEvent.initEvent(eventName, true, true); + + touchEvent.altKey = mouseEv.altKey; + touchEvent.ctrlKey = mouseEv.ctrlKey; + touchEvent.metaKey = mouseEv.metaKey; + touchEvent.shiftKey = mouseEv.shiftKey; + + touchEvent.touches = getActiveTouches(mouseEv, eventName); + touchEvent.targetTouches = getActiveTouches(mouseEv, eventName); + touchEvent.changedTouches = getChangedTouches(mouseEv, eventName); + + eventTarget.dispatchEvent(touchEvent); + } + + /** + * create a touchList based on the mouse event + * @param mouseEv + * @returns {TouchList} + */ + function createTouchList(mouseEv) { + var touchList = new TouchList(); + + if (isMultiTouch) { + var f = TouchEmulator.multiTouchOffset; + var deltaX = multiTouchStartPos.pageX - mouseEv.pageX; + var deltaY = multiTouchStartPos.pageY - mouseEv.pageY; + + touchList.push(new Touch(eventTarget, 1, multiTouchStartPos, (deltaX*-1) - f, (deltaY*-1) + f)); + touchList.push(new Touch(eventTarget, 2, multiTouchStartPos, deltaX+f, deltaY-f)); + } else { + touchList.push(new Touch(eventTarget, 1, mouseEv, 0, 0)); + } + + return touchList; + } + + /** + * receive all active touches + * @param mouseEv + * @returns {TouchList} + */ + function getActiveTouches(mouseEv, eventName) { + // empty list + if (mouseEv.type == 'mouseup') { + return new TouchList(); + } + + var touchList = createTouchList(mouseEv); + if(isMultiTouch && mouseEv.type != 'mouseup' && eventName == 'touchend') { + touchList.splice(1, 1); + } + return touchList; + } + + /** + * receive a filtered set of touches with only the changed pointers + * @param mouseEv + * @param eventName + * @returns {TouchList} + */ + function getChangedTouches(mouseEv, eventName) { + var touchList = createTouchList(mouseEv); + + // we only want to return the added/removed item on multitouch + // which is the second pointer, so remove the first pointer from the touchList + // + // but when the mouseEv.type is mouseup, we want to send all touches because then + // no new input will be possible + if(isMultiTouch && mouseEv.type != 'mouseup' && + (eventName == 'touchstart' || eventName == 'touchend')) { + touchList.splice(0, 1); + } + + return touchList; + } + + /** + * show the touchpoints on the screen + */ + function showTouches(ev) { + var touch, i, el, styles; + + // first all visible touches + for(i = 0; i < ev.touches.length; i++) { + touch = ev.touches[i]; + el = touchElements[touch.identifier]; + if(!el) { + el = touchElements[touch.identifier] = document.createElement("div"); + document.body.appendChild(el); + } + + styles = TouchEmulator.template(touch); + for(var prop in styles) { + el.style[prop] = styles[prop]; + } + } + + // remove all ended touches + if(ev.type == 'touchend' || ev.type == 'touchcancel') { + for(i = 0; i < ev.changedTouches.length; i++) { + touch = ev.changedTouches[i]; + el = touchElements[touch.identifier]; + if(el) { + el.parentNode.removeChild(el); + delete touchElements[touch.identifier]; + } + } + } + } + + /** + * TouchEmulator initializer + */ + function TouchEmulator() { + if (hasTouchSupport()) { + return; + } + + fakeTouchSupport(); + + window.addEventListener("mousedown", onMouse('touchstart'), true); + window.addEventListener("mousemove", onMouse('touchmove'), true); + window.addEventListener("mouseup", onMouse('touchend'), true); + + window.addEventListener("mouseenter", preventMouseEvents, true); + window.addEventListener("mouseleave", preventMouseEvents, true); + window.addEventListener("mouseout", preventMouseEvents, true); + window.addEventListener("mouseover", preventMouseEvents, true); + + // it uses itself! + window.addEventListener("touchstart", showTouches, true); + window.addEventListener("touchmove", showTouches, true); + window.addEventListener("touchend", showTouches, true); + window.addEventListener("touchcancel", showTouches, true); + } + + // start distance when entering the multitouch mode + TouchEmulator.multiTouchOffset = 75; + + /** + * css template for the touch rendering + * @param touch + * @returns object + */ + TouchEmulator.template = function(touch) { + var size = 0; + var transform = 'translate('+ (touch.clientX-(size/2)) +'px, '+ (touch.clientY-(size/2)) +'px)'; + return { + position: 'fixed', + left: 0, + top: 0, + background: '#fff', + border: 'solid 1px #999', + opacity: .6, + borderRadius: '100%', + height: size + 'px', + width: size + 'px', + padding: 0, + margin: 0, + display: 'block', + overflow: 'hidden', + pointerEvents: 'none', + webkitUserSelect: 'none', + mozUserSelect: 'none', + userSelect: 'none', + webkitTransform: transform, + mozTransform: transform, + transform: transform, + zIndex: 100 + } + }; + + // export + if (typeof define == "function" && define.amd) { + define(function() { + return TouchEmulator; + }); + } else if (typeof module != "undefined" && module.exports) { + module.exports = TouchEmulator; + } else { + window[exportName] = TouchEmulator; + } +})(window, document, "TouchEmulator"); \ No newline at end of file diff --git a/static/common/me.png b/static/common/me.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8f6af3cfe22df619e28c1f98d044aa060aa161 GIT binary patch literal 1716 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 \ No newline at end of file diff --git a/static/common/play.png b/static/common/play.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1f8dce96a68f5ca83f7e16aad5e04a9f52b8aa GIT binary patch literal 1423 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 rxDF`R$rP$C*8zo6x>$K;yaWCR \ No newline at end of file diff --git a/static/common/word.svg b/static/common/word.svg new file mode 100644 index 0000000..64fbba3 --- /dev/null +++ b/static/common/word.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/uview/common/favicon.ico b/static/uview/common/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e0af36815787f184eea5e88e44602b9e47ab9994 GIT binary patch literal 4286 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 CUq5XC literal 0 HcmV?d00001 diff --git a/static/uview/common/logo.png b/static/uview/common/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..05b3aed334e406696ae694725ee81750542d8352 GIT binary patch literal 15558 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�j2)oTzk%&U*yg&}2Ew)`7q4#Upx2YPgyA&$ YKfm^QoXml%*Z=?k07*qoM6N<$g6gsA&Hw-a literal 0 HcmV?d00001 diff --git a/static/uview/example/js_select_bak.png b/static/uview/example/js_select_bak.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea6122cb8a9843d421e78031e6259a28d4d157c GIT binary patch literal 2248 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%0DPgAa#wv}lwE3a0@QL9o{<#V1; zv0eJucGi*X{FLQ0Bv90_ zc%-I-V%-z$Rhtn$8BxtQg0rodhl=inAIE_%-F?KAX)sdpVmakg3!7$hLNnGkac>2} z(EVdn&yT9{lJ*JluX~8JgnF6Z+Z;E$p^A@AOfv)l`4T_#w+AX=^#%@}<`#;AfXP&K z*){`%?pU8bBuw}<_ShjMNS#jEv3zdfyz6ViA2CU|wnG;KPV!hrWA{0{jvslcr4)6r zPJ7!vSp+M5NguLH$NTJjGTT6)9B7}m1vN_Ro1s|^{~9)aM?N(z($TFX^16_kXt~pNw z{DyKLyvAH2Ati++-7q;6d71ZUxB!cTN;(2w1(4lsdKM?PvRKcJZf?O;5#bxI48ZP= zo7Ac#BY3y(&FCn-YBK0ib7HDH@fy(yL|+&WGwUf6+Lbheha)q|ghUmB1O_sxjZlGb z!?XBfBEDKv5(HYIr6>maC}_xgdr&8_zw2-VfibHASG^4k=a=L8_hve47LoBVfo{y0 z+f<&5k}2HwsA}Cq9Yc`aq3wt}!c)3yF_%epE3VD61m{r&)fGQ=1Am(^1WxK1xN$J4 z(DB49w`Pa^?bCLk`8B0~VY)mvC$w>lUhcHV>W>UgH7;XTujhluY*R|7*eA`ai%1qzE?CS`W%iPzH<*YX_AJ%} zF)gdRgo-J8uVkR+vESy1S5Mh^Do4qBl-g`>+f*OG&oZMC$zD*i$)Am6 zVMZd7Vb5ab&w{jTtP*Om2rE^$x?<kF|am@thWnApktT{O2IjDiH=n2JIM|pya2DzI*8rfAu9>UjSF%F7fz%`X?5X1{%NzB zp@mK*kOSiMGH}UU9fal1;vCI)4U^?*hhKNQ|G(Mf@FbKw$&h&B>POwb|1Wk7&*mC{wwau)-Ol*IN zy$eHGG)woA(5eq8KEoJHengAnYs&0CN4^kJ9e!EWW=6I&AZqa|9B6j1kV=)@lY|Ul zI4N)uiq>lo3(SN8wjMR_mIp6#%H2!u5{?$M39AKjevOiHuH@F)#1G`TnN13G5H_OX z8NSd%I?J<2cN_YOYnEpg{i#%C&0SNAzIHN?|AzjH+_4}jC+&P^AT~kORy8_4%lJ2j z*)nLkQ)<#hts9^Nf_-xM4{@T$)6QUEX*N#-@%H2LyeoMU?;22P15eA;PTm5ejo_G6 zz=3vSAArS}fBADg=xadYz zX3?ml$%g#t57)8cVwial@01fOkad3-g!hBOXC!`|MB%4;J&0HHHHWcdcoE%OT}Iw zpIYg)Ms-z8$+rVpHevB)A+@ag)Qv?mtM$g+(XL7G46aHxgx ztcp*LPME^`ZSYl1ga;`v$Bx1TYD;L=mj-d;aCssxojmY6jI9w3XkkRUHX3b=lP=#G zlil?fd;zNQj!00gd0vdg*`uvV98YZ`d^=$67qDTZhvc$QK*UaplGJe>oL9yzf=7fQsG4K=7;tz~=DQ?lF2|*kd|JuFrYPvZ@v(LKpOy`F{~HFW)&6 zcPWUm9#kp{gv-Y^i?mKt!3o!Oh*nj(TM9e+Hcl@@&+)y2R zSWwQ7i#yzeptys$A-cRjX zRxqAA5%&D0y8>@I)2B&i)o{V~wF3J|5I7pV@E0e8wbC>UAi#AxqwHvzZo;7wDf5YN z&b4g&%EU@$ zcQySzn*12@Ac=1h#gej}lfvsS{r7&Vlf2dqsaKlE<4UF!KQoV|k dnncY%!V)r+YgEWaa^s^04#dN@Ro0{{{{yBCJHY?| literal 0 HcmV?d00001 diff --git a/static/uview/example/template.png b/static/uview/example/template.png new file mode 100644 index 0000000000000000000000000000000000000000..5d27f97afafb96e733ae50f45cdcbe7eb00b4502 GIT binary patch literal 4097 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 X!|097^VM<*00000NkvXXu0mjfiSEVw literal 0 HcmV?d00001 diff --git a/store/$u.mixin.js b/store/$u.mixin.js new file mode 100644 index 0000000..61ae187 --- /dev/null +++ b/store/$u.mixin.js @@ -0,0 +1,27 @@ +import { mapState } from 'vuex' +import store from "@/store" + +// 尝试将用户在根目录中的store/index.js的vuex的state变量,全部加载到全局变量中 +let $uStoreKey = []; +try{ + $uStoreKey = store.state ? Object.keys(store.state) : []; +}catch(e){ + +} + +module.exports = { + beforeCreate() { + // 将vuex方法挂在到$u中 + // 使用方法为:如果要修改vuex的state中的user.name变量为"史诗" => this.$u.vuex('user.name', '史诗') + // 如果要修改vuex的state的version变量为1.0.1 => this.$u.vuex('version', '1.0.1') + this.$u.vuex = (name, value) => { + this.$store.commit('$uStore', { + name,value + }) + } + }, + computed: { + // 将vuex的state中的所有变量,解构到全局混入的mixin中 + ...mapState($uStoreKey) + } +} \ No newline at end of file diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..673b1e5 --- /dev/null +++ b/store/index.js @@ -0,0 +1,94 @@ +import Vue from 'vue' +import Vuex from 'vuex' +Vue.use(Vuex) + +let lifeData = {}; + +try{ + // 尝试获取本地是否存在lifeData变量,第一次启动APP时是不存在的 + lifeData = uni.getStorageSync('lifeData'); +}catch(e){ + +} + +// 需要永久存储,且下次APP启动需要取出的,在state中的变量名 +let saveStateKeys = ['vuex_user', 'vuex_token']; + +// 保存变量到本地存储中 +const saveLifeData = function(key, value){ + // 判断变量名是否在需要存储的数组中 + if(saveStateKeys.indexOf(key) != -1) { + // 获取本地存储的lifeData对象,将变量添加到对象中 + let tmp = uni.getStorageSync('lifeData'); + // 第一次打开APP,不存在lifeData变量,故放一个{}空对象 + tmp = tmp ? tmp : {}; + tmp[key] = value; + // 执行这一步后,所有需要存储的变量,都挂载在本地的lifeData对象中 + uni.setStorageSync('lifeData', tmp); + } +} +const store = new Vuex.Store({ + state: { + // 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量 + // 加上vuex_前缀,是防止变量名冲突,也让人一目了然 + vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {}, + vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '', + vuex_host: 'http://127.0.0.1:8000', + //vuex_api: 'http://47.95.0.242:9101/api', + vuex_api: 'http://127.0.0.1:8000/api', + // vuex_apifile: 'http://127.0.0.1:8000/api/file/', + + // vuex_host: 'https://testsearch.ctc.ac.cn', + // vuex_api: 'https://testsearch.ctc.ac.cn/api', + vuex_apifile: 'https://testsearch.ctc.ac.cn/api/file/', + + // 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式 + // vuex_version: '1.0.1', + // vuex_demo: '绛紫', + // 自定义tabbar数据 + // vuex_tabbar: [{ + // iconPath: "/static/uview/example/component.png", + // selectedIconPath: "/static/uview/example/component_select.png", + // text: '组件', + // pagePath: '/pages/example/components' + // }, + // { + // iconPath: "/static/uview/example/js.png", + // selectedIconPath: "/static/uview/example/js_select.png", + // text: '工具', + // midButton: true, + // pagePath: '/pages/example/js' + // }, + // { + // iconPath: "/static/uview/example/template.png", + // selectedIconPath: "/static/uview/example/template_select.png", + // text: '模板', + // pagePath: '/pages/example/template' + // } + // ] + }, + mutations: { + $uStore(state, payload) { + // 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1 + let nameArr = payload.name.split('.'); + let saveKey = ''; + let len = nameArr.length; + if(len >= 2) { + let obj = state[nameArr[0]]; + for(let i = 1; i < len - 1; i ++) { + obj = obj[nameArr[i]]; + } + obj[nameArr[len - 1]] = payload.value; + saveKey = nameArr[0]; + } else { + // 单层级变量,在state就是一个普通变量的情况 + state[payload.name] = payload.value; + saveKey = payload.name; + } + // 保存变量到本地,见顶部函数定义 + saveLifeData(saveKey, state[saveKey]) + } + } +}) + +export default store diff --git a/template.h5.html b/template.h5.html new file mode 100644 index 0000000..2656b09 --- /dev/null +++ b/template.h5.html @@ -0,0 +1,42 @@ + + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + + + + + + + + + +
+ + + + diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..8c223a7 --- /dev/null +++ b/uni.scss @@ -0,0 +1,7 @@ +/** + * 下方引入的为uView UI的集成样式文件,为scss预处理器,其中包含了一些"u-"开头的自定义变量 + * 使用的时候,请将下面的一行复制到您的uniapp项目根目录的uni.scss中即可 + * uView自定义的css类名和scss变量,均以"u-"开头,不会造成冲突,请放心使用 + */ +@import 'uview-ui/theme.scss'; + diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md new file mode 100644 index 0000000..47a930a --- /dev/null +++ b/uni_modules/uni-badge/changelog.md @@ -0,0 +1,16 @@ +## 1.1.3(2021-06-24) +- 优化 示例项目 +## 1.1.1(2021-05-12) +- 新增 组件示例地址 +## 1.1.0(2021-05-12) +- 新增 uni-badge 的 absolute 属性,支持定位 +- 新增 uni-badge 的 offset 属性,支持定位偏移 +- 新增 uni-badge 的 is-dot 属性,支持仅显示有一个小点 +- 新增 uni-badge 的 max-num 属性,支持自定义封顶的数字值,超过 99 显示99+ +- 优化 uni-badge 属性 custom-style, 支持以对象形式自定义样式 +## 1.0.7(2021-05-07) +- 修复 uni-badge 在 App 端,数字小于10时不是圆形的bug +- 修复 uni-badge 在父元素不是 flex 布局时,宽度缩小的bug +- 新增 uni-badge 属性 custom-style, 支持自定义样式 +## 1.0.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..efe2812 --- /dev/null +++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json new file mode 100644 index 0000000..c68bcc3 --- /dev/null +++ b/uni_modules/uni-badge/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-badge", + "displayName": "uni-badge 数字角标", + "version": "1.1.3", + "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。", + "keywords": [ + "", + "badge", + "uni-ui", + "uniui", + "数字角标", + "徽章" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "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": "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" + }, + "快应用": { + "华为": "y", + "联盟": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-badge/readme.md b/uni_modules/uni-badge/readme.md new file mode 100644 index 0000000..e035449 --- /dev/null +++ b/uni_modules/uni-badge/readme.md @@ -0,0 +1,58 @@ + + +## Badge 数字角标 +> **组件名:uni-badge** +> 代码块: `uBadge` + + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + + + + + +``` + + +## API + +### Badge Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|text |String |- |角标内容 | +|type |String |default|颜色类型,可选值:default(灰色)、primary(蓝色)、success(绿色)、warning(黄色)、error(红色)| +|size |String |normal |Badge 大小,可取值:normal、small | +|is-dot |Boolean|false |不展示数字,只有一个小点 | +|max-num |String/Numbuer|99 |展示封顶的数字值,超过 99 显示99+ | +|custom-style |Object | {} |自定义 Badge 样式, 样式对象语法 | +|inverted |Boolean|false |是否无需背景颜色,为 true 时,背景颜色将变为文字的字体颜色 | +|absolute |String| rightTop|开启绝对定位, 角标将定位到其包裹的标签的四个角上,可选值: rightTop(右上角)、rightBottom(右下角)、leftBottom(左下角) 、leftTop(左上角) | +|offset |Array[number]| [0, 0]|距定位角中心点的偏移量,[-10, -10] 表示向 absolute 指定的方向偏移 10px,[10, 10] 表示向 absolute 指定的反方向偏移 10px,只有存在 absolute 属性时有效,与absolute 的值一一对应(例如:值为rightTop, 对应 offset 为 [right, Top])| + +### Badge Events + +|事件名 |事件说明 |返回参数 | +|:-: |:-: |:-: | +|@click |点击 Badge 触发事件| - | + + + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/badge/badge](https://hellouniapp.dcloud.net.cn/pages/extUI/badge/badge) \ No newline at end of file diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md new file mode 100644 index 0000000..204f31b --- /dev/null +++ b/uni_modules/uni-icons/changelog.md @@ -0,0 +1,4 @@ +## 1.1.5(2021-05-12) +- 新增 组件示例地址 +## 1.1.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-icons/components/uni-icons/icons.js b/uni_modules/uni-icons/components/uni-icons/icons.js new file mode 100644 index 0000000..60b7332 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/icons.js @@ -0,0 +1,132 @@ +export default { + "pulldown": "\ue588", + "refreshempty": "\ue461", + "back": "\ue471", + "forward": "\ue470", + "more": "\ue507", + "more-filled": "\ue537", + "scan": "\ue612", + "qq": "\ue264", + "weibo": "\ue260", + "weixin": "\ue261", + "pengyouquan": "\ue262", + "loop": "\ue565", + "refresh": "\ue407", + "refresh-filled": "\ue437", + "arrowthindown": "\ue585", + "arrowthinleft": "\ue586", + "arrowthinright": "\ue587", + "arrowthinup": "\ue584", + "undo-filled": "\ue7d6", + "undo": "\ue406", + "redo": "\ue405", + "redo-filled": "\ue7d9", + "bars": "\ue563", + "chatboxes": "\ue203", + "camera": "\ue301", + "chatboxes-filled": "\ue233", + "camera-filled": "\ue7ef", + "cart-filled": "\ue7f4", + "cart": "\ue7f5", + "checkbox-filled": "\ue442", + "checkbox": "\ue7fa", + "arrowleft": "\ue582", + "arrowdown": "\ue581", + "arrowright": "\ue583", + "smallcircle-filled": "\ue801", + "arrowup": "\ue580", + "circle": "\ue411", + "eye-filled": "\ue568", + "eye-slash-filled": "\ue822", + "eye-slash": "\ue823", + "eye": "\ue824", + "flag-filled": "\ue825", + "flag": "\ue508", + "gear-filled": "\ue532", + "reload": "\ue462", + "gear": "\ue502", + "hand-thumbsdown-filled": "\ue83b", + "hand-thumbsdown": "\ue83c", + "hand-thumbsup-filled": "\ue83d", + "heart-filled": "\ue83e", + "hand-thumbsup": "\ue83f", + "heart": "\ue840", + "home": "\ue500", + "info": "\ue504", + "home-filled": "\ue530", + "info-filled": "\ue534", + "circle-filled": "\ue441", + "chat-filled": "\ue847", + "chat": "\ue263", + "mail-open-filled": "\ue84d", + "email-filled": "\ue231", + "mail-open": "\ue84e", + "email": "\ue201", + "checkmarkempty": "\ue472", + "list": "\ue562", + "locked-filled": "\ue856", + "locked": "\ue506", + "map-filled": "\ue85c", + "map-pin": "\ue85e", + "map-pin-ellipse": "\ue864", + "map": "\ue364", + "minus-filled": "\ue440", + "mic-filled": "\ue332", + "minus": "\ue410", + "micoff": "\ue360", + "mic": "\ue302", + "clear": "\ue434", + "smallcircle": "\ue868", + "close": "\ue404", + "closeempty": "\ue460", + "paperclip": "\ue567", + "paperplane": "\ue503", + "paperplane-filled": "\ue86e", + "person-filled": "\ue131", + "contact-filled": "\ue130", + "person": "\ue101", + "contact": "\ue100", + "images-filled": "\ue87a", + "phone": "\ue200", + "images": "\ue87b", + "image": "\ue363", + "image-filled": "\ue877", + "location-filled": "\ue333", + "location": "\ue303", + "plus-filled": "\ue439", + "plus": "\ue409", + "plusempty": "\ue468", + "help-filled": "\ue535", + "help": "\ue505", + "navigate-filled": "\ue884", + "navigate": "\ue501", + "mic-slash-filled": "\ue892", + "search": "\ue466", + "settings": "\ue560", + "sound": "\ue590", + "sound-filled": "\ue8a1", + "spinner-cycle": "\ue465", + "download-filled": "\ue8a4", + "personadd-filled": "\ue132", + "videocam-filled": "\ue8af", + "personadd": "\ue102", + "upload": "\ue402", + "upload-filled": "\ue8b1", + "starhalf": "\ue463", + "star-filled": "\ue438", + "star": "\ue408", + "trash": "\ue401", + "phone-filled": "\ue230", + "compose": "\ue400", + "videocam": "\ue300", + "trash-filled": "\ue8dc", + "download": "\ue403", + "chatbubble-filled": "\ue232", + "chatbubble": "\ue202", + "cloud-download": "\ue8e4", + "cloud-upload-filled": "\ue8e5", + "cloud-upload": "\ue8e6", + "cloud-download-filled": "\ue8e9", + "headphones":"\ue8bf", + "shop":"\ue609" +} diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..6319565 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uni.ttf b/uni_modules/uni-icons/components/uni-icons/uni.ttf new file mode 100644 index 0000000000000000000000000000000000000000..60a1968d08cc6056c70b5402b2effac43c6f96a3 GIT binary patch literal 26164 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 literal 0 HcmV?d00001 diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json new file mode 100644 index 0000000..c8e1224 --- /dev/null +++ b/uni_modules/uni-icons/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "1.1.5", + "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "图标" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "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": "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" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md new file mode 100644 index 0000000..8d56f42 --- /dev/null +++ b/uni_modules/uni-icons/readme.md @@ -0,0 +1,46 @@ + + +## Icons 图标 +> **组件名:uni-icons** +> 代码块: `uIcons` + + +用于展示 icons 图标 。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + +``` + + + +## API + +### Icons Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|size |Number |24 |图标大小 | +|type |String |- |图标图案,参考示例 | +|color |String |- |图标颜色 | + + +### Icons Events +|事件名 |说明 |返回值| +|:-: |:-: |:-: | +|@click|点击 Icon 触发事件|- | + + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/icons/icons](https://hellouniapp.dcloud.net.cn/pages/extUI/icons/icons) \ No newline at end of file diff --git a/uni_modules/uni-list/changelog.md b/uni_modules/uni-list/changelog.md new file mode 100644 index 0000000..e3338a9 --- /dev/null +++ b/uni_modules/uni-list/changelog.md @@ -0,0 +1,7 @@ +## 1.0.17(2021-05-12) +- 新增 组件示例地址 +## 1.0.16(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.15(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 uni-list-chat 角标显示不正常的问题 diff --git a/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue new file mode 100644 index 0000000..e256e4c --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss new file mode 100644 index 0000000..311f8d9 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss @@ -0,0 +1,58 @@ +/** + * 这里是 uni-list 组件内置的常用样式变量 + * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码 + * + */ + +// 背景色 +$background-color : #fff; +// 分割线颜色 +$divide-line-color : #e5e5e5; + +// 默认头像大小,如需要修改此值,注意同步修改 js 中的值 const avatarWidth = xx ,目前只支持方形头像 +// nvue 页面不支持修改头像大小 +$avatar-width : 45px ; + +// 头像边框 +$avatar-border-radius: 5px; +$avatar-border-color: #eee; +$avatar-border-width: 1px; + +// 标题文字样式 +$title-size : 16px; +$title-color : #3b4144; +$title-weight : normal; + +// 描述文字样式 +$note-size : 12px; +$note-color : #999; +$note-weight : normal; + +// 右侧额外内容默认样式 +$right-text-size : 12px; +$right-text-color : #999; +$right-text-weight : normal; + +// 角标样式 +// nvue 页面不支持修改圆点位置以及大小 +// 角标在左侧时,角标的位置,默认为 0 ,负数左/下移动,正数右/上移动 +$badge-left: 0px; +$badge-top: 0px; + +// 显示圆点时,圆点大小 +$dot-width: 10px; +$dot-height: 10px; + +// 显示角标时,角标大小和字体大小 +$badge-size : 18px; +$badge-font : 12px; +// 显示角标时,角标前景色 +$badge-color : #fff; +// 显示角标时,角标背景色 +$badge-background-color : #ff5a5f; +// 显示角标时,角标左右间距 +$badge-space : 6px; + +// 状态样式 +// 选中颜色 +$hover : #f5f5f5; diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue new file mode 100644 index 0000000..a2de186 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue @@ -0,0 +1,533 @@ + + + + + diff --git a/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue new file mode 100644 index 0000000..c0ba12e --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue @@ -0,0 +1,438 @@ + + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-list.vue b/uni_modules/uni-list/components/uni-list/uni-list.vue new file mode 100644 index 0000000..d478729 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list/uni-list.vue @@ -0,0 +1,106 @@ + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.vue b/uni_modules/uni-list/components/uni-list/uni-refresh.vue new file mode 100644 index 0000000..3b4c5a2 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list/uni-refresh.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.wxs b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs new file mode 100644 index 0000000..818a6b7 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs @@ -0,0 +1,87 @@ +var pullDown = { + threshold: 95, + maxHeight: 200, + callRefresh: 'onrefresh', + callPullingDown: 'onpullingdown', + refreshSelector: '.uni-refresh' +}; + +function ready(newValue, oldValue, ownerInstance, instance) { + var state = instance.getState() + state.canPullDown = newValue; + // console.log(newValue); +} + +function touchStart(e, instance) { + var state = instance.getState(); + state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); + state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); + if (!state.canPullDown) { + return + } + + // console.log("touchStart"); + + state.height = 0; + state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; + state.refreshInstance.setStyle({ + 'height': 0 + }); + state.refreshInstance.callMethod("onchange", true); +} + +function touchMove(e, ownerInstance) { + var instance = e.instance; + var state = instance.getState(); + if (!state.canPullDown) { + return + } + + var oldHeight = state.height; + var endY = e.touches[0].pageY || e.changedTouches[0].pageY; + var height = endY - state.touchStartY; + if (height > pullDown.maxHeight) { + return; + } + + var refreshInstance = state.refreshInstance; + refreshInstance.setStyle({ + 'height': height + 'px' + }); + + height = height < pullDown.maxHeight ? height : pullDown.maxHeight; + state.height = height; + refreshInstance.callMethod(pullDown.callPullingDown, { + height: height + }); +} + +function touchEnd(e, ownerInstance) { + var state = e.instance.getState(); + if (!state.canPullDown) { + return + } + + state.refreshInstance.callMethod("onchange", false); + + var refreshInstance = state.refreshInstance; + if (state.height > pullDown.threshold) { + refreshInstance.callMethod(pullDown.callRefresh); + return; + } + + refreshInstance.setStyle({ + 'height': 0 + }); +} + +function propObserver(newValue, oldValue, instance) { + pullDown = newValue; +} + +module.exports = { + touchmove: touchMove, + touchstart: touchStart, + touchend: touchEnd, + propObserver: propObserver +} diff --git a/uni_modules/uni-list/package.json b/uni_modules/uni-list/package.json new file mode 100644 index 0000000..3437e9e --- /dev/null +++ b/uni_modules/uni-list/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-list", + "displayName": "uni-list 列表", + "version": "1.0.17", + "description": "List 组件 ,帮助使用者快速构建列表。", + "keywords": [ + "", + "uni-ui", + "uniui", + "列表", + "", + "list" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "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": [ + "uni-badge", + "uni-icons" + ], + "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" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-list/readme.md b/uni_modules/uni-list/readme.md new file mode 100644 index 0000000..e4a5d73 --- /dev/null +++ b/uni_modules/uni-list/readme.md @@ -0,0 +1,347 @@ + + +## List 列表 +> **组件名:uni-list** +> 代码块: `uList`、`uListItem` +> 关联组件:`uni-list-item`、`uni-badge`、`uni-icons`、`uni-list-chat`、`uni-list-ad` + + +List 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容。 + +在vue页面里,它默认使用页面级滚动。在app-nvue页面里,它默认使用原生list组件滚动。这样的长列表,在滚动出屏幕外后,系统会回收不可见区域的渲染内存资源,不会造成滚动越长手机越卡的问题。 + +uni-list组件是父容器,里面的核心是uni-list-item子组件,它代表列表中的一个可重复行,子组件可以无限循环。 + +uni-list-item有很多风格,uni-list-item组件通过内置的属性,满足一些常用的场景。当内置属性不满足需求时,可以通过扩展插槽来自定义列表内容。 + +内置属性可以覆盖的场景包括:导航列表、设置列表、小图标列表、通信录列表、聊天记录列表。 + +涉及很多大图或丰富内容的列表,比如类今日头条的新闻列表、类淘宝的电商列表,需要通过扩展插槽实现。 + +下文均有样例给出。 + +uni-list不包含下拉刷新和上拉翻页。上拉翻页另见组件:[uni-load-more](https://ext.dcloud.net.cn/plugin?id=29) + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +> **注意事项** +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - 组件内部依赖 `'uni-icons'` 、`uni-badge` 组件 +> - `uni-list` 和 `uni-list-item` 需要配套使用,暂不支持单独使用 `uni-list-item` +> - 只有开启点击反馈后,会有点击选中效果 +> - 使用插槽时,可以完全自定义内容 +> - note 、rightText 属性暂时没做限制,不支持文字溢出隐藏,使用时应该控制长度显示或通过默认插槽自行扩展 +> - 支付宝小程序平台需要在支付宝小程序开发者工具里开启 component2 编译模式,开启方式: 详情 --> 项目配置 --> 启用 component2 编译 +> - 如果需要修改 `switch`、`badge` 样式,请使用插槽自定义 +> - 在 `HBuilderX` 低版本中,可能会出现组件显示 `undefined` 的问题,请升级最新的 `HBuilderX` 或者 `cli` +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + +### 基本用法 + +- 设置 `title` 属性,可以显示列表标题 +- 设置 `disabled` 属性,可以禁用当前项 + +```html + + + + + +``` + +### 多行内容显示 + +- 设置 `note` 属性 ,可以在第二行显示描述文本信息 + +```html + + + + + +``` + +### 右侧显示角标、switch + +- 设置 `show-badge` 属性 ,可以显示角标内容 +- 设置 `show-switch` 属性,可以显示 switch 开关 + +```html + + + + + +``` + +### 左侧显示略缩图、图标 + +- 设置 `thumb` 属性 ,可以在列表左侧显示略缩图 +- 设置 `show-extra-icon` 属性,并指定 `extra-icon` 可以在左侧显示图标 + +```html + + + + +``` + +### 开启点击反馈和右侧箭头 +- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 +- 设置 `link` 属性,会自动开启点击反馈,并给列表右侧添加一个箭头 +- 设置 `to` 属性,可以跳转页面,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` + +```html + + + + + + + +``` + + +### 聊天列表示例 +- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 +- 设置 `link` 属性,会自动开启点击反馈,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` +- 设置 `to` 属性,可以跳转页面 +- `time` 属性,通常会设置成时间显示,但是这个属性不仅仅可以设置时间,你可以传入任何文本,注意文本长度可能会影响显示 +- `avatar` 和 `avatarList` 属性同时只会有一个生效,同时设置的话,`avatarList` 属性的长度大于1 ,`avatar` 属性将失效 +- 可以通过默认插槽自定义列表右侧内容 + +```html + + + + + + + + + + + + + + + + + 刚刚 + + + + + + + +``` + +```javascript + +export default { + components: {}, + data() { + return { + avatarList: [{ + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }, { + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }, { + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }] + } + } +} + +``` + + +```css + +.chat-custom-right { + flex: 1; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; + justify-content: space-between; + align-items: flex-end; +} + +.chat-custom-text { + font-size: 12px; + color: #999; +} + +``` + +## API + +### List Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +border |Boolean |true | 是否显示边框 + + +### ListItem Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +title |String |- | 标题 +note |String |- | 描述 +ellipsis |Number |0 | title 是否溢出隐藏,可选值,0:默认; 1:显示一行; 2:显示两行;【nvue 暂不支持】 +thumb |String |- | 左侧缩略图,若thumb有值,则不会显示扩展图标 +thumbSize |String |medium | 略缩图尺寸,可选值,lg:大图; medium:一般; sm:小图; +showBadge |Boolean |false | 是否显示数字角标 +badgeText |String |- | 数字角标内容 +badgeType |String |- | 数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21) +rightText |String |- | 右侧文字内容 +disabled |Boolean |false | 是否禁用 +showArrow |Boolean |true | 是否显示箭头图标 +link |String |navigateTo | 新页面跳转方式,可选值见下表 +to |String |- | 新页面跳转地址,如填写此属性,click 会返回页面是否跳转成功 +clickable |Boolean |false | 是否开启点击反馈 +showSwitch |Boolean |false | 是否显示Switch +switchChecked |Boolean |false | Switch是否被选中 +showExtraIcon |Boolean |false | 左侧是否显示扩展图标 +extraIcon |Object |- | 扩展图标参数,格式为 ``{color: '#4cd964',size: '22',type: 'spinner'}``,参考 [uni-icons](https://ext.dcloud.net.cn/plugin?id=28) +direction | String |row | 排版方向,可选值,row:水平排列; column:垂直排列; 3个插槽是水平排还是垂直排,也受此属性控制 + + +#### Link Options + +属性名 | 说明 +:-: | :-: +navigateTo | 同 uni.navigateTo() +redirectTo | 同 uni.reLaunch() +reLaunch | 同 uni.reLaunch() +switchTab | 同 uni.switchTab() + +### ListItem Events + +事件称名 |说明 |返回参数 +:-: |:-: |:-: +click |点击 uniListItem 触发事件,需开启点击反馈 |- +switchChange |点击切换 Switch 时触发,需显示 switch |e={value:checked} + + + +### ListItem Slots + +名称 | 说明 +:-: | :-: +header | 左/上内容插槽,可完全自定义默认显示 +body | 中间内容插槽,可完全自定义中间内容 +footer | 右/下内容插槽,可完全自定义右侧内容 + + +> **通过插槽扩展** +> 需要注意的是当使用插槽时,内置样式将会失效,只保留排版样式,此时的样式需要开发者自己实现 +> 如果 `uni-list-item` 组件内置属性样式无法满足需求,可以使用插槽来自定义uni-list-item里的内容。 +> uni-list-item提供了3个可扩展的插槽:`header`、`body`、`footer` +> - 当 `direction` 属性为 `row` 时表示水平排列,此时 `header` 表示列表的左边部分,`body` 表示列表的中间部分,`footer` 表示列表的右边部分 +> - 当 `direction` 属性为 `column` 时表示垂直排列,此时 `header` 表示列表的上边部分,`body` 表示列表的中间部分,`footer` 表示列表的下边部分 +> 开发者可以只用1个插槽,也可以3个一起使用。在插槽中可自主编写view标签,实现自己所需的效果。 + + +**示例** + +```html + + + + + + + + + 自定义插槽 + + + + +``` + + + + + +### ListItemChat Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +title |String |- | 标题 +note |String |- | 描述 +clickable |Boolean |false | 是否开启点击反馈 +badgeText |String |- | 数字角标内容,设置为 `dot` 将显示圆点 +badgePositon |String |right | 角标位置 +link |String |navigateTo | 是否展示右侧箭头并开启点击反馈,可选值见下表 +clickable |Boolean |false | 是否开启点击反馈 +to |String |- | 跳转页面地址,如填写此属性,click 会返回页面是否跳转成功 +time |String |- | 右侧时间显示 +avatarCircle |Boolean |false | 是否显示圆形头像 +avatar |String |- | 头像地址,avatarCircle 不填时生效 +avatarList |Array |- | 头像组,格式为 [{url:''}] + +#### Link Options + +属性名 | 说明 +:-: | :-: +navigateTo | 同 uni.navigateTo() +redirectTo | 同 uni.reLaunch() +reLaunch | 同 uni.reLaunch() +switchTab | 同 uni.switchTab() + +### ListItemChat Slots + +名称 | 说明 +:- | :- +default | 自定义列表右侧内容(包括时间和角标显示) + +### ListItemChat Events +事件称名 | 说明 | 返回参数 +:-: | :-: | :-: +@click | 点击 uniListChat 触发事件 | {data:{}} ,如有 to 属性,会返回页面跳转信息 + + + + + + +## 基于uni-list扩展的页面模板 + +通过扩展插槽,可实现多种常见样式的列表 + +**新闻列表类** + +1. 云端一体混合布局:[https://ext.dcloud.net.cn/plugin?id=2546](https://ext.dcloud.net.cn/plugin?id=2546) +2. 云端一体垂直布局,大图模式:[https://ext.dcloud.net.cn/plugin?id=2583](https://ext.dcloud.net.cn/plugin?id=2583) +3. 云端一体垂直布局,多行图文混排:[https://ext.dcloud.net.cn/plugin?id=2584](https://ext.dcloud.net.cn/plugin?id=2584) +4. 云端一体垂直布局,多图模式:[https://ext.dcloud.net.cn/plugin?id=2585](https://ext.dcloud.net.cn/plugin?id=2585) +5. 云端一体水平布局,左图右文:[https://ext.dcloud.net.cn/plugin?id=2586](https://ext.dcloud.net.cn/plugin?id=2586) +6. 云端一体水平布局,左文右图:[https://ext.dcloud.net.cn/plugin?id=2587](https://ext.dcloud.net.cn/plugin?id=2587) +7. 云端一体垂直布局,无图模式,主标题+副标题:[https://ext.dcloud.net.cn/plugin?id=2588](https://ext.dcloud.net.cn/plugin?id=2588) + +**商品列表类** + +1. 云端一体列表/宫格视图互切:[https://ext.dcloud.net.cn/plugin?id=2651](https://ext.dcloud.net.cn/plugin?id=2651) +2. 云端一体列表(宫格模式):[https://ext.dcloud.net.cn/plugin?id=2671](https://ext.dcloud.net.cn/plugin?id=2671) +3. 云端一体列表(列表模式):[https://ext.dcloud.net.cn/plugin?id=2672](https://ext.dcloud.net.cn/plugin?id=2672) + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/list/list](https://hellouniapp.dcloud.net.cn/pages/extUI/list/list) \ No newline at end of file diff --git a/uni_modules/uni-search-bar/changelog.md b/uni_modules/uni-search-bar/changelog.md new file mode 100644 index 0000000..1ab3128 --- /dev/null +++ b/uni_modules/uni-search-bar/changelog.md @@ -0,0 +1,18 @@ +## 1.0.9(2021-05-12) +- 新增 项目示例地址 +## 1.0.8(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.7(2021-04-15) +- uni-ui 新增 uni-search-bar 的 focus 事件 + +## 1.0.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持双向绑定 +- 更改 input 事件的返回值,e={value:Number} --> e=value +- 新增 支持图标插槽 +- 新增 支持 clear、blur 事件 +- 新增 支持 focus 属性 +- 去掉组件背景色 diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue b/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue new file mode 100644 index 0000000..a0b0e53 --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/uni_modules/uni-search-bar/package.json b/uni_modules/uni-search-bar/package.json new file mode 100644 index 0000000..98f64a2 --- /dev/null +++ b/uni_modules/uni-search-bar/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-search-bar", + "displayName": "uni-search-bar 搜索栏", + "version": "1.0.9", + "description": "搜索栏组件,通常用于搜索商品、文章等", + "keywords": [ + "uni-ui", + "uniui", + "搜索框", + "搜索栏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "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": [ + "uni-icons" + ], + "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" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-search-bar/readme.md b/uni_modules/uni-search-bar/readme.md new file mode 100644 index 0000000..b39d6cf --- /dev/null +++ b/uni_modules/uni-search-bar/readme.md @@ -0,0 +1,86 @@ + + +## SearchBar 搜索栏 + +> **组件名:uni-search-bar** +> 代码块: `uSearchBar` + + +评分组件 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + + + + + + + + + +``` + + +## API +### SearchBar Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|value/v-model |StringNumber | |搜索栏绑定值 | +|placeholder |String |搜索 |搜索栏Placeholder | +|radius |Number |10 |搜索栏圆角,单位px | +|clearButton |String |auto |是否显示清除按钮,可选值`always`-一直显示、`auto`-输入框不为空时显示、`none`-一直不显示 | +|cancelButton |String |auto |是否显示取消按钮,可选值`always`-一直显示、`auto`-输入框不为空时显示、`none`-一直不显示 | +|cancelText |String |取消 |取消按钮的文字 | +|bgColor |String |#F8F8F8|输入框背景颜色 | +|maxlength |Number |100 |输入最大长度 | +|focus |Boolean |false | | + + +### SearchBar Events + +|事件称名 |说明 |返回参数 | +|:-: |:-: |:-: | +|@confirm |uniSearchBar 的输入框 confirm 事件,返回参数为uniSearchBar的value |e={value:Number} | +|@input |uniSearchBar 的 value 改变时触发事件,返回参数为uniSearchBar的value|e=value | +|@cancel |点击取消按钮时触发事件,返回参数为uniSearchBar的value |e={value:Number} | +|@clear |点击清除按钮时触发事件,返回参数为uniSearchBar的value |e={value:Number} | +|@focus |input 获取焦点时触发事件,返回参数为uniSearchBar的value |e={value:Number} | +|@blur |input 失去焦点时触发事件,返回参数为uniSearchBar的value |e={value:Number} | + +### 替换 icon 的 slot 插槽 + +|插槽称名 |说明 | +|:-: |:-: | +|searchIcon |替换组件的搜索图标| +|clearIcon |替换组件的清除图标| + +```html + + + + + + + + X + + +``` + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/search-bar/search-bar](https://hellouniapp.dcloud.net.cn/pages/extUI/search-bar/search-bar) \ No newline at end of file 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..2b30184 --- /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-circle-progress/u-line-progress/u-line-progress.vue b/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue new file mode 100644 index 0000000..77e2da2 --- /dev/null +++ b/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue @@ -0,0 +1,147 @@ + + + + + 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 @@ +