From 9721e1f9bed8815a9fb3c6e2b7cb24e110bffc60 Mon Sep 17 00:00:00 2001 From: liuchen864 <23082234@qq.com> Date: Sun, 24 Sep 2023 10:39:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 16 + App.vue | 34 + LICENSE | 21 + api/login.js | 34 + api/system/user.js | 42 + components/uni-section/uni-section.vue | 167 + components/verifition/Verify.vue | 469 ++ components/verifition/utils/ase.js | 14 + components/verifition/utils/request.js | 17 + .../verifition/verifyPoint/verifyPoint.vue | 557 +++ .../verifition/verifySlider/verifySlider.vue | 661 +++ config.js | 27 + main.js | 17 + manifest.json | 69 + package.json | 5 + pages.json | 97 + pages/common/textview/index.vue | 43 + pages/common/webview/index.vue | 34 + pages/index.vue | 43 + pages/login.vue | 168 + pages/mine/about/index.vue | 75 + pages/mine/avatar/index.vue | 631 +++ pages/mine/help/index.vue | 112 + pages/mine/index.vue | 198 + pages/mine/info/edit.vue | 128 + pages/mine/info/index.vue | 44 + pages/mine/pwd/index.vue | 85 + pages/mine/setting/index.vue | 78 + pages/work/index.vue | 183 + permission.js | 39 + plugins/auth.js | 60 + plugins/index.js | 14 + plugins/modal.js | 74 + plugins/tab.js | 30 + static/favicon.ico | Bin 0 -> 16958 bytes static/font/iconfont.css | 90 + static/font/iconfont.ttf | Bin 0 -> 6724 bytes static/images/banner/banner01.jpg | Bin 0 -> 44454 bytes static/images/banner/banner02.jpg | Bin 0 -> 37061 bytes static/images/banner/banner03.jpg | Bin 0 -> 38123 bytes static/images/default.jpg | Bin 0 -> 20200 bytes static/images/profile.jpg | Bin 0 -> 81131 bytes static/images/tabbar/home.png | Bin 0 -> 3265 bytes static/images/tabbar/home_.png | Bin 0 -> 3229 bytes static/images/tabbar/mine.png | Bin 0 -> 4235 bytes static/images/tabbar/mine_.png | Bin 0 -> 4219 bytes static/images/tabbar/work.png | Bin 0 -> 4108 bytes static/images/tabbar/work_.png | Bin 0 -> 5008 bytes static/index.html | 20 + static/logo.png | Bin 0 -> 5748 bytes static/logo200.png | Bin 0 -> 7995 bytes static/scss/colorui.css | 3912 +++++++++++++++++ static/scss/global.scss | 90 + static/scss/index.scss | 6 + store/getters.js | 8 + store/index.js | 15 + store/modules/user.js | 98 + uni.scss | 64 + uni_modules/uni-badge/changelog.md | 29 + .../components/uni-badge/uni-badge.vue | 268 ++ uni_modules/uni-badge/package.json | 88 + uni_modules/uni-badge/readme.md | 10 + uni_modules/uni-breadcrumb/changelog.md | 6 + .../uni-breadcrumb-item.vue | 121 + .../uni-breadcrumb/uni-breadcrumb.vue | 41 + uni_modules/uni-breadcrumb/package.json | 88 + uni_modules/uni-breadcrumb/readme.md | 66 + uni_modules/uni-calendar/changelog.md | 16 + .../components/uni-calendar/calendar.js | 546 +++ .../components/uni-calendar/i18n/en.json | 12 + .../components/uni-calendar/i18n/index.js | 8 + .../components/uni-calendar/i18n/zh-Hans.json | 12 + .../components/uni-calendar/i18n/zh-Hant.json | 12 + .../uni-calendar/uni-calendar-item.vue | 188 + .../components/uni-calendar/uni-calendar.vue | 562 +++ .../components/uni-calendar/util.js | 350 ++ uni_modules/uni-calendar/package.json | 88 + uni_modules/uni-calendar/readme.md | 103 + uni_modules/uni-card/changelog.md | 26 + .../uni-card/components/uni-card/uni-card.vue | 270 ++ uni_modules/uni-card/package.json | 90 + uni_modules/uni-card/readme.md | 12 + uni_modules/uni-collapse/changelog.md | 36 + .../uni-collapse-item/uni-collapse-item.vue | 402 ++ .../components/uni-collapse/uni-collapse.vue | 147 + uni_modules/uni-collapse/package.json | 89 + uni_modules/uni-collapse/readme.md | 12 + uni_modules/uni-combox/changelog.md | 15 + .../components/uni-combox/uni-combox.vue | 275 ++ uni_modules/uni-combox/package.json | 90 + uni_modules/uni-combox/readme.md | 11 + uni_modules/uni-countdown/changelog.md | 24 + .../components/uni-countdown/i18n/en.json | 6 + .../components/uni-countdown/i18n/index.js | 8 + .../uni-countdown/i18n/zh-Hans.json | 6 + .../uni-countdown/i18n/zh-Hant.json | 6 + .../uni-countdown/uni-countdown.vue | 271 ++ uni_modules/uni-countdown/package.json | 86 + uni_modules/uni-countdown/readme.md | 10 + uni_modules/uni-data-checkbox/changelog.md | 43 + .../uni-data-checkbox/uni-data-checkbox.vue | 817 ++++ uni_modules/uni-data-checkbox/package.json | 87 + uni_modules/uni-data-checkbox/readme.md | 18 + uni_modules/uni-data-picker/changelog.md | 64 + .../components/uni-data-picker/keypress.js | 45 + .../uni-data-picker/uni-data-picker.vue | 554 +++ .../uni-data-pickerview/uni-data-picker.js | 563 +++ .../uni-data-pickerview.vue | 333 ++ uni_modules/uni-data-picker/package.json | 93 + uni_modules/uni-data-picker/readme.md | 22 + uni_modules/uni-data-select/changelog.md | 16 + .../uni-data-select/uni-data-select.vue | 426 ++ uni_modules/uni-data-select/package.json | 88 + uni_modules/uni-data-select/readme.md | 8 + uni_modules/uni-dateformat/changelog.md | 10 + .../components/uni-dateformat/date-format.js | 200 + .../uni-dateformat/uni-dateformat.vue | 88 + uni_modules/uni-dateformat/package.json | 88 + uni_modules/uni-dateformat/readme.md | 11 + uni_modules/uni-datetime-picker/changelog.md | 93 + .../uni-datetime-picker/calendar-item.vue | 185 + .../uni-datetime-picker/calendar.vue | 907 ++++ .../uni-datetime-picker/i18n/en.json | 22 + .../uni-datetime-picker/i18n/index.js | 8 + .../uni-datetime-picker/i18n/zh-Hans.json | 22 + .../uni-datetime-picker/i18n/zh-Hant.json | 22 + .../uni-datetime-picker/keypress.js | 45 + .../uni-datetime-picker/time-picker.vue | 927 ++++ .../uni-datetime-picker.vue | 1012 +++++ .../components/uni-datetime-picker/util.js | 410 ++ uni_modules/uni-datetime-picker/package.json | 90 + uni_modules/uni-datetime-picker/readme.md | 21 + uni_modules/uni-drawer/changelog.md | 13 + .../components/uni-drawer/keypress.js | 45 + .../components/uni-drawer/uni-drawer.vue | 183 + uni_modules/uni-drawer/package.json | 87 + uni_modules/uni-drawer/readme.md | 10 + uni_modules/uni-easyinput/changelog.md | 47 + .../components/uni-easyinput/common.js | 56 + .../uni-easyinput/uni-easyinput.vue | 593 +++ uni_modules/uni-easyinput/package.json | 90 + uni_modules/uni-easyinput/readme.md | 11 + uni_modules/uni-fab/changelog.md | 17 + .../uni-fab/components/uni-fab/uni-fab.vue | 475 ++ uni_modules/uni-fab/package.json | 87 + uni_modules/uni-fab/readme.md | 9 + uni_modules/uni-fav/changelog.md | 19 + .../uni-fav/components/uni-fav/i18n/en.json | 4 + .../uni-fav/components/uni-fav/i18n/index.js | 8 + .../components/uni-fav/i18n/zh-Hans.json | 4 + .../components/uni-fav/i18n/zh-Hant.json | 4 + .../uni-fav/components/uni-fav/uni-fav.vue | 161 + uni_modules/uni-fav/package.json | 89 + uni_modules/uni-fav/readme.md | 10 + uni_modules/uni-file-picker/changelog.md | 63 + .../uni-file-picker/choose-and-upload-file.js | 224 + .../uni-file-picker/uni-file-picker.vue | 656 +++ .../uni-file-picker/upload-file.vue | 325 ++ .../uni-file-picker/upload-image.vue | 292 ++ .../components/uni-file-picker/utils.js | 109 + uni_modules/uni-file-picker/package.json | 86 + uni_modules/uni-file-picker/readme.md | 11 + uni_modules/uni-forms/changelog.md | 86 + .../uni-forms-item/uni-forms-item.vue | 627 +++ .../components/uni-forms/uni-forms.vue | 397 ++ .../uni-forms/components/uni-forms/utils.js | 293 ++ .../components/uni-forms/validate.js | 486 ++ uni_modules/uni-forms/package.json | 91 + uni_modules/uni-forms/readme.md | 23 + uni_modules/uni-goods-nav/changelog.md | 18 + .../components/uni-goods-nav/i18n/en.json | 6 + .../components/uni-goods-nav/i18n/index.js | 8 + .../uni-goods-nav/i18n/zh-Hans.json | 6 + .../uni-goods-nav/i18n/zh-Hant.json | 6 + .../uni-goods-nav/uni-goods-nav.vue | 229 + uni_modules/uni-goods-nav/package.json | 88 + uni_modules/uni-goods-nav/readme.md | 10 + uni_modules/uni-grid/changelog.md | 13 + .../uni-grid-item/uni-grid-item.vue | 127 + .../uni-grid/components/uni-grid/uni-grid.vue | 142 + uni_modules/uni-grid/package.json | 86 + uni_modules/uni-grid/readme.md | 11 + uni_modules/uni-group/changelog.md | 16 + .../components/uni-group/uni-group.vue | 134 + uni_modules/uni-group/package.json | 87 + uni_modules/uni-group/readme.md | 9 + uni_modules/uni-icons/changelog.md | 22 + .../uni-icons/components/uni-icons/icons.js | 1169 +++++ .../components/uni-icons/uni-icons.vue | 96 + .../components/uni-icons/uniicons.css | 663 +++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35760 bytes uni_modules/uni-icons/package.json | 86 + uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-indexed-list/changelog.md | 17 + .../uni-indexed-list-item.vue | 144 + .../uni-indexed-list/uni-indexed-list.vue | 367 ++ uni_modules/uni-indexed-list/package.json | 89 + uni_modules/uni-indexed-list/readme.md | 11 + uni_modules/uni-link/changelog.md | 17 + .../uni-link/components/uni-link/uni-link.vue | 128 + uni_modules/uni-link/package.json | 87 + uni_modules/uni-link/readme.md | 11 + uni_modules/uni-list/changelog.md | 20 + .../components/uni-list-ad/uni-list-ad.vue | 107 + .../uni-list-chat/uni-list-chat.scss | 58 + .../uni-list-chat/uni-list-chat.vue | 538 +++ .../uni-list-item/uni-list-item.vue | 454 ++ .../uni-list/components/uni-list/uni-list.vue | 108 + .../components/uni-list/uni-refresh.vue | 65 + .../components/uni-list/uni-refresh.wxs | 87 + uni_modules/uni-list/package.json | 91 + uni_modules/uni-list/readme.md | 346 ++ uni_modules/uni-load-more/changelog.md | 19 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 399 ++ uni_modules/uni-load-more/package.json | 86 + uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-nav-bar/changelog.md | 41 + .../components/uni-nav-bar/uni-nav-bar.vue | 348 ++ .../components/uni-nav-bar/uni-status-bar.vue | 27 + uni_modules/uni-nav-bar/package.json | 89 + uni_modules/uni-nav-bar/readme.md | 15 + uni_modules/uni-notice-bar/changelog.md | 16 + .../uni-notice-bar/uni-notice-bar.vue | 395 ++ uni_modules/uni-notice-bar/package.json | 90 + uni_modules/uni-notice-bar/readme.md | 13 + uni_modules/uni-number-box/changelog.md | 25 + .../uni-number-box/uni-number-box.vue | 221 + uni_modules/uni-number-box/package.json | 85 + uni_modules/uni-number-box/readme.md | 13 + uni_modules/uni-pagination/changelog.md | 20 + .../components/uni-pagination/i18n/en.json | 4 + .../components/uni-pagination/i18n/es.json | 4 + .../components/uni-pagination/i18n/fr.json | 4 + .../components/uni-pagination/i18n/index.js | 12 + .../uni-pagination/i18n/zh-Hans.json | 4 + .../uni-pagination/i18n/zh-Hant.json | 4 + .../uni-pagination/uni-pagination.vue | 409 ++ uni_modules/uni-pagination/package.json | 86 + uni_modules/uni-pagination/readme.md | 13 + uni_modules/uni-popup/changelog.md | 60 + .../components/uni-popup-dialog/keypress.js | 45 + .../uni-popup-dialog/uni-popup-dialog.vue | 271 ++ .../uni-popup-message/uni-popup-message.vue | 143 + .../uni-popup-share/uni-popup-share.vue | 187 + .../components/uni-popup/i18n/en.json | 7 + .../components/uni-popup/i18n/index.js | 8 + .../components/uni-popup/i18n/zh-Hans.json | 7 + .../components/uni-popup/i18n/zh-Hant.json | 7 + .../components/uni-popup/keypress.js | 45 + .../uni-popup/components/uni-popup/popup.js | 26 + .../components/uni-popup/uni-popup.vue | 474 ++ uni_modules/uni-popup/package.json | 90 + uni_modules/uni-popup/readme.md | 17 + uni_modules/uni-rate/changelog.md | 25 + .../uni-rate/components/uni-rate/uni-rate.vue | 361 ++ uni_modules/uni-rate/package.json | 88 + uni_modules/uni-rate/readme.md | 12 + uni_modules/uni-row/changelog.md | 10 + .../uni-row/components/uni-col/uni-col.vue | 317 ++ .../uni-row/components/uni-row/uni-row.vue | 190 + uni_modules/uni-row/package.json | 87 + uni_modules/uni-row/readme.md | 10 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 + .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uni-search-bar/changelog.md | 33 + .../components/uni-search-bar/i18n/en.json | 4 + .../components/uni-search-bar/i18n/index.js | 8 + .../uni-search-bar/i18n/zh-Hans.json | 4 + .../uni-search-bar/i18n/zh-Hant.json | 4 + .../uni-search-bar/uni-search-bar.vue | 298 ++ uni_modules/uni-search-bar/package.json | 89 + uni_modules/uni-search-bar/readme.md | 14 + .../uni-segmented-control/changelog.md | 9 + .../uni-segmented-control.vue | 145 + .../uni-segmented-control/package.json | 87 + uni_modules/uni-segmented-control/readme.md | 13 + uni_modules/uni-steps/changelog.md | 16 + .../components/uni-steps/uni-steps.vue | 269 ++ uni_modules/uni-steps/package.json | 89 + uni_modules/uni-steps/readme.md | 13 + uni_modules/uni-swipe-action/changelog.md | 41 + .../uni-swipe-action-item/bindingx.js | 302 ++ .../components/uni-swipe-action-item/isPC.js | 12 + .../uni-swipe-action-item/mpalipay.js | 193 + .../uni-swipe-action-item/mpother.js | 259 ++ .../components/uni-swipe-action-item/mpwxs.js | 83 + .../uni-swipe-action-item/render.js | 270 ++ .../uni-swipe-action-item.vue | 347 ++ .../components/uni-swipe-action-item/wx.wxs | 341 ++ .../uni-swipe-action/uni-swipe-action.vue | 60 + uni_modules/uni-swipe-action/package.json | 87 + uni_modules/uni-swipe-action/readme.md | 11 + uni_modules/uni-swiper-dot/changelog.md | 12 + .../uni-swiper-dot/uni-swiper-dot.vue | 218 + uni_modules/uni-swiper-dot/package.json | 87 + uni_modules/uni-swiper-dot/readme.md | 11 + uni_modules/uni-table/changelog.md | 23 + .../components/uni-table/uni-table.vue | 455 ++ .../components/uni-tbody/uni-tbody.vue | 29 + .../uni-table/components/uni-td/uni-td.vue | 90 + .../components/uni-th/filter-dropdown.vue | 503 +++ .../uni-table/components/uni-th/uni-th.vue | 278 ++ .../components/uni-thead/uni-thead.vue | 129 + .../components/uni-tr/table-checkbox.vue | 179 + .../uni-table/components/uni-tr/uni-tr.vue | 171 + uni_modules/uni-table/i18n/en.json | 9 + uni_modules/uni-table/i18n/es.json | 9 + uni_modules/uni-table/i18n/fr.json | 9 + uni_modules/uni-table/i18n/index.js | 12 + uni_modules/uni-table/i18n/zh-Hans.json | 9 + uni_modules/uni-table/i18n/zh-Hant.json | 9 + uni_modules/uni-table/package.json | 86 + uni_modules/uni-table/readme.md | 13 + uni_modules/uni-tag/changelog.md | 21 + .../uni-tag/components/uni-tag/uni-tag.vue | 252 ++ uni_modules/uni-tag/package.json | 87 + uni_modules/uni-tag/readme.md | 13 + uni_modules/uni-title/changelog.md | 10 + .../components/uni-title/uni-title.vue | 171 + uni_modules/uni-title/package.json | 88 + uni_modules/uni-title/readme.md | 14 + uni_modules/uni-tooltip/changelog.md | 10 + .../components/uni-tooltip/uni-tooltip.vue | 68 + uni_modules/uni-tooltip/package.json | 88 + uni_modules/uni-tooltip/readme.md | 8 + uni_modules/uni-transition/changelog.md | 20 + .../uni-transition/createAnimation.js | 128 + .../uni-transition/uni-transition.vue | 277 ++ uni_modules/uni-transition/package.json | 87 + uni_modules/uni-transition/readme.md | 11 + utils/auth.js | 22 + utils/common.js | 54 + utils/constant.js | 8 + utils/errorCode.js | 6 + utils/permission.js | 51 + utils/request.js | 76 + utils/ruoyi.js | 47 + utils/storage.js | 33 + utils/upload.js | 73 + 356 files changed, 44871 insertions(+) create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 LICENSE create mode 100644 api/login.js create mode 100644 api/system/user.js create mode 100644 components/uni-section/uni-section.vue create mode 100644 components/verifition/Verify.vue create mode 100644 components/verifition/utils/ase.js create mode 100644 components/verifition/utils/request.js create mode 100644 components/verifition/verifyPoint/verifyPoint.vue create mode 100644 components/verifition/verifySlider/verifySlider.vue create mode 100644 config.js create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/common/textview/index.vue create mode 100644 pages/common/webview/index.vue create mode 100644 pages/index.vue create mode 100644 pages/login.vue create mode 100644 pages/mine/about/index.vue create mode 100644 pages/mine/avatar/index.vue create mode 100644 pages/mine/help/index.vue create mode 100644 pages/mine/index.vue create mode 100644 pages/mine/info/edit.vue create mode 100644 pages/mine/info/index.vue create mode 100644 pages/mine/pwd/index.vue create mode 100644 pages/mine/setting/index.vue create mode 100644 pages/work/index.vue create mode 100644 permission.js create mode 100644 plugins/auth.js create mode 100644 plugins/index.js create mode 100644 plugins/modal.js create mode 100644 plugins/tab.js create mode 100644 static/favicon.ico create mode 100644 static/font/iconfont.css create mode 100644 static/font/iconfont.ttf create mode 100644 static/images/banner/banner01.jpg create mode 100644 static/images/banner/banner02.jpg create mode 100644 static/images/banner/banner03.jpg create mode 100644 static/images/default.jpg create mode 100644 static/images/profile.jpg create mode 100644 static/images/tabbar/home.png create mode 100644 static/images/tabbar/home_.png create mode 100644 static/images/tabbar/mine.png create mode 100644 static/images/tabbar/mine_.png create mode 100644 static/images/tabbar/work.png create mode 100644 static/images/tabbar/work_.png create mode 100644 static/index.html create mode 100644 static/logo.png create mode 100644 static/logo200.png create mode 100644 static/scss/colorui.css create mode 100644 static/scss/global.scss create mode 100644 static/scss/index.scss create mode 100644 store/getters.js create mode 100644 store/index.js create mode 100644 store/modules/user.js 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-breadcrumb/changelog.md create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue create mode 100644 uni_modules/uni-breadcrumb/package.json create mode 100644 uni_modules/uni-breadcrumb/readme.md create mode 100644 uni_modules/uni-calendar/changelog.md create mode 100644 uni_modules/uni-calendar/components/uni-calendar/calendar.js create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/en.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/index.js create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/util.js create mode 100644 uni_modules/uni-calendar/package.json create mode 100644 uni_modules/uni-calendar/readme.md create mode 100644 uni_modules/uni-card/changelog.md create mode 100644 uni_modules/uni-card/components/uni-card/uni-card.vue create mode 100644 uni_modules/uni-card/package.json create mode 100644 uni_modules/uni-card/readme.md create mode 100644 uni_modules/uni-collapse/changelog.md create mode 100644 uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue create mode 100644 uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue create mode 100644 uni_modules/uni-collapse/package.json create mode 100644 uni_modules/uni-collapse/readme.md create mode 100644 uni_modules/uni-combox/changelog.md create mode 100644 uni_modules/uni-combox/components/uni-combox/uni-combox.vue create mode 100644 uni_modules/uni-combox/package.json create mode 100644 uni_modules/uni-combox/readme.md create mode 100644 uni_modules/uni-countdown/changelog.md create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/en.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/index.js create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue create mode 100644 uni_modules/uni-countdown/package.json create mode 100644 uni_modules/uni-countdown/readme.md create mode 100644 uni_modules/uni-data-checkbox/changelog.md create mode 100644 uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue create mode 100644 uni_modules/uni-data-checkbox/package.json create mode 100644 uni_modules/uni-data-checkbox/readme.md create mode 100644 uni_modules/uni-data-picker/changelog.md create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/keypress.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 uni_modules/uni-data-picker/package.json create mode 100644 uni_modules/uni-data-picker/readme.md create mode 100644 uni_modules/uni-data-select/changelog.md create mode 100644 uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue create mode 100644 uni_modules/uni-data-select/package.json create mode 100644 uni_modules/uni-data-select/readme.md create mode 100644 uni_modules/uni-dateformat/changelog.md create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/date-format.js create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue create mode 100644 uni_modules/uni-dateformat/package.json create mode 100644 uni_modules/uni-dateformat/readme.md create mode 100644 uni_modules/uni-datetime-picker/changelog.md create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js create mode 100644 uni_modules/uni-datetime-picker/package.json create mode 100644 uni_modules/uni-datetime-picker/readme.md create mode 100644 uni_modules/uni-drawer/changelog.md create mode 100644 uni_modules/uni-drawer/components/uni-drawer/keypress.js create mode 100644 uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue create mode 100644 uni_modules/uni-drawer/package.json create mode 100644 uni_modules/uni-drawer/readme.md create mode 100644 uni_modules/uni-easyinput/changelog.md create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/common.js create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue create mode 100644 uni_modules/uni-easyinput/package.json create mode 100644 uni_modules/uni-easyinput/readme.md create mode 100644 uni_modules/uni-fab/changelog.md create mode 100644 uni_modules/uni-fab/components/uni-fab/uni-fab.vue create mode 100644 uni_modules/uni-fab/package.json create mode 100644 uni_modules/uni-fab/readme.md create mode 100644 uni_modules/uni-fav/changelog.md create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/en.json create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/index.js create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json create mode 100644 uni_modules/uni-fav/components/uni-fav/uni-fav.vue create mode 100644 uni_modules/uni-fav/package.json create mode 100644 uni_modules/uni-fav/readme.md create mode 100644 uni_modules/uni-file-picker/changelog.md create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/utils.js create mode 100644 uni_modules/uni-file-picker/package.json create mode 100644 uni_modules/uni-file-picker/readme.md create mode 100644 uni_modules/uni-forms/changelog.md create mode 100644 uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/uni-forms.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/utils.js create mode 100644 uni_modules/uni-forms/components/uni-forms/validate.js create mode 100644 uni_modules/uni-forms/package.json create mode 100644 uni_modules/uni-forms/readme.md create mode 100644 uni_modules/uni-goods-nav/changelog.md create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue create mode 100644 uni_modules/uni-goods-nav/package.json create mode 100644 uni_modules/uni-goods-nav/readme.md create mode 100644 uni_modules/uni-grid/changelog.md create mode 100644 uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue create mode 100644 uni_modules/uni-grid/components/uni-grid/uni-grid.vue create mode 100644 uni_modules/uni-grid/package.json create mode 100644 uni_modules/uni-grid/readme.md create mode 100644 uni_modules/uni-group/changelog.md create mode 100644 uni_modules/uni-group/components/uni-group/uni-group.vue create mode 100644 uni_modules/uni-group/package.json create mode 100644 uni_modules/uni-group/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/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.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-indexed-list/changelog.md create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue create mode 100644 uni_modules/uni-indexed-list/package.json create mode 100644 uni_modules/uni-indexed-list/readme.md create mode 100644 uni_modules/uni-link/changelog.md create mode 100644 uni_modules/uni-link/components/uni-link/uni-link.vue create mode 100644 uni_modules/uni-link/package.json create mode 100644 uni_modules/uni-link/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-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-nav-bar/changelog.md create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue create mode 100644 uni_modules/uni-nav-bar/package.json create mode 100644 uni_modules/uni-nav-bar/readme.md create mode 100644 uni_modules/uni-notice-bar/changelog.md create mode 100644 uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue create mode 100644 uni_modules/uni-notice-bar/package.json create mode 100644 uni_modules/uni-notice-bar/readme.md create mode 100644 uni_modules/uni-number-box/changelog.md create mode 100644 uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue create mode 100644 uni_modules/uni-number-box/package.json create mode 100644 uni_modules/uni-number-box/readme.md create mode 100644 uni_modules/uni-pagination/changelog.md create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/en.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/es.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/index.js create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue create mode 100644 uni_modules/uni-pagination/package.json create mode 100644 uni_modules/uni-pagination/readme.md create mode 100644 uni_modules/uni-popup/changelog.md create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/en.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/index.js create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json create mode 100644 uni_modules/uni-popup/components/uni-popup/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup/popup.js create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.vue create mode 100644 uni_modules/uni-popup/package.json create mode 100644 uni_modules/uni-popup/readme.md create mode 100644 uni_modules/uni-rate/changelog.md create mode 100644 uni_modules/uni-rate/components/uni-rate/uni-rate.vue create mode 100644 uni_modules/uni-rate/package.json create mode 100644 uni_modules/uni-rate/readme.md create mode 100644 uni_modules/uni-row/changelog.md create mode 100644 uni_modules/uni-row/components/uni-col/uni-col.vue create mode 100644 uni_modules/uni-row/components/uni-row/uni-row.vue create mode 100644 uni_modules/uni-row/package.json create mode 100644 uni_modules/uni-row/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/uni-search-bar/changelog.md create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json 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 uni_modules/uni-segmented-control/changelog.md create mode 100644 uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue create mode 100644 uni_modules/uni-segmented-control/package.json create mode 100644 uni_modules/uni-segmented-control/readme.md create mode 100644 uni_modules/uni-steps/changelog.md create mode 100644 uni_modules/uni-steps/components/uni-steps/uni-steps.vue create mode 100644 uni_modules/uni-steps/package.json create mode 100644 uni_modules/uni-steps/readme.md create mode 100644 uni_modules/uni-swipe-action/changelog.md create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue create mode 100644 uni_modules/uni-swipe-action/package.json create mode 100644 uni_modules/uni-swipe-action/readme.md create mode 100644 uni_modules/uni-swiper-dot/changelog.md create mode 100644 uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue create mode 100644 uni_modules/uni-swiper-dot/package.json create mode 100644 uni_modules/uni-swiper-dot/readme.md create mode 100644 uni_modules/uni-table/changelog.md create mode 100644 uni_modules/uni-table/components/uni-table/uni-table.vue create mode 100644 uni_modules/uni-table/components/uni-tbody/uni-tbody.vue create mode 100644 uni_modules/uni-table/components/uni-td/uni-td.vue create mode 100644 uni_modules/uni-table/components/uni-th/filter-dropdown.vue create mode 100644 uni_modules/uni-table/components/uni-th/uni-th.vue create mode 100644 uni_modules/uni-table/components/uni-thead/uni-thead.vue create mode 100644 uni_modules/uni-table/components/uni-tr/table-checkbox.vue create mode 100644 uni_modules/uni-table/components/uni-tr/uni-tr.vue create mode 100644 uni_modules/uni-table/i18n/en.json create mode 100644 uni_modules/uni-table/i18n/es.json create mode 100644 uni_modules/uni-table/i18n/fr.json create mode 100644 uni_modules/uni-table/i18n/index.js create mode 100644 uni_modules/uni-table/i18n/zh-Hans.json create mode 100644 uni_modules/uni-table/i18n/zh-Hant.json create mode 100644 uni_modules/uni-table/package.json create mode 100644 uni_modules/uni-table/readme.md create mode 100644 uni_modules/uni-tag/changelog.md create mode 100644 uni_modules/uni-tag/components/uni-tag/uni-tag.vue create mode 100644 uni_modules/uni-tag/package.json create mode 100644 uni_modules/uni-tag/readme.md create mode 100644 uni_modules/uni-title/changelog.md create mode 100644 uni_modules/uni-title/components/uni-title/uni-title.vue create mode 100644 uni_modules/uni-title/package.json create mode 100644 uni_modules/uni-title/readme.md create mode 100644 uni_modules/uni-tooltip/changelog.md create mode 100644 uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue create mode 100644 uni_modules/uni-tooltip/package.json create mode 100644 uni_modules/uni-tooltip/readme.md create mode 100644 uni_modules/uni-transition/changelog.md create mode 100644 uni_modules/uni-transition/components/uni-transition/createAnimation.js create mode 100644 uni_modules/uni-transition/components/uni-transition/uni-transition.vue create mode 100644 uni_modules/uni-transition/package.json create mode 100644 uni_modules/uni-transition/readme.md create mode 100644 utils/auth.js create mode 100644 utils/common.js create mode 100644 utils/constant.js create mode 100644 utils/errorCode.js create mode 100644 utils/permission.js create mode 100644 utils/request.js create mode 100644 utils/ruoyi.js create mode 100644 utils/storage.js create mode 100644 utils/upload.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..59c91545 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +###################################################################### +# Build Tools + +/unpackage/* +/node_modules/* + +###################################################################### +# Development Tools + +/.idea/* +/.vscode/* +/.hbuilderx/* + +package-lock.json +yarn.lock + diff --git a/App.vue b/App.vue new file mode 100644 index 00000000..93318b58 --- /dev/null +++ b/App.vue @@ -0,0 +1,34 @@ + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..458a14c9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 闻荫 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/api/login.js b/api/login.js new file mode 100644 index 00000000..b79fd078 --- /dev/null +++ b/api/login.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +// 登录方法 +export function login(username, password, captchaVerification) { + const data = { + username, + password, + captchaVerification + } + return request({ + url: '/system/auth/login', + headers: { + isToken: false + }, + 'method': 'POST', + 'data': data + }) +} + +// 获取用户详细信息 +export function getInfo() { + return request({ + url: '/system/auth/get-permission-info', + 'method': 'GET' + }) +} + +// 退出方法 +export function logout() { + return request({ + url: '/system/auth/logout', + 'method': 'POST' + }) +} diff --git a/api/system/user.js b/api/system/user.js new file mode 100644 index 00000000..59e9304c --- /dev/null +++ b/api/system/user.js @@ -0,0 +1,42 @@ +import upload from '@/utils/upload' +import request from '@/utils/request' + +// 用户密码重置 +export function updateUserPwd(oldPassword, newPassword) { + const data = { + oldPassword, + newPassword + } + return request({ + url: '/system/user/profile/update-password', + method: 'PUT', + params: data + }) +} + +// 查询用户个人信息 +export function getUserProfile() { + return request({ + url: '/system/user/profile/get', + method: 'GET' + }) +} + +// 修改用户个人信息 +export function updateUserProfile(data) { + return request({ + url: '/system/user/profile/update', + method: 'PUT', + data: data + }) +} + +// 用户头像上传 +export function uploadAvatar(data) { + return upload({ + url: '/system/user/profile/update-avatar', + method: 'PUT', + name: data.name, + filePath: data.filePath + }) +} diff --git a/components/uni-section/uni-section.vue b/components/uni-section/uni-section.vue new file mode 100644 index 00000000..9a52e0b8 --- /dev/null +++ b/components/uni-section/uni-section.vue @@ -0,0 +1,167 @@ + + + + diff --git a/components/verifition/Verify.vue b/components/verifition/Verify.vue new file mode 100644 index 00000000..3fe4d884 --- /dev/null +++ b/components/verifition/Verify.vue @@ -0,0 +1,469 @@ + + + diff --git a/components/verifition/utils/ase.js b/components/verifition/utils/ase.js new file mode 100644 index 00000000..1fdceed4 --- /dev/null +++ b/components/verifition/utils/ase.js @@ -0,0 +1,14 @@ +import CryptoJS from 'crypto-js' +/** + * @word 要加密的内容 + * @keyWord String 服务器随机返回的关键字 + * */ +export function aesEncrypt(word, keyWord = "XwKsGlMcdPMEhR1B") { + var key = CryptoJS.enc.Utf8.parse(keyWord); + var srcs = CryptoJS.enc.Utf8.parse(word); + var encrypted = CryptoJS.AES.encrypt(srcs, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); + return encrypted.toString(); +} diff --git a/components/verifition/utils/request.js b/components/verifition/utils/request.js new file mode 100644 index 00000000..e6a31b02 --- /dev/null +++ b/components/verifition/utils/request.js @@ -0,0 +1,17 @@ +import config from '@/config' +const baseUrl = config.baseUrl +export const myRequest = (option = {}) => { + return new Promise((reslove, reject) => { + uni.request({ + url: baseUrl + option.url, + data: option.data, + method: option.method || "GET", + success: (result) => { + reslove(result) + }, + fail: (error) => { + reject(error) + } + }) + }) +} diff --git a/components/verifition/verifyPoint/verifyPoint.vue b/components/verifition/verifyPoint/verifyPoint.vue new file mode 100644 index 00000000..57d7d033 --- /dev/null +++ b/components/verifition/verifyPoint/verifyPoint.vue @@ -0,0 +1,557 @@ + + + + diff --git a/components/verifition/verifySlider/verifySlider.vue b/components/verifition/verifySlider/verifySlider.vue new file mode 100644 index 00000000..7c75e0e2 --- /dev/null +++ b/components/verifition/verifySlider/verifySlider.vue @@ -0,0 +1,661 @@ + + + diff --git a/config.js b/config.js new file mode 100644 index 00000000..7dab65ac --- /dev/null +++ b/config.js @@ -0,0 +1,27 @@ +// 应用全局配置 +module.exports = { + // baseUrl: 'http://api-dashboard.win.iocoder.cn', + baseUrl: 'http://localhost:48080', + baseApi: '/admin-api', + // 应用信息 + appInfo: { + // 应用名称 + name: "win-app", + // 应用版本 + version: "1.0.0", + // 应用logo + logo: "/static/logo.png", + // 官方网站 + site_url: "https://iocoder.cn", + // 政策协议 + agreements: [{ + title: "隐私政策", + url: "https://iocoder.cn" + }, + { + title: "用户服务协议", + url: "https://iocoder.cn" + } + ] + } +} diff --git a/main.js b/main.js new file mode 100644 index 00000000..3985b1b1 --- /dev/null +++ b/main.js @@ -0,0 +1,17 @@ +import Vue from 'vue' +import App from './App' +import store from './store' // store +import plugins from './plugins' // plugins +import './permission' // permission +Vue.use(plugins) + +Vue.config.productionTip = false +Vue.prototype.$store = store + +App.mpType = 'app' + +const app = new Vue({ + ...App +}) + +app.$mount() diff --git a/manifest.json b/manifest.json new file mode 100644 index 00000000..409e5a29 --- /dev/null +++ b/manifest.json @@ -0,0 +1,69 @@ +{ + "name" : "闻荫移动端", + "appid" : "__UNI__25A9D80", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + "app-plus" : { + "usingComponents" : true, + "nvueCompiler" : "uni-app", + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "modules" : {}, + "distribute" : { + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "ios" : {}, + "sdkConfigs" : {} + } + }, + "quickapp" : {}, + "mp-weixin" : { + "appid" : "wxccd7e2a0911b3397", + "setting" : { + "urlCheck" : false, + "es6" : false, + "minified" : true, + "postcss" : true + }, + "optimization" : { + "subPackages" : true + }, + "usingComponents" : true + }, + "vueVersion" : "2", + "h5" : { + "template" : "static/index.html", + "devServer" : { + "port" : 9090, + "https" : false + }, + "title" : "win-App", + "router" : { + "mode" : "hash", + "base" : "./" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..e5def356 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "crypto-js": "^4.0.0" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 00000000..5c19f74b --- /dev/null +++ b/pages.json @@ -0,0 +1,97 @@ +{ + "pages": [{ + "path": "pages/login", + "style": { + "navigationBarTitleText": "登录" + } + }, { + "path": "pages/index", + "style": { + "navigationBarTitleText": "闻荫移动端框架", + "navigationStyle": "custom" + } + }, { + "path": "pages/work/index", + "style": { + "navigationBarTitleText": "工作台" + } + }, { + "path": "pages/mine/index", + "style": { + "navigationBarTitleText": "我的" + } + }, { + "path": "pages/mine/avatar/index", + "style": { + "navigationBarTitleText": "修改头像" + } + }, { + "path": "pages/mine/info/index", + "style": { + "navigationBarTitleText": "个人信息" + } + }, { + "path": "pages/mine/info/edit", + "style": { + "navigationBarTitleText": "编辑资料" + } + }, { + "path": "pages/mine/pwd/index", + "style": { + "navigationBarTitleText": "修改密码" + } + }, { + "path": "pages/mine/setting/index", + "style": { + "navigationBarTitleText": "应用设置" + } + }, { + "path": "pages/mine/help/index", + "style": { + "navigationBarTitleText": "常见问题" + } + }, { + "path": "pages/mine/about/index", + "style": { + "navigationBarTitleText": "关于我们" + } + }, { + "path": "pages/common/webview/index", + "style": { + "navigationBarTitleText": "浏览网页" + } + }, { + "path": "pages/common/textview/index", + "style": { + "navigationBarTitleText": "浏览文本" + } + }], + "tabBar": { + "color": "#000000", + "selectedColor": "#000000", + "borderStyle": "white", + "backgroundColor": "#ffffff", + "list": [{ + "pagePath": "pages/index", + "iconPath": "static/images/tabbar/home.png", + "selectedIconPath": "static/images/tabbar/home_.png", + "text": "首页" + }, { + "pagePath": "pages/work/index", + "iconPath": "static/images/tabbar/work.png", + "selectedIconPath": "static/images/tabbar/work_.png", + "text": "工作台" + }, { + "pagePath": "pages/mine/index", + "iconPath": "static/images/tabbar/mine.png", + "selectedIconPath": "static/images/tabbar/mine_.png", + "text": "我的" + } + ] + }, + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "RuoYi", + "navigationBarBackgroundColor": "#FFFFFF" + } +} diff --git a/pages/common/textview/index.vue b/pages/common/textview/index.vue new file mode 100644 index 00000000..e9b05fbb --- /dev/null +++ b/pages/common/textview/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/pages/common/webview/index.vue b/pages/common/webview/index.vue new file mode 100644 index 00000000..8388c76f --- /dev/null +++ b/pages/common/webview/index.vue @@ -0,0 +1,34 @@ + + + diff --git a/pages/index.vue b/pages/index.vue new file mode 100644 index 00000000..bdaf530d --- /dev/null +++ b/pages/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/pages/login.vue b/pages/login.vue new file mode 100644 index 00000000..13cbfc60 --- /dev/null +++ b/pages/login.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/pages/mine/about/index.vue b/pages/mine/about/index.vue new file mode 100644 index 00000000..c3a2bcad --- /dev/null +++ b/pages/mine/about/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/pages/mine/avatar/index.vue b/pages/mine/avatar/index.vue new file mode 100644 index 00000000..77314866 --- /dev/null +++ b/pages/mine/avatar/index.vue @@ -0,0 +1,631 @@ + + + + + diff --git a/pages/mine/help/index.vue b/pages/mine/help/index.vue new file mode 100644 index 00000000..93ec2269 --- /dev/null +++ b/pages/mine/help/index.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/pages/mine/index.vue b/pages/mine/index.vue new file mode 100644 index 00000000..42e2120d --- /dev/null +++ b/pages/mine/index.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/pages/mine/info/edit.vue b/pages/mine/info/edit.vue new file mode 100644 index 00000000..44d8ce4c --- /dev/null +++ b/pages/mine/info/edit.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/pages/mine/info/index.vue b/pages/mine/info/index.vue new file mode 100644 index 00000000..2e519e8f --- /dev/null +++ b/pages/mine/info/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/pages/mine/pwd/index.vue b/pages/mine/pwd/index.vue new file mode 100644 index 00000000..da9567f5 --- /dev/null +++ b/pages/mine/pwd/index.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/pages/mine/setting/index.vue b/pages/mine/setting/index.vue new file mode 100644 index 00000000..0f9f058e --- /dev/null +++ b/pages/mine/setting/index.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/pages/work/index.vue b/pages/work/index.vue new file mode 100644 index 00000000..1afefc91 --- /dev/null +++ b/pages/work/index.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/permission.js b/permission.js new file mode 100644 index 00000000..a47d9473 --- /dev/null +++ b/permission.js @@ -0,0 +1,39 @@ +import { getAccessToken } from '@/utils/auth' + +// 登录页面 +const loginPage = "/pages/login" + +// 页面白名单 +const whiteList = [ + '/pages/login', '/pages/common/webview/index' +] + +// 检查地址白名单 +function checkWhite(url) { + const path = url.split('?')[0] + return whiteList.indexOf(path) !== -1 +} + +// 页面跳转验证拦截器 +let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"] +list.forEach(item => { + uni.addInterceptor(item, { + invoke(to) { + if (getAccessToken()) { + if (to.path === loginPage) { + uni.reLaunch({ url: "/" }) + } + return true + } else { + if (checkWhite(to.url)) { + return true + } + uni.reLaunch({ url: loginPage }) + return false + } + }, + fail(err) { + console.log(err) + } + }) +}) diff --git a/plugins/auth.js b/plugins/auth.js new file mode 100644 index 00000000..3b91c14e --- /dev/null +++ b/plugins/auth.js @@ -0,0 +1,60 @@ +import store from '@/store' + +function authPermission(permission) { + const all_permission = "*:*:*" + const permissions = store.getters && store.getters.permissions + if (permission && permission.length > 0) { + return permissions.some(v => { + return all_permission === v || v === permission + }) + } else { + return false + } +} + +function authRole(role) { + const super_admin = "admin" + const roles = store.getters && store.getters.roles + if (role && role.length > 0) { + return roles.some(v => { + return super_admin === v || v === role + }) + } else { + return false + } +} + +export default { + // 验证用户是否具备某权限 + hasPermi(permission) { + return authPermission(permission) + }, + // 验证用户是否含有指定权限,只需包含其中一个 + hasPermiOr(permissions) { + return permissions.some(item => { + return authPermission(item) + }) + }, + // 验证用户是否含有指定权限,必须全部拥有 + hasPermiAnd(permissions) { + return permissions.every(item => { + return authPermission(item) + }) + }, + // 验证用户是否具备某角色 + hasRole(role) { + return authRole(role) + }, + // 验证用户是否含有指定角色,只需包含其中一个 + hasRoleOr(roles) { + return roles.some(item => { + return authRole(item) + }) + }, + // 验证用户是否含有指定角色,必须全部拥有 + hasRoleAnd(roles) { + return roles.every(item => { + return authRole(item) + }) + } +} diff --git a/plugins/index.js b/plugins/index.js new file mode 100644 index 00000000..efbae151 --- /dev/null +++ b/plugins/index.js @@ -0,0 +1,14 @@ +import tab from './tab' +import auth from './auth' +import modal from './modal' + +export default { + install(Vue) { + // 页签操作 + Vue.prototype.$tab = tab + // 认证对象 + Vue.prototype.$auth = auth + // 模态框对象 + Vue.prototype.$modal = modal + } +} diff --git a/plugins/modal.js b/plugins/modal.js new file mode 100644 index 00000000..87960fd4 --- /dev/null +++ b/plugins/modal.js @@ -0,0 +1,74 @@ +export default { + // 消息提示 + msg(content) { + uni.showToast({ + title: content, + icon: 'none' + }) + }, + // 错误消息 + msgError(content) { + uni.showToast({ + title: content, + icon: 'error' + }) + }, + // 成功消息 + msgSuccess(content) { + uni.showToast({ + title: content, + icon: 'success' + }) + }, + // 隐藏消息 + hideMsg(content) { + uni.hideToast() + }, + // 弹出提示 + alert(content) { + uni.showModal({ + title: '提示', + content: content, + showCancel: false + }) + }, + // 确认窗体 + confirm(content) { + return new Promise((resolve, reject) => { + uni.showModal({ + title: '系统提示', + content: content, + cancelText: '取消', + confirmText: '确定', + success: function(res) { + if (res.confirm) { + resolve(res.confirm) + } + } + }) + }) + }, + // 提示信息 + showToast(option) { + if (typeof option === "object") { + uni.showToast(option) + } else { + uni.showToast({ + title: option, + icon: "none", + duration: 2500 + }) + } + }, + // 打开遮罩层 + loading(content) { + uni.showLoading({ + title: content, + icon: 'none' + }) + }, + // 关闭遮罩层 + closeLoading() { + uni.hideLoading() + } +} diff --git a/plugins/tab.js b/plugins/tab.js new file mode 100644 index 00000000..5d1b3058 --- /dev/null +++ b/plugins/tab.js @@ -0,0 +1,30 @@ +export default { + // 关闭所有页面,打开到应用内的某个页面 + reLaunch(url) { + return uni.reLaunch({ + url: url + }) + }, + // 跳转到tabBar页面,并关闭其他所有非tabBar页面 + switchTab(url) { + return uni.switchTab({ + url: url + }) + }, + // 关闭当前页面,跳转到应用内的某个页面 + redirectTo(url) { + return uni.redirectTo({ + url: url + }) + }, + // 保留当前页面,跳转到应用内的某个页面 + navigateTo(url) { + return uni.navigateTo({ + url: url + }) + }, + // 关闭当前页面,返回上一页面或多级页面 + navigateBack() { + return uni.navigateBack() + } +} diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6f07782abfc7881a73d3f47a00b761c183e06ff9 GIT binary patch literal 16958 zcmeI1Z)lW95XSfJqDezYN}8rYBqt&wBDRQ#NH9S}`awjB6cH&RR+IaarXpfR)DlFb zh=>#s5s}vV!CI~H?vjewAT~$|B0)q%Ob{C+NR$wa5bpYW-n+GzGl`d)Tq3*|=4RjB z*`1kZW@q=k7~|ourpE9+%gkG0Ot~>;9z>Vf52@ez)Fhev?IPeJ;3D86;3D86;3D86 z;3D86;3D86;3D86;3AMK1foH+JQgzNVqw$JTyN&&O7CRrX%3nX@p%uvKY@CnM03cT znQXfzT7Og6l;L{_e_Np!&@ztn|9kuk&0*mkI7e>91WFMsH5xfu5*mkfh9dBF5b3Nj;06R}W zvR`>_rM4$Rk}X%U^tqnEmN0w108jo8jZ-YY|C&!zo^+VDAGbdNd8 z^X;_r)DI@*&`$c=Az`Yug@I(Bw1mx*OSK;#{bkF-oS&cQFN9>|bU)uK3F~%OJ(^qqrLJGAGu z?j}2Kc_ipv#X470UaP|ben>-UnGpzi(a@JbHe*Fn9UzC5+C9XQuiVy1usIW{8{7K@^JlQ0 za@YDTZu9&aHjaoZa=PEQ!L1z~Jim+tOpR<#<)$6ens@PGf%V6cQLX$BBjKQWx;|Yd zvmFh1%A>*Qp=ii=p7nZ&o#LgO&>j-bJE+G+ne*&3;|16`8-55<+!B!HYMn=n-Gpx@ z4ny+X&bJ&pw<71%FSz2M7+k$lo7BzoQONqQaplQrJ71i5?x0V)wQnTT5B-=fGg3Pm z_D*jKez5rBwu;Xqf$6)McNI$JZP;7@oB6}dMP?SHJu5$NLru_m=#*-BOZ}U9p1BUb z>)vu2lI^lv_V=Q*-pb;e-u>jW#zo2j;Zb8{n(B%xqam;Mzv3pD2h_%gzi$0xNS;{v z(KxmjP(O-d4W>9&Z)TIbZ|v9f`I5(vGISQC_h-{)ZPg3a2fOdp{+qL@*v{uU09kx2 z27TbN*UE^;g1*Dx_Bu~kqwlw^GD&djlGBQP5Z_Ar8p0%72vD=@iI+Dvcl^Q zF|M$F!~&j5&U59D&cY7X?urJdowwstjbq;;>{Kqx7v=6#_I-?Z_#t_O|4ULbPVJ*D z|0Ul;{y6tV>)VCeiq*tj7^(&ei|$A;f2AFtN*vpCZ?XGYG3&zDk!sD^G+CP~kJ$q| zGkqc_4j`-jB3!${`6hi+>K&N+qI;qCs^WAXzx#Q=e_iu3eZq&M$fchV!a%jIHB%N} z3#f%>7!w9szZaZ_eV5Ffn~P`e?|PTfd9SlpdE7_Nj(S#Isx7Ta?QQvEC`UTs$WO4T{jx?SYNFF&i-bdhSAob zrdEO5HRNLgrwsXcqj(T5- z&g0no<-4p$O>0d0?9>4A-_sQdO&fAw%4U6R8S%X)oB3mv;Z9SC&UZe8@!kFor2JPN zv{M&`y)%r}#`i%Ue^mpu=jFf7|C`|YUjM&mEV$#Z-i7)h$A9Yj?_-(&zRTjT-t!gz z4(OTgk?*@t+1k(VLHZr}6n^X8=}!t3A6C)>7M z=;z$tsGOJYkn?|mT z>h3?Q;rsvj_PIZii2MH9HIUD6Nztyo9)_0}?Wx|+aJ;C>-&q~^4OUe72mAvigB6t} ziG$Cp2ddzFEPuYIgz1R{{GfQ}U`eBR*I@n)@z!{Lm-vl%{($(wME>ADxIf{Gi&rNc k^WuqwvkX1XGQ;pA^y%ZMhx_%w$M1Y6;?*ghWE1=SFG{UvNdN!< literal 0 HcmV?d00001 diff --git a/static/font/iconfont.css b/static/font/iconfont.css new file mode 100644 index 00000000..39aed3da --- /dev/null +++ b/static/font/iconfont.css @@ -0,0 +1,90 @@ +@font-face { + font-family: "iconfont"; + src: url('/static/font/iconfont.ttf') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + display: inline-block; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-user:before { + content: "\e7ae"; +} + +.icon-password:before { + content: "\e8b2"; +} + +.icon-code:before { + content: "\e699"; +} + +.icon-setting:before { + content: "\e6cc"; +} + +.icon-share:before { + content: "\e739"; +} + +.icon-edit:before { + content: "\e60c"; +} + +.icon-version:before { + content: "\e63f"; +} + +.icon-service:before { + content: "\e6ff"; +} + +.icon-friendfill:before { + content: "\e726"; +} + +.icon-community:before { + content: "\e741"; +} + +.icon-people:before { + content: "\e736"; +} + +.icon-dianzan:before { + content: "\ec7f"; +} + +.icon-right:before { + content: "\e7eb"; +} + +.icon-logout:before { + content: "\e61d"; +} + +.icon-help:before { + content: "\e616"; +} + +.icon-github:before { + content: "\e628"; +} + +.icon-aixin:before { + content: "\e601"; +} + +.icon-clean:before { + content: "\e607"; +} + +.icon-refresh:before { + content: "\e604"; +} + diff --git a/static/font/iconfont.ttf b/static/font/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..53915cafcb782962308dc5f2bea68bb528f84de4 GIT binary patch literal 6724 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 literal 0 HcmV?d00001 diff --git a/static/images/banner/banner01.jpg b/static/images/banner/banner01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdb1e167eca46acee0482a1494d66537a1b6711a GIT binary patch literal 44454 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

-wtB?K+}+jmbpC5} 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

j7PFa!NH&l+pFwQ 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

=9!F zaB-Wc*K)pVPIM144}AOgXIuP*g`ucOTbQpuYmio$;6#)eZNb3p1Dy@}!?V3_io>m; z5MICLt2`llgic#EV7_%fs9y~LN-{Z&jg zd;hOxrR4GamyHW46?POl$ii>sh~aWYYoUTm$)w86WF?6auphh8ia;O~1% z*bg%T{ZF3>g#K!O>HQHI4h>DE|NBAf%jOS-&ua@@%xyB19D4kx5gYgsqf@vHvs{5G z=}8QlP-Qp&a|&x9*%c+t;Jn9M%VmS|=Ba00YrlAr%~@8&noZDeM+D2_48>jOdy{&eB+*#`UUnl_ z*0?=rTe;FTqDU8d%{rhgnvbfsshQVZ5(1{~EmV<%!a$CNcHDAn*nWjMDH*f2h6h(r zUD&Xb(UhF3XF*gJNuiO>)dC*ZT0H-c09)*JQ+!jpRnd-p*12o$+8ZxDM_ej040t}6 zWgZL#0zGCH7l)>##P+Y47zZoo(S_~4i0zd}vAGmcqa^bmE6Ct2J3I8g5gQcWrix9fcOd=4*l{4*Z70pPsGenBwH^XAeaS(Gx*h zuGF;v?~#>nt#%JxzW(vSZVl|&ayU!a*d~}PUv<^{QrONs&b(oiaD#KKK>*MtcGfB4 z%g3(@C3H4w8vZKl;BXUiA7!!j?JGc5jA6U6&Rn;Mh|cz^nZG{rS=aDf0dfvG_t!yu z)q_J%`H1mBaBG(SrqSy(?pV=kY(!$d;@~ZFFl)GO-iGT{A^F#)TBb^)e2A2Pa5_ai z0HUa`RtUuICFU&4Zp#OQIzZEz4ks=q#xGwbnr3fBX!dC&rsx<;PSetq;D2_KPBV+@ z(Dr!R!d+)BgNMcg9cD&#Lcnj|PMu#DC<&A+I3J&)RmwDcIPzR}BZ2bXr7%`jLUk87 z;jTFI#X*+7o`#wnuktia)<>vO;-#NB$GKomgl0dPli-^N(8irew(be-@hRV)c3-Gx z-RA0MSEP)1>y|{ppV+w#)A+gFu$0{kyYWYW zKfEcaMqtouISTce2Gd$}eHs>z>janSC1PEVDj&@krH*k*K%4$rI+vnrsXalJ2MmWx zMi=MtvNqM!a?*)vdj$GneyNhlVMSi@n}>MZYivq>%FpishtLPwXFa){K9~g&23_gp zDd;Kc$r8uAXrKwTv7Jy5N-}+xZ2F^I8k;3hJ$w!PbPQgg9unNZ6gtv~%ZCSe9U?CC z8-6!X5{4~@WWlx=er{MZn{jca;c~TWZ2e0}=cCzftKUum=!4_F<X+A=0?ui*b>MV4>>yiWm_p)=Q{0^>pGN*R zrrqY3;Nn*~+Gb{e-vMdcETLRcHwrT=silu)Dn7(Y%Jns|xWwgdE`cvB-4u)47atf6 z*NIv07CA==kYsjyF-ncvW^<5Yj!S%U&y&BK)USFdKDDO=+nLbl8vRErF@@XlCT+m#Il*Xj}M zhQj$w^B8tc2h1`4YXcCzthfmq?Pm+^ZeCRT>iH(iZ4?fsZEoQ!GPRw2b9ze&?o$hT zb*zz&dIlA`?)?h+&h277KFr1;)r+$CMcrh_y3WUcv|Am3P21X>SG0ASr`>dhmo#Tl z!ZC1^c^=wX+{PUg(0idXGN;v9)EopsxeADRPR>2`NBC~(Y8jymC=qW2w_z|6*UU{y z^=a86c6KvQLGuYy*Dxn+cPFOmVO?p06XfwP+?gn{lv4J1k9kYv6aP@U%tfRsk2b!sVR(DYoeCP7lN(X(Ju&>0@4M*8sW%MH0d zP)E@C|37Sto>(~7CQuk&NoJ&aS3{252gR$kRWlfZ+);_5t0KG35eK~^SMk}4NTnzi zF;^&{S5_$tO{KJEzt2C52*LO56S)QKdO~*+JJ)a#c^N19UtIfKIq~%0NV1V_nTU(Y z&-&kAKTAnBBY$SIVtk4tz-b?_=J)|q>1ZN@@0K}`W=SobUEfQd&(W*V!!AAXt($pb zLgKiWekV>zn|+PN^3&wg2WgLLdkgFRF9YI?3gERy*=Yl6z_fa;eLjOPdG1t;2d3@e z2O}wvOZ9fyp0g6S8APP`fYg4<3-xgQ!@yhMKLShKM@s9RG$(MwQ%+-EVYRyic|U7D zZ3q14c$+@oCH zD}7S|z5?ghhC?k;firW*uO8mVX0agDi*jpy*WH{F*L}sxYB*_&tt3TBf9Ll4$2w6% zI-YKsFs--D!*615m;wE7j7+0jLdgA6UTCB+Ran+PNZShXv(AR=-G@w!vTC41{SXMP zmUiHV^pg+#OjANe6;G&>4QcxngObvi*HV_6T=FcYrHT_2@n8B{n!T^};O*tbLoqp= zkkD#%#Va8n!V?j)Y{@&s?;k?k;x*=D^16r6iw>2}4!B_OL!y5KHq9-U^v@?#-zX&% zef+30oaqRbcXb|TF$s@;kY1=Y*B@5JkRvI;sYrLlubB_`x1E(<| zbUtjA-Fi=UxmUsM_8Tq1XDvDWtgaQq`*sm@lEbuW6TBpBa6^K6RFrS1YV6Wg+T*si zlhk(oCRy_2X;70Q_u&443}ammyA(e?UgfWE z)dTO9!1Mew*B~JS>P2N>rhg~`9XWcZR+}=h#{Hf9% zp3l$M>E*A!+;ut6>ACl+;ty%ajb%`>%crpOG;AbqZ z|IT&qbLwCo2fs;Fy8_o^(8J$vbNasiqG5{T8O_Vci~G;|keK-YHGCxE`JY%;u80}| zTHavBNkVchy|532K0I=%(JTUi3}G9@$TYu}8V)@&{=^oJuGqVx5anVJ41XHsJlpxQ zxn3eS5_|rczxpRCayouW`3O5raMxC*hId0l{pRC6k43TI85}aYmMXs5eKXXAHCba_ z>qju92?l5*S3lVWnV{C2#~h%odn0ilOFDiQ>KRqJ1}RD1k@p`c4mGy%axlGI%@7*v z-%@Xm)~R44`#mbE@r&5Dn=W@5-74BnM7;ZHGT)EwQ?ouY(K6vj^7xpal@yJ%>G7O4jyiqqiv`r zHcgL8$-`z&%s?u84;A49ul&fb9xGv1Tp5zhzgoW&@o5aubDoyJkbVHFX`W%#juu8= z#tk-JQn)Ea+lZ-33Li$qi>Z*|UDnO7L4 zU+qo(IKaS^X2t+td-$9!TDNk%iB;V| zMSwXQdVn@Q1sa4~SMdYnCToZfLoJ;%XxxIZ zPS&_T_UB2!Uv!b4t#`Mz@X#eRx+UG&NGtP30x3+>=RSH8$WQmmmwD zg!e2>01|J%;Nx1i-Wo0!X+6(bz9TfLQ|7!jP%cHh7R1e^_2@hmPf1BRgIExh zAt(|I%XsrexrKC8@W+VDq>5`q)DEe(rl|1xS ztH(Bq1l0y33p9|_945-m{2xNgf5VQs{*%9o53nWt?}_pSf2aUVo=^+!M5Gt+6=*DQ zi4w6B3Q2kg0t3&OdF5Ih>-KjC3uLroJc!rVau2!+`a!VCIRfIEeXq7-A3?U@fi>bg zoVjxlhyM2$$#qp!m=UFX{k98X|N5DDz}*4KPw9k$1(CEWiI-)a?a%DOQ>weZ?_36q zH2w;4ihgQe=9&70U?VQi$Cu-HbjD$VNzKWUfOn8L z(93I3u>M_O;&WT7eJN*cnTJ)BPq?#2|3#3EAP#SAETXp0ng~!9Gx>pqD7<&=sYs0a zNf7IQF?j&WzDFHNFuJ`TF=zq=FXB6D+^aEnVLI-a=+H`*SFA7h2f-NAXeEsM5=PNS zSMt`K9SVf-pKE^P+MtHCT(_)R1_};W2P1cl!S!V{dfo}(c9q{#CR)Fo>Z)!< zYRSWtCjS)cND96b%Hqk8==~jW*7O{fN>{YA{#p_^3#p2JqT|iRB?-3NMNCm30fg%{ zTso-EfuG4UpJE4wBC-8%^@}VccjBRLS`s=(Q*tzElLGVl ztlZn+6A@3EZ5cDb9$XtGCU{mY*(9+iQ6@|?Ae(2w3s=Eb&ldNpmy*N;@*Di9SXUl& z>S)|jM%+n~{E6WxY zKF6oN!YOt=c(ll-zt(XJZdLsjryn+BAv-;aC#gm7^v*FC#nujdtd5d+_#u)lP>TB~zlDLs>4@iMa}b1V)}R=APe6qw^4^v-bW?pLyjc&iI6LH>-jYsuxxh zMSKw-C^>nCFAmC~^dDa6114f`Y1Ebg_ul`;MPzt=HNF<$!>6VEH#+z~un;0u zuF==8g$}AuP0pWN7P3|I_ZBX|iiue(FSH13ZHaV@}uJdyH7j9uQLqLh* z+;Y~Zx5iE;=jW5Ah~b9f%-=i{{c-fWaj%rv27K{^a`%05F>pepDCJK>d)M+1RqDA(4&gB&6r;XnqdX zxhrE|S8C^p0GPE_?J3v9lsva~j`|Qg+XPMKyThyRVVFvmCO;xai4w_rEU`OIgtNBJ zo{2;*M9DmH)Wkd7%bG;Nfyv+penG2tXqas~z)hNrNcB)O=;i5AWl+Pf6JfT34FA7P zZS{!FQ1eRHugltg#1-fF=5!gW@2(2X?oI9?DfZX~&S;^rJn4QC{x77*O?f_#xtYDb zb0{GoBQB|G=GIL}u&vz_1+Oz!@%Z7m-6_AX-12%jD5<*t{pHZ-%f<-bZ}mh2_U-WB z@1yX`p7`|VyKDQA;${Cy?zu02vqH_KYcgw$Vh^nQ&}{6{gewP%7_ZV z<;VT7cW&qRxWNFU#2GCm{B?<^d;eeEP4NFs3MKlVd=avUDuH1QhErw=gaAm5F_we= zkpGAVU=l(0mfacA z9Xip{TsD%+6mr~`xzll}=`y4XDYv=g9_o;gLKoKWYpU}*zyH2_?fE{h=lMLJ=kvTj zpYP}Syjy28xz7O?TdTw?X0L>=SrU9q2^i6tYk~s>ryd+e4paH}&fS|xc;LjXlM43IA))Bd~uBiQtK;9Uy`gxGfB*$ze4Ftb>a#} z%~FD?XW-jXNzRRYo4GK`Bjdv^9in$OD~yanf8|5O)x5U%WF1cFHoRia zHISh_x_9;t-}=yHRin;Y?bvDcm89u^!nVWK}pZN!ow|83sF#H zKcBRNAA9O zev5UExhXSuPg$vOyhyjiTsB-S03n&M{mr9I&dFVJ)6bD7S9B`AMMMSvX@%@46cp!- zg5~87>Y4jpgn*{%*Zd;P7ov8dY^(S4wL4ecT4Za=i>q5uOHVE~ssYvF=#pTgn!;}& zJ-mgw95qA}3U^xM;~ zNDEq9Egw$8`&^QZ0-nKCj1#exk}=WuJO`yB3_H0CNFve!liIL6wW%+$69}wh6{a?( zdyN{hBo%-!$fOIXUXe;37sXhrWLAMLf@DdHgF=Bys+jcxQ$Lg&Dg=naj20jX7dTXY z@Z^O`sp&}TGZ`S=rHW_K zJ*}n-7b|CDeCn4Oh07->F-^a&v5idtfkZkH%)v zS*DM&d_Hg)iCU_;$r!Cp>8*zsU(&3;M62S4wi0dfI)YScc;PLGOpd8FmQS*c^2!xS zRlrb+a^s|qayT4Bgg4KiIZCBpi&iWvqnBU?DXj{kE$N)A>ce z-uG-J!jp0KcoAsZvHJj()@%ud+J2-!^BD7_W_lgh$7O!9x59;ccY*834zNRYRlQ=8 z$v(wkb-G{CRq6KF(-}HX+vZ%E%MM9*L=D$y9lds+Pc1b&p}HrG=7BB`j;o z5K?*b(3v#E^`~Z7L)~*hvv6atw4I>UYwyY2^K1I3wA!+AY9bQ!Hw2A{))IyUfYf4X z02lyy3%n#BiK`aO>%dO+Y#I3~VJ1;=Gf$L33J`o0z-=g~GMe2?N98A=$StJ>6?se6 zZ~{zf1^hfg7CgxnN!=B_`#uP1@$}(UzWD@*Uy7Ug5(60ob(o=(vg@TLRKa#4renzq zbw=WNyYl35g59(o0ApZp#8@AT#%&<8QMh~&cQ}Ac{$I5=zLhGN0C)xX#FCEsp;`cQ z!j`;6v+E$|as9_PQLSSXe*|B!3&7=+_XpWakgaT=nEE^qyY{-pzfEqw*$8ji-%q-$rU)dFBdYt zNx3Pl-O5=JJHn#!;jT#h&JnCOl9b8R`=k$>H>>!!85e# z;CuaL&0qb;u_E3mt0{fYk}mJ#%ckKquJhUZXDsuFNhKb>XC_eRt>|uU^5<`jK8u^2 zYA9%Lt8M3t?%sXf)yt*x75WABqr8C@W-){c&D?>7?rk73?? zJRc2F)#Qe_ETyvmwy*E+iva6QKnNFggH-beECnO}fu$QJ<{=#*-h^3FQ^zsq@W-}l zUd9pLi71M@F3k_k8^@ zvM}t>V5wEYXZICSK#2DB(7GM9vF-8ftOG-8sMKQi?+%76Q^#&ZCrR1w?`@R^ZeJYM zj9p7Ka*IzTNIc~cRqGS@Zn&VOZ=gh8jeVvpNR%1*I90YoLS&;Bm(5G54jy1<3NUnpJ$+aKNl&_Ed| z!YTt|$iSu1>oy&bHk2oH4gfy#?*!)?Hl4tN5lrxo%vd|EXxZp6T2oLXiy2GEbd2zk z!34TReGb8=DtI+%oq(MGD}zpMwq>V^g;`hAu_w*XrU&@%#smDI!8Ev1XUZg^kX z>+TKnKgh}M25-ba{#T6asa_kZPZ0L_)?+f9ugpJq#0$vw^d>i;LdtQMi literal 0 HcmV?d00001 diff --git a/static/images/banner/banner03.jpg b/static/images/banner/banner03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..092a5fc234fddbcdcc6ed598c30f6e603aa9b9f5 GIT binary patch literal 38123 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 Z^grK@u`mYS8yJRsRa5J^>0)PP^Kbr*rfRAkm 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%0DhU#n?ioy`d|OqI_>#0 literal 0 HcmV?d00001 diff --git a/static/images/profile.jpg b/static/images/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3a940b21cc9dcea01e62d94e243eebcf76d96bc GIT binary patch literal 81131 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 z≺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 literal 0 HcmV?d00001 diff --git a/static/images/tabbar/home.png b/static/images/tabbar/home.png new file mode 100644 index 0000000000000000000000000000000000000000..50acdfdde68a0b48c62409c2706e8da8eee36910 GIT binary patch literal 3265 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 literal 0 HcmV?d00001 diff --git a/static/images/tabbar/home_.png b/static/images/tabbar/home_.png new file mode 100644 index 0000000000000000000000000000000000000000..a408f71b28693f358228ff050e2d04617ba1e007 GIT binary patch literal 3229 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 literal 0 HcmV?d00001 diff --git a/static/images/tabbar/mine.png b/static/images/tabbar/mine.png new file mode 100644 index 0000000000000000000000000000000000000000..f13fe44d266c1b0d6f17feda0ae376217865c88c GIT binary patch literal 4235 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 Ar~m)} literal 0 HcmV?d00001 diff --git a/static/images/tabbar/work.png b/static/images/tabbar/work.png new file mode 100644 index 0000000000000000000000000000000000000000..21e130d8e788d2ad97508c62ae7d65d618481b47 GIT binary patch literal 4108 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 G{r><2moMf3 literal 0 HcmV?d00001 diff --git a/static/images/tabbar/work_.png b/static/images/tabbar/work_.png new file mode 100644 index 0000000000000000000000000000000000000000..80b979c5a3356c09cf37f1ca742c0da982293448 GIT binary patch literal 5008 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 a-+ox4z)NM}p*%Hd0~qR>BFnTL9{&eNattW| literal 0 HcmV?d00001 diff --git a/static/index.html b/static/index.html new file mode 100644 index 00000000..a7af653b --- /dev/null +++ b/static/index.html @@ -0,0 +1,20 @@ + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + +

+ \ No newline at end of file diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b4270c06716f80b3c722933329cd42a6dd4593fa GIT binary patch literal 5748 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 literal 0 HcmV?d00001 diff --git a/static/logo200.png b/static/logo200.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa9988266f7852b40e1475a89bd02aae63976bd GIT binary patch literal 7995 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.cu-item { + transition: all .6s ease-in-out 0s; + transform: translateX(0upx) +} + +.cu-list>.cu-item.move-cur { + transform: translateX(-260upx) +} + +.cu-list>.cu-item .move { + position: absolute; + right: 0; + display: flex; + width: 260upx; + height: 100%; + transform: translateX(100%) +} + +.cu-list>.cu-item .move view { + display: flex; + flex: 1; + justify-content: center; + align-items: center +} + +.cu-list.menu-avatar { + overflow: hidden; +} + +.cu-list.menu-avatar>.cu-item { + position: relative; + display: flex; + padding-right: 10upx; + height: 140upx; + background-color: #ffffff; + justify-content: flex-end; + align-items: center +} + +.cu-list.menu-avatar>.cu-item>.cu-avatar { + position: absolute; + left: 30upx +} + +.cu-list.menu-avatar>.cu-item .flex .text-cut { + max-width: 510upx +} + +.cu-list.menu-avatar>.cu-item .content { + position: absolute; + left: 146upx; + width: calc(100% - 96upx - 60upx - 120upx - 20upx); + line-height: 1.6em; +} + +.cu-list.menu-avatar>.cu-item .content.flex-sub { + width: calc(100% - 96upx - 60upx - 20upx); +} + +.cu-list.menu-avatar>.cu-item .content>view:first-child { + font-size: 30upx; + display: flex; + align-items: center +} + +.cu-list.menu-avatar>.cu-item .content .cu-tag.sm { + display: inline-block; + margin-left: 10upx; + height: 28upx; + font-size: 16upx; + line-height: 32upx +} + +.cu-list.menu-avatar>.cu-item .action { + width: 100upx; + text-align: center +} + +.cu-list.menu-avatar>.cu-item .action view+view { + margin-top: 10upx +} + +.cu-list.menu-avatar.comment>.cu-item .content { + position: relative; + left: 0; + width: auto; + flex: 1; +} + +.cu-list.menu-avatar.comment>.cu-item { + padding: 30upx 30upx 30upx 120upx; + height: auto +} + +.cu-list.menu-avatar.comment .cu-avatar { + align-self: flex-start +} + +.cu-list.menu>.cu-item { + position: relative; + display: flex; + padding: 0 30upx; + min-height: 100upx; + background-color: #ffffff; + justify-content: space-between; + align-items: center +} + +.cu-list.menu>.cu-item:last-child:after { + border: none +} + +.cu-list.menu-avatar>.cu-item:after, +.cu-list.menu>.cu-item:after { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + width: 200%; + height: 200%; + border-bottom: 1upx solid #ddd; + border-radius: inherit; + content: " "; + transform: scale(.5); + transform-origin: 0 0; + pointer-events: none +} + +.cu-list.menu>.cu-item.grayscale { + background-color: #f5f5f5 +} + +.cu-list.menu>.cu-item.cur { + background-color: #fcf7e9 +} + +.cu-list.menu>.cu-item.arrow { + padding-right: 90upx +} + +.cu-list.menu>.cu-item.arrow:before { + position: absolute; + top: 0; + right: 30upx; + bottom: 0; + display: block; + margin: auto; + width: 30upx; + height: 30upx; + color: #8799a3; + content: "\e6a3"; + text-align: center; + font-size: 34upx; + font-family: cuIcon; + line-height: 30upx +} + +.cu-list.menu>.cu-item button.content { + padding: 0; + background-color: transparent; + justify-content: flex-start +} + +.cu-list.menu>.cu-item button.content:after { + display: none +} + +.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar { + border-color: #ffffff +} + +.cu-list.menu>.cu-item .content>view:first-child { + display: flex; + align-items: center +} + +.cu-list.menu>.cu-item .content>text[class*=cuIcon] { + display: inline-block; + margin-right: 10upx; + width: 1.6em; + text-align: center +} + +.cu-list.menu>.cu-item .content>image { + display: inline-block; + margin-right: 10upx; + width: 1.6em; + height: 1.6em; + vertical-align: middle +} + +.cu-list.menu>.cu-item .content { + font-size: 30upx; + line-height: 1.6em; + flex: 1 +} + +.cu-list.menu>.cu-item .content .cu-tag.sm { + display: inline-block; + margin-left: 10upx; + height: 28upx; + font-size: 16upx; + line-height: 32upx +} + +.cu-list.menu>.cu-item .action .cu-tag:empty { + right: 10upx +} + +.cu-list.menu { + display: block; + overflow: hidden +} + +.cu-list.menu.sm-border>.cu-item:after { + left: 30upx; + width: calc(200% - 120upx) +} + +.cu-list.grid>.cu-item { + position: relative; + display: flex; + padding: 20upx 0 30upx; + transition-duration: 0s; + flex-direction: column +} + +.cu-list.grid>.cu-item:after { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + width: 200%; + height: 200%; + border-right: 1px solid rgba(0, 0, 0, .1); + border-bottom: 1px solid rgba(0, 0, 0, .1); + border-radius: inherit; + content: " "; + transform: scale(.5); + transform-origin: 0 0; + pointer-events: none +} + +.cu-list.grid>.cu-item text { + display: block; + margin-top: 10upx; + color: #888; + font-size: 26upx; + line-height: 40upx +} + +.cu-list.grid>.cu-item [class*=cuIcon] { + position: relative; + display: block; + margin-top: 20upx; + width: 100%; + font-size: 48upx +} + +.cu-list.grid>.cu-item .cu-tag { + right: auto; + left: 50%; + margin-left: 20upx +} + +.cu-list.grid { + background-color: #ffffff; + text-align: center +} + +.cu-list.grid.no-border>.cu-item { + padding-top: 10upx; + padding-bottom: 20upx +} + +.cu-list.grid.no-border>.cu-item:after { + border: none +} + +.cu-list.grid.no-border { + padding: 20upx 10upx +} + +.cu-list.grid.col-3>.cu-item:nth-child(3n):after, +.cu-list.grid.col-4>.cu-item:nth-child(4n):after, +.cu-list.grid.col-5>.cu-item:nth-child(5n):after { + border-right-width: 0 +} + +.cu-list.card-menu { + overflow: hidden; + margin-right: 30upx; + margin-left: 30upx; + border-radius: 20upx +} + + +/* ================== + 操作条 + ==================== */ + +.cu-bar { + display: flex; + position: relative; + align-items: center; + min-height: 100upx; + justify-content: space-between; +} + +.cu-bar .action { + display: flex; + align-items: center; + height: 100%; + justify-content: center; + max-width: 100%; +} + +.cu-bar .action.border-title { + position: relative; + top: -10upx; +} + +.cu-bar .action.border-title text[class*="bg-"]:last-child { + position: absolute; + bottom: -0.5rem; + min-width: 2rem; + height: 6upx; + left: 0; +} + +.cu-bar .action.sub-title { + position: relative; + top: -0.2rem; +} + +.cu-bar .action.sub-title text { + position: relative; + z-index: 1; +} + +.cu-bar .action.sub-title text[class*="bg-"]:last-child { + position: absolute; + display: inline-block; + bottom: -0.2rem; + border-radius: 6upx; + width: 100%; + height: 0.6rem; + left: 0.6rem; + opacity: 0.3; + z-index: 0; +} + +.cu-bar .action.sub-title text[class*="text-"]:last-child { + position: absolute; + display: inline-block; + bottom: -0.7rem; + left: 0.5rem; + opacity: 0.2; + z-index: 0; + text-align: right; + font-weight: 900; + font-size: 36upx; +} + +.cu-bar.justify-center .action.border-title text:last-child, +.cu-bar.justify-center .action.sub-title text:last-child { + left: 0; + right: 0; + margin: auto; + text-align: center; +} + +.cu-bar .action:first-child { + margin-left: 30upx; + font-size: 30upx; +} + +.cu-bar .action text.text-cut { + text-align: left; + width: 100%; +} + +.cu-bar .cu-avatar:first-child { + margin-left: 20upx; +} + +.cu-bar .action:first-child>text[class*="cuIcon-"] { + margin-left: -0.3em; + margin-right: 0.3em; +} + +.cu-bar .action:last-child { + margin-right: 30upx; +} + +.cu-bar .action>text[class*="cuIcon-"], +.cu-bar .action>view[class*="cuIcon-"] { + font-size: 36upx; +} + +.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] { + margin-left: 0.5em; +} + +.cu-bar .content { + position: absolute; + text-align: center; + width: calc(100% - 340upx); + left: 0; + right: 0; + bottom: 0; + top: 0; + margin: auto; + height: 60upx; + font-size: 32upx; + line-height: 60upx; + cursor: none; + pointer-events: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.cu-bar.ios .content { + bottom: 7px; + height: 30px; + font-size: 32upx; + line-height: 30px; +} + +.cu-bar.btn-group { + justify-content: space-around; +} + +.cu-bar.btn-group button { + padding: 20upx 32upx; +} + +.cu-bar.btn-group button { + flex: 1; + margin: 0 20upx; + max-width: 50%; +} + +.cu-bar .search-form { + background-color: #f5f5f5; + line-height: 64upx; + height: 64upx; + font-size: 24upx; + color: #333333; + flex: 1; + display: flex; + align-items: center; + margin: 0 30upx; +} + +.cu-bar .search-form+.action { + margin-right: 30upx; +} + +.cu-bar .search-form input { + flex: 1; + padding-right: 30upx; + height: 64upx; + line-height: 64upx; + font-size: 26upx; + background-color: transparent; +} + +.cu-bar .search-form [class*="cuIcon-"] { + margin: 0 0.5em 0 0.8em; +} + +.cu-bar .search-form [class*="cuIcon-"]::before { + top: 0upx; +} + +.cu-bar.fixed, +.nav.fixed { + position: fixed; + width: 100%; + top: 0; + z-index: 1024; + box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1); +} + +.cu-bar.foot { + position: fixed; + width: 100%; + bottom: 0; + z-index: 1024; + box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1); +} + +.cu-bar.tabbar { + padding: 0; + height: calc(100upx + env(safe-area-inset-bottom) / 2); + padding-bottom: calc(env(safe-area-inset-bottom) / 2); +} + +.cu-tabbar-height { + min-height: 100upx; + height: calc(100upx + env(safe-area-inset-bottom) / 2); +} + +.cu-bar.tabbar.shadow { + box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1); +} + +.cu-bar.tabbar .action { + font-size: 22upx; + position: relative; + flex: 1; + text-align: center; + padding: 0; + display: block; + height: auto; + line-height: 1; + margin: 0; + background-color: inherit; + overflow: initial; +} + +.cu-bar.tabbar.shop .action { + width: 140upx; + flex: initial; +} + +.cu-bar.tabbar .action.add-action { + position: relative; + z-index: 2; + padding-top: 50upx; +} + +.cu-bar.tabbar .action.add-action [class*="cuIcon-"] { + position: absolute; + width: 70upx; + z-index: 2; + height: 70upx; + border-radius: 50%; + line-height: 70upx; + font-size: 50upx; + top: -35upx; + left: 0; + right: 0; + margin: auto; + padding: 0; +} + +.cu-bar.tabbar .action.add-action::after { + content: ""; + position: absolute; + width: 100upx; + height: 100upx; + top: -50upx; + left: 0; + right: 0; + margin: auto; + box-shadow: 0 -3upx 8upx rgba(0, 0, 0, 0.08); + border-radius: 50upx; + background-color: inherit; + z-index: 0; +} + +.cu-bar.tabbar .action.add-action::before { + content: ""; + position: absolute; + width: 100upx; + height: 30upx; + bottom: 30upx; + left: 0; + right: 0; + margin: auto; + background-color: inherit; + z-index: 1; +} + +.cu-bar.tabbar .btn-group { + flex: 1; + display: flex; + justify-content: space-around; + align-items: center; + padding: 0 10upx; +} + +.cu-bar.tabbar button.action::after { + border: 0; +} + +.cu-bar.tabbar .action [class*="cuIcon-"] { + width: 100upx; + position: relative; + display: block; + height: auto; + margin: 0 auto 10upx; + text-align: center; + font-size: 40upx; +} + +.cu-bar.tabbar .action .cuIcon-cu-image { + margin: 0 auto; +} + +.cu-bar.tabbar .action .cuIcon-cu-image image { + width: 50upx; + height: 50upx; + display: inline-block; +} + +.cu-bar.tabbar .submit { + align-items: center; + display: flex; + justify-content: center; + text-align: center; + position: relative; + flex: 2; + align-self: stretch; +} + +.cu-bar.tabbar .submit:last-child { + flex: 2.6; +} + +.cu-bar.tabbar .submit+.submit { + flex: 2; +} + +.cu-bar.tabbar.border .action::before { + content: " "; + width: 200%; + height: 200%; + position: absolute; + top: 0; + left: 0; + transform: scale(0.5); + transform-origin: 0 0; + border-right: 1upx solid rgba(0, 0, 0, 0.1); + z-index: 3; +} + +.cu-bar.tabbar.border .action:last-child:before { + display: none; +} + +.cu-bar.input { + padding-right: 20upx; + background-color: #ffffff; +} + +.cu-bar.input input { + overflow: initial; + line-height: 64upx; + height: 64upx; + min-height: 64upx; + flex: 1; + font-size: 30upx; + margin: 0 20upx; +} + +.cu-bar.input .action { + margin-left: 20upx; +} + +.cu-bar.input .action [class*="cuIcon-"] { + font-size: 48upx; +} + +.cu-bar.input input+.action { + margin-right: 20upx; + margin-left: 0upx; +} + +.cu-bar.input .action:first-child [class*="cuIcon-"] { + margin-left: 0upx; +} + +.cu-custom { + display: block; + position: relative; +} + +.cu-custom .cu-bar .content { + width: calc(100% - 440upx); +} + +/* #ifdef MP-ALIPAY */ +.cu-custom .cu-bar .action .cuIcon-back { + opacity: 0; +} + +/* #endif */ + +.cu-custom .cu-bar .content image { + height: 60upx; + width: 240upx; +} + +.cu-custom .cu-bar { + min-height: 0px; + /* #ifdef MP-WEIXIN */ + padding-right: 220upx; + /* #endif */ + /* #ifdef MP-ALIPAY */ + padding-right: 150upx; + /* #endif */ + box-shadow: 0upx 0upx 0upx; + z-index: 9999; +} + +.cu-custom .cu-bar .border-custom { + position: relative; + background: rgba(0, 0, 0, 0.15); + border-radius: 1000upx; + height: 30px; +} + +.cu-custom .cu-bar .border-custom::after { + content: " "; + width: 200%; + height: 200%; + position: absolute; + top: 0; + left: 0; + border-radius: inherit; + transform: scale(0.5); + transform-origin: 0 0; + pointer-events: none; + box-sizing: border-box; + border: 1upx solid #ffffff; + opacity: 0.5; +} + +.cu-custom .cu-bar .border-custom::before { + content: " "; + width: 1upx; + height: 110%; + position: absolute; + top: 22.5%; + left: 0; + right: 0; + margin: auto; + transform: scale(0.5); + transform-origin: 0 0; + pointer-events: none; + box-sizing: border-box; + opacity: 0.6; + background-color: #ffffff; +} + +.cu-custom .cu-bar .border-custom text { + display: block; + flex: 1; + margin: auto !important; + text-align: center; + font-size: 34upx; +} + +/* ================== + 导航栏 + ==================== */ + +.nav { + white-space: nowrap; +} + +::-webkit-scrollbar { + display: none; +} + +.nav .cu-item { + height: 90upx; + display: inline-block; + line-height: 90upx; + margin: 0 10upx; + padding: 0 20upx; +} + +.nav .cu-item.cur { + border-bottom: 4upx solid; +} + +/* ================== + 时间轴 + ==================== */ + +.cu-timeline { + display: block; + background-color: #ffffff; +} + +.cu-timeline .cu-time { + width: 120upx; + text-align: center; + padding: 20upx 0; + font-size: 26upx; + color: #888; + display: block; +} + +.cu-timeline>.cu-item { + padding: 30upx 30upx 30upx 120upx; + position: relative; + display: block; + z-index: 0; +} + +.cu-timeline>.cu-item:not([class*="text-"]) { + color: #ccc; +} + +.cu-timeline>.cu-item::after { + content: ""; + display: block; + position: absolute; + width: 1upx; + background-color: #ddd; + left: 60upx; + height: 100%; + top: 0; + z-index: 8; +} + +.cu-timeline>.cu-item::before { + font-family: "cuIcon"; + display: block; + position: absolute; + top: 36upx; + z-index: 9; + background-color: #ffffff; + width: 50upx; + height: 50upx; + text-align: center; + border: none; + line-height: 50upx; + left: 36upx; +} + +.cu-timeline>.cu-item:not([class*="cuIcon-"])::before { + content: "\e763"; +} + +.cu-timeline>.cu-item[class*="cuIcon-"]::before { + background-color: #ffffff; + width: 50upx; + height: 50upx; + text-align: center; + border: none; + line-height: 50upx; + left: 36upx; +} + +.cu-timeline>.cu-item>.content { + padding: 30upx; + border-radius: 6upx; + display: block; + line-height: 1.6; +} + +.cu-timeline>.cu-item>.content:not([class*="bg-"]) { + background-color: #f1f1f1; + color: #333333; +} + +.cu-timeline>.cu-item>.content+.content { + margin-top: 20upx; +} + +/* ================== + 聊天 + ==================== */ + +.cu-chat { + display: flex; + flex-direction: column; +} + +.cu-chat .cu-item { + display: flex; + padding: 30upx 30upx 70upx; + position: relative; +} + +.cu-chat .cu-item>.cu-avatar { + width: 80upx; + height: 80upx; +} + +.cu-chat .cu-item>.main { + max-width: calc(100% - 260upx); + margin: 0 40upx; + display: flex; + align-items: center; +} + +.cu-chat .cu-item>image { + height: 320upx; +} + +.cu-chat .cu-item>.main .content { + padding: 20upx; + border-radius: 6upx; + display: inline-flex; + max-width: 100%; + align-items: center; + font-size: 30upx; + position: relative; + min-height: 80upx; + line-height: 40upx; + text-align: left; +} + +.cu-chat .cu-item>.main .content:not([class*="bg-"]) { + background-color: #ffffff; + color: #333333; +} + +.cu-chat .cu-item .date { + position: absolute; + font-size: 24upx; + color: #8799a3; + width: calc(100% - 320upx); + bottom: 20upx; + left: 160upx; +} + +.cu-chat .cu-item .action { + padding: 0 30upx; + display: flex; + align-items: center; +} + +.cu-chat .cu-item>.main .content::after { + content: ""; + top: 27upx; + transform: rotate(45deg); + position: absolute; + z-index: 100; + display: inline-block; + overflow: hidden; + width: 24upx; + height: 24upx; + left: -12upx; + right: initial; + background-color: inherit; +} + +.cu-chat .cu-item.self>.main .content::after { + left: auto; + right: -12upx; +} + +.cu-chat .cu-item>.main .content::before { + content: ""; + top: 30upx; + transform: rotate(45deg); + position: absolute; + z-index: -1; + display: inline-block; + overflow: hidden; + width: 24upx; + height: 24upx; + left: -12upx; + right: initial; + background-color: inherit; + filter: blur(5upx); + opacity: 0.3; +} + +.cu-chat .cu-item>.main .content:not([class*="bg-"])::before { + background-color: #333333; + opacity: 0.1; +} + +.cu-chat .cu-item.self>.main .content::before { + left: auto; + right: -12upx; +} + +.cu-chat .cu-item.self { + justify-content: flex-end; + text-align: right; +} + +.cu-chat .cu-info { + display: inline-block; + margin: 20upx auto; + font-size: 24upx; + padding: 8upx 12upx; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 6upx; + color: #ffffff; + max-width: 400upx; + line-height: 1.4; +} + +/* ================== + 卡片 + ==================== */ + +.cu-card { + display: block; + overflow: hidden; +} + +.cu-card>.cu-item { + display: block; + background-color: #ffffff; + overflow: hidden; + border-radius: 10upx; + margin: 30upx; +} + +.cu-card>.cu-item.shadow-blur { + overflow: initial; +} + +.cu-card.no-card>.cu-item { + margin: 0upx; + border-radius: 0upx; +} + +.cu-card .grid.grid-square { + margin-bottom: -20upx; +} + +.cu-card.case .image { + position: relative; +} + +.cu-card.case .image image { + width: 100%; +} + +.cu-card.case .image .cu-tag { + position: absolute; + right: 0; + top: 0; +} + +.cu-card.case .image .cu-bar { + position: absolute; + bottom: 0; + width: 100%; + background-color: transparent; + padding: 0upx 30upx; +} + +.cu-card.case.no-card .image { + margin: 30upx 30upx 0; + overflow: hidden; + border-radius: 10upx; +} + +.cu-card.dynamic { + display: block; +} + +.cu-card.dynamic>.cu-item { + display: block; + background-color: #ffffff; + overflow: hidden; +} + +.cu-card.dynamic>.cu-item>.text-content { + padding: 0 30upx 0; + max-height: 6.4em; + overflow: hidden; + font-size: 30upx; + margin-bottom: 20upx; +} + +.cu-card.dynamic>.cu-item .square-img { + width: 100%; + height: 200upx; + border-radius: 6upx; +} + +.cu-card.dynamic>.cu-item .only-img { + width: 100%; + height: 320upx; + border-radius: 6upx; +} + +/* card.dynamic>.cu-item .comment { + padding: 20upx; + background-color: #f1f1f1; + margin: 0 30upx 30upx; + border-radius: 6upx; +} */ + +.cu-card.article { + display: block; +} + +.cu-card.article>.cu-item { + padding-bottom: 30upx; +} + +.cu-card.article>.cu-item .title { + font-size: 30upx; + font-weight: 900; + color: #333333; + line-height: 100upx; + padding: 0 30upx; +} + +.cu-card.article>.cu-item .content { + display: flex; + padding: 0 30upx; +} + +.cu-card.article>.cu-item .content>image { + width: 240upx; + height: 6.4em; + margin-right: 20upx; + border-radius: 6upx; +} + +.cu-card.article>.cu-item .content .desc { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.cu-card.article>.cu-item .content .text-content { + font-size: 28upx; + color: #888; + height: 4.8em; + overflow: hidden; +} + +/* ================== + 表单 + ==================== */ + +.cu-form-group { + background-color: #ffffff; + padding: 1upx 30upx; + display: flex; + align-items: center; + min-height: 100upx; + justify-content: space-between; +} + +.cu-form-group+.cu-form-group { + border-top: 1upx solid #eee; +} + +.cu-form-group .title { + text-align: justify; + padding-right: 30upx; + font-size: 30upx; + position: relative; + height: 60upx; + line-height: 60upx; +} + +.cu-form-group input { + flex: 1; + font-size: 30upx; + color: #555; + padding-right: 20upx; +} + +.cu-form-group>text[class*="cuIcon-"] { + font-size: 36upx; + padding: 0; + box-sizing: border-box; +} + +.cu-form-group textarea { + margin: 32upx 0 30upx; + height: 4.6em; + width: 100%; + line-height: 1.2em; + flex: 1; + font-size: 28upx; + padding: 0; +} + +.cu-form-group.align-start .title { + height: 1em; + margin-top: 32upx; + line-height: 1em; +} + +.cu-form-group picker { + flex: 1; + padding-right: 40upx; + overflow: hidden; + position: relative; +} + +.cu-form-group picker .picker { + line-height: 100upx; + font-size: 28upx; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 100%; + text-align: right; +} + +.cu-form-group picker::after { + font-family: cuIcon; + display: block; + content: "\e6a3"; + position: absolute; + font-size: 34upx; + color: #8799a3; + line-height: 100upx; + width: 60upx; + text-align: center; + top: 0; + bottom: 0; + right: -20upx; + margin: auto; +} + +.cu-form-group textarea[disabled], +.cu-form-group textarea[disabled] .placeholder { + color: transparent; +} + +/* ================== + 模态窗口 + ==================== */ + +.cu-modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1110; + opacity: 0; + outline: 0; + text-align: center; + -ms-transform: scale(1.185); + transform: scale(1.185); + backface-visibility: hidden; + perspective: 2000upx; + background: rgba(0, 0, 0, 0.6); + transition: all 0.3s ease-in-out 0s; + pointer-events: none; +} + +.cu-modal::before { + content: "\200B"; + display: inline-block; + height: 100%; + vertical-align: middle; +} + +.cu-modal.show { + opacity: 1; + transition-duration: 0.3s; + -ms-transform: scale(1); + transform: scale(1); + overflow-x: hidden; + overflow-y: auto; + pointer-events: auto; +} + +.cu-dialog { + position: relative; + display: inline-block; + vertical-align: middle; + margin-left: auto; + margin-right: auto; + width: 680upx; + max-width: 100%; + background-color: #f8f8f8; + border-radius: 10upx; + overflow: hidden; +} + +.cu-modal.bottom-modal::before { + vertical-align: bottom; +} + +.cu-modal.bottom-modal .cu-dialog { + width: 100%; + border-radius: 0; +} + +.cu-modal.bottom-modal { + margin-bottom: -1000upx; +} + +.cu-modal.bottom-modal.show { + margin-bottom: 0; +} + +.cu-modal.drawer-modal { + transform: scale(1); + display: flex; +} + +.cu-modal.drawer-modal .cu-dialog { + height: 100%; + min-width: 200upx; + border-radius: 0; + margin: initial; + transition-duration: 0.3s; +} + +.cu-modal.drawer-modal.justify-start .cu-dialog { + transform: translateX(-100%); +} + +.cu-modal.drawer-modal.justify-end .cu-dialog { + transform: translateX(100%); +} + +.cu-modal.drawer-modal.show .cu-dialog { + transform: translateX(0%); +} +.cu-modal .cu-dialog>.cu-bar:first-child .action{ + min-width: 100rpx; + margin-right: 0; + min-height: 100rpx; +} +/* ================== + 轮播 + ==================== */ +swiper .a-swiper-dot { + display: inline-block; + width: 16upx; + height: 16upx; + background: rgba(0, 0, 0, .3); + border-radius: 50%; + vertical-align: middle; +} + +swiper[class*="-dot"] .wx-swiper-dots, +swiper[class*="-dot"] .a-swiper-dots, +swiper[class*="-dot"] .uni-swiper-dots { + display: flex; + align-items: center; + width: 100%; + justify-content: center; +} + +swiper.square-dot .wx-swiper-dot, +swiper.square-dot .a-swiper-dot, +swiper.square-dot .uni-swiper-dot { + background-color: #ffffff; + opacity: 0.4; + width: 10upx; + height: 10upx; + border-radius: 20upx; + margin: 0 8upx !important; +} + +swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active, +swiper.square-dot .a-swiper-dot.a-swiper-dot-active, +swiper.square-dot .uni-swiper-dot.uni-swiper-dot-active { + opacity: 1; + width: 30upx; +} + +swiper.round-dot .wx-swiper-dot, +swiper.round-dot .a-swiper-dot, +swiper.round-dot .uni-swiper-dot { + width: 10upx; + height: 10upx; + position: relative; + margin: 4upx 8upx !important; +} + +swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after, +swiper.round-dot .a-swiper-dot.a-swiper-dot-active::after, +swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active::after { + content: ""; + position: absolute; + width: 10upx; + height: 10upx; + top: 0upx; + left: 0upx; + right: 0; + bottom: 0; + margin: auto; + background-color: #ffffff; + border-radius: 20upx; +} + +swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active, +swiper.round-dot .a-swiper-dot.a-swiper-dot-active, +swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active { + width: 18upx; + height: 18upx; +} + +.screen-swiper { + min-height: 375upx; +} + +.screen-swiper image, +.screen-swiper video, +.swiper-item image, +.swiper-item video { + width: 100%; + display: block; + height: 100%; + margin: 0; + pointer-events: none; +} + +.card-swiper { + height: 420upx !important; +} + +.card-swiper swiper-item { + width: 610upx !important; + left: 70upx; + box-sizing: border-box; + padding: 40upx 0upx 70upx; + overflow: initial; +} + +.card-swiper swiper-item .swiper-item { + width: 100%; + display: block; + height: 100%; + border-radius: 10upx; + transform: scale(0.9); + transition: all 0.2s ease-in 0s; + overflow: hidden; +} + +.card-swiper swiper-item.cur .swiper-item { + transform: none; + transition: all 0.2s ease-in 0s; +} + + +.tower-swiper { + height: 420upx; + position: relative; + max-width: 750upx; + overflow: hidden; +} + +.tower-swiper .tower-item { + position: absolute; + width: 300upx; + height: 380upx; + top: 0; + bottom: 0; + left: 50%; + margin: auto; + transition: all 0.2s ease-in 0s; + opacity: 1; +} + +.tower-swiper .tower-item.none { + opacity: 0; +} + +.tower-swiper .tower-item .swiper-item { + width: 100%; + height: 100%; + border-radius: 6upx; + overflow: hidden; +} + +/* ================== + 步骤条 + ==================== */ + +.cu-steps { + display: flex; +} + +scroll-view.cu-steps { + display: block; + white-space: nowrap; +} + +scroll-view.cu-steps .cu-item { + display: inline-block; +} + +.cu-steps .cu-item { + flex: 1; + text-align: center; + position: relative; + min-width: 100upx; +} + +.cu-steps .cu-item:not([class*="text-"]) { + color: #8799a3; +} + +.cu-steps .cu-item [class*="cuIcon-"], +.cu-steps .cu-item .num { + display: block; + font-size: 40upx; + line-height: 80upx; +} + +.cu-steps .cu-item::before, +.cu-steps .cu-item::after, +.cu-steps.steps-arrow .cu-item::before, +.cu-steps.steps-arrow .cu-item::after { + content: ""; + display: block; + position: absolute; + height: 0px; + width: calc(100% - 80upx); + border-bottom: 1px solid #ccc; + left: calc(0px - (100% - 80upx) / 2); + top: 40upx; + z-index: 0; +} + +.cu-steps.steps-arrow .cu-item::before, +.cu-steps.steps-arrow .cu-item::after { + content: "\e6a3"; + font-family: 'cuIcon'; + height: 30upx; + border-bottom-width: 0px; + line-height: 30upx; + top: 0; + bottom: 0; + margin: auto; + color: #ccc; +} + +.cu-steps.steps-bottom .cu-item::before, +.cu-steps.steps-bottom .cu-item::after { + bottom: 40upx; + top: initial; +} + +.cu-steps .cu-item::after { + border-bottom: 1px solid currentColor; + width: 0px; + transition: all 0.3s ease-in-out 0s; +} + +.cu-steps .cu-item[class*="text-"]::after { + width: calc(100% - 80upx); + color: currentColor; +} + +.cu-steps .cu-item:first-child::before, +.cu-steps .cu-item:first-child::after { + display: none; +} + +.cu-steps .cu-item .num { + width: 40upx; + height: 40upx; + border-radius: 50%; + line-height: 40upx; + margin: 20upx auto; + font-size: 24upx; + border: 1px solid currentColor; + position: relative; + overflow: hidden; +} + +.cu-steps .cu-item[class*="text-"] .num { + background-color: currentColor; +} + +.cu-steps .cu-item .num::before, +.cu-steps .cu-item .num::after { + content: attr(data-index); + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; + transition: all 0.3s ease-in-out 0s; + transform: translateY(0upx); +} + +.cu-steps .cu-item[class*="text-"] .num::before { + transform: translateY(-40upx); + color: #ffffff; +} + +.cu-steps .cu-item .num::after { + transform: translateY(40upx); + color: #ffffff; + transition: all 0.3s ease-in-out 0s; +} + +.cu-steps .cu-item[class*="text-"] .num::after { + content: "\e645"; + font-family: 'cuIcon'; + color: #ffffff; + transform: translateY(0upx); +} + +.cu-steps .cu-item[class*="text-"] .num.err::after { + content: "\e646"; +} + +/* ================== + 布局 + ==================== */ + +/* -- flex弹性布局 -- */ + +.flex { + display: flex; +} + +.basis-xs { + flex-basis: 20%; +} + +.basis-sm { + flex-basis: 40%; +} + +.basis-df { + flex-basis: 50%; +} + +.basis-lg { + flex-basis: 60%; +} + +.basis-xl { + flex-basis: 80%; +} + +.flex-sub { + flex: 1; +} + +.flex-twice { + flex: 2; +} + +.flex-treble { + flex: 3; +} + +.flex-direction { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.align-start { + align-items: flex-start; +} + +.align-end { + align-items: flex-end; +} + +.align-center { + align-items: center; +} + +.align-stretch { + align-items: stretch; +} + +.self-start { + align-self: flex-start; +} + +.self-center { + align-self: flex-center; +} + +.self-end { + align-self: flex-end; +} + +.self-stretch { + align-self: stretch; +} + +.align-stretch { + align-items: stretch; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +/* grid布局 */ + +.grid { + display: flex; + flex-wrap: wrap; +} + +.grid.grid-square { + overflow: hidden; +} + +.grid.grid-square .cu-tag { + position: absolute; + right: 0; + top: 0; + border-bottom-left-radius: 6upx; + padding: 6upx 12upx; + height: auto; + background-color: rgba(0, 0, 0, 0.5); +} + +.grid.grid-square>view>text[class*="cuIcon-"] { + font-size: 52upx; + position: absolute; + color: #8799a3; + margin: auto; + top: 0; + bottom: 0; + left: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} + +.grid.grid-square>view { + margin-right: 20upx; + margin-bottom: 20upx; + border-radius: 6upx; + position: relative; + overflow: hidden; +} +.grid.grid-square>view.bg-img image { + width: 100%; + height: 100%; + position: absolute; +} +.grid.col-1.grid-square>view { + padding-bottom: 100%; + height: 0; + margin-right: 0; +} + +.grid.col-2.grid-square>view { + padding-bottom: calc((100% - 20upx)/2); + height: 0; + width: calc((100% - 20upx)/2); +} + +.grid.col-3.grid-square>view { + padding-bottom: calc((100% - 40upx)/3); + height: 0; + width: calc((100% - 40upx)/3); +} + +.grid.col-4.grid-square>view { + padding-bottom: calc((100% - 60upx)/4); + height: 0; + width: calc((100% - 60upx)/4); +} + +.grid.col-5.grid-square>view { + padding-bottom: calc((100% - 80upx)/5); + height: 0; + width: calc((100% - 80upx)/5); +} + +.grid.col-2.grid-square>view:nth-child(2n), +.grid.col-3.grid-square>view:nth-child(3n), +.grid.col-4.grid-square>view:nth-child(4n), +.grid.col-5.grid-square>view:nth-child(5n) { + margin-right: 0; +} + +.grid.col-1>view { + width: 100%; +} + +.grid.col-2>view { + width: 50%; +} + +.grid.col-3>view { + width: 33.33%; +} + +.grid.col-4>view { + width: 25%; +} + +.grid.col-5>view { + width: 20%; +} + +/* -- 内外边距 -- */ + +.margin-0 { + margin: 0; +} + +.margin-xs { + margin: 10upx; +} + +.margin-sm { + margin: 20upx; +} + +.margin { + margin: 30upx; +} + +.margin-lg { + margin: 40upx; +} + +.margin-xl { + margin: 50upx; +} + +.margin-top-xs { + margin-top: 10upx; +} + +.margin-top-sm { + margin-top: 20upx; +} + +.margin-top { + margin-top: 30upx; +} + +.margin-top-lg { + margin-top: 40upx; +} + +.margin-top-xl { + margin-top: 50upx; +} + +.margin-right-xs { + margin-right: 10upx; +} + +.margin-right-sm { + margin-right: 20upx; +} + +.margin-right { + margin-right: 30upx; +} + +.margin-right-lg { + margin-right: 40upx; +} + +.margin-right-xl { + margin-right: 50upx; +} + +.margin-bottom-xs { + margin-bottom: 10upx; +} + +.margin-bottom-sm { + margin-bottom: 20upx; +} + +.margin-bottom { + margin-bottom: 30upx; +} + +.margin-bottom-lg { + margin-bottom: 40upx; +} + +.margin-bottom-xl { + margin-bottom: 50upx; +} + +.margin-left-xs { + margin-left: 10upx; +} + +.margin-left-sm { + margin-left: 20upx; +} + +.margin-left { + margin-left: 30upx; +} + +.margin-left-lg { + margin-left: 40upx; +} + +.margin-left-xl { + margin-left: 50upx; +} + +.margin-lr-xs { + margin-left: 10upx; + margin-right: 10upx; +} + +.margin-lr-sm { + margin-left: 20upx; + margin-right: 20upx; +} + +.margin-lr { + margin-left: 30upx; + margin-right: 30upx; +} + +.margin-lr-lg { + margin-left: 40upx; + margin-right: 40upx; +} + +.margin-lr-xl { + margin-left: 50upx; + margin-right: 50upx; +} + +.margin-tb-xs { + margin-top: 10upx; + margin-bottom: 10upx; +} + +.margin-tb-sm { + margin-top: 20upx; + margin-bottom: 20upx; +} + +.margin-tb { + margin-top: 30upx; + margin-bottom: 30upx; +} + +.margin-tb-lg { + margin-top: 40upx; + margin-bottom: 40upx; +} + +.margin-tb-xl { + margin-top: 50upx; + margin-bottom: 50upx; +} + +.padding-0 { + padding: 0; +} + +.padding-xs { + padding: 10upx; +} + +.padding-sm { + padding: 20upx; +} + +.padding { + padding: 30upx; +} + +.padding-lg { + padding: 40upx; +} + +.padding-xl { + padding: 50upx; +} + +.padding-top-xs { + padding-top: 10upx; +} + +.padding-top-sm { + padding-top: 20upx; +} + +.padding-top { + padding-top: 30upx; +} + +.padding-top-lg { + padding-top: 40upx; +} + +.padding-top-xl { + padding-top: 50upx; +} + +.padding-right-xs { + padding-right: 10upx; +} + +.padding-right-sm { + padding-right: 20upx; +} + +.padding-right { + padding-right: 30upx; +} + +.padding-right-lg { + padding-right: 40upx; +} + +.padding-right-xl { + padding-right: 50upx; +} + +.padding-bottom-xs { + padding-bottom: 10upx; +} + +.padding-bottom-sm { + padding-bottom: 20upx; +} + +.padding-bottom { + padding-bottom: 30upx; +} + +.padding-bottom-lg { + padding-bottom: 40upx; +} + +.padding-bottom-xl { + padding-bottom: 50upx; +} + +.padding-left-xs { + padding-left: 10upx; +} + +.padding-left-sm { + padding-left: 20upx; +} + +.padding-left { + padding-left: 30upx; +} + +.padding-left-lg { + padding-left: 40upx; +} + +.padding-left-xl { + padding-left: 50upx; +} + +.padding-lr-xs { + padding-left: 10upx; + padding-right: 10upx; +} + +.padding-lr-sm { + padding-left: 20upx; + padding-right: 20upx; +} + +.padding-lr { + padding-left: 30upx; + padding-right: 30upx; +} + +.padding-lr-lg { + padding-left: 40upx; + padding-right: 40upx; +} + +.padding-lr-xl { + padding-left: 50upx; + padding-right: 50upx; +} + +.padding-tb-xs { + padding-top: 10upx; + padding-bottom: 10upx; +} + +.padding-tb-sm { + padding-top: 20upx; + padding-bottom: 20upx; +} + +.padding-tb { + padding-top: 30upx; + padding-bottom: 30upx; +} + +.padding-tb-lg { + padding-top: 40upx; + padding-bottom: 40upx; +} + +.padding-tb-xl { + padding-top: 50upx; + padding-bottom: 50upx; +} + +/* -- 浮动 -- */ + +.cf::after, +.cf::before { + content: " "; + display: table; +} + +.cf::after { + clear: both; +} + +.fl { + float: left; +} + +.fr { + float: right; +} + +/* ================== + 背景 + ==================== */ + +.line-red::after, +.lines-red::after { + border-color: #e54d42; +} + +.line-orange::after, +.lines-orange::after { + border-color: #f37b1d; +} + +.line-yellow::after, +.lines-yellow::after { + border-color: #fbbd08; +} + +.line-olive::after, +.lines-olive::after { + border-color: #8dc63f; +} + +.line-green::after, +.lines-green::after { + border-color: #39b54a; +} + +.line-cyan::after, +.lines-cyan::after { + border-color: #1cbbb4; +} + +.line-blue::after, +.lines-blue::after { + border-color: #0081ff; +} + +.line-purple::after, +.lines-purple::after { + border-color: #6739b6; +} + +.line-mauve::after, +.lines-mauve::after { + border-color: #9c26b0; +} + +.line-pink::after, +.lines-pink::after { + border-color: #e03997; +} + +.line-brown::after, +.lines-brown::after { + border-color: #a5673f; +} + +.line-grey::after, +.lines-grey::after { + border-color: #8799a3; +} + +.line-gray::after, +.lines-gray::after { + border-color: #aaaaaa; +} + +.line-black::after, +.lines-black::after { + border-color: #333333; +} + +.line-white::after, +.lines-white::after { + border-color: #ffffff; +} + +.bg-red { + background-color: #e54d42; + color: #ffffff; +} + +.bg-orange { + background-color: #f37b1d; + color: #ffffff; +} + +.bg-yellow { + background-color: #fbbd08; + color: #333333; +} + +.bg-olive { + background-color: #8dc63f; + color: #ffffff; +} + +.bg-green { + background-color: #39b54a; + color: #ffffff; +} + +.bg-cyan { + background-color: #1cbbb4; + color: #ffffff; +} + +.bg-blue { + background-color: #0081ff; + color: #ffffff; +} + +.bg-purple { + background-color: #6739b6; + color: #ffffff; +} + +.bg-mauve { + background-color: #9c26b0; + color: #ffffff; +} + +.bg-pink { + background-color: #e03997; + color: #ffffff; +} + +.bg-brown { + background-color: #a5673f; + color: #ffffff; +} + +.bg-grey { + background-color: #8799a3; + color: #ffffff; +} + +.bg-gray { + background-color: #f0f0f0; + color: #333333; +} + +.bg-black { + background-color: #333333; + color: #ffffff; +} + +.bg-white { + background-color: #ffffff; + color: #666666; +} + +.bg-shadeTop { + background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01)); + color: #ffffff; +} + +.bg-shadeBottom { + background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1)); + color: #ffffff; +} + +.bg-red.light { + color: #e54d42; + background-color: #fadbd9; +} + +.bg-orange.light { + color: #f37b1d; + background-color: #fde6d2; +} + +.bg-yellow.light { + color: #fbbd08; + background-color: #fef2ced2; +} + +.bg-olive.light { + color: #8dc63f; + background-color: #e8f4d9; +} + +.bg-green.light { + color: #39b54a; + background-color: #d7f0dbff; +} + +.bg-cyan.light { + color: #1cbbb4; + background-color: #d2f1f0; +} + +.bg-blue.light { + color: #0081ff; + background-color: #cce6ff; +} + +.bg-purple.light { + color: #6739b6; + background-color: #e1d7f0; +} + +.bg-mauve.light { + color: #9c26b0; + background-color: #ebd4ef; +} + +.bg-pink.light { + color: #e03997; + background-color: #f9d7ea; +} + +.bg-brown.light { + color: #a5673f; + background-color: #ede1d9; +} + +.bg-grey.light { + color: #8799a3; + background-color: #e7ebed; +} + +.bg-gradual-red { + background-image: linear-gradient(45deg, #f43f3b, #ec008c); + color: #ffffff; +} + +.bg-gradual-orange { + background-image: linear-gradient(45deg, #ff9700, #ed1c24); + color: #ffffff; +} + +.bg-gradual-green { + background-image: linear-gradient(45deg, #39b54a, #8dc63f); + color: #ffffff; +} + +.bg-gradual-purple { + background-image: linear-gradient(45deg, #9000ff, #5e00ff); + color: #ffffff; +} + +.bg-gradual-pink { + background-image: linear-gradient(45deg, #ec008c, #6739b6); + color: #ffffff; +} + +.bg-gradual-blue { + background-image: linear-gradient(45deg, #0081ff, #1cbbb4); + color: #ffffff; +} + +.shadow[class*="-red"] { + box-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2); +} + +.shadow[class*="-orange"] { + box-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2); +} + +.shadow[class*="-yellow"] { + box-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2); +} + +.shadow[class*="-olive"] { + box-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2); +} + +.shadow[class*="-green"] { + box-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2); +} + +.shadow[class*="-cyan"] { + box-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2); +} + +.shadow[class*="-blue"] { + box-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2); +} + +.shadow[class*="-purple"] { + box-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2); +} + +.shadow[class*="-mauve"] { + box-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2); +} + +.shadow[class*="-pink"] { + box-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2); +} + +.shadow[class*="-brown"] { + box-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2); +} + +.shadow[class*="-grey"] { + box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2); +} + +.shadow[class*="-gray"] { + box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2); +} + +.shadow[class*="-black"] { + box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2); +} + +.shadow[class*="-white"] { + box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2); +} + +.text-shadow[class*="-red"] { + text-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2); +} + +.text-shadow[class*="-orange"] { + text-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2); +} + +.text-shadow[class*="-yellow"] { + text-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2); +} + +.text-shadow[class*="-olive"] { + text-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2); +} + +.text-shadow[class*="-green"] { + text-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2); +} + +.text-shadow[class*="-cyan"] { + text-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2); +} + +.text-shadow[class*="-blue"] { + text-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2); +} + +.text-shadow[class*="-purple"] { + text-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2); +} + +.text-shadow[class*="-mauve"] { + text-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2); +} + +.text-shadow[class*="-pink"] { + text-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2); +} + +.text-shadow[class*="-brown"] { + text-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2); +} + +.text-shadow[class*="-grey"] { + text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2); +} + +.text-shadow[class*="-gray"] { + text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2); +} + +.text-shadow[class*="-black"] { + text-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2); +} + +.bg-img { + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + +.bg-mask { + background-color: #333333; + position: relative; +} + +.bg-mask::after { + content: ""; + border-radius: inherit; + width: 100%; + height: 100%; + display: block; + background-color: rgba(0, 0, 0, 0.4); + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; +} + +.bg-mask view, +.bg-mask cover-view { + z-index: 5; + position: relative; +} + +.bg-video { + position: relative; +} + +.bg-video video { + display: block; + height: 100%; + width: 100%; + -o-object-fit: cover; + object-fit: cover; + position: absolute; + top: 0; + z-index: 0; + pointer-events: none; +} + +/* ================== + 文本 + ==================== */ + +.text-xs { + font-size: 20upx; +} + +.text-sm { + font-size: 24upx; +} + +.text-df { + font-size: 28upx; +} + +.text-lg { + font-size: 32upx; +} + +.text-xl { + font-size: 36upx; +} + +.text-xxl { + font-size: 44upx; +} + +.text-sl { + font-size: 80upx; +} + +.text-xsl { + font-size: 120upx; +} + +.text-Abc { + text-transform: Capitalize; +} + +.text-ABC { + text-transform: Uppercase; +} + +.text-abc { + text-transform: Lowercase; +} + +.text-price::before { + content: "¥"; + font-size: 80%; + margin-right: 4upx; +} + +.text-cut { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.text-bold { + font-weight: bold; +} + +.text-center { + text-align: center; +} + +.text-content { + line-height: 1.6; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-red, +.line-red, +.lines-red { + color: #e54d42; +} + +.text-orange, +.line-orange, +.lines-orange { + color: #f37b1d; +} + +.text-yellow, +.line-yellow, +.lines-yellow { + color: #fbbd08; +} + +.text-olive, +.line-olive, +.lines-olive { + color: #8dc63f; +} + +.text-green, +.line-green, +.lines-green { + color: #39b54a; +} + +.text-cyan, +.line-cyan, +.lines-cyan { + color: #1cbbb4; +} + +.text-blue, +.line-blue, +.lines-blue { + color: #0081ff; +} + +.text-purple, +.line-purple, +.lines-purple { + color: #6739b6; +} + +.text-mauve, +.line-mauve, +.lines-mauve { + color: #9c26b0; +} + +.text-pink, +.line-pink, +.lines-pink { + color: #e03997; +} + +.text-brown, +.line-brown, +.lines-brown { + color: #a5673f; +} + +.text-grey, +.line-grey, +.lines-grey { + color: #8799a3; +} + +.text-gray, +.line-gray, +.lines-gray { + color: #aaaaaa; +} + +.text-black, +.line-black, +.lines-black { + color: #333333; +} + +.text-white, +.line-white, +.lines-white { + color: #ffffff; +} diff --git a/static/scss/global.scss b/static/scss/global.scss new file mode 100644 index 00000000..ac636bdf --- /dev/null +++ b/static/scss/global.scss @@ -0,0 +1,90 @@ +.text-center { + text-align: center; +} + +.font-13 { + font-size: 13px; +} + +.font-12 { + font-size: 12px; +} + +.font-11 { + font-size: 11px; +} + +.text-grey1 { + color: #888; +} +.text-grey2 { + color: #aaa; +} + +.list-cell-arrow::before { + content: ' '; + height: 10px; + width: 10px; + border-width: 2px 2px 0 0; + border-color: #c0c0c0; + border-style: solid; + -webkit-transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0); + transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0); + position: absolute; + top: 50%; + margin-top: -6px; + right: 30rpx; + } + + .list-cell { + position: relative; + width: 100%; + box-sizing: border-box; + background-color: #fff; + color: #333; + padding: 26rpx 30rpx; + } + + .list-cell:first-child { + border-radius: 8rpx 8rpx 0 0; + } + + .list-cell:last-child { + border-radius: 0 0 8rpx 8rpx; + } + + .list-cell::after { + content: ''; + position: absolute; + border-bottom: 1px solid #eaeef1; + -webkit-transform: scaleY(0.5) translateZ(0); + transform: scaleY(0.5) translateZ(0); + transform-origin: 0 100%; + bottom: 0; + right: 0; + left: 0; + pointer-events: none; + } + + + .menu-list { + margin: 15px 15px; + + .menu-item-box { + width: 100%; + display: flex; + align-items: center; + + .menu-icon { + color: #007AFF; + font-size: 16px; + margin-right: 5px; + } + + .text-right { + margin-left: auto; + margin-right: 34rpx; + color: #999; + } + } + } diff --git a/static/scss/index.scss b/static/scss/index.scss new file mode 100644 index 00000000..745cffa2 --- /dev/null +++ b/static/scss/index.scss @@ -0,0 +1,6 @@ +// global +@import "./global.scss"; +// color-ui +@import "@/static/scss/colorui.css"; +// iconfont +@import "@/static/font/iconfont.css"; \ No newline at end of file diff --git a/store/getters.js b/store/getters.js new file mode 100644 index 00000000..88547941 --- /dev/null +++ b/store/getters.js @@ -0,0 +1,8 @@ +const getters = { + token: state => state.user.token, + avatar: state => state.user.avatar, + name: state => state.user.name, + roles: state => state.user.roles, + permissions: state => state.user.permissions +} +export default getters diff --git a/store/index.js b/store/index.js new file mode 100644 index 00000000..83a9db56 --- /dev/null +++ b/store/index.js @@ -0,0 +1,15 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import user from '@/store/modules/user' +import getters from './getters' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + user + }, + getters +}) + +export default store diff --git a/store/modules/user.js b/store/modules/user.js new file mode 100644 index 00000000..7d03c1a2 --- /dev/null +++ b/store/modules/user.js @@ -0,0 +1,98 @@ +import config from '@/config' +import storage from '@/utils/storage' +import constant from '@/utils/constant' +import { login, logout, getInfo } from '@/api/login' +import { setToken, removeToken } from '@/utils/auth' + +const baseUrl = config.baseUrl + +const user = { + state: { + id: 0, // 用户编号 + name: storage.get(constant.name), + avatar: storage.get(constant.avatar), + roles: storage.get(constant.roles), + permissions: storage.get(constant.permissions) + }, + + mutations: { + SET_ID: (state, id) => { + state.id = id + }, + SET_NAME: (state, name) => { + state.name = name + storage.set(constant.name, name) + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + storage.set(constant.avatar, avatar) + }, + SET_ROLES: (state, roles) => { + state.roles = roles + storage.set(constant.roles, roles) + }, + SET_PERMISSIONS: (state, permissions) => { + state.permissions = permissions + storage.set(constant.permissions, permissions) + } + }, + + actions: { + // 登录 + Login({ commit }, userInfo) { + const username = userInfo.username.trim() + const password = userInfo.password + const captchaVerification = userInfo.captchaVerification + return new Promise((resolve, reject) => { + login(username, password, captchaVerification).then(res => { + res = res.data; + // 设置 token + setToken(res) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 获取用户信息 + GetInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo().then(res => { + res = res.data; // 读取 data 数据 + const user = res.user + const avatar = (user == null || user.avatar === "" || user.avatar == null) ? require("@/static/images/profile.jpg") : user.avatar + const nickname = (user == null || user.nickname === "" || user.nickname == null) ? "" : user.nickname + if (res.roles && res.roles.length > 0) { + commit('SET_ROLES', res.roles) + commit('SET_PERMISSIONS', res.permissions) + } else { + commit('SET_ROLES', ['ROLE_DEFAULT']) + } + commit('SET_NAME', nickname) + commit('SET_AVATAR', avatar) + resolve(res) + }).catch(error => { + reject(error) + }) + }) + }, + + // 退出系统 + LogOut({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_ROLES', []) + commit('SET_PERMISSIONS', []) + removeToken() + storage.clean() + resolve() + }).catch(error => { + reject(error) + }) + }) + } + } +} + +export default user diff --git a/uni.scss b/uni.scss new file mode 100644 index 00000000..5b30ca31 --- /dev/null +++ b/uni.scss @@ -0,0 +1,64 @@ +/** + * uni-app内置的常用样式变量 + */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#e5e5e5; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16px; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; \ No newline at end of file diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md new file mode 100644 index 00000000..544ecc13 --- /dev/null +++ b/uni_modules/uni-badge/changelog.md @@ -0,0 +1,29 @@ +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-badge](https://uniapp.dcloud.io/component/uniui/uni-badge) +## 1.1.7(2021-11-08) +- 优化 升级ui +- 修改 size 属性默认值调整为 small +- 修改 type 属性,默认值调整为 error,info 替换 default +## 1.1.6(2021-09-22) +- 修复 在字节小程序上样式不生效的 bug +## 1.1.5(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.4(2021-07-29) +- 修复 去掉 nvue 不支持css 的 align-self 属性,nvue 下不暂支持 absolute 属性 +## 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 00000000..fcbfe938 --- /dev/null +++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json new file mode 100644 index 00000000..4e9e631a --- /dev/null +++ b/uni_modules/uni-badge/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-badge", + "displayName": "uni-badge 数字角标", + "version": "1.2.0", + "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。", + "keywords": [ + "", + "badge", + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "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 00000000..bdf175da --- /dev/null +++ b/uni_modules/uni-badge/readme.md @@ -0,0 +1,10 @@ +## Badge 数字角标 +> **组件名:uni-badge** +> 代码块: `uBadge` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-badge) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-breadcrumb/changelog.md b/uni_modules/uni-breadcrumb/changelog.md new file mode 100644 index 00000000..016e6cee --- /dev/null +++ b/uni_modules/uni-breadcrumb/changelog.md @@ -0,0 +1,6 @@ +## 0.1.2(2022-06-08) +- 修复 微信小程序 separator 不显示问题 +## 0.1.1(2022-06-02) +- 新增 支持 uni.scss 修改颜色 +## 0.1.0(2022-04-21) +- 初始化 diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue new file mode 100644 index 00000000..b9edbd62 --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue @@ -0,0 +1,121 @@ + + + diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue new file mode 100644 index 00000000..94493a21 --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue @@ -0,0 +1,41 @@ + + + diff --git a/uni_modules/uni-breadcrumb/package.json b/uni_modules/uni-breadcrumb/package.json new file mode 100644 index 00000000..0a04e503 --- /dev/null +++ b/uni_modules/uni-breadcrumb/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-breadcrumb", + "displayName": "uni-breadcrumb 面包屑", + "version": "0.1.2", + "description": "Breadcrumb 面包屑", + "keywords": [ + "uni-breadcrumb", + "breadcrumb", + "uni-ui", + "面包屑导航", + "面包屑" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "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", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} diff --git a/uni_modules/uni-breadcrumb/readme.md b/uni_modules/uni-breadcrumb/readme.md new file mode 100644 index 00000000..6976b8d7 --- /dev/null +++ b/uni_modules/uni-breadcrumb/readme.md @@ -0,0 +1,66 @@ + +## breadcrumb 面包屑导航 +> **组件名:uni-breadcrumb** +> 代码块: `ubreadcrumb` + +显示当前页面的路径,快速返回之前的任意页面。 + +### 安装方式 + +本组件符合[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 + + {{route.name}} + +``` + +```js +export default { + name: "uni-stat-breadcrumb", + data() { + return { + routes: [{ + to: '/A', + name: 'A页面' + }, { + to: '/B', + name: 'B页面' + }, { + to: '/C', + name: 'C页面' + }] + }; + } + } +``` + + +## API + +### Breadcrumb Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|separator |String |斜杠'/' |分隔符 | +|separatorClass |String | |图标分隔符 class | + +### Breadcrumb Item Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|to |String | |路由跳转页面路径 | +|replace|Boolean | |在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录(仅 h5 支持) | + + + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb](https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb) \ No newline at end of file diff --git a/uni_modules/uni-calendar/changelog.md b/uni_modules/uni-calendar/changelog.md new file mode 100644 index 00000000..6df4493e --- /dev/null +++ b/uni_modules/uni-calendar/changelog.md @@ -0,0 +1,16 @@ +## 1.4.5(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式 +## 1.4.4(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式 +## 1.4.3(2021-09-22) +- 修复 startDate、 endDate 属性失效的 bug +## 1.4.2(2021-08-24) +- 新增 支持国际化 +## 1.4.1(2021-08-05) +- 修复 弹出层被 tabbar 遮盖 bug +## 1.4.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.3.16(2021-05-12) +- 新增 组件示例地址 +## 1.3.15(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-calendar/components/uni-calendar/calendar.js b/uni_modules/uni-calendar/components/uni-calendar/calendar.js new file mode 100644 index 00000000..b8d7d6fc --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/calendar.js @@ -0,0 +1,546 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @github https://github.com/jjonline/calendar.js +* @Author Jea杨(JJonline@JJonline.Cn) +* @Time 2014-7-21 +* @Time 2016-8-13 Fixed 2033hex、Attribution Annals +* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug +* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year +* @Version 1.0.3 +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +*/ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + var i; var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { return -1 } + if (n < 1 || n > 24) { return -1 } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708'// 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; break + case 20: + s = '\u4e8c\u5341'; break + break + case 30: + s = '\u4e09\u5341'; break + break + default : + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1// undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; var leap = 0; var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i)// 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { isLeap = false } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; --i + } + } + if (offset < 0) { + offset += temp; --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { offset += day } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json new file mode 100644 index 00000000..fcbd13cf --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json @@ -0,0 +1,12 @@ +{ + "uni-calender.ok": "ok", + "uni-calender.cancel": "cancel", + "uni-calender.today": "today", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN" +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json new file mode 100644 index 00000000..1ca43de0 --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json @@ -0,0 +1,12 @@ +{ + "uni-calender.ok": "确定", + "uni-calender.cancel": "取消", + "uni-calender.today": "今日", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json new file mode 100644 index 00000000..e0fe33b9 --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json @@ -0,0 +1,12 @@ +{ + "uni-calender.ok": "確定", + "uni-calender.cancel": "取消", + "uni-calender.today": "今日", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue new file mode 100644 index 00000000..30bd6c84 --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue new file mode 100644 index 00000000..88381db7 --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue @@ -0,0 +1,562 @@ + + + + + diff --git a/uni_modules/uni-calendar/components/uni-calendar/util.js b/uni_modules/uni-calendar/components/uni-calendar/util.js new file mode 100644 index 00000000..2d6100bf --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/util.js @@ -0,0 +1,350 @@ +import CALENDAR from './calendar.js' + +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + lunar: this.getlunar(full.year, full.month - 1, beforeDate), + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + // let dateCompBefore = this.dateCompare(this.startDate, fullDate) + // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + disableBefore = this.dateCompare(this.startDate, nowDate) + } + + if (this.endDate) { + // let dateCompAfter = this.dateCompare(fullDate, this.endDate) + // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + disableAfter = this.dateCompare(nowDate, this.endDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate), + afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate), + month: full.month, + lunar: this.getlunar(full.year, full.month, i), + disable: !(disableBefore && disableAfter), + isDay + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + lunar: this.getlunar(full.year, Number(full.month) + 1, i), + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + /** + * 计算阴历日期显示 + */ + getlunar(year, month, date) { + return CALENDAR.solar2lunar(year, month, date) + } + /** + * 设置打点 + */ + setSelectInfo(data, value) { + this.selected = value + this._getWeek(data) + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (before && after) { + this.multipleStatus.before = '' + this.multipleStatus.after = '' + this.multipleStatus.data = [] + } else { + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + } + this._getWeek(fullDate) + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + year, + month + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/uni_modules/uni-calendar/package.json b/uni_modules/uni-calendar/package.json new file mode 100644 index 00000000..40455c87 --- /dev/null +++ b/uni_modules/uni-calendar/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-calendar", + "displayName": "uni-calendar 日历", + "version": "1.4.5", + "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": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-calendar/readme.md b/uni_modules/uni-calendar/readme.md new file mode 100644 index 00000000..4f3ca0e8 --- /dev/null +++ b/uni_modules/uni-calendar/readme.md @@ -0,0 +1,103 @@ + + +## Calendar 日历 +> **组件名:uni-calendar** +> 代码块: `uCalendar` + + +日历组件 + +> **注意事项** +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 本组件农历转换使用的js是 [@1900-2100区间内的公历、农历互转](https://github.com/jjonline/calendar.js) +> - 仅支持自定义组件模式 +> - `date`属性传入的应该是一个 String ,如: 2019-06-27 ,而不是 new Date() +> - 通过 `insert` 属性来确定当前的事件是 @change 还是 @confirm 。理应合并为一个事件,但是为了区分模式,现使用两个事件,这里需要注意 +> - 弹窗模式下无法阻止后面的元素滚动,如有需要阻止,请在弹窗弹出后,手动设置滚动元素为不可滚动 + + +### 安装方式 + +本组件符合[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 + + + +``` + +### 通过方法打开日历 + +需要设置 `insert` 为 `false` + +```html + + + + +``` + +```javascript + +export default { + data() { + return {}; + }, + methods: { + open(){ + this.$refs.calendar.open(); + }, + confirm(e) { + console.log(e); + } + } +}; + +``` + + +## API + +### Calendar Props + +| 属性名 | 类型 | 默认值| 说明 | +| | | +| date | String |- | 自定义当前时间,默认为今天 | +| lunar | Boolean | false | 显示农历 | +| startDate | String |- | 日期选择范围-开始日期 | +| endDate | String |- | 日期选择范围-结束日期 | +| range | Boolean | false | 范围选择 | +| insert | Boolean | false | 插入模式,可选值,ture:插入模式;false:弹窗模式;默认为插入模式 | +|clearDate |Boolean |true |弹窗模式是否清空上次选择内容 | +| selected | Array |- | 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}] | +|showMonth | Boolean | true | 是否显示月份为背景 | + +### Calendar Events + +| 事件名 | 说明 |返回值| +| | | | +| open | 弹出日历组件,`insert :false` 时生效|- | + + + + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar](https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar) \ No newline at end of file diff --git a/uni_modules/uni-card/changelog.md b/uni_modules/uni-card/changelog.md new file mode 100644 index 00000000..c3cd8c45 --- /dev/null +++ b/uni_modules/uni-card/changelog.md @@ -0,0 +1,26 @@ +## 1.3.1(2021-12-20) +- 修复 在vue页面下略缩图显示不正常的bug +## 1.3.0(2021-11-19) +- 重构插槽的用法 ,header 替换为 title +- 新增 actions 插槽 +- 新增 cover 封面图属性和插槽 +- 新增 padding 内容默认内边距离 +- 新增 margin 卡片默认外边距离 +- 新增 spacing 卡片默认内边距 +- 新增 shadow 卡片阴影属性 +- 取消 mode 属性,可使用组合插槽代替 +- 取消 note 属性 ,使用actions插槽代替 +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-card](https://uniapp.dcloud.io/component/uniui/uni-card) +## 1.2.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-07-01) +- 优化 图文卡片无图片加载时,提供占位图标 +- 新增 header 插槽,自定义卡片头部( 图文卡片 mode="style" 时,不支持) +- 修复 thumbnail 不存在仍然占位的 bug +## 1.1.7(2021-05-12) +- 新增 组件示例地址 +## 1.1.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-card/components/uni-card/uni-card.vue b/uni_modules/uni-card/components/uni-card/uni-card.vue new file mode 100644 index 00000000..38cf594c --- /dev/null +++ b/uni_modules/uni-card/components/uni-card/uni-card.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/uni_modules/uni-card/package.json b/uni_modules/uni-card/package.json new file mode 100644 index 00000000..f16224de --- /dev/null +++ b/uni_modules/uni-card/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-card", + "displayName": "uni-card 卡片", + "version": "1.3.1", + "description": "Card 组件,提供常见的卡片样式。", + "keywords": [ + "uni-ui", + "uniui", + "card", + "", + "卡片" +], + "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", + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-card/readme.md b/uni_modules/uni-card/readme.md new file mode 100644 index 00000000..7434e71d --- /dev/null +++ b/uni_modules/uni-card/readme.md @@ -0,0 +1,12 @@ + + +## Card 卡片 +> **组件名:uni-card** +> 代码块: `uCard` + +卡片视图组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-card) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-collapse/changelog.md b/uni_modules/uni-collapse/changelog.md new file mode 100644 index 00000000..292e4c79 --- /dev/null +++ b/uni_modules/uni-collapse/changelog.md @@ -0,0 +1,36 @@ +## 1.4.3(2022-01-25) +- 修复 初始化的时候 ,open 属性失效的bug +## 1.4.2(2022-01-21) +- 修复 微信小程序resize后组件收起的bug +## 1.4.1(2021-11-22) +- 修复 vue3中个别scss变量无法找到的问题 +## 1.4.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse) +## 1.3.3(2021-08-17) +- 优化 show-arrow 属性默认为true +## 1.3.2(2021-08-17) +- 新增 show-arrow 属性,控制是否显示右侧箭头 +## 1.3.1(2021-07-30) +- 优化 vue3下小程序事件警告的问题 +## 1.3.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.2.2(2021-07-21) +- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug +## 1.2.1(2021-07-21) +- 优化 组件示例 +## 1.2.0(2021-07-21) +- 新增 组件折叠动画 +- 新增 value\v-model 属性 ,动态修改面板折叠状态 +- 新增 title 插槽 ,可定义面板标题 +- 新增 border 属性 ,显示隐藏面板内容分隔线 +- 新增 title-border 属性 ,显示隐藏面板标题分隔线 +- 修复 resize 方法失效的Bug +- 修复 change 事件返回参数不正确的Bug +- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法 +## 1.1.7(2021-05-12) +- 新增 组件示例地址 +## 1.1.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.1.5(2021-02-05) +- 调整为uni_modules目录规范 \ No newline at end of file diff --git a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue new file mode 100644 index 00000000..d62a6a71 --- /dev/null +++ b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue new file mode 100644 index 00000000..384c39a9 --- /dev/null +++ b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue @@ -0,0 +1,147 @@ + + + diff --git a/uni_modules/uni-collapse/package.json b/uni_modules/uni-collapse/package.json new file mode 100644 index 00000000..65349cf9 --- /dev/null +++ b/uni_modules/uni-collapse/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-collapse", + "displayName": "uni-collapse 折叠面板", + "version": "1.4.3", + "description": "Collapse 组件,可以折叠 / 展开的内容区域。", + "keywords": [ + "uni-ui", + "折叠", + "折叠面板", + "手风琴" +], + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-collapse/readme.md b/uni_modules/uni-collapse/readme.md new file mode 100644 index 00000000..bc758ebc --- /dev/null +++ b/uni_modules/uni-collapse/readme.md @@ -0,0 +1,12 @@ + + +## Collapse 折叠面板 +> **组件名:uni-collapse** +> 代码块: `uCollapse` +> 关联组件:`uni-collapse-item`、`uni-icons`。 + + +折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-collapse) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-combox/changelog.md b/uni_modules/uni-combox/changelog.md new file mode 100644 index 00000000..23c27485 --- /dev/null +++ b/uni_modules/uni-combox/changelog.md @@ -0,0 +1,15 @@ +## 1.0.1(2021-11-23) +- 优化 label、label-width 属性 +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-combox](https://uniapp.dcloud.io/component/uniui/uni-combox) +## 0.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.0.6(2021-05-12) +- 新增 组件示例地址 +## 0.0.5(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 0.0.4(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 0.0.3(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-combox/components/uni-combox/uni-combox.vue b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue new file mode 100644 index 00000000..500b6f88 --- /dev/null +++ b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/uni_modules/uni-combox/package.json b/uni_modules/uni-combox/package.json new file mode 100644 index 00000000..4a05c3ff --- /dev/null +++ b/uni_modules/uni-combox/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-combox", + "displayName": "uni-combox 组合框", + "version": "1.0.1", + "description": "可以选择也可以输入的表单项 ", + "keywords": [ + "uni-ui", + "uniui", + "combox", + "组合框", + "select" +], + "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-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-combox/readme.md b/uni_modules/uni-combox/readme.md new file mode 100644 index 00000000..ffa2cc86 --- /dev/null +++ b/uni_modules/uni-combox/readme.md @@ -0,0 +1,11 @@ + + +## Combox 组合框 +> **组件名:uni-combox** +> 代码块: `uCombox` + + +组合框组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-combox) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-countdown/changelog.md b/uni_modules/uni-countdown/changelog.md new file mode 100644 index 00000000..f25beefc --- /dev/null +++ b/uni_modules/uni-countdown/changelog.md @@ -0,0 +1,24 @@ +## 1.2.2(2022-01-19) +- 修复 在微信小程序中样式不生效的bug +## 1.2.1(2022-01-18) +- 新增 update 方法 ,在动态更新时间后,刷新组件 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-countdown](https://uniapp.dcloud.io/component/uniui/uni-countdown) +## 1.1.3(2021-10-18) +- 重构 +- 新增 font-size 支持自定义字体大小 +## 1.1.2(2021-08-24) +- 新增 支持国际化 +## 1.1.1(2021-07-30) +- 优化 vue3下小程序事件警告的问题 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.5(2021-06-18) +- 修复 uni-countdown 重复赋值跳两秒的 bug +## 1.0.4(2021-05-12) +- 新增 组件示例地址 +## 1.0.3(2021-05-08) +- 修复 uni-countdown 不能控制倒计时的 bug +## 1.0.2(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json b/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json new file mode 100644 index 00000000..06309cb0 --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json @@ -0,0 +1,6 @@ +{ + "uni-countdown.day": "day", + "uni-countdown.h": "h", + "uni-countdown.m": "m", + "uni-countdown.s": "s" +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js b/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json new file mode 100644 index 00000000..358cdd16 --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json @@ -0,0 +1,6 @@ +{ + "uni-countdown.day": "天", + "uni-countdown.h": "时", + "uni-countdown.m": "分", + "uni-countdown.s": "秒" +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json new file mode 100644 index 00000000..e5a63dea --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json @@ -0,0 +1,6 @@ +{ + "uni-countdown.day": "天", + "uni-countdown.h": "時", + "uni-countdown.m": "分", + "uni-countdown.s": "秒" +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue b/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue new file mode 100644 index 00000000..1f8ef4eb --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue @@ -0,0 +1,271 @@ + + + diff --git a/uni_modules/uni-countdown/package.json b/uni_modules/uni-countdown/package.json new file mode 100644 index 00000000..70e99ee7 --- /dev/null +++ b/uni_modules/uni-countdown/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-countdown", + "displayName": "uni-countdown 倒计时", + "version": "1.2.2", + "description": "CountDown 倒计时组件", + "keywords": [ + "uni-ui", + "uniui", + "countdown", + "倒计时" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-countdown/readme.md b/uni_modules/uni-countdown/readme.md new file mode 100644 index 00000000..4bcb1aa7 --- /dev/null +++ b/uni_modules/uni-countdown/readme.md @@ -0,0 +1,10 @@ + + +## CountDown 倒计时 +> **组件名:uni-countdown** +> 代码块: `uCountDown` + +倒计时组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-countdown) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-data-checkbox/changelog.md b/uni_modules/uni-data-checkbox/changelog.md new file mode 100644 index 00000000..dbc517a3 --- /dev/null +++ b/uni_modules/uni-data-checkbox/changelog.md @@ -0,0 +1,43 @@ +## 1.0.2(2022-06-30) +- 优化 在 uni-forms 中的依赖注入方式 +## 1.0.1(2022-02-07) +- 修复 multiple 为 true 时,v-model 的值为 null 报错的 bug +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-checkbox](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox) +## 0.2.5(2021-08-23) +- 修复 在uni-forms中 modelValue 中不存在当前字段,当前字段必填写也不参与校验的问题 +## 0.2.4(2021-08-17) +- 修复 单选 list 模式下 ,icon 为 left 时,选中图标不显示的问题 +## 0.2.3(2021-08-11) +- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 +## 0.2.2(2021-07-30) +- 优化 在uni-forms组件,与label不对齐的问题 +## 0.2.1(2021-07-27) +- 修复 单选默认值为0不能选中的Bug +## 0.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.1.11(2021-07-06) +- 优化 删除无用日志 +## 0.1.10(2021-07-05) +- 修复 由 0.1.9 引起的非 nvue 端图标不显示的问题 +## 0.1.9(2021-07-05) +- 修复 nvue 黑框样式问题 +## 0.1.8(2021-06-28) +- 修复 selectedTextColor 属性不生效的Bug +## 0.1.7(2021-06-02) +- 新增 map 属性,可以方便映射text/value属性 +## 0.1.6(2021-05-26) +- 修复 不关联服务空间的情况下组件报错的Bug +## 0.1.5(2021-05-12) +- 新增 组件示例地址 +## 0.1.4(2021-04-09) +- 修复 nvue 下无法选中的问题 +## 0.1.3(2021-03-22) +- 新增 disabled属性 +## 0.1.2(2021-02-24) +- 优化 默认颜色显示 +## 0.1.1(2021-02-24) +- 新增 支持nvue +## 0.1.0(2021-02-18) +- “暂无数据”显示居中 diff --git a/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue new file mode 100644 index 00000000..2e517123 --- /dev/null +++ b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue @@ -0,0 +1,817 @@ + + + + + diff --git a/uni_modules/uni-data-checkbox/package.json b/uni_modules/uni-data-checkbox/package.json new file mode 100644 index 00000000..51470a95 --- /dev/null +++ b/uni_modules/uni-data-checkbox/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-data-checkbox", + "displayName": "uni-data-checkbox 数据选择器", + "version": "1.0.2", + "description": "通过数据驱动的单选框和复选框", + "keywords": [ + "uni-ui", + "checkbox", + "单选", + "多选", + "单选多选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1" + }, + "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-load-more","uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-checkbox/readme.md b/uni_modules/uni-data-checkbox/readme.md new file mode 100644 index 00000000..6eb253d4 --- /dev/null +++ b/uni_modules/uni-data-checkbox/readme.md @@ -0,0 +1,18 @@ + + +## DataCheckbox 数据驱动的单选复选框 +> **组件名:uni-data-checkbox** +> 代码块: `uDataCheckbox` + + +本组件是基于uni-app基础组件checkbox的封装。本组件要解决问题包括: + +1. 数据绑定型组件:给本组件绑定一个data,会自动渲染一组候选内容。再以往,开发者需要编写不少代码实现类似功能 +2. 自动的表单校验:组件绑定了data,且符合[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)组件的表单校验规范,搭配使用会自动实现表单校验 +3. 本组件合并了单选多选 +4. 本组件有若干风格选择,如普通的单选多选框、并列button风格、tag风格。开发者可以快速选择需要的风格。但作为一个封装组件,样式代码虽然不用自己写了,却会牺牲一定的样式自定义性 + +在uniCloud开发中,`DB Schema`中配置了enum枚举等类型后,在web控制台的[自动生成表单](https://uniapp.dcloud.io/uniCloud/schema?id=autocode)功能中,会自动生成``uni-data-checkbox``组件并绑定好data + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-data-picker/changelog.md b/uni_modules/uni-data-picker/changelog.md new file mode 100644 index 00000000..083e521f --- /dev/null +++ b/uni_modules/uni-data-picker/changelog.md @@ -0,0 +1,64 @@ +## 1.0.7(2022-07-06) +- 优化 pc端图标位置不正确的问题 +## 1.0.6(2022-07-05) +- 优化 显示样式 +## 1.0.5(2022-07-04) +- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +## 1.0.4(2022-04-19) +- 修复 字节小程序 本地数据无法选择下一级的Bug +## 1.0.3(2022-02-25) +- 修复 nvue 不支持的 v-show 的 bug +## 1.0.2(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式 +## 1.0.1(2021-11-23) +- 修复 由上个版本引发的map、v-model等属性不生效的bug +## 1.0.0(2021-11-19) +- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +## 0.4.9(2021-10-28) +- 修复 VUE2 v-model 概率无效的 bug +## 0.4.8(2021-10-27) +- 修复 v-model 概率无效的 bug +## 0.4.7(2021-10-25) +- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+ +- 修复 树型 uniCloud 数据类型为 int 时报错的 bug +## 0.4.6(2021-10-19) +- 修复 非 VUE3 v-model 为 0 时无法选中的 bug +## 0.4.5(2021-09-26) +- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效 +- 修复 readonly 为 true 时报错的 bug +## 0.4.4(2021-09-26) +- 修复 上一版本造成的 map 属性失效的 bug +- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略 +## 0.4.3(2021-09-24) +- 修复 某些情况下级联未触发的 bug +## 0.4.2(2021-09-23) +- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用 +- 新增 选项内容过长自动添加省略号 +## 0.4.1(2021-09-15) +- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段 +## 0.4.0(2021-07-13) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.3.5(2021-06-04) +- 修复 无法加载云端数据的问题 +## 0.3.4(2021-05-28) +- 修复 v-model 无效问题 +- 修复 loaddata 为空数据组时加载时间过长问题 +- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点 +## 0.3.3(2021-05-12) +- 新增 组件示例地址 +## 0.3.2(2021-04-22) +- 修复 非树形数据有 where 属性查询报错的问题 +## 0.3.1(2021-04-15) +- 修复 本地数据概率无法回显时问题 +## 0.3.0(2021-04-07) +- 新增 支持云端非树形表结构数据 +- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题 +## 0.2.0(2021-03-15) +- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题 +## 0.1.9(2021-03-09) +- 修复 微信小程序某些情况下无法选择的问题 +## 0.1.8(2021-02-05) +- 优化 部分样式在 nvue 上的兼容表现 +## 0.1.7(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js new file mode 100644 index 00000000..6ef26a26 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue new file mode 100644 index 00000000..45536275 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -0,0 +1,554 @@ + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js new file mode 100644 index 00000000..c12fd54b --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -0,0 +1,563 @@ +export default { + props: { + localdata: { + type: [Array, Object], + default () { + return [] + } + }, + spaceInfo: { + type: Object, + default () { + return {} + } + }, + collection: { + type: String, + default: '' + }, + action: { + type: String, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: [String, Object], + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 20 + }, + getcount: { + type: [Boolean, String], + default: false + }, + getone: { + type: [Boolean, String], + default: false + }, + gettree: { + type: [Boolean, String], + default: false + }, + manual: { + type: Boolean, + default: false + }, + value: { + type: [Array, String, Number], + default () { + return [] + } + }, + modelValue: { + type: [Array, String, Number], + default () { + return [] + } + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + map: { + type: Object, + default() { + return { + text: "text", + value: "value" + } + } + } + }, + data() { + return { + loading: false, + errorMessage: '', + loadMore: { + contentdown: '', + contentrefresh: '', + contentnomore: '' + }, + dataList: [], + selected: [], + selectedIndex: 0, + page: { + current: this.pageCurrent, + size: this.pageSize, + count: 0 + } + } + }, + computed: { + isLocaldata() { + return !this.collection.length + }, + postField() { + let fields = [this.field]; + if (this.parentField) { + fields.push(`${this.parentField} as parent_value`); + } + return fields.join(','); + }, + dataValue() { + let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined) + return isModelValue ? this.modelValue : this.value + }, + hasValue() { + if (typeof this.dataValue === 'number') { + return true + } + return (this.dataValue != null) && (this.dataValue.length > 0) + } + }, + created() { + this.$watch(() => { + var al = []; + ['pageCurrent', + 'pageSize', + 'spaceInfo', + 'value', + 'modelValue', + 'localdata', + 'collection', + 'action', + 'field', + 'orderby', + 'where', + 'getont', + 'getcount', + 'gettree' + ].forEach(key => { + al.push(this[key]) + }); + return al + }, (newValue, oldValue) => { + let needReset = false + for (let i = 2; i < newValue.length; i++) { + if (newValue[i] != oldValue[i]) { + needReset = true + break + } + } + if (newValue[0] != oldValue[0]) { + this.page.current = this.pageCurrent + } + this.page.size = this.pageSize + + this.onPropsChange() + }) + this._treeData = [] + }, + methods: { + onPropsChange() { + this._treeData = [] + }, + getCommand(options = {}) { + /* eslint-disable no-undef */ + let db = uniCloud.database(this.spaceInfo) + + const action = options.action || this.action + if (action) { + db = db.action(action) + } + + const collection = options.collection || this.collection + db = db.collection(collection) + + const where = options.where || this.where + if (!(!where || !Object.keys(where).length)) { + db = db.where(where) + } + + const field = options.field || this.field + if (field) { + db = db.field(field) + } + + const orderby = options.orderby || this.orderby + if (orderby) { + db = db.orderBy(orderby) + } + + const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current + const size = options.pageSize !== undefined ? options.pageSize : this.page.size + const getCount = options.getcount !== undefined ? options.getcount : this.getcount + const getTree = options.gettree !== undefined ? options.gettree : this.gettree + + const getOptions = { + getCount, + getTree + } + if (options.getTreePath) { + getOptions.getTreePath = options.getTreePath + } + + db = db.skip(size * (current - 1)).limit(size).get(getOptions) + + return db + }, + getNodeData(callback) { + if (this.loading) { + return + } + this.loading = true + this.getCommand({ + field: this.postField, + where: this._pathWhere() + }).then((res) => { + this.loading = false + this.selected = res.result.data + callback && callback() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + getTreePath(callback) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + getTreePath: { + startWith: `${this.selfField}=='${this.dataValue}'` + } + }).then((res) => { + this.loading = false + let treePath = [] + this._extractTreePath(res.result.data, treePath) + this.selected = treePath + callback && callback() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + loadData() { + if (this.isLocaldata) { + this._processLocalData() + return + } + + if (this.dataValue != null) { + this._loadNodeData((data) => { + this._treeData = data + this._updateBindData() + this._updateSelected() + }) + return + } + + if (this.stepSearh) { + this._loadNodeData((data) => { + this._treeData = data + this._updateBindData() + }) + } else { + this._loadAllData((data) => { + this._treeData = [] + this._extractTree(data, this._treeData, null) + this._updateBindData() + }) + } + }, + _loadAllData(callback) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + gettree: true, + startwith: `${this.selfField}=='${this.dataValue}'` + }).then((res) => { + this.loading = false + callback(res.result.data) + this.onDataChange() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + _loadNodeData(callback, pw) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + where: pw || this._postWhere(), + pageSize: 500 + }).then((res) => { + this.loading = false + callback(res.result.data) + this.onDataChange() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + _pathWhere() { + let result = [] + let where_field = this._getParentNameByField(); + if (where_field) { + result.push(`${where_field} == '${this.dataValue}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + _postWhere() { + let result = [] + let selected = this.selected + let parentField = this.parentField + if (parentField) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selected.length) { + for (var i = 0; i < selected.length - 1; i++) { + result.push(`${parentField} == '${selected[i].value}'`) + } + } + + let where = [] + if (this.where) { + where.push(`(${this.where})`) + } + if (result.length) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + _nodeWhere() { + let result = [] + let selected = this.selected + if (selected.length) { + result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + _getParentNameByField() { + const fields = this.field.split(','); + let where_field = null; + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as'); + if (items.length < 2) { + continue; + } + if (items[1].trim() === 'value') { + where_field = items[0].trim(); + break; + } + } + return where_field + }, + _isTreeView() { + return (this.parentField && this.selfField) + }, + _updateSelected() { + var dl = this.dataList + var sl = this.selected + let textField = this.map.text + let valueField = this.map.value + for (var i = 0; i < sl.length; i++) { + var value = sl[i].value + var dl2 = dl[i] + for (var j = 0; j < dl2.length; j++) { + var item2 = dl2[j] + if (item2[valueField] === value) { + sl[i].text = item2[textField] + break + } + } + } + }, + _updateBindData(node) { + const { + dataList, + hasNodes + } = this._filterData(this._treeData, this.selected) + + let isleaf = this._stepSearh === false && !hasNodes + + if (node) { + node.isleaf = isleaf + } + + this.dataList = dataList + this.selectedIndex = dataList.length - 1 + + if (!isleaf && this.selected.length < dataList.length) { + this.selected.push({ + value: null, + text: "请选择" + }) + } + + return { + isleaf, + hasNodes + } + }, + _filterData(data, paths) { + let dataList = [] + let hasNodes = true + + dataList.push(data.filter((item) => { + return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') + })) + for (let i = 0; i < paths.length; i++) { + var value = paths[i].value + var nodes = data.filter((item) => { + return item.parent_value === value + }) + + if (nodes.length) { + dataList.push(nodes) + } else { + hasNodes = false + } + } + + return { + dataList, + hasNodes + } + }, + _extractTree(nodes, result, parent_value) { + let list = result || [] + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + if (parent_value !== null && parent_value !== undefined && parent_value !== '') { + child.parent_value = parent_value + } + result.push(child) + + let children = node.children + if (children) { + this._extractTree(children, result, node[valueField]) + } + } + }, + _extractTreePath(nodes, result) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + result.push(child) + + let children = node.children + if (children) { + this._extractTreePath(children, result) + } + } + }, + _findNodePath(key, nodes, path = []) { + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + let children = node.children + let text = node[textField] + let value = node[valueField] + + path.push({ + value, + text + }) + + if (value === key) { + return path + } + + if (children) { + const p = this._findNodePath(key, children, path) + if (p.length) { + return p + } + } + + path.pop() + } + return [] + }, + _processLocalData() { + this._treeData = [] + this._extractTree(this.localdata, this._treeData) + + var inputValue = this.dataValue + if (inputValue === undefined) { + return + } + + if (Array.isArray(inputValue)) { + inputValue = inputValue[inputValue.length - 1] + if (typeof inputValue === 'object' && inputValue[this.map.value]) { + inputValue = inputValue[this.map.value] + } + } + + this.selected = this._findNodePath(inputValue, this.localdata) + } + } +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue new file mode 100644 index 00000000..065aac2b --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -0,0 +1,333 @@ + + + + diff --git a/uni_modules/uni-data-picker/package.json b/uni_modules/uni-data-picker/package.json new file mode 100644 index 00000000..99003802 --- /dev/null +++ b/uni_modules/uni-data-picker/package.json @@ -0,0 +1,93 @@ +{ + "id": "uni-data-picker", + "displayName": "uni-data-picker 数据驱动的picker选择器", + "version": "1.0.7", + "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景", + "keywords": [ + "uni-ui", + "uniui", + "picker", + "级联", + "省市区", + "" +], + "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-load-more", + "uni-icons", + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-data-picker/readme.md b/uni_modules/uni-data-picker/readme.md new file mode 100644 index 00000000..6cda2240 --- /dev/null +++ b/uni_modules/uni-data-picker/readme.md @@ -0,0 +1,22 @@ +## DataPicker 级联选择 +> **组件名:uni-data-picker** +> 代码块: `uDataPicker` +> 关联组件:`uni-data-pickerview`、`uni-load-more`。 + + +`` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。 + +支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。 + +候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。 + +`` 组件尤其适用于地址选择、分类选择等选择类。 + +`` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。 + +`` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。 + +在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md new file mode 100644 index 00000000..d5beaa35 --- /dev/null +++ b/uni_modules/uni-data-select/changelog.md @@ -0,0 +1,16 @@ +## 0.1.6(2022-07-06) +- 修复 pc端宽度异常的bug +## 0.1.5 +- 修复 pc端宽度异常的bug +## 0.1.4(2022-07-05) +- 优化 显示样式 +## 0.1.3(2022-06-02) +- 修复 localdata 赋值不生效的 bug +- 新增 支持 uni.scss 修改颜色 +- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用) +## 0.1.2(2022-05-08) +- 修复 当 value 为 0 时选择不生效的 bug +## 0.1.1(2022-05-07) +- 新增 记住上次的选项(仅 collection 存在时有效) +## 0.1.0(2022-04-22) +- 初始化 diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue new file mode 100644 index 00000000..16995bd6 --- /dev/null +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,426 @@ + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 00000000..1ebd8dd4 --- /dev/null +++ b/uni_modules/uni-data-select/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "0.1.6", + "description": "通过数据驱动的下拉框选择器", + "keywords": [ + "uni-ui", + "select", + "uni-data-select", + "下拉框", + "下拉选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1" + }, + "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-load-more"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "n" + }, + "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", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md new file mode 100644 index 00000000..eb58de30 --- /dev/null +++ b/uni_modules/uni-data-select/readme.md @@ -0,0 +1,8 @@ +## DataSelect 下拉框选择器 +> **组件名:uni-data-select** +> 代码块: `uDataSelect` + +当选项过多时,使用下拉菜单展示并选择内容 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-dateformat/changelog.md b/uni_modules/uni-dateformat/changelog.md new file mode 100644 index 00000000..d551d7b8 --- /dev/null +++ b/uni_modules/uni-dateformat/changelog.md @@ -0,0 +1,10 @@ +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-dateformat](https://uniapp.dcloud.io/component/uniui/uni-dateformat) +## 0.0.5(2021-07-08) +- 调整 默认时间不再是当前时间,而是显示'-'字符 +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-02-04) +- 调整为uni_modules目录规范 +- 修复 iOS 平台日期格式化出错的问题 diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js new file mode 100644 index 00000000..e00d5597 --- /dev/null +++ b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js @@ -0,0 +1,200 @@ +// yyyy-MM-dd hh:mm:ss.SSS 所有支持的类型 +function pad(str, length = 2) { + str += '' + while (str.length < length) { + str = '0' + str + } + return str.slice(-length) +} + +const parser = { + yyyy: (dateObj) => { + return pad(dateObj.year, 4) + }, + yy: (dateObj) => { + return pad(dateObj.year) + }, + MM: (dateObj) => { + return pad(dateObj.month) + }, + M: (dateObj) => { + return dateObj.month + }, + dd: (dateObj) => { + return pad(dateObj.day) + }, + d: (dateObj) => { + return dateObj.day + }, + hh: (dateObj) => { + return pad(dateObj.hour) + }, + h: (dateObj) => { + return dateObj.hour + }, + mm: (dateObj) => { + return pad(dateObj.minute) + }, + m: (dateObj) => { + return dateObj.minute + }, + ss: (dateObj) => { + return pad(dateObj.second) + }, + s: (dateObj) => { + return dateObj.second + }, + SSS: (dateObj) => { + return pad(dateObj.millisecond, 3) + }, + S: (dateObj) => { + return dateObj.millisecond + }, +} + +// 这都n年了iOS依然不认识2020-12-12,需要转换为2020/12/12 +function getDate(time) { + if (time instanceof Date) { + return time + } + switch (typeof time) { + case 'string': + { + // 2020-12-12T12:12:12.000Z、2020-12-12T12:12:12.000 + if (time.indexOf('T') > -1) { + return new Date(time) + } + return new Date(time.replace(/-/g, '/')) + } + default: + return new Date(time) + } +} + +export function formatDate(date, format = 'yyyy/MM/dd hh:mm:ss') { + if (!date && date !== 0) { + return '' + } + date = getDate(date) + const dateObj = { + year: date.getFullYear(), + month: date.getMonth() + 1, + day: date.getDate(), + hour: date.getHours(), + minute: date.getMinutes(), + second: date.getSeconds(), + millisecond: date.getMilliseconds() + } + const tokenRegExp = /yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|SS|S/ + let flag = true + let result = format + while (flag) { + flag = false + result = result.replace(tokenRegExp, function(matched) { + flag = true + return parser[matched](dateObj) + }) + } + return result +} + +export function friendlyDate(time, { + locale = 'zh', + threshold = [60000, 3600000], + format = 'yyyy/MM/dd hh:mm:ss' +}) { + if (time === '-') { + return time + } + if (!time && time !== 0) { + return '' + } + const localeText = { + zh: { + year: '年', + month: '月', + day: '天', + hour: '小时', + minute: '分钟', + second: '秒', + ago: '前', + later: '后', + justNow: '刚刚', + soon: '马上', + template: '{num}{unit}{suffix}' + }, + en: { + year: 'year', + month: 'month', + day: 'day', + hour: 'hour', + minute: 'minute', + second: 'second', + ago: 'ago', + later: 'later', + justNow: 'just now', + soon: 'soon', + template: '{num} {unit} {suffix}' + } + } + const text = localeText[locale] || localeText.zh + let date = getDate(time) + let ms = date.getTime() - Date.now() + let absMs = Math.abs(ms) + if (absMs < threshold[0]) { + return ms < 0 ? text.justNow : text.soon + } + if (absMs >= threshold[1]) { + return formatDate(date, format) + } + let num + let unit + let suffix = text.later + if (ms < 0) { + suffix = text.ago + ms = -ms + } + const seconds = Math.floor((ms) / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + const days = Math.floor(hours / 24) + const months = Math.floor(days / 30) + const years = Math.floor(months / 12) + switch (true) { + case years > 0: + num = years + unit = text.year + break + case months > 0: + num = months + unit = text.month + break + case days > 0: + num = days + unit = text.day + break + case hours > 0: + num = hours + unit = text.hour + break + case minutes > 0: + num = minutes + unit = text.minute + break + default: + num = seconds + unit = text.second + break + } + + if (locale === 'en') { + if (num === 1) { + num = 'a' + } else { + unit += 's' + } + } + + return text.template.replace(/{\s*num\s*}/g, num + '').replace(/{\s*unit\s*}/g, unit).replace(/{\s*suffix\s*}/g, + suffix) +} diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue new file mode 100644 index 00000000..c5ed0307 --- /dev/null +++ b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/uni_modules/uni-dateformat/package.json b/uni_modules/uni-dateformat/package.json new file mode 100644 index 00000000..786a670b --- /dev/null +++ b/uni_modules/uni-dateformat/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-dateformat", + "displayName": "uni-dateformat 日期格式化", + "version": "1.0.0", + "description": "日期格式化组件,可以将日期格式化为1分钟前、刚刚等形式", + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-dateformat/readme.md b/uni_modules/uni-dateformat/readme.md new file mode 100644 index 00000000..37ddb6ec --- /dev/null +++ b/uni_modules/uni-dateformat/readme.md @@ -0,0 +1,11 @@ + + +### DateFormat 日期格式化 +> **组件名:uni-dateformat** +> 代码块: `uDateformat` + + +日期格式化组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-dateformat) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md new file mode 100644 index 00000000..5c9735a1 --- /dev/null +++ b/uni_modules/uni-datetime-picker/changelog.md @@ -0,0 +1,93 @@ +## 2.2.6(2022-06-30) +- 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致 +## 2.2.5(2022-06-24) +- 修复 日历顶部年月及底部确认未国际化 bug +## 2.2.4(2022-03-31) +- 修复 Vue3 下动态赋值,单选类型未响应的 bug +## 2.2.3(2022-03-28) +- 修复 Vue3 下动态赋值未响应的 bug +## 2.2.2(2021-12-10) +- 修复 clear-icon 属性在小程序平台不生效的 bug +## 2.2.1(2021-12-10) +- 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的 bug +## 2.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +## 2.1.5(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 2.1.4(2021-09-10) +- 修复 hide-second 在移动端的 bug +- 修复 单选赋默认值时,赋值日期未高亮的 bug +- 修复 赋默认值时,移动端未正确显示时间的 bug +## 2.1.3(2021-09-09) +- 新增 hide-second 属性,支持只使用时分,隐藏秒 +## 2.1.2(2021-09-03) +- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 +- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 +- 优化 调整字号大小,美化日历界面 +- 修复 因国际化导致的 placeholder 失效的 bug +## 2.1.1(2021-08-24) +- 新增 支持国际化 +- 优化 范围选择器在 pc 端过宽的问题 +## 2.1.0(2021-08-09) +- 新增 适配 vue3 +## 2.0.19(2021-08-09) +- 新增 支持作为 uni-forms 子组件相关功能 +- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug +## 2.0.18(2021-08-05) +- 修复 type 属性动态赋值无效的 bug +- 修复 ‘确认’按钮被 tabbar 遮盖 bug +- 修复 组件未赋值时范围选左、右日历相同的 bug +## 2.0.17(2021-08-04) +- 修复 范围选未正确显示当前值的 bug +- 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug +## 2.0.16(2021-07-21) +- 新增 return-type 属性支持返回 date 日期对象 +## 2.0.15(2021-07-14) +- 修复 单选日期类型,初始赋值后不在当前日历的 bug +- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) +- 优化 移动端移除显示框的清空按钮,无实际用途 +## 2.0.14(2021-07-14) +- 修复 组件赋值为空,界面未更新的 bug +- 修复 start 和 end 不能动态赋值的 bug +- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的 bug +## 2.0.13(2021-07-08) +- 修复 范围选择不能动态赋值的 bug +## 2.0.12(2021-07-08) +- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug +## 2.0.11(2021-07-08) +- 优化 弹出层在超出视窗边缘定位不准确的问题 +## 2.0.10(2021-07-08) +- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的 bug +- 优化 弹出层在超出视窗边缘被遮盖的问题 +## 2.0.9(2021-07-07) +- 新增 maskClick 事件 +- 修复 特殊情况日历 rpx 布局错误的 bug,rpx -> px +- 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] +## 2.0.8(2021-07-07) +- 新增 日期时间显示框支持插槽 +## 2.0.7(2021-07-01) +- 优化 添加 uni-icons 依赖 +## 2.0.6(2021-05-22) +- 修复 图标在小程序上不显示的 bug +- 优化 重命名引用组件,避免潜在组件命名冲突 +## 2.0.5(2021-05-20) +- 优化 代码目录扁平化 +## 2.0.4(2021-05-12) +- 新增 组件示例地址 +## 2.0.3(2021-05-10) +- 修复 ios 下不识别 '-' 日期格式的 bug +- 优化 pc 下弹出层添加边框和阴影 +## 2.0.2(2021-05-08) +- 修复 在 admin 中获取弹出层定位错误的bug +## 2.0.1(2021-05-08) +- 修复 type 属性向下兼容,默认值从 date 变更为 datetime +## 2.0.0(2021-04-30) +- 支持日历形式的日期+时间的范围选择 + > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker) +## 1.0.6(2021-03-18) +- 新增 hide-second 属性,时间支持仅选择时、分 +- 修复 选择跟显示的日期不一样的 bug +- 修复 chang事件触发2次的 bug +- 修复 分、秒 end 范围错误的 bug +- 优化 更好的 nvue 适配 diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue new file mode 100644 index 00000000..3d2dbeac --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue new file mode 100644 index 00000000..8f7f1815 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -0,0 +1,907 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json new file mode 100644 index 00000000..9acf1ab0 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "select date", + "uni-datetime-picker.selectTime": "select time", + "uni-datetime-picker.selectDateTime": "select datetime", + "uni-datetime-picker.startDate": "start date", + "uni-datetime-picker.endDate": "end date", + "uni-datetime-picker.startTime": "start time", + "uni-datetime-picker.endTime": "end time", + "uni-datetime-picker.ok": "ok", + "uni-datetime-picker.clear": "clear", + "uni-datetime-picker.cancel": "cancel", + "uni-datetime-picker.year": "-", + "uni-datetime-picker.month": "", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN", + "uni-calender.confirm": "confirm" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json new file mode 100644 index 00000000..d2df5e72 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "选择日期", + "uni-datetime-picker.selectTime": "选择时间", + "uni-datetime-picker.selectDateTime": "选择日期时间", + "uni-datetime-picker.startDate": "开始日期", + "uni-datetime-picker.endDate": "结束日期", + "uni-datetime-picker.startTime": "开始时间", + "uni-datetime-picker.endTime": "结束时间", + "uni-datetime-picker.ok": "确定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "确认" +} \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json new file mode 100644 index 00000000..d23fa3c3 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "選擇日期", + "uni-datetime-picker.selectTime": "選擇時間", + "uni-datetime-picker.selectDateTime": "選擇日期時間", + "uni-datetime-picker.startDate": "開始日期", + "uni-datetime-picker.endDate": "結束日期", + "uni-datetime-picker.startTime": "開始时间", + "uni-datetime-picker.endTime": "結束时间", + "uni-datetime-picker.ok": "確定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "確認" +} \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js new file mode 100644 index 00000000..9601abae --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue new file mode 100644 index 00000000..699aa639 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue @@ -0,0 +1,927 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 00000000..9bdf8bca --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,1012 @@ + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js new file mode 100644 index 00000000..efa5773a --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -0,0 +1,410 @@ +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range, + // multipleStatus + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + // this.multipleStatus = multipleStatus + this.lastHover = false + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + // let dateCompBefore = this.dateCompare(this.startDate, fullDate) + // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + disableBefore = this.dateCompare(this.startDate, nowDate) + } + + if (this.endDate) { + // let dateCompAfter = this.dateCompare(fullDate, this.endDate) + // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + disableAfter = this.dateCompare(nowDate, this.endDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), + month: full.month, + disable: !(disableBefore && disableAfter), + isDay, + userChecked: false + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + /** + * 比较真实起始日期 + */ + + isLogicBefore(currentDay, before, after) { + let logicBefore = before + if (before && after) { + logicBefore = this.dateCompare(before, after) ? before : after + } + return this.dateEqual(logicBefore, currentDay) + } + + isLogicAfter(currentDay, before, after) { + let logicAfter = after + if (before && after) { + logicAfter = this.dateCompare(before, after) ? after : before + } + return this.dateEqual(logicAfter, currentDay) + } + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + if (!this.range) return + if (before && after) { + if (!this.lastHover) { + this.lastHover = true + return + } + this.multipleStatus.before = fullDate + this.multipleStatus.after = '' + this.multipleStatus.data = [] + this.multipleStatus.fulldate = '' + this.lastHover = false + } else { + if (!before) { + this.multipleStatus.before = fullDate + this.lastHover = false + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus + .after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus + .before); + } + this.lastHover = true + } + } + this._getWeek(fullDate) + } + + /** + * 鼠标 hover 更新多选状态 + */ + setHoverMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (this.lastHover) return + + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + this._getWeek(fullDate) + } + + /** + * 更新默认值多选状态 + */ + setDefaultMultiple(before, after) { + this.multipleStatus.before = before + this.multipleStatus.after = after + if (before && after) { + if (this.dateCompare(before, after)) { + this.multipleStatus.data = this.geDateAll(before, after); + this._getWeek(after) + } else { + this.multipleStatus.data = this.geDateAll(after, before); + this._getWeek(before) + } + } + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json new file mode 100644 index 00000000..60fa1d02 --- /dev/null +++ b/uni_modules/uni-datetime-picker/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-datetime-picker", + "displayName": "uni-datetime-picker 日期选择器", + "version": "2.2.6", + "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", + "keywords": [ + "uni-datetime-picker", + "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-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md new file mode 100644 index 00000000..162fbefa --- /dev/null +++ b/uni_modules/uni-datetime-picker/readme.md @@ -0,0 +1,21 @@ + + +> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` + +## DatetimePicker 时间选择器 + +> **组件名:uni-datetime-picker** +> 代码块: `uDatetimePicker` + + +该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 + +若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 + +**_点击 picker 默认值规则:_** + +- 若设置初始值 value, 会显示在 picker 显示框中 +- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-drawer/changelog.md b/uni_modules/uni-drawer/changelog.md new file mode 100644 index 00000000..6d2488c3 --- /dev/null +++ b/uni_modules/uni-drawer/changelog.md @@ -0,0 +1,13 @@ +## 1.2.1(2021-11-22) +- 修复 vue3中个别scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-drawer](https://uniapp.dcloud.io/component/uniui/uni-drawer) +## 1.1.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-drawer/components/uni-drawer/keypress.js b/uni_modules/uni-drawer/components/uni-drawer/keypress.js new file mode 100644 index 00000000..62dda461 --- /dev/null +++ b/uni_modules/uni-drawer/components/uni-drawer/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue new file mode 100644 index 00000000..82331a81 --- /dev/null +++ b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/uni_modules/uni-drawer/package.json b/uni_modules/uni-drawer/package.json new file mode 100644 index 00000000..dd056e4c --- /dev/null +++ b/uni_modules/uni-drawer/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-drawer", + "displayName": "uni-drawer 抽屉", + "version": "1.2.1", + "description": "抽屉式导航,用于展示侧滑菜单,侧滑导航。", + "keywords": [ + "uni-ui", + "uniui", + "drawer", + "抽屉", + "侧滑导航" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-drawer/readme.md b/uni_modules/uni-drawer/readme.md new file mode 100644 index 00000000..dcf6e6b2 --- /dev/null +++ b/uni_modules/uni-drawer/readme.md @@ -0,0 +1,10 @@ + + +## Drawer 抽屉 +> **组件名:uni-drawer** +> 代码块: `uDrawer` + +抽屉侧滑菜单。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-drawer) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-easyinput/changelog.md b/uni_modules/uni-easyinput/changelog.md new file mode 100644 index 00000000..1e8c6f91 --- /dev/null +++ b/uni_modules/uni-easyinput/changelog.md @@ -0,0 +1,47 @@ +## 1.1.0(2022-06-30) +- 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容 +- 新增 clear 事件,点击右侧叉号图标触发 +- 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发 +- 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等 +- +## 1.0.5(2022-06-07) +- 优化 clearable 显示策略 +## 1.0.4(2022-06-07) +- 优化 clearable 显示策略 +## 1.0.3(2022-05-20) +- 修复 关闭图标某些情况下无法取消的bug +## 1.0.2(2022-04-12) +- 修复 默认值不生效的bug +## 1.0.1(2022-04-02) +- 修复 value不能为0的bug +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput) +## 0.1.4(2021-08-20) +- 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug +## 0.1.3(2021-08-11) +- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 +## 0.1.2(2021-07-30) +- 优化 vue3下事件警告的问题 +## 0.1.1 +- 优化 errorMessage 属性支持 Boolean 类型 +## 0.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.0.16(2021-06-29) +- 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug +## 0.0.15(2021-06-21) +- 修复 passwordIcon 属性拼写错误的 bug +## 0.0.14(2021-06-18) +- 新增 passwordIcon 属性,当type=password时是否显示小眼睛图标 +- 修复 confirmType 属性不生效的问题 +## 0.0.13(2021-06-04) +- 修复 disabled 状态可清出内容的 bug +## 0.0.12(2021-05-12) +- 新增 组件示例地址 +## 0.0.11(2021-05-07) +- 修复 input-border 属性不生效的问题 +## 0.0.10(2021-04-30) +- 修复 ios 遮挡文字、显示一半的问题 +## 0.0.9(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 兼容 nvue 页面 diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/common.js b/uni_modules/uni-easyinput/components/uni-easyinput/common.js new file mode 100644 index 00000000..df9abe1d --- /dev/null +++ b/uni_modules/uni-easyinput/components/uni-easyinput/common.js @@ -0,0 +1,56 @@ +/** + * @desc 函数防抖 + * @param func 目标函数 + * @param wait 延迟执行毫秒数 + * @param immediate true - 立即执行, false - 延迟执行 + */ +export const debounce = function(func, wait = 1000, immediate = true) { + let timer; + console.log(1); + return function() { + console.log(123); + let context = this, + args = arguments; + if (timer) clearTimeout(timer); + if (immediate) { + let callNow = !timer; + timer = setTimeout(() => { + timer = null; + }, wait); + if (callNow) func.apply(context, args); + } else { + timer = setTimeout(() => { + func.apply(context, args); + }, wait) + } + } +} +/** + * @desc 函数节流 + * @param func 函数 + * @param wait 延迟执行毫秒数 + * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发 + */ +export const throttle = (func, wait = 1000, type = 1) => { + let previous = 0; + let timeout; + return function() { + let context = this; + let args = arguments; + if (type === 1) { + let now = Date.now(); + + if (now - previous > wait) { + func.apply(context, args); + previous = now; + } + } else if (type === 2) { + if (!timeout) { + timeout = setTimeout(() => { + timeout = null; + func.apply(context, args) + }, wait) + } + } + } +} diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue new file mode 100644 index 00000000..5818d7fa --- /dev/null +++ b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue @@ -0,0 +1,593 @@ + + + + + diff --git a/uni_modules/uni-easyinput/package.json b/uni_modules/uni-easyinput/package.json new file mode 100644 index 00000000..3cc793e6 --- /dev/null +++ b/uni_modules/uni-easyinput/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-easyinput", + "displayName": "uni-easyinput 增强输入框", + "version": "1.1.0", + "description": "Easyinput 组件是对原生input组件的增强", + "keywords": [ + "uni-ui", + "uniui", + "input", + "uni-easyinput", + "输入框" +], + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-easyinput/readme.md b/uni_modules/uni-easyinput/readme.md new file mode 100644 index 00000000..f1faf8fb --- /dev/null +++ b/uni_modules/uni-easyinput/readme.md @@ -0,0 +1,11 @@ + + +### Easyinput 增强输入框 +> **组件名:uni-easyinput** +> 代码块: `uEasyinput` + + +easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-easyinput) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-fab/changelog.md b/uni_modules/uni-fab/changelog.md new file mode 100644 index 00000000..24e26b16 --- /dev/null +++ b/uni_modules/uni-fab/changelog.md @@ -0,0 +1,17 @@ +## 1.2.2(2021-12-29) +- 更新 组件依赖 +## 1.2.1(2021-11-19) +- 修复 阴影颜色不正确的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fab](https://uniapp.dcloud.io/component/uniui/uni-fab) +## 1.1.1(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 按钮背景色调整 +- 优化 兼容pc端 diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue new file mode 100644 index 00000000..bef97f11 --- /dev/null +++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue @@ -0,0 +1,475 @@ + + + + + diff --git a/uni_modules/uni-fab/package.json b/uni_modules/uni-fab/package.json new file mode 100644 index 00000000..0f27daa5 --- /dev/null +++ b/uni_modules/uni-fab/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-fab", + "displayName": "uni-fab 悬浮按钮", + "version": "1.2.2", + "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。", + "keywords": [ + "uni-ui", + "uniui", + "按钮", + "悬浮按钮", + "fab" +], + "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-scss","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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-fab/readme.md b/uni_modules/uni-fab/readme.md new file mode 100644 index 00000000..9a444e88 --- /dev/null +++ b/uni_modules/uni-fab/readme.md @@ -0,0 +1,9 @@ +## Fab 悬浮按钮 +> **组件名:uni-fab** +> 代码块: `uFab` + + +点击可展开一个图形按钮菜单 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fab) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-fav/changelog.md b/uni_modules/uni-fav/changelog.md new file mode 100644 index 00000000..d8a08d43 --- /dev/null +++ b/uni_modules/uni-fav/changelog.md @@ -0,0 +1,19 @@ +## 1.2.1(2022-05-30) +- 新增 stat 属性 ,是否开启uni统计功能 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fav](https://uniapp.dcloud.io/component/uniui/uni-fav) +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.6(2021-05-12) +- 新增 组件示例地址 +## 1.0.5(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.4(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.3(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.2(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/en.json b/uni_modules/uni-fav/components/uni-fav/i18n/en.json new file mode 100644 index 00000000..9a0759e0 --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/en.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "collect", + "uni-fav.collected": "collected" +} diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/index.js b/uni_modules/uni-fav/components/uni-fav/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json new file mode 100644 index 00000000..67c89bfc --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "收藏", + "uni-fav.collected": "已收藏" +} diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json new file mode 100644 index 00000000..67c89bfc --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "收藏", + "uni-fav.collected": "已收藏" +} diff --git a/uni_modules/uni-fav/components/uni-fav/uni-fav.vue b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue new file mode 100644 index 00000000..d2c58df9 --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/uni_modules/uni-fav/package.json b/uni_modules/uni-fav/package.json new file mode 100644 index 00000000..cc146971 --- /dev/null +++ b/uni_modules/uni-fav/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-fav", + "displayName": "uni-fav 收藏按钮", + "version": "1.2.1", + "description": " Fav 收藏组件,可自定义颜色、大小。", + "keywords": [ + "fav", + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-fav/readme.md b/uni_modules/uni-fav/readme.md new file mode 100644 index 00000000..4de125d2 --- /dev/null +++ b/uni_modules/uni-fav/readme.md @@ -0,0 +1,10 @@ + + +## Fav 收藏按钮 +> **组件名:uni-fav** +> 代码块: `uFav` + +用于收藏功能,可点击切换选中、不选中的状态。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fav) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-file-picker/changelog.md b/uni_modules/uni-file-picker/changelog.md new file mode 100644 index 00000000..5c810268 --- /dev/null +++ b/uni_modules/uni-file-picker/changelog.md @@ -0,0 +1,63 @@ +## 1.0.2(2022-07-04) +- 修复 在uni-forms下样式不生效的bug +## 1.0.1(2021-11-23) +- 修复 参数为对象的情况下,url在某些情况显示错误的bug +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-file-picker](https://uniapp.dcloud.io/component/uniui/uni-file-picker) +## 0.2.16(2021-11-08) +- 修复 传入空对象 ,显示错误的Bug +## 0.2.15(2021-08-30) +- 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug +## 0.2.14(2021-08-23) +- 新增 参数中返回 fileID 字段 +## 0.2.13(2021-08-23) +- 修复 腾讯云传入fileID 不能回显的bug +- 修复 选择图片后,不能放大的问题 +## 0.2.12(2021-08-17) +- 修复 由于 0.2.11 版本引起的不能回显图片的Bug +## 0.2.11(2021-08-16) +- 新增 clearFiles(index) 方法,可以手动删除指定文件 +- 修复 v-model 值设为 null 报错的Bug +## 0.2.10(2021-08-13) +- 修复 return-type="object" 时,无法删除文件的Bug +## 0.2.9(2021-08-03) +- 修复 auto-upload 属性失效的Bug +## 0.2.8(2021-07-31) +- 修复 fileExtname属性不指定值报错的Bug +## 0.2.7(2021-07-31) +- 修复 在某种场景下图片不回显的Bug +## 0.2.6(2021-07-30) +- 修复 return-type为object下,返回值不正确的Bug +## 0.2.5(2021-07-30) +- 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题 +## 0.2.3(2021-07-28) +- 优化 调整示例代码 +## 0.2.2(2021-07-27) +- 修复 vue3 下赋值错误的Bug +- 优化 h5平台下上传文件导致页面卡死的问题 +## 0.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.1.1(2021-07-02) +- 修复 sourceType 缺少默认值导致 ios 无法选择文件 +## 0.1.0(2021-06-30) +- 优化 解耦与uniCloud的强绑定关系 ,如不绑定服务空间,默认autoUpload为false且不可更改 +## 0.0.11(2021-06-30) +- 修复 由 0.0.10 版本引发的 returnType 属性失效的问题 +## 0.0.10(2021-06-29) +- 优化 文件上传后进度条消失时机 +## 0.0.9(2021-06-29) +- 修复 在uni-forms 中,删除文件 ,获取的值不对的Bug +## 0.0.8(2021-06-15) +- 修复 删除文件时无法触发 v-model 的Bug +## 0.0.7(2021-05-12) +- 新增 组件示例地址 +## 0.0.6(2021-04-09) +- 修复 选择的文件非 file-extname 字段指定的扩展名报错的Bug +## 0.0.5(2021-04-09) +- 优化 更新组件示例 +## 0.0.4(2021-04-09) +- 优化 file-extname 字段支持字符串写法,多个扩展名需要用逗号分隔 +## 0.0.3(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 微信小程序不指定 fileExtname 属性选择失败的Bug diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js new file mode 100644 index 00000000..24a07f57 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js @@ -0,0 +1,224 @@ +'use strict'; + +const ERR_MSG_OK = 'chooseAndUploadFile:ok'; +const ERR_MSG_FAIL = 'chooseAndUploadFile:fail'; + +function chooseImage(opts) { + const { + count, + sizeType = ['original', 'compressed'], + sourceType = ['album', 'camera'], + extension + } = opts + return new Promise((resolve, reject) => { + uni.chooseImage({ + count, + sizeType, + sourceType, + extension, + success(res) { + resolve(normalizeChooseAndUploadFileRes(res, 'image')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL), + }); + }, + }); + }); +} + +function chooseVideo(opts) { + const { + camera, + compressed, + maxDuration, + sourceType = ['album', 'camera'], + extension + } = opts; + return new Promise((resolve, reject) => { + uni.chooseVideo({ + camera, + compressed, + maxDuration, + sourceType, + extension, + success(res) { + const { + tempFilePath, + duration, + size, + height, + width + } = res; + resolve(normalizeChooseAndUploadFileRes({ + errMsg: 'chooseVideo:ok', + tempFilePaths: [tempFilePath], + tempFiles: [ + { + name: (res.tempFile && res.tempFile.name) || '', + path: tempFilePath, + size, + type: (res.tempFile && res.tempFile.type) || '', + width, + height, + duration, + fileType: 'video', + cloudPath: '', + }, ], + }, 'video')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL), + }); + }, + }); + }); +} + +function chooseAll(opts) { + const { + count, + extension + } = opts; + return new Promise((resolve, reject) => { + let chooseFile = uni.chooseFile; + if (typeof wx !== 'undefined' && + typeof wx.chooseMessageFile === 'function') { + chooseFile = wx.chooseMessageFile; + } + if (typeof chooseFile !== 'function') { + return reject({ + errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。', + }); + } + chooseFile({ + type: 'all', + count, + extension, + success(res) { + resolve(normalizeChooseAndUploadFileRes(res)); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL), + }); + }, + }); + }); +} + +function normalizeChooseAndUploadFileRes(res, fileType) { + res.tempFiles.forEach((item, index) => { + if (!item.name) { + item.name = item.path.substring(item.path.lastIndexOf('/') + 1); + } + if (fileType) { + item.fileType = fileType; + } + item.cloudPath = + Date.now() + '_' + index + item.name.substring(item.name.lastIndexOf('.')); + }); + if (!res.tempFilePaths) { + res.tempFilePaths = res.tempFiles.map((file) => file.path); + } + return res; +} + +function uploadCloudFiles(files, max = 5, onUploadProgress) { + files = JSON.parse(JSON.stringify(files)) + const len = files.length + let count = 0 + let self = this + return new Promise(resolve => { + while (count < max) { + next() + } + + function next() { + let cur = count++ + if (cur >= len) { + !files.find(item => !item.url && !item.errMsg) && resolve(files) + return + } + const fileItem = files[cur] + const index = self.files.findIndex(v => v.uuid === fileItem.uuid) + fileItem.url = '' + delete fileItem.errMsg + + uniCloud + .uploadFile({ + filePath: fileItem.path, + cloudPath: fileItem.cloudPath, + fileType: fileItem.fileType, + onUploadProgress: res => { + res.index = index + onUploadProgress && onUploadProgress(res) + } + }) + .then(res => { + fileItem.url = res.fileID + fileItem.index = index + if (cur < len) { + next() + } + }) + .catch(res => { + fileItem.errMsg = res.errMsg || res.message + fileItem.index = index + if (cur < len) { + next() + } + }) + } + }) +} + + + + + +function uploadFiles(choosePromise, { + onChooseFile, + onUploadProgress +}) { + return choosePromise + .then((res) => { + if (onChooseFile) { + const customChooseRes = onChooseFile(res); + if (typeof customChooseRes !== 'undefined') { + return Promise.resolve(customChooseRes).then((chooseRes) => typeof chooseRes === 'undefined' ? + res : chooseRes); + } + } + return res; + }) + .then((res) => { + if (res === false) { + return { + errMsg: ERR_MSG_OK, + tempFilePaths: [], + tempFiles: [], + }; + } + return res + }) +} + +function chooseAndUploadFile(opts = { + type: 'all' +}) { + if (opts.type === 'image') { + return uploadFiles(chooseImage(opts), opts); + } + else if (opts.type === 'video') { + return uploadFiles(chooseVideo(opts), opts); + } + return uploadFiles(chooseAll(opts), opts); +} + +export { + chooseAndUploadFile, + uploadCloudFiles +}; diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue new file mode 100644 index 00000000..0928a41a --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue @@ -0,0 +1,656 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue new file mode 100644 index 00000000..625d92ec --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue new file mode 100644 index 00000000..2a29bc23 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/utils.js b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js new file mode 100644 index 00000000..60aaa3e4 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js @@ -0,0 +1,109 @@ +/** + * 获取文件名和后缀 + * @param {String} name + */ +export const get_file_ext = (name) => { + const last_len = name.lastIndexOf('.') + const len = name.length + return { + name: name.substring(0, last_len), + ext: name.substring(last_len + 1, len) + } +} + +/** + * 获取扩展名 + * @param {Array} fileExtname + */ +export const get_extname = (fileExtname) => { + if (!Array.isArray(fileExtname)) { + let extname = fileExtname.replace(/(\[|\])/g, '') + return extname.split(',') + } else { + return fileExtname + } + return [] +} + +/** + * 获取文件和检测是否可选 + */ +export const get_files_and_is_max = (res, _extname) => { + let filePaths = [] + let files = [] + if(!_extname || _extname.length === 0){ + return { + filePaths, + files + } + } + res.tempFiles.forEach(v => { + let fileFullName = get_file_ext(v.name) + const extname = fileFullName.ext.toLowerCase() + if (_extname.indexOf(extname) !== -1) { + files.push(v) + filePaths.push(v.path) + } + }) + if (files.length !== res.tempFiles.length) { + uni.showToast({ + title: `当前选择了${res.tempFiles.length}个文件 ,${res.tempFiles.length - files.length} 个文件格式不正确`, + icon: 'none', + duration: 5000 + }) + } + + return { + filePaths, + files + } +} + + +/** + * 获取图片信息 + * @param {Object} filepath + */ +export const get_file_info = (filepath) => { + return new Promise((resolve, reject) => { + uni.getImageInfo({ + src: filepath, + success(res) { + resolve(res) + }, + fail(err) { + reject(err) + } + }) + }) +} +/** + * 获取封装数据 + */ +export const get_file_data = async (files, type = 'image') => { + // 最终需要上传数据库的数据 + let fileFullName = get_file_ext(files.name) + const extname = fileFullName.ext.toLowerCase() + let filedata = { + name: files.name, + uuid: files.uuid, + extname: extname || '', + cloudPath: files.cloudPath, + fileType: files.fileType, + url: files.path || files.path, + size: files.size, //单位是字节 + image: {}, + path: files.path, + video: {} + } + if (type === 'image') { + const imageinfo = await get_file_info(files.path) + delete filedata.video + filedata.image.width = imageinfo.width + filedata.image.height = imageinfo.height + filedata.image.location = imageinfo.path + } else { + delete filedata.image + } + return filedata +} diff --git a/uni_modules/uni-file-picker/package.json b/uni_modules/uni-file-picker/package.json new file mode 100644 index 00000000..08bd66ec --- /dev/null +++ b/uni_modules/uni-file-picker/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-file-picker", + "displayName": "uni-file-picker 文件选择上传", + "version": "1.0.2", + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-file-picker/readme.md b/uni_modules/uni-file-picker/readme.md new file mode 100644 index 00000000..c8399a5e --- /dev/null +++ b/uni_modules/uni-file-picker/readme.md @@ -0,0 +1,11 @@ + +## FilePicker 文件选择上传 + +> **组件名:uni-file-picker** +> 代码块: `uFilePicker` + + +文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-file-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-forms/changelog.md b/uni_modules/uni-forms/changelog.md new file mode 100644 index 00000000..5a4bb79a --- /dev/null +++ b/uni_modules/uni-forms/changelog.md @@ -0,0 +1,86 @@ +## 1.4.6(2022-07-13) +- 修复 model 需要校验的值没有声明对应字段时,导致第一次不触发校验的bug +## 1.4.5(2022-07-05) +- 新增 更多表单示例 +- 优化 子表单组件过期提示的问题 +- 优化 子表单组件uni-datetime-picker、uni-data-select、uni-data-picker的显示样式 +## 1.4.4(2022-07-04) +- 更新 删除组件日志 +## 1.4.3(2022-07-04) +- 修复 由 1.4.0 引发的 label 插槽不生效的bug +## 1.4.2(2022-07-04) +- 修复 子组件找不到 setValue 报错的bug +## 1.4.1(2022-07-04) +- 修复 uni-data-picker 在 uni-forms-item 中报错的bug +- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +## 1.4.0(2022-06-30) +- 【重要】组件逻辑重构,部分用法用旧版本不兼容,请注意兼容问题 +- 【重要】组件使用 Provide/Inject 方式注入依赖,提供了自定义表单组件调用 uni-forms 校验表单的能力 +- 新增 model 属性,等同于原 value/modelValue 属性,旧属性即将废弃 +- 新增 validateTrigger 属性的 blur 值,仅 uni-easyinput 生效 +- 新增 onFieldChange 方法,可以对子表单进行校验,可替代binddata方法 +- 新增 子表单的 setRules 方法,配合自定义校验函数使用 +- 新增 uni-forms-item 的 setRules 方法,配置动态表单使用可动态更新校验规则 +- 优化 动态表单校验方式,废弃拼接name的方式 +## 1.3.3(2022-06-22) +- 修复 表单校验顺序无序问题 +## 1.3.2(2021-12-09) +- +## 1.3.1(2021-11-19) +- 修复 label 插槽不生效的bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-forms](https://uniapp.dcloud.io/component/uniui/uni-forms) +## 1.2.7(2021-08-13) +- 修复 没有添加校验规则的字段依然报错的Bug +## 1.2.6(2021-08-11) +- 修复 重置表单错误信息无法清除的问题 +## 1.2.5(2021-08-11) +- 优化 组件文档 +## 1.2.4(2021-08-11) +- 修复 表单验证只生效一次的问题 +## 1.2.3(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.2(2021-07-26) +- 修复 vue2 下条件编译导致destroyed生命周期失效的Bug +- 修复 1.2.1 引起的示例在小程序平台报错的Bug +## 1.2.1(2021-07-22) +- 修复 动态校验表单,默认值为空的情况下校验失效的Bug +- 修复 不指定name属性时,运行报错的Bug +- 优化 label默认宽度从65调整至70,使required为true且四字时不换行 +- 优化 组件示例,新增动态校验示例代码 +- 优化 组件文档,使用方式更清晰 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.2(2021-06-25) +- 修复 pattern 属性在微信小程序平台无效的问题 +## 1.1.1(2021-06-22) +- 修复 validate-trigger属性为submit且err-show-type属性为toast时不能弹出的Bug +## 1.1.0(2021-06-22) +- 修复 只写setRules方法而导致校验不生效的Bug +- 修复 由上个办法引发的错误提示文字错位的Bug +## 1.0.48(2021-06-21) +- 修复 不设置 label 属性 ,无法设置label插槽的问题 +## 1.0.47(2021-06-21) +- 修复 不设置label属性,label-width属性不生效的bug +- 修复 setRules 方法与rules属性冲突的问题 +## 1.0.46(2021-06-04) +- 修复 动态删减数据导致报错的问题 +## 1.0.45(2021-06-04) +- 新增 modelValue 属性 ,value 即将废弃 +## 1.0.44(2021-06-02) +- 新增 uni-forms-item 可以设置单独的 rules +- 新增 validate 事件增加 keepitem 参数,可以选择那些字段不过滤 +- 优化 submit 事件重命名为 validate +## 1.0.43(2021-05-12) +- 新增 组件示例地址 +## 1.0.42(2021-04-30) +- 修复 自定义检验器失效的问题 +## 1.0.41(2021-03-05) +- 更新 校验器 +- 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug +## 1.0.40(2021-03-04) +- 修复 动态显示uni-forms-item的情况下,submit 方法获取值错误的Bug +## 1.0.39(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 校验器传入 int 等类型 ,返回String类型的Bug diff --git a/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue new file mode 100644 index 00000000..250ed875 --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue @@ -0,0 +1,627 @@ + + + + + diff --git a/uni_modules/uni-forms/components/uni-forms/uni-forms.vue b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue new file mode 100644 index 00000000..ed2f6d97 --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue @@ -0,0 +1,397 @@ + + + + + diff --git a/uni_modules/uni-forms/components/uni-forms/utils.js b/uni_modules/uni-forms/components/uni-forms/utils.js new file mode 100644 index 00000000..6da24216 --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms/utils.js @@ -0,0 +1,293 @@ +/** + * 简单处理对象拷贝 + * @param {Obejct} 被拷贝对象 + * @@return {Object} 拷贝对象 + */ +export const deepCopy = (val) => { + return JSON.parse(JSON.stringify(val)) +} +/** + * 过滤数字类型 + * @param {String} format 数字类型 + * @@return {Boolean} 返回是否为数字类型 + */ +export const typeFilter = (format) => { + return format === 'int' || format === 'double' || format === 'number' || format === 'timestamp'; +} + +/** + * 把 value 转换成指定的类型,用于处理初始值,原因是初始值需要入库不能为 undefined + * @param {String} key 字段名 + * @param {any} value 字段值 + * @param {Object} rules 表单校验规则 + */ +export const getValue = (key, value, rules) => { + const isRuleNumType = rules.find(val => val.format && typeFilter(val.format)); + const isRuleBoolType = rules.find(val => (val.format && val.format === 'boolean') || val.format === 'bool'); + // 输入类型为 number + if (!!isRuleNumType) { + if (!value && value !== 0) { + value = null + } else { + value = isNumber(Number(value)) ? Number(value) : value + } + } + + // 输入类型为 boolean + if (!!isRuleBoolType) { + value = isBoolean(value) ? value : false + } + + return value; +} + +/** + * 获取表单数据 + * @param {String|Array} name 真实名称,需要使用 realName 获取 + * @param {Object} data 原始数据 + * @param {any} value 需要设置的值 + */ +export const setDataValue = (field, formdata, value) => { + formdata[field] = value + return value || '' +} + +/** + * 获取表单数据 + * @param {String|Array} field 真实名称,需要使用 realName 获取 + * @param {Object} data 原始数据 + */ +export const getDataValue = (field, data) => { + return objGet(data, field) +} + +/** + * 获取表单类型 + * @param {String|Array} field 真实名称,需要使用 realName 获取 + */ +export const getDataValueType = (field, data) => { + const value = getDataValue(field, data) + return { + type: type(value), + value + } +} + +/** + * 获取表单可用的真实name + * @param {String|Array} name 表单name + * @@return {String} 表单可用的真实name + */ +export const realName = (name, data = {}) => { + const base_name = _basePath(name) + if (typeof base_name === 'object' && Array.isArray(base_name) && base_name.length > 1) { + const realname = base_name.reduce((a, b) => a += `#${b}`, '_formdata_') + return realname + } + return base_name[0] || name +} + +/** + * 判断是否表单可用的真实name + * @param {String|Array} name 表单name + * @@return {String} 表单可用的真实name + */ +export const isRealName = (name) => { + const reg = /^_formdata_#*/ + return reg.test(name) +} + +/** + * 获取表单数据的原始格式 + * @@return {Object|Array} object 需要解析的数据 + */ +export const rawData = (object = {}, name) => { + let newData = JSON.parse(JSON.stringify(object)) + let formData = {} + for(let i in newData){ + let path = name2arr(i) + objSet(formData,path,newData[i]) + } + return formData +} + +/** + * 真实name还原为 array + * @param {*} name + */ +export const name2arr = (name) => { + let field = name.replace('_formdata_#', '') + field = field.split('#').map(v => (isNumber(v) ? Number(v) : v)) + return field +} + +/** + * 对象中设置值 + * @param {Object|Array} object 源数据 + * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c'] + * @param {String} value 需要设置的值 + */ +export const objSet = (object, path, value) => { + if (typeof object !== 'object') return object; + _basePath(path).reduce((o, k, i, _) => { + if (i === _.length - 1) { + // 若遍历结束直接赋值 + o[k] = value + return null + } else if (k in o) { + // 若存在对应路径,则返回找到的对象,进行下一次遍历 + return o[k] + } else { + // 若不存在对应路径,则创建对应对象,若下一路径是数字,新对象赋值为空数组,否则赋值为空对象 + o[k] = /^[0-9]{1,}$/.test(_[i + 1]) ? [] : {} + return o[k] + } + }, object) + // 返回object + return object; +} + +// 处理 path, path有三种形式:'a[0].b.c'、'a.0.b.c' 和 ['a','0','b','c'],需要统一处理成数组,便于后续使用 +function _basePath(path) { + // 若是数组,则直接返回 + if (Array.isArray(path)) return path + // 若有 '[',']',则替换成将 '[' 替换成 '.',去掉 ']' + return path.replace(/\[/g, '.').replace(/\]/g, '').split('.') +} + +/** + * 从对象中获取值 + * @param {Object|Array} object 源数据 + * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c'] + * @param {String} defaultVal 如果无法从调用链中获取值的默认值 + */ +export const objGet = (object, path, defaultVal = 'undefined') => { + // 先将path处理成统一格式 + let newPath = _basePath(path) + // 递归处理,返回最后结果 + let val = newPath.reduce((o, k) => { + return (o || {})[k] + }, object); + return !val || val !== undefined ? val : defaultVal +} + + +/** + * 是否为 number 类型 + * @param {any} num 需要判断的值 + * @return {Boolean} 是否为 number + */ +export const isNumber = (num) => { + return !isNaN(Number(num)) +} + +/** + * 是否为 boolean 类型 + * @param {any} bool 需要判断的值 + * @return {Boolean} 是否为 boolean + */ +export const isBoolean = (bool) => { + return (typeof bool === 'boolean') +} +/** + * 是否有必填字段 + * @param {Object} rules 规则 + * @return {Boolean} 是否有必填字段 + */ +export const isRequiredField = (rules) => { + let isNoField = false; + for (let i = 0; i < rules.length; i++) { + const ruleData = rules[i]; + if (ruleData.required) { + isNoField = true; + break; + } + } + return isNoField; +} + + +/** + * 获取数据类型 + * @param {Any} obj 需要获取数据类型的值 + */ +export const type = (obj) => { + var class2type = {}; + + // 生成class2type映射 + "Boolean Number String Function Array Date RegExp Object Error".split(" ").map(function(item, index) { + class2type["[object " + item + "]"] = item.toLowerCase(); + }) + if (obj == null) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[Object.prototype.toString.call(obj)] || "object" : + typeof obj; +} + +/** + * 判断两个值是否相等 + * @param {any} a 值 + * @param {any} b 值 + * @return {Boolean} 是否相等 + */ +export const isEqual = (a, b) => { + //如果a和b本来就全等 + if (a === b) { + //判断是否为0和-0 + return a !== 0 || 1 / a === 1 / b; + } + //判断是否为null和undefined + if (a == null || b == null) { + return a === b; + } + //接下来判断a和b的数据类型 + var classNameA = toString.call(a), + classNameB = toString.call(b); + //如果数据类型不相等,则返回false + if (classNameA !== classNameB) { + return false; + } + //如果数据类型相等,再根据不同数据类型分别判断 + switch (classNameA) { + case '[object RegExp]': + case '[object String]': + //进行字符串转换比较 + return '' + a === '' + b; + case '[object Number]': + //进行数字转换比较,判断是否为NaN + if (+a !== +a) { + return +b !== +b; + } + //判断是否为0或-0 + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + return +a === +b; + } + //如果是对象类型 + if (classNameA == '[object Object]') { + //获取a和b的属性长度 + var propsA = Object.getOwnPropertyNames(a), + propsB = Object.getOwnPropertyNames(b); + if (propsA.length != propsB.length) { + return false; + } + for (var i = 0; i < propsA.length; i++) { + var propName = propsA[i]; + //如果对应属性对应值不相等,则返回false + if (a[propName] !== b[propName]) { + return false; + } + } + return true; + } + //如果是数组类型 + if (classNameA == '[object Array]') { + if (a.toString() == b.toString()) { + return true; + } + return false; + } +} diff --git a/uni_modules/uni-forms/components/uni-forms/validate.js b/uni_modules/uni-forms/components/uni-forms/validate.js new file mode 100644 index 00000000..1834c6cf --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms/validate.js @@ -0,0 +1,486 @@ +var pattern = { + email: /^\S+?@\S+?\.\S+?$/, + idcard: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, + url: new RegExp( + "^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", + 'i') +}; + +const FORMAT_MAPPING = { + "int": 'integer', + "bool": 'boolean', + "double": 'number', + "long": 'number', + "password": 'string' + // "fileurls": 'array' +} + +function formatMessage(args, resources = '') { + var defaultMessage = ['label'] + defaultMessage.forEach((item) => { + if (args[item] === undefined) { + args[item] = '' + } + }) + + let str = resources + for (let key in args) { + let reg = new RegExp('{' + key + '}') + str = str.replace(reg, args[key]) + } + return str +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true; + } + + if (typeof value === 'string' && !value) { + return true; + } + + if (Array.isArray(value) && !value.length) { + return true; + } + + if (type === 'object' && !Object.keys(value).length) { + return true; + } + + return false; +} + +const types = { + integer(value) { + return types.number(value) && parseInt(value, 10) === value; + }, + string(value) { + return typeof value === 'string'; + }, + number(value) { + if (isNaN(value)) { + return false; + } + return typeof value === 'number'; + }, + "boolean": function(value) { + return typeof value === 'boolean'; + }, + "float": function(value) { + return types.number(value) && !types.integer(value); + }, + array(value) { + return Array.isArray(value); + }, + object(value) { + return typeof value === 'object' && !types.array(value); + }, + date(value) { + return value instanceof Date; + }, + timestamp(value) { + if (!this.integer(value) || Math.abs(value).toString().length > 16) { + return false + } + return true; + }, + file(value) { + return typeof value.url === 'string'; + }, + email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; + }, + url(value) { + return typeof value === 'string' && !!value.match(pattern.url); + }, + pattern(reg, value) { + try { + return new RegExp(reg).test(value); + } catch (e) { + return false; + } + }, + method(value) { + return typeof value === 'function'; + }, + idcard(value) { + return typeof value === 'string' && !!value.match(pattern.idcard); + }, + 'url-https'(value) { + return this.url(value) && value.startsWith('https://'); + }, + 'url-scheme'(value) { + return value.startsWith('://'); + }, + 'url-web'(value) { + return false; + } +} + +class RuleValidator { + + constructor(message) { + this._message = message + } + + async validateRule(fieldKey, fieldValue, value, data, allData) { + var result = null + + let rules = fieldValue.rules + + let hasRequired = rules.findIndex((item) => { + return item.required + }) + if (hasRequired < 0) { + if (value === null || value === undefined) { + return result + } + if (typeof value === 'string' && !value.length) { + return result + } + } + + var message = this._message + + if (rules === undefined) { + return message['default'] + } + + for (var i = 0; i < rules.length; i++) { + let rule = rules[i] + let vt = this._getValidateType(rule) + + Object.assign(rule, { + label: fieldValue.label || `["${fieldKey}"]` + }) + + if (RuleValidatorHelper[vt]) { + result = RuleValidatorHelper[vt](rule, value, message) + if (result != null) { + break + } + } + + if (rule.validateExpr) { + let now = Date.now() + let resultExpr = rule.validateExpr(value, allData, now) + if (resultExpr === false) { + result = this._getMessage(rule, rule.errorMessage || this._message['default']) + break + } + } + + if (rule.validateFunction) { + result = await this.validateFunction(rule, value, data, allData, vt) + if (result !== null) { + break + } + } + } + + if (result !== null) { + result = message.TAG + result + } + + return result + } + + async validateFunction(rule, value, data, allData, vt) { + let result = null + try { + let callbackMessage = null + const res = await rule.validateFunction(rule, value, allData || data, (message) => { + callbackMessage = message + }) + if (callbackMessage || (typeof res === 'string' && res) || res === false) { + result = this._getMessage(rule, callbackMessage || res, vt) + } + } catch (e) { + result = this._getMessage(rule, e.message, vt) + } + return result + } + + _getMessage(rule, message, vt) { + return formatMessage(rule, message || rule.errorMessage || this._message[vt] || message['default']) + } + + _getValidateType(rule) { + var result = '' + if (rule.required) { + result = 'required' + } else if (rule.format) { + result = 'format' + } else if (rule.arrayType) { + result = 'arrayTypeFormat' + } else if (rule.range) { + result = 'range' + } else if (rule.maximum !== undefined || rule.minimum !== undefined) { + result = 'rangeNumber' + } else if (rule.maxLength !== undefined || rule.minLength !== undefined) { + result = 'rangeLength' + } else if (rule.pattern) { + result = 'pattern' + } else if (rule.validateFunction) { + result = 'validateFunction' + } + return result + } +} + +const RuleValidatorHelper = { + required(rule, value, message) { + if (rule.required && isEmptyValue(value, rule.format || typeof value)) { + return formatMessage(rule, rule.errorMessage || message.required); + } + + return null + }, + + range(rule, value, message) { + const { + range, + errorMessage + } = rule; + + let list = new Array(range.length); + for (let i = 0; i < range.length; i++) { + const item = range[i]; + if (types.object(item) && item.value !== undefined) { + list[i] = item.value; + } else { + list[i] = item; + } + } + + let result = false + if (Array.isArray(value)) { + result = (new Set(value.concat(list)).size === list.length); + } else { + if (list.indexOf(value) > -1) { + result = true; + } + } + + if (!result) { + return formatMessage(rule, errorMessage || message['enum']); + } + + return null + }, + + rangeNumber(rule, value, message) { + if (!types.number(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let { + minimum, + maximum, + exclusiveMinimum, + exclusiveMaximum + } = rule; + let min = exclusiveMinimum ? value <= minimum : value < minimum; + let max = exclusiveMaximum ? value >= maximum : value > maximum; + + if (minimum !== undefined && min) { + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMinimum ? + 'exclusiveMinimum' : 'minimum' + ]) + } else if (maximum !== undefined && max) { + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMaximum ? + 'exclusiveMaximum' : 'maximum' + ]) + } else if (minimum !== undefined && maximum !== undefined && (min || max)) { + return formatMessage(rule, rule.errorMessage || message['number'].range) + } + + return null + }, + + rangeLength(rule, value, message) { + if (!types.string(value) && !types.array(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let min = rule.minLength; + let max = rule.maxLength; + let val = value.length; + + if (min !== undefined && val < min) { + return formatMessage(rule, rule.errorMessage || message['length'].minLength) + } else if (max !== undefined && val > max) { + return formatMessage(rule, rule.errorMessage || message['length'].maxLength) + } else if (min !== undefined && max !== undefined && (val < min || val > max)) { + return formatMessage(rule, rule.errorMessage || message['length'].range) + } + + return null + }, + + pattern(rule, value, message) { + if (!types['pattern'](rule.pattern, value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + return null + }, + + format(rule, value, message) { + var customTypes = Object.keys(types); + var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : (rule.format || rule.arrayType); + + if (customTypes.indexOf(format) > -1) { + if (!types[format](value)) { + return formatMessage(rule, rule.errorMessage || message.typeError); + } + } + + return null + }, + + arrayTypeFormat(rule, value, message) { + if (!Array.isArray(value)) { + return formatMessage(rule, rule.errorMessage || message.typeError); + } + + for (let i = 0; i < value.length; i++) { + const element = value[i]; + let formatResult = this.format(rule, element, message) + if (formatResult !== null) { + return formatResult + } + } + + return null + } +} + +class SchemaValidator extends RuleValidator { + + constructor(schema, options) { + super(SchemaValidator.message); + + this._schema = schema + this._options = options || null + } + + updateSchema(schema) { + this._schema = schema + } + + async validate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, false, allData) + } + return result.length ? result[0] : null + } + + async validateAll(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, true, allData) + } + return result + } + + async validateUpdate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidateUpdate(data, false, allData) + } + return result.length ? result[0] : null + } + + async invokeValidate(data, all, allData) { + let result = [] + let schema = this._schema + for (let key in schema) { + let value = schema[key] + let errorMessage = await this.validateRule(key, value, data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + async invokeValidateUpdate(data, all, allData) { + let result = [] + for (let key in data) { + let errorMessage = await this.validateRule(key, this._schema[key], data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + _checkFieldInSchema(data) { + var keys = Object.keys(data) + var keys2 = Object.keys(this._schema) + if (new Set(keys.concat(keys2)).size === keys2.length) { + return '' + } + + var noExistFields = keys.filter((key) => { + return keys2.indexOf(key) < 0; + }) + var errorMessage = formatMessage({ + field: JSON.stringify(noExistFields) + }, SchemaValidator.message.TAG + SchemaValidator.message['defaultInvalid']) + return [{ + key: 'invalid', + errorMessage + }] + } +} + +function Message() { + return { + TAG: "", + default: '验证错误', + defaultInvalid: '提交的字段{field}在数据库中并不存在', + validateFunction: '验证无效', + required: '{label}必填', + 'enum': '{label}超出范围', + timestamp: '{label}格式无效', + whitespace: '{label}不能为空', + typeError: '{label}类型无效', + date: { + format: '{label}日期{value}格式无效', + parse: '{label}日期无法解析,{value}无效', + invalid: '{label}日期{value}无效' + }, + length: { + minLength: '{label}长度不能少于{minLength}', + maxLength: '{label}长度不能超过{maxLength}', + range: '{label}必须介于{minLength}和{maxLength}之间' + }, + number: { + minimum: '{label}不能小于{minimum}', + maximum: '{label}不能大于{maximum}', + exclusiveMinimum: '{label}不能小于等于{minimum}', + exclusiveMaximum: '{label}不能大于等于{maximum}', + range: '{label}必须介于{minimum}and{maximum}之间' + }, + pattern: { + mismatch: '{label}格式不匹配' + } + }; +} + + +SchemaValidator.message = new Message(); + +export default SchemaValidator diff --git a/uni_modules/uni-forms/package.json b/uni_modules/uni-forms/package.json new file mode 100644 index 00000000..e69d39b5 --- /dev/null +++ b/uni_modules/uni-forms/package.json @@ -0,0 +1,91 @@ +{ + "id": "uni-forms", + "displayName": "uni-forms 表单", + "version": "1.4.6", + "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "keywords": [ + "uni-ui", + "表单", + "校验", + "表单校验", + "表单验证" +], + "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-scss", + "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", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-forms/readme.md b/uni_modules/uni-forms/readme.md new file mode 100644 index 00000000..63d5a043 --- /dev/null +++ b/uni_modules/uni-forms/readme.md @@ -0,0 +1,23 @@ + + +## Forms 表单 + +> **组件名:uni-forms** +> 代码块: `uForms`、`uni-forms-item` +> 关联组件:`uni-forms-item`、`uni-easyinput`、`uni-data-checkbox`、`uni-group`。 + + +uni-app的内置组件已经有了 `
`组件,用于提交表单内容。 + +然而几乎每个表单都需要做表单验证,为了方便做表单验证,减少重复开发,`uni ui` 又基于 ``组件封装了 ``组件,内置了表单验证功能。 + +`` 提供了 `rules`属性来描述校验规则、``子组件来包裹具体的表单项,以及给原生或三方组件提供了 `binddata()` 来设置表单值。 + +每个要校验的表单项,不管input还是checkbox,都必须放在``组件中,且一个``组件只能放置一个表单项。 + +``组件内部预留了显示error message的区域,默认是在表单项的底部。 + +另外,``组件下面的各个表单项,可以通过``包裹为不同的分组。同一``下的不同表单项目将聚拢在一起,同其他group保持垂直间距。``仅影响视觉效果。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-forms) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-goods-nav/changelog.md b/uni_modules/uni-goods-nav/changelog.md new file mode 100644 index 00000000..c6264c67 --- /dev/null +++ b/uni_modules/uni-goods-nav/changelog.md @@ -0,0 +1,18 @@ +## 1.2.1(2022-05-30) +- 新增 stat属性,是否开启uni统计功能 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-goods-nav](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json new file mode 100644 index 00000000..dcdba41c --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json @@ -0,0 +1,6 @@ +{ + "uni-goods-nav.options.shop": "shop", + "uni-goods-nav.options.cart": "cart", + "uni-goods-nav.buttonGroup.addToCart": "add to cart", + "uni-goods-nav.buttonGroup.buyNow": "buy now" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json new file mode 100644 index 00000000..48ee344c --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json @@ -0,0 +1,6 @@ +{ + "uni-goods-nav.options.shop": "店铺", + "uni-goods-nav.options.cart": "购物车", + "uni-goods-nav.buttonGroup.addToCart": "加入购物车", + "uni-goods-nav.buttonGroup.buyNow": "立即购买" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json new file mode 100644 index 00000000..d0a0255c --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json @@ -0,0 +1,6 @@ +{ + "uni-goods-nav.options.shop": "店鋪", + "uni-goods-nav.options.cart": "購物車", + "uni-goods-nav.buttonGroup.addToCart": "加入購物車", + "uni-goods-nav.buttonGroup.buyNow": "立即購買" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue new file mode 100644 index 00000000..8a16b175 --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/uni_modules/uni-goods-nav/package.json b/uni_modules/uni-goods-nav/package.json new file mode 100644 index 00000000..636e45e7 --- /dev/null +++ b/uni_modules/uni-goods-nav/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-goods-nav", + "displayName": "uni-goods-nav 商品导航", + "version": "1.2.1", + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-goods-nav/readme.md b/uni_modules/uni-goods-nav/readme.md new file mode 100644 index 00000000..07df93f5 --- /dev/null +++ b/uni_modules/uni-goods-nav/readme.md @@ -0,0 +1,10 @@ + + +## GoodsNav 商品导航 +> **组件名:uni-goods-nav** +> 代码块: `uGoodsNav` + +商品加入购物车,立即购买等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-grid/changelog.md b/uni_modules/uni-grid/changelog.md new file mode 100644 index 00000000..d301166c --- /dev/null +++ b/uni_modules/uni-grid/changelog.md @@ -0,0 +1,13 @@ +## 1.4.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-grid](https://uniapp.dcloud.io/component/uniui/uni-grid) +## 1.3.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.3.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.3.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.2.4(2021-05-12) +- 新增 组件示例地址 +## 1.2.3(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue new file mode 100644 index 00000000..20fd54e5 --- /dev/null +++ b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/uni_modules/uni-grid/components/uni-grid/uni-grid.vue b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue new file mode 100644 index 00000000..96a412f6 --- /dev/null +++ b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/uni_modules/uni-grid/package.json b/uni_modules/uni-grid/package.json new file mode 100644 index 00000000..ccb2c917 --- /dev/null +++ b/uni_modules/uni-grid/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-grid", + "displayName": "uni-grid 宫格", + "version": "1.4.0", + "description": "Grid 宫格组件,提供移动端常见的宫格布局,如九宫格。", + "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-scss","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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-grid/readme.md b/uni_modules/uni-grid/readme.md new file mode 100644 index 00000000..0aa44cc1 --- /dev/null +++ b/uni_modules/uni-grid/readme.md @@ -0,0 +1,11 @@ + + +## Grid 宫格 +> **组件名:uni-grid** +> 代码块: `uGrid` + + +宫格组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-grid) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-group/changelog.md b/uni_modules/uni-group/changelog.md new file mode 100644 index 00000000..a7024fdf --- /dev/null +++ b/uni_modules/uni-group/changelog.md @@ -0,0 +1,16 @@ +## 1.2.2(2022-05-30) +- 新增 stat属性,是否开启uni统计功能 +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-group](https://uniapp.dcloud.io/component/uniui/uni-group) +## 1.1.7(2021-11-08) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +- 优化 组件文档 +## 1.0.3(2021-05-12) +- 新增 组件示例地址 +## 1.0.2(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 兼容 nvue 页面 diff --git a/uni_modules/uni-group/components/uni-group/uni-group.vue b/uni_modules/uni-group/components/uni-group/uni-group.vue new file mode 100644 index 00000000..3425ecd3 --- /dev/null +++ b/uni_modules/uni-group/components/uni-group/uni-group.vue @@ -0,0 +1,134 @@ + + + + diff --git a/uni_modules/uni-group/package.json b/uni_modules/uni-group/package.json new file mode 100644 index 00000000..ea00a08c --- /dev/null +++ b/uni_modules/uni-group/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-group", + "displayName": "uni-group 分组", + "version": "1.2.2", + "description": "分组组件可用于将组件用于分组,添加间隔,以产生明显的区块", + "keywords": [ + "uni-ui", + "uniui", + "group", + "分组", + "" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-group/readme.md b/uni_modules/uni-group/readme.md new file mode 100644 index 00000000..bae67f46 --- /dev/null +++ b/uni_modules/uni-group/readme.md @@ -0,0 +1,9 @@ + +## Group 分组 +> **组件名:uni-group** +> 代码块: `uGroup` + +分组组件可用于将组件分组,添加间隔,以产生明显的区块。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-group) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ 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 00000000..64498853 --- /dev/null +++ b/uni_modules/uni-icons/changelog.md @@ -0,0 +1,22 @@ +## 1.3.5(2022-01-24) +- 优化 size 属性可以传入不带单位的字符串数值 +## 1.3.4(2022-01-24) +- 优化 size 支持其他单位 +## 1.3.3(2022-01-17) +- 修复 nvue 有些图标不显示的bug,兼容老版本图标 +## 1.3.2(2021-12-01) +- 优化 示例可复制图标名称 +## 1.3.1(2021-11-23) +- 优化 兼容旧组件 type 值 +## 1.3.0(2021-11-19) +- 新增 更多图标 +- 优化 自定义图标使用方式 +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) +## 1.1.7(2021-11-08) +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 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 00000000..78899364 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/icons.js @@ -0,0 +1,1169 @@ +export default { + "id": "2852637", + "name": "uniui图标库", + "font_family": "uniicons", + "css_prefix_text": "uniui-", + "description": "", + "glyphs": [ + { + "icon_id": "25027049", + "name": "yanse", + "font_class": "color", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "25027048", + "name": "wallet", + "font_class": "wallet", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "25015720", + "name": "settings-filled", + "font_class": "settings-filled", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "25015434", + "name": "shimingrenzheng-filled", + "font_class": "auth-filled", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "24934246", + "name": "shop-filled", + "font_class": "shop-filled", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "24934159", + "name": "staff-filled-01", + "font_class": "staff-filled", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "24932461", + "name": "VIP-filled", + "font_class": "vip-filled", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "24932462", + "name": "plus_circle_fill", + "font_class": "plus-filled", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "24932463", + "name": "folder_add-filled", + "font_class": "folder-add-filled", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "24932464", + "name": "yanse-filled", + "font_class": "color-filled", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "24932465", + "name": "tune-filled", + "font_class": "tune-filled", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "24932455", + "name": "a-rilidaka-filled", + "font_class": "calendar-filled", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "24932456", + "name": "notification-filled", + "font_class": "notification-filled", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "24932457", + "name": "wallet-filled", + "font_class": "wallet-filled", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "24932458", + "name": "paihangbang-filled", + "font_class": "medal-filled", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "24932459", + "name": "gift-filled", + "font_class": "gift-filled", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "24932460", + "name": "fire-filled", + "font_class": "fire-filled", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "24928001", + "name": "refreshempty", + "font_class": "refreshempty", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "24926853", + "name": "location-ellipse", + "font_class": "location-filled", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "24926735", + "name": "person-filled", + "font_class": "person-filled", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "24926703", + "name": "personadd-filled", + "font_class": "personadd-filled", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "24923351", + "name": "back", + "font_class": "back", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "24923352", + "name": "forward", + "font_class": "forward", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrow-right", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrowthinright", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrow-left", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrowthinleft", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrow-up", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrowthinup", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrow-down", + "unicode": "e6be", + "unicode_decimal": 59070 + },{ + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrowthindown", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "bottom", + "unicode": "e6b8", + "unicode_decimal": 59064 + },{ + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "arrowdown", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "right", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "arrowright", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "top", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "arrowup", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "left", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "arrowleft", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923334", + "name": "eye", + "font_class": "eye", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "24923335", + "name": "eye-filled", + "font_class": "eye-filled", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "24923336", + "name": "eye-slash", + "font_class": "eye-slash", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "24923337", + "name": "eye-slash-filled", + "font_class": "eye-slash-filled", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "24923305", + "name": "info-filled", + "font_class": "info-filled", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "24923299", + "name": "reload-01", + "font_class": "reload", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "24923195", + "name": "mic_slash_fill", + "font_class": "micoff-filled", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "24923165", + "name": "map-pin-ellipse", + "font_class": "map-pin-ellipse", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "24923166", + "name": "map-pin", + "font_class": "map-pin", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "24923167", + "name": "location", + "font_class": "location", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "24923064", + "name": "starhalf", + "font_class": "starhalf", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "24923065", + "name": "star", + "font_class": "star", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "24923066", + "name": "star-filled", + "font_class": "star-filled", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "24899646", + "name": "a-rilidaka", + "font_class": "calendar", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "24899647", + "name": "fire", + "font_class": "fire", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "24899648", + "name": "paihangbang", + "font_class": "medal", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "24899649", + "name": "font", + "font_class": "font", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "24899650", + "name": "gift", + "font_class": "gift", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "24899651", + "name": "link", + "font_class": "link", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "24899652", + "name": "notification", + "font_class": "notification", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "24899653", + "name": "staff", + "font_class": "staff", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "24899654", + "name": "VIP", + "font_class": "vip", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "24899655", + "name": "folder_add", + "font_class": "folder-add", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "24899656", + "name": "tune", + "font_class": "tune", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "24899657", + "name": "shimingrenzheng", + "font_class": "auth", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "24899565", + "name": "person", + "font_class": "person", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "24899566", + "name": "email-filled", + "font_class": "email-filled", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "24899567", + "name": "phone-filled", + "font_class": "phone-filled", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "24899568", + "name": "phone", + "font_class": "phone", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "24899570", + "name": "email", + "font_class": "email", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "24899571", + "name": "personadd", + "font_class": "personadd", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "24899558", + "name": "chatboxes-filled", + "font_class": "chatboxes-filled", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "24899559", + "name": "contact", + "font_class": "contact", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "24899560", + "name": "chatbubble-filled", + "font_class": "chatbubble-filled", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "24899561", + "name": "contact-filled", + "font_class": "contact-filled", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "24899562", + "name": "chatboxes", + "font_class": "chatboxes", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "24899563", + "name": "chatbubble", + "font_class": "chatbubble", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "24881290", + "name": "upload-filled", + "font_class": "upload-filled", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "24881292", + "name": "upload", + "font_class": "upload", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "24881293", + "name": "weixin", + "font_class": "weixin", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "24881274", + "name": "compose", + "font_class": "compose", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "24881275", + "name": "qq", + "font_class": "qq", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "24881276", + "name": "download-filled", + "font_class": "download-filled", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "24881277", + "name": "pengyouquan", + "font_class": "pyq", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "24881279", + "name": "sound", + "font_class": "sound", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "24881280", + "name": "trash-filled", + "font_class": "trash-filled", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "24881281", + "name": "sound-filled", + "font_class": "sound-filled", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "24881282", + "name": "trash", + "font_class": "trash", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "24881284", + "name": "videocam-filled", + "font_class": "videocam-filled", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "24881285", + "name": "spinner-cycle", + "font_class": "spinner-cycle", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "24881286", + "name": "weibo", + "font_class": "weibo", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "24881288", + "name": "videocam", + "font_class": "videocam", + "unicode": "e68c", + "unicode_decimal": 59020 + }, + { + "icon_id": "24881289", + "name": "download", + "font_class": "download", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "24879601", + "name": "help", + "font_class": "help", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "24879602", + "name": "navigate-filled", + "font_class": "navigate-filled", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "24879603", + "name": "plusempty", + "font_class": "plusempty", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "24879604", + "name": "smallcircle", + "font_class": "smallcircle", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "24879605", + "name": "minus-filled", + "font_class": "minus-filled", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "24879606", + "name": "micoff", + "font_class": "micoff", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "24879588", + "name": "closeempty", + "font_class": "closeempty", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "24879589", + "name": "clear", + "font_class": "clear", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "24879590", + "name": "navigate", + "font_class": "navigate", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "24879591", + "name": "minus", + "font_class": "minus", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "24879592", + "name": "image", + "font_class": "image", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "24879593", + "name": "mic", + "font_class": "mic", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "24879594", + "name": "paperplane", + "font_class": "paperplane", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "24879595", + "name": "close", + "font_class": "close", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "24879596", + "name": "help-filled", + "font_class": "help-filled", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "24879597", + "name": "plus-filled", + "font_class": "paperplane-filled", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "24879598", + "name": "plus", + "font_class": "plus", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "24879599", + "name": "mic-filled", + "font_class": "mic-filled", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "24879600", + "name": "image-filled", + "font_class": "image-filled", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "24855900", + "name": "locked-filled", + "font_class": "locked-filled", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "24855901", + "name": "info", + "font_class": "info", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "24855903", + "name": "locked", + "font_class": "locked", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "24855884", + "name": "camera-filled", + "font_class": "camera-filled", + "unicode": "e658", + "unicode_decimal": 58968 + }, + { + "icon_id": "24855885", + "name": "chat-filled", + "font_class": "chat-filled", + "unicode": "e659", + "unicode_decimal": 58969 + }, + { + "icon_id": "24855886", + "name": "camera", + "font_class": "camera", + "unicode": "e65a", + "unicode_decimal": 58970 + }, + { + "icon_id": "24855887", + "name": "circle", + "font_class": "circle", + "unicode": "e65b", + "unicode_decimal": 58971 + }, + { + "icon_id": "24855888", + "name": "checkmarkempty", + "font_class": "checkmarkempty", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "24855889", + "name": "chat", + "font_class": "chat", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "24855890", + "name": "circle-filled", + "font_class": "circle-filled", + "unicode": "e65e", + "unicode_decimal": 58974 + }, + { + "icon_id": "24855891", + "name": "flag", + "font_class": "flag", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "24855892", + "name": "flag-filled", + "font_class": "flag-filled", + "unicode": "e660", + "unicode_decimal": 58976 + }, + { + "icon_id": "24855893", + "name": "gear-filled", + "font_class": "gear-filled", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "24855894", + "name": "home", + "font_class": "home", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "24855895", + "name": "home-filled", + "font_class": "home-filled", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "24855896", + "name": "gear", + "font_class": "gear", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "24855897", + "name": "smallcircle-filled", + "font_class": "smallcircle-filled", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "24855898", + "name": "map-filled", + "font_class": "map-filled", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "24855899", + "name": "map", + "font_class": "map", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "24855825", + "name": "refresh-filled", + "font_class": "refresh-filled", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "24855826", + "name": "refresh", + "font_class": "refresh", + "unicode": "e657", + "unicode_decimal": 58967 + }, + { + "icon_id": "24855808", + "name": "cloud-upload", + "font_class": "cloud-upload", + "unicode": "e645", + "unicode_decimal": 58949 + }, + { + "icon_id": "24855809", + "name": "cloud-download-filled", + "font_class": "cloud-download-filled", + "unicode": "e646", + "unicode_decimal": 58950 + }, + { + "icon_id": "24855810", + "name": "cloud-download", + "font_class": "cloud-download", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "24855811", + "name": "cloud-upload-filled", + "font_class": "cloud-upload-filled", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "24855813", + "name": "redo", + "font_class": "redo", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "24855814", + "name": "images-filled", + "font_class": "images-filled", + "unicode": "e64b", + "unicode_decimal": 58955 + }, + { + "icon_id": "24855815", + "name": "undo-filled", + "font_class": "undo-filled", + "unicode": "e64c", + "unicode_decimal": 58956 + }, + { + "icon_id": "24855816", + "name": "more", + "font_class": "more", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "24855817", + "name": "more-filled", + "font_class": "more-filled", + "unicode": "e64e", + "unicode_decimal": 58958 + }, + { + "icon_id": "24855818", + "name": "undo", + "font_class": "undo", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "24855819", + "name": "images", + "font_class": "images", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "24855821", + "name": "paperclip", + "font_class": "paperclip", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "24855822", + "name": "settings", + "font_class": "settings", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "24855823", + "name": "search", + "font_class": "search", + "unicode": "e654", + "unicode_decimal": 58964 + }, + { + "icon_id": "24855824", + "name": "redo-filled", + "font_class": "redo-filled", + "unicode": "e655", + "unicode_decimal": 58965 + }, + { + "icon_id": "24841702", + "name": "list", + "font_class": "list", + "unicode": "e644", + "unicode_decimal": 58948 + }, + { + "icon_id": "24841489", + "name": "mail-open-filled", + "font_class": "mail-open-filled", + "unicode": "e63a", + "unicode_decimal": 58938 + }, + { + "icon_id": "24841491", + "name": "hand-thumbsdown-filled", + "font_class": "hand-down-filled", + "unicode": "e63c", + "unicode_decimal": 58940 + }, + { + "icon_id": "24841492", + "name": "hand-thumbsdown", + "font_class": "hand-down", + "unicode": "e63d", + "unicode_decimal": 58941 + }, + { + "icon_id": "24841493", + "name": "hand-thumbsup-filled", + "font_class": "hand-up-filled", + "unicode": "e63e", + "unicode_decimal": 58942 + }, + { + "icon_id": "24841494", + "name": "hand-thumbsup", + "font_class": "hand-up", + "unicode": "e63f", + "unicode_decimal": 58943 + }, + { + "icon_id": "24841496", + "name": "heart-filled", + "font_class": "heart-filled", + "unicode": "e641", + "unicode_decimal": 58945 + }, + { + "icon_id": "24841498", + "name": "mail-open", + "font_class": "mail-open", + "unicode": "e643", + "unicode_decimal": 58947 + }, + { + "icon_id": "24841488", + "name": "heart", + "font_class": "heart", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "24839963", + "name": "loop", + "font_class": "loop", + "unicode": "e633", + "unicode_decimal": 58931 + }, + { + "icon_id": "24839866", + "name": "pulldown", + "font_class": "pulldown", + "unicode": "e632", + "unicode_decimal": 58930 + }, + { + "icon_id": "24813798", + "name": "scan", + "font_class": "scan", + "unicode": "e62a", + "unicode_decimal": 58922 + }, + { + "icon_id": "24813786", + "name": "bars", + "font_class": "bars", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "24813788", + "name": "cart-filled", + "font_class": "cart-filled", + "unicode": "e629", + "unicode_decimal": 58921 + }, + { + "icon_id": "24813790", + "name": "checkbox", + "font_class": "checkbox", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "24813791", + "name": "checkbox-filled", + "font_class": "checkbox-filled", + "unicode": "e62c", + "unicode_decimal": 58924 + }, + { + "icon_id": "24813794", + "name": "shop", + "font_class": "shop", + "unicode": "e62f", + "unicode_decimal": 58927 + }, + { + "icon_id": "24813795", + "name": "headphones", + "font_class": "headphones", + "unicode": "e630", + "unicode_decimal": 58928 + }, + { + "icon_id": "24813796", + "name": "cart", + "font_class": "cart", + "unicode": "e631", + "unicode_decimal": 58929 + } + ] +} 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 00000000..86e74445 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css new file mode 100644 index 00000000..2f56eabd --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css @@ -0,0 +1,663 @@ +.uniui-color:before { + content: "\e6cf"; +} + +.uniui-wallet:before { + content: "\e6b1"; +} + +.uniui-settings-filled:before { + content: "\e6ce"; +} + +.uniui-auth-filled:before { + content: "\e6cc"; +} + +.uniui-shop-filled:before { + content: "\e6cd"; +} + +.uniui-staff-filled:before { + content: "\e6cb"; +} + +.uniui-vip-filled:before { + content: "\e6c6"; +} + +.uniui-plus-filled:before { + content: "\e6c7"; +} + +.uniui-folder-add-filled:before { + content: "\e6c8"; +} + +.uniui-color-filled:before { + content: "\e6c9"; +} + +.uniui-tune-filled:before { + content: "\e6ca"; +} + +.uniui-calendar-filled:before { + content: "\e6c0"; +} + +.uniui-notification-filled:before { + content: "\e6c1"; +} + +.uniui-wallet-filled:before { + content: "\e6c2"; +} + +.uniui-medal-filled:before { + content: "\e6c3"; +} + +.uniui-gift-filled:before { + content: "\e6c4"; +} + +.uniui-fire-filled:before { + content: "\e6c5"; +} + +.uniui-refreshempty:before { + content: "\e6bf"; +} + +.uniui-location-filled:before { + content: "\e6af"; +} + +.uniui-person-filled:before { + content: "\e69d"; +} + +.uniui-personadd-filled:before { + content: "\e698"; +} + +.uniui-back:before { + content: "\e6b9"; +} + +.uniui-forward:before { + content: "\e6ba"; +} + +.uniui-arrow-right:before { + content: "\e6bb"; +} + +.uniui-arrowthinright:before { + content: "\e6bb"; +} + +.uniui-arrow-left:before { + content: "\e6bc"; +} + +.uniui-arrowthinleft:before { + content: "\e6bc"; +} + +.uniui-arrow-up:before { + content: "\e6bd"; +} + +.uniui-arrowthinup:before { + content: "\e6bd"; +} + +.uniui-arrow-down:before { + content: "\e6be"; +} + +.uniui-arrowthindown:before { + content: "\e6be"; +} + +.uniui-bottom:before { + content: "\e6b8"; +} + +.uniui-arrowdown:before { + content: "\e6b8"; +} + +.uniui-right:before { + content: "\e6b5"; +} + +.uniui-arrowright:before { + content: "\e6b5"; +} + +.uniui-top:before { + content: "\e6b6"; +} + +.uniui-arrowup:before { + content: "\e6b6"; +} + +.uniui-left:before { + content: "\e6b7"; +} + +.uniui-arrowleft:before { + content: "\e6b7"; +} + +.uniui-eye:before { + content: "\e651"; +} + +.uniui-eye-filled:before { + content: "\e66a"; +} + +.uniui-eye-slash:before { + content: "\e6b3"; +} + +.uniui-eye-slash-filled:before { + content: "\e6b4"; +} + +.uniui-info-filled:before { + content: "\e649"; +} + +.uniui-reload:before { + content: "\e6b2"; +} + +.uniui-micoff-filled:before { + content: "\e6b0"; +} + +.uniui-map-pin-ellipse:before { + content: "\e6ac"; +} + +.uniui-map-pin:before { + content: "\e6ad"; +} + +.uniui-location:before { + content: "\e6ae"; +} + +.uniui-starhalf:before { + content: "\e683"; +} + +.uniui-star:before { + content: "\e688"; +} + +.uniui-star-filled:before { + content: "\e68f"; +} + +.uniui-calendar:before { + content: "\e6a0"; +} + +.uniui-fire:before { + content: "\e6a1"; +} + +.uniui-medal:before { + content: "\e6a2"; +} + +.uniui-font:before { + content: "\e6a3"; +} + +.uniui-gift:before { + content: "\e6a4"; +} + +.uniui-link:before { + content: "\e6a5"; +} + +.uniui-notification:before { + content: "\e6a6"; +} + +.uniui-staff:before { + content: "\e6a7"; +} + +.uniui-vip:before { + content: "\e6a8"; +} + +.uniui-folder-add:before { + content: "\e6a9"; +} + +.uniui-tune:before { + content: "\e6aa"; +} + +.uniui-auth:before { + content: "\e6ab"; +} + +.uniui-person:before { + content: "\e699"; +} + +.uniui-email-filled:before { + content: "\e69a"; +} + +.uniui-phone-filled:before { + content: "\e69b"; +} + +.uniui-phone:before { + content: "\e69c"; +} + +.uniui-email:before { + content: "\e69e"; +} + +.uniui-personadd:before { + content: "\e69f"; +} + +.uniui-chatboxes-filled:before { + content: "\e692"; +} + +.uniui-contact:before { + content: "\e693"; +} + +.uniui-chatbubble-filled:before { + content: "\e694"; +} + +.uniui-contact-filled:before { + content: "\e695"; +} + +.uniui-chatboxes:before { + content: "\e696"; +} + +.uniui-chatbubble:before { + content: "\e697"; +} + +.uniui-upload-filled:before { + content: "\e68e"; +} + +.uniui-upload:before { + content: "\e690"; +} + +.uniui-weixin:before { + content: "\e691"; +} + +.uniui-compose:before { + content: "\e67f"; +} + +.uniui-qq:before { + content: "\e680"; +} + +.uniui-download-filled:before { + content: "\e681"; +} + +.uniui-pyq:before { + content: "\e682"; +} + +.uniui-sound:before { + content: "\e684"; +} + +.uniui-trash-filled:before { + content: "\e685"; +} + +.uniui-sound-filled:before { + content: "\e686"; +} + +.uniui-trash:before { + content: "\e687"; +} + +.uniui-videocam-filled:before { + content: "\e689"; +} + +.uniui-spinner-cycle:before { + content: "\e68a"; +} + +.uniui-weibo:before { + content: "\e68b"; +} + +.uniui-videocam:before { + content: "\e68c"; +} + +.uniui-download:before { + content: "\e68d"; +} + +.uniui-help:before { + content: "\e679"; +} + +.uniui-navigate-filled:before { + content: "\e67a"; +} + +.uniui-plusempty:before { + content: "\e67b"; +} + +.uniui-smallcircle:before { + content: "\e67c"; +} + +.uniui-minus-filled:before { + content: "\e67d"; +} + +.uniui-micoff:before { + content: "\e67e"; +} + +.uniui-closeempty:before { + content: "\e66c"; +} + +.uniui-clear:before { + content: "\e66d"; +} + +.uniui-navigate:before { + content: "\e66e"; +} + +.uniui-minus:before { + content: "\e66f"; +} + +.uniui-image:before { + content: "\e670"; +} + +.uniui-mic:before { + content: "\e671"; +} + +.uniui-paperplane:before { + content: "\e672"; +} + +.uniui-close:before { + content: "\e673"; +} + +.uniui-help-filled:before { + content: "\e674"; +} + +.uniui-paperplane-filled:before { + content: "\e675"; +} + +.uniui-plus:before { + content: "\e676"; +} + +.uniui-mic-filled:before { + content: "\e677"; +} + +.uniui-image-filled:before { + content: "\e678"; +} + +.uniui-locked-filled:before { + content: "\e668"; +} + +.uniui-info:before { + content: "\e669"; +} + +.uniui-locked:before { + content: "\e66b"; +} + +.uniui-camera-filled:before { + content: "\e658"; +} + +.uniui-chat-filled:before { + content: "\e659"; +} + +.uniui-camera:before { + content: "\e65a"; +} + +.uniui-circle:before { + content: "\e65b"; +} + +.uniui-checkmarkempty:before { + content: "\e65c"; +} + +.uniui-chat:before { + content: "\e65d"; +} + +.uniui-circle-filled:before { + content: "\e65e"; +} + +.uniui-flag:before { + content: "\e65f"; +} + +.uniui-flag-filled:before { + content: "\e660"; +} + +.uniui-gear-filled:before { + content: "\e661"; +} + +.uniui-home:before { + content: "\e662"; +} + +.uniui-home-filled:before { + content: "\e663"; +} + +.uniui-gear:before { + content: "\e664"; +} + +.uniui-smallcircle-filled:before { + content: "\e665"; +} + +.uniui-map-filled:before { + content: "\e666"; +} + +.uniui-map:before { + content: "\e667"; +} + +.uniui-refresh-filled:before { + content: "\e656"; +} + +.uniui-refresh:before { + content: "\e657"; +} + +.uniui-cloud-upload:before { + content: "\e645"; +} + +.uniui-cloud-download-filled:before { + content: "\e646"; +} + +.uniui-cloud-download:before { + content: "\e647"; +} + +.uniui-cloud-upload-filled:before { + content: "\e648"; +} + +.uniui-redo:before { + content: "\e64a"; +} + +.uniui-images-filled:before { + content: "\e64b"; +} + +.uniui-undo-filled:before { + content: "\e64c"; +} + +.uniui-more:before { + content: "\e64d"; +} + +.uniui-more-filled:before { + content: "\e64e"; +} + +.uniui-undo:before { + content: "\e64f"; +} + +.uniui-images:before { + content: "\e650"; +} + +.uniui-paperclip:before { + content: "\e652"; +} + +.uniui-settings:before { + content: "\e653"; +} + +.uniui-search:before { + content: "\e654"; +} + +.uniui-redo-filled:before { + content: "\e655"; +} + +.uniui-list:before { + content: "\e644"; +} + +.uniui-mail-open-filled:before { + content: "\e63a"; +} + +.uniui-hand-down-filled:before { + content: "\e63c"; +} + +.uniui-hand-down:before { + content: "\e63d"; +} + +.uniui-hand-up-filled:before { + content: "\e63e"; +} + +.uniui-hand-up:before { + content: "\e63f"; +} + +.uniui-heart-filled:before { + content: "\e641"; +} + +.uniui-mail-open:before { + content: "\e643"; +} + +.uniui-heart:before { + content: "\e639"; +} + +.uniui-loop:before { + content: "\e633"; +} + +.uniui-pulldown:before { + content: "\e632"; +} + +.uniui-scan:before { + content: "\e62a"; +} + +.uniui-bars:before { + content: "\e627"; +} + +.uniui-cart-filled:before { + content: "\e629"; +} + +.uniui-checkbox:before { + content: "\e62b"; +} + +.uniui-checkbox-filled:before { + content: "\e62c"; +} + +.uniui-shop:before { + content: "\e62f"; +} + +.uniui-headphones:before { + content: "\e630"; +} + +.uniui-cart:before { + content: "\e631"; +} diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..835f33bc9411461b8b9046b3fec742e921d6ce3a GIT binary patch literal 35760 zcmeFacbp?vl{Q?rN>WLsSXIigCAC7gI!S6tox^m`be^1}CwPJ>yxZ{uSzi{WC_=LI+*Wx!<-H!v})21fuKMZQ#fB2Fs zuEGwU_ZyDmuR3&e_s&PS@Be}0T=(JF$l;w=9Als0-iQ4lE^0cm^YDeWhnK#G<4!$@ z>-QZydhsP6Kl0Pv9Cw|EbP-?YO$@C;`+ zuKnR1zxV)MXnddfv56Dn_-W<%#_jZ^d%1f!hyI(6O8C!lXY}93nl=3f9^gzbYS03Jm0vJ;T)Z1IKntfUtypB#zx`e6wG3 zC5AhB&Me^QdH${3yL1otSUp#NN^cKN_yKnkm%XqxczWUgrT^Oo|6lL`SPy&+DZ_DX z1{?B^82rf|!cpSXHhg1*;kZecHy+MI*MqCu>g9T0eYieaf9edzAC9!tJL|pm0UQ~l zBQN;JaG!_sb8)VT%i=%By_I_#_ZIFh?(N(=xVtf?-^|^~y@`7RcMEqbcN=#*_eSmx z?)BVjxU0EqFm9T;Q`~9pTJAdTdhWH{>+qBtxEr~fxSP3Gb60T(xkKDx?g)33JH{R7 zPH-1465x0fg%5CGeb33>TxSiZCZa24wyO7(&Q z>$wfwMs5?gnVaOMxM^;NYvpFSIc_<(f-7(s&u0CxL#u8VbF$klItIryQ@x|5W z48lm`>dOtnnB(dz48rK+>MISxIOOW948n-y>Z=XH*yQSK48kbo>T3axcUVKK~8Y>od!W-aP?gVL3VKU-3CF5aP>U~L7s5+3k`x~;p%%0f{fwn z`wW7#;p+Phg52Ti2MmG);_4R}1X;w@scs-hC9Y0&13^AJNK#+l4o$3aH zH00`3HxT3^SEssxAR)Or)eQt$$+z7tkWDxWPSHIIBXb!IaW`m$ZxcXZRf;QpmZ#4*d zg{!~KAZQq_ewRVeHC+Ae20`m^^>-Kq{lnGoHVB%CtKVY~bP`v;*C1#ou700E&{JIf zeuJQ~xcWN{g6`t#?=lEljH|!fAm}r${tpI0vvKtY41$j1>hCcK+K#I~Xb|)sSAVZT z(12Y1eFi}na`pEc1g*%`|Ir}mN3Q+>gPp}tAE%avLosrF^GJG z`bQ0dZsqD9GYDFitAE@e=v%J-34@?{x%wv!f)3{DpE3yAn5#cz5cD!v|Fl8S&|Lj9 z20>SI_0JjvtVjlpxwFpV+N5QQ~$g{(D+>a3kE^= zbM-G81S^26f5{-&16=*f2Ej7m>R&MkHUd}wszKz<)E_qpb^}-cnn7g6)t@j3wggxI zxp1QBm2=klxXa|a&TVx+;Qp=WwVt{>D}O~9QXW)O>O0h5db_-@^8Ud$^pPT-1=NS-v_4k2r|_kM*0!vaW9xyNll~`AaKH zuPQxR4wv6t{%QC2?wh**v$DGKU?rS_5?F|crGafkiL7dNk-%Y_E4VmkSn6>Hb;SUukEx3l0# zej=BS$yT%Av8Uc*J`xpdRw>aQ5n{34Scli{%@0hjo|#!%t;CXMOO1~vM@By$$wu(0 z7+*JsbCF0c%-{dHFL+pQI~s3&zjaOf89{d%!`6o3fsCO(`6

PqiNa$~E4XJ#a8s%?nsx`&SiQ7Wz{CE9c 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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 00000000..d1c4e77d --- /dev/null +++ b/uni_modules/uni-icons/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "1.3.5", + "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "图标" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.14" + }, + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md new file mode 100644 index 00000000..86234ba1 --- /dev/null +++ b/uni_modules/uni-icons/readme.md @@ -0,0 +1,8 @@ +## Icons 图标 +> **组件名:uni-icons** +> 代码块: `uIcons` + +用于展示 icons 图标 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-indexed-list/changelog.md b/uni_modules/uni-indexed-list/changelog.md new file mode 100644 index 00000000..08fa71cb --- /dev/null +++ b/uni_modules/uni-indexed-list/changelog.md @@ -0,0 +1,17 @@ +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-indexed-list](https://uniapp.dcloud.io/component/uniui/uni-indexed-list) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.11(2021-05-12) +- 新增 组件示例地址 +## 1.0.10(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.8(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 diff --git a/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue new file mode 100644 index 00000000..2f13baec --- /dev/null +++ b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue new file mode 100644 index 00000000..35e168c2 --- /dev/null +++ b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue @@ -0,0 +1,367 @@ + + + diff --git a/uni_modules/uni-indexed-list/package.json b/uni_modules/uni-indexed-list/package.json new file mode 100644 index 00000000..125c0e7f --- /dev/null +++ b/uni_modules/uni-indexed-list/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-indexed-list", + "displayName": "uni-indexed-list 索引列表", + "version": "1.2.1", + "description": "索引列表组件,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景", + "keywords": [ + "uni-ui", + "索引列表", + "索引", + "列表" +], + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-indexed-list/readme.md b/uni_modules/uni-indexed-list/readme.md new file mode 100644 index 00000000..44ad84b2 --- /dev/null +++ b/uni_modules/uni-indexed-list/readme.md @@ -0,0 +1,11 @@ + + +## IndexedList 索引列表 +> **组件名:uni-indexed-list** +> 代码块: `uIndexedList` + + +用于展示索引列表。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-indexed-list) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-link/changelog.md b/uni_modules/uni-link/changelog.md new file mode 100644 index 00000000..2cfbf591 --- /dev/null +++ b/uni_modules/uni-link/changelog.md @@ -0,0 +1,17 @@ +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-link](https://uniapp.dcloud.io/component/uniui/uni-link) +## 1.1.7(2021-11-08) +## 0.0.7(2021-09-03) +- 修复 在 nvue 下不显示的 bug +## 0.0.6(2021-07-30) +- 新增 支持自定义插槽 +## 0.0.5(2021-06-21) +- 新增 download 属性,H5平台下载文件名 +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-03-09) +- 新增 href 属性支持 tel:|mailto: + +## 0.0.2(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-link/components/uni-link/uni-link.vue b/uni_modules/uni-link/components/uni-link/uni-link.vue new file mode 100644 index 00000000..27c5468e --- /dev/null +++ b/uni_modules/uni-link/components/uni-link/uni-link.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/uni_modules/uni-link/package.json b/uni_modules/uni-link/package.json new file mode 100644 index 00000000..77b19865 --- /dev/null +++ b/uni_modules/uni-link/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-link", + "displayName": "uni-link 超链接", + "version": "1.0.0", + "description": "uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打", + "keywords": [ + "uni-ui", + "uniui", + "link", + "超链接", + "" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-link/readme.md b/uni_modules/uni-link/readme.md new file mode 100644 index 00000000..7f09e941 --- /dev/null +++ b/uni_modules/uni-link/readme.md @@ -0,0 +1,11 @@ + + +## Link 链接 +> **组件名:uni-link** +> 代码块: `uLink` + + +uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打开新网页。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-link) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ 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 00000000..6aa6e4e0 --- /dev/null +++ b/uni_modules/uni-list/changelog.md @@ -0,0 +1,20 @@ +## 1.2.1(2022-03-30) +- 删除无用文件 +## 1.2.0(2021-11-23) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-list](https://uniapp.dcloud.io/component/uniui/uni-list) +## 1.1.3(2021-08-30) +- 修复 在vue3中to属性在发行应用的时候报错的bug +## 1.1.2(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.1(2021-07-21) +- 修复 与其他组件嵌套使用时,点击失效的Bug +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 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 00000000..b9349c29 --- /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 00000000..311f8d9f --- /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 00000000..2b310085 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue @@ -0,0 +1,538 @@ + + + + + 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 00000000..2c7d9ea7 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue @@ -0,0 +1,454 @@ + + + + + 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 00000000..ecda6765 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list/uni-list.vue @@ -0,0 +1,108 @@ + + + + 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 00000000..3b4c5a23 --- /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 00000000..818a6b72 --- /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 00000000..66e8bef0 --- /dev/null +++ b/uni_modules/uni-list/package.json @@ -0,0 +1,91 @@ +{ + "id": "uni-list", + "displayName": "uni-list 列表", + "version": "1.2.1", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ 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 00000000..32c28654 --- /dev/null +++ b/uni_modules/uni-list/readme.md @@ -0,0 +1,346 @@ +## 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) +badgeStyle |Object |- | 数字角标样式,使用uni-badge的custom-style参数 +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-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md new file mode 100644 index 00000000..8f03f1d5 --- /dev/null +++ b/uni_modules/uni-load-more/changelog.md @@ -0,0 +1,19 @@ +## 1.3.3(2022-01-20) +- 新增 showText属性 ,是否显示文本 +## 1.3.2(2022-01-19) +- 修复 nvue 平台下不显示文本的bug +## 1.3.1(2022-01-19) +- 修复 微信小程序平台样式选择器报警告的问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) +## 1.2.1(2021-08-24) +- 新增 支持国际化 +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-05-12) +- 新增 组件示例地址 +## 1.1.7(2021-03-30) +- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json new file mode 100644 index 00000000..a4f14a54 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 00000000..f15d5105 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 00000000..a255c6de --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 00000000..e5eff4d6 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,399 @@ + + + + + diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json new file mode 100644 index 00000000..2fa6f040 --- /dev/null +++ b/uni_modules/uni-load-more/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-load-more", + "displayName": "uni-load-more 加载更多", + "version": "1.3.3", + "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", + "keywords": [ + "uni-ui", + "uniui", + "加载更多", + "load-more" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md new file mode 100644 index 00000000..54dc1fad --- /dev/null +++ b/uni_modules/uni-load-more/readme.md @@ -0,0 +1,14 @@ + + +### LoadMore 加载更多 +> **组件名:uni-load-more** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-nav-bar/changelog.md b/uni_modules/uni-nav-bar/changelog.md new file mode 100644 index 00000000..f0f6b566 --- /dev/null +++ b/uni_modules/uni-nav-bar/changelog.md @@ -0,0 +1,41 @@ +## 1.3.6(2022-06-30) +- 修复 组件示例中插槽用法无法显示内容的bug +## 1.3.5(2022-05-24) +- 新增 stat 属性 ,可开启统计title 上报 ,仅使用了title 属性且项目开启了uni统计生效 +## 1.3.4(2022-01-24) +- 更新 组件示例 +## 1.3.3(2022-01-24) +- 新增 left-width/right-width属性 ,可修改左右两侧的宽度 +## 1.3.2(2022-01-18) +- 修复 在vue下,标题不垂直居中的bug +## 1.3.1(2022-01-18) +- 修复 height 属性类型错误 +## 1.3.0(2022-01-18) +- 新增 height 属性,可修改组件高度 +- 新增 dark 属性可可开启暗黑模式 +- 优化 标题字数过多显示省略号 +- 优化 插槽,插入内容可完全覆盖 +## 1.2.1(2022-01-10) +- 修复 color 属性不生效的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-nav-bar](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.11(2021-05-12) +- 新增 组件示例地址 +## 1.0.10(2021-04-30) +- 修复 在nvue下fixed为true,宽度不能撑满的Bug +## 1.0.9(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.8(2021-04-14) +- uni-ui 修复 uni-nav-bar 当 fixed 属性为 true 时铺不满屏幕的 bug + +## 1.0.7(2021-02-25) +- 修复 easycom 下,找不到 uni-status-bar 的bug + +## 1.0.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue new file mode 100644 index 00000000..cbfc1685 --- /dev/null +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue @@ -0,0 +1,348 @@ + + + + + diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue new file mode 100644 index 00000000..6a688744 --- /dev/null +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/uni_modules/uni-nav-bar/package.json b/uni_modules/uni-nav-bar/package.json new file mode 100644 index 00000000..e3fe073d --- /dev/null +++ b/uni_modules/uni-nav-bar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-nav-bar", + "displayName": "uni-nav-bar 自定义导航栏", + "version": "1.3.6", + "description": "自定义导航栏组件,主要用于头部导航。", + "keywords": [ + "uni-ui", + "导航", + "导航栏", + "自定义导航栏" +], + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-nav-bar/readme.md b/uni_modules/uni-nav-bar/readme.md new file mode 100644 index 00000000..3934b327 --- /dev/null +++ b/uni_modules/uni-nav-bar/readme.md @@ -0,0 +1,15 @@ + + +## NavBar 导航栏 +> **组件名:uni-nav-bar** +> 代码块: `uNavBar` + +导航栏组件,主要用于头部导航。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + + diff --git a/uni_modules/uni-notice-bar/changelog.md b/uni_modules/uni-notice-bar/changelog.md new file mode 100644 index 00000000..9ee75a01 --- /dev/null +++ b/uni_modules/uni-notice-bar/changelog.md @@ -0,0 +1,16 @@ +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) +## 1.1.1(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.9(2021-05-12) +- 新增 组件示例地址 +## 1.0.8(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.7(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue new file mode 100644 index 00000000..1d2ac1dc --- /dev/null +++ b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue @@ -0,0 +1,395 @@ + + + + + diff --git a/uni_modules/uni-notice-bar/package.json b/uni_modules/uni-notice-bar/package.json new file mode 100644 index 00000000..97719a0f --- /dev/null +++ b/uni_modules/uni-notice-bar/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-notice-bar", + "displayName": "uni-notice-bar 通告栏", + "version": "1.2.0", + "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告", + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-notice-bar/readme.md b/uni_modules/uni-notice-bar/readme.md new file mode 100644 index 00000000..fb2ede24 --- /dev/null +++ b/uni_modules/uni-notice-bar/readme.md @@ -0,0 +1,13 @@ + + +## NoticeBar 通告栏 +> **组件名:uni-notice-bar** +> 代码块: `uNoticeBar` + + +通告栏组件 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-number-box/changelog.md b/uni_modules/uni-number-box/changelog.md new file mode 100644 index 00000000..5925c32a --- /dev/null +++ b/uni_modules/uni-number-box/changelog.md @@ -0,0 +1,25 @@ +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-number-box](https://uniapp.dcloud.io/component/uniui/uni-number-box) +## 1.1.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-20) +- 修复 uni-number-box 浮点数运算不精确的 bug +- 修复 uni-number-box change 事件触发不正确的 bug +- 新增 uni-number-box v-model 双向绑定 +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 + +## 1.0.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 v-model +- 新增 支持 focus、blur 事件 +- 新增 支持 PC 端 diff --git a/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue new file mode 100644 index 00000000..e91c0321 --- /dev/null +++ b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue @@ -0,0 +1,221 @@ + + + diff --git a/uni_modules/uni-number-box/package.json b/uni_modules/uni-number-box/package.json new file mode 100644 index 00000000..ad823368 --- /dev/null +++ b/uni_modules/uni-number-box/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-number-box", + "displayName": "uni-number-box 数字输入框", + "version": "1.2.1", + "description": "NumberBox 带加减按钮的数字输入框组件,用户可以控制每次点击增加的数值,支持小数。", + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-number-box/readme.md b/uni_modules/uni-number-box/readme.md new file mode 100644 index 00000000..affc56fa --- /dev/null +++ b/uni_modules/uni-number-box/readme.md @@ -0,0 +1,13 @@ + + +## NumberBox 数字输入框 +> **组件名:uni-number-box** +> 代码块: `uNumberBox` + + +带加减按钮的数字输入框。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-number-box) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-pagination/changelog.md b/uni_modules/uni-pagination/changelog.md new file mode 100644 index 00000000..336c2ba6 --- /dev/null +++ b/uni_modules/uni-pagination/changelog.md @@ -0,0 +1,20 @@ +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-pagination](https://uniapp.dcloud.io/component/uniui/uni-pagination) +## 1.1.2(2021-10-08) +- 修复 current 、value 属性未监听,导致高亮样式失效的 bug +## 1.1.1(2021-08-20) +- 新增 支持国际化 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-12) +- 新增 PC 和 移动端适配不同的 ui +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json new file mode 100644 index 00000000..a57becdc --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json @@ -0,0 +1,4 @@ +{ + "uni-pagination.prevText": "prev", + "uni-pagination.nextText": "next" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json new file mode 100644 index 00000000..ccbba2f6 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json @@ -0,0 +1,4 @@ +{ + "uni-pagination.prevText": "anterior", + "uni-pagination.nextText": "próxima" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json new file mode 100644 index 00000000..9b5f2d92 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json @@ -0,0 +1,4 @@ +{ + "uni-pagination.prevText": "précédente", + "uni-pagination.nextText": "suivante" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js b/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js new file mode 100644 index 00000000..2469dd02 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js @@ -0,0 +1,12 @@ +import en from './en.json' +import es from './es.json' +import fr from './fr.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + es, + fr, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json new file mode 100644 index 00000000..fedbe82a --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json @@ -0,0 +1,4 @@ +{ + "uni-pagination.prevText": "上一页", + "uni-pagination.nextText": "下一页" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json new file mode 100644 index 00000000..133b3404 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json @@ -0,0 +1,4 @@ +{ + "uni-pagination.prevText": "上一頁", + "uni-pagination.nextText": "下一頁" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue b/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue new file mode 100644 index 00000000..79db4b88 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue @@ -0,0 +1,409 @@ + + + + + diff --git a/uni_modules/uni-pagination/package.json b/uni_modules/uni-pagination/package.json new file mode 100644 index 00000000..adce6704 --- /dev/null +++ b/uni_modules/uni-pagination/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-pagination", + "displayName": "uni-pagination 分页器", + "version": "1.2.1", + "description": "Pagination 分页器组件,用于展示页码、请求数据等。", + "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-scss","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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-pagination/readme.md b/uni_modules/uni-pagination/readme.md new file mode 100644 index 00000000..eefa2634 --- /dev/null +++ b/uni_modules/uni-pagination/readme.md @@ -0,0 +1,13 @@ + + +## Pagination 分页器 +> **组件名:uni-pagination** +> 代码块: `uPagination` + + +分页器组件,用于展示页码、请求数据等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-pagination) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md new file mode 100644 index 00000000..a9e2d668 --- /dev/null +++ b/uni_modules/uni-popup/changelog.md @@ -0,0 +1,60 @@ +## 1.7.9(2022-04-02) +- 修复 弹出层内部无法滚动的bug +## 1.7.8(2022-03-28) +- 修复 小程序中高度错误的bug +## 1.7.7(2022-03-17) +- 修复 快速调用open出现问题的Bug +## 1.7.6(2022-02-14) +- 修复 safeArea 属性不能设置为false的bug +## 1.7.5(2022-01-19) +- 修复 isMaskClick 失效的bug +## 1.7.4(2022-01-19) +- 新增 cancelText \ confirmText 属性 ,可自定义文本 +- 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色 +- 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题 +## 1.7.3(2022-01-13) +- 修复 设置 safeArea 属性不生效的bug +## 1.7.2(2021-11-26) +- 优化 组件示例 +## 1.7.1(2021-11-26) +- 修复 vuedoc 文字错误 +## 1.7.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup) +## 1.6.2(2021-08-24) +- 新增 支持国际化 +## 1.6.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.6.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.5.0(2021-06-23) +- 新增 mask-click 遮罩层点击事件 +## 1.4.5(2021-06-22) +- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.4(2021-06-18) +- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.3(2021-06-08) +- 修复 错误的 watch 字段 +- 修复 safeArea 属性不生效的问题 +- 修复 点击内容,再点击遮罩无法关闭的Bug +## 1.4.2(2021-05-12) +- 新增 组件示例地址 +## 1.4.1(2021-04-29) +- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题 +## 1.4.0 (2021-04-29) +- 新增 type 属性的 left\right 值,支持左右弹出 +- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗 +- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色 +- 新增 safeArea 属性,是否适配底部安全区 +- 修复 App\h5\微信小程序底部安全区占位不对的Bug +- 修复 App 端弹出等待的Bug +- 优化 提升低配设备性能,优化动画卡顿问题 +- 优化 更简单的组件自定义方式 +## 1.2.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.2.8(2021-02-05) +- 调整为uni_modules目录规范 +## 1.2.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 +- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端 diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js new file mode 100644 index 00000000..6ef26a26 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue new file mode 100644 index 00000000..a5d0f2a2 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue new file mode 100644 index 00000000..91370a82 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -0,0 +1,143 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue new file mode 100644 index 00000000..5be76247 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -0,0 +1,187 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json new file mode 100644 index 00000000..7f1bd06a --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "cancel", + "uni-popup.ok": "ok", + "uni-popup.placeholder": "pleace enter", + "uni-popup.title": "Hint", + "uni-popup.shareTitle": "Share to" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json new file mode 100644 index 00000000..5e3003ca --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "确定", + "uni-popup.placeholder": "请输入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json new file mode 100644 index 00000000..13e39eba --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "確定", + "uni-popup.placeholder": "請輸入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js new file mode 100644 index 00000000..62dda461 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js new file mode 100644 index 00000000..c4e5781d --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/popup.js @@ -0,0 +1,26 @@ + +export default { + data() { + return { + + } + }, + created(){ + this.popup = this.getParent() + }, + methods:{ + /** + * 获取父元素实例 + */ + getParent(name = 'uniPopup') { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== name) { + parent = parent.$parent; + if (!parent) return false + parentName = parent.$options.name; + } + return parent; + }, + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue new file mode 100644 index 00000000..db90c599 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -0,0 +1,474 @@ + + + + diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json new file mode 100644 index 00000000..069e9ce5 --- /dev/null +++ b/uni_modules/uni-popup/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-popup", + "displayName": "uni-popup 弹出层", + "version": "1.7.9", + "description": " Popup 组件,提供常用的弹层", + "keywords": [ + "uni-ui", + "弹出层", + "弹窗", + "popup", + "弹框" + ], + "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-scss", + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md new file mode 100644 index 00000000..fdad4b3d --- /dev/null +++ b/uni_modules/uni-popup/readme.md @@ -0,0 +1,17 @@ + + +## Popup 弹出层 +> **组件名:uni-popup** +> 代码块: `uPopup` +> 关联组件:`uni-transition` + + +弹出层组件,在应用中弹出一个消息提示窗口、提示框等 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + + diff --git a/uni_modules/uni-rate/changelog.md b/uni_modules/uni-rate/changelog.md new file mode 100644 index 00000000..8a98a612 --- /dev/null +++ b/uni_modules/uni-rate/changelog.md @@ -0,0 +1,25 @@ +## 1.3.1(2022-02-25) +- 修复 条件判断 `NaN` 错误的 bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-rate](https://uniapp.dcloud.io/component/uniui/uni-rate) +## 1.2.2(2021-09-10) +- 优化 默认值修改为 0 颗星 +## 1.2.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.2(2021-05-12) +- 新增 组件示例地址 +## 1.1.1(2021-04-21) +- 修复 布局变化后 uni-rate 星星计算不准确的 bug +- 优化 添加依赖 uni-icons, 导入 uni-rate 自动下载依赖 +## 1.1.0(2021-04-16) +- 修复 uni-rate 属性 margin 值为 string 组件失效的 bug + +## 1.0.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.8(2021-02-05) +- 调整为uni_modules目录规范 +- 支持 pc 端 diff --git a/uni_modules/uni-rate/components/uni-rate/uni-rate.vue b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue new file mode 100644 index 00000000..857f5f9c --- /dev/null +++ b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue @@ -0,0 +1,361 @@ + + + + + diff --git a/uni_modules/uni-rate/package.json b/uni_modules/uni-rate/package.json new file mode 100644 index 00000000..64e8e332 --- /dev/null +++ b/uni_modules/uni-rate/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-rate", + "displayName": "uni-rate 评分", + "version": "1.3.1", + "description": "Rate 评分组件,可自定义评分星星图标的大小、间隔、评分数。", + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-rate/readme.md b/uni_modules/uni-rate/readme.md new file mode 100644 index 00000000..eae7b5ce --- /dev/null +++ b/uni_modules/uni-rate/readme.md @@ -0,0 +1,12 @@ + + +## Rate 评分 +> **组件名:uni-rate** +> 代码块: `uRate` +> 关联组件:`uni-icons` + + +评分组件,多用于购买商品后,对商品进行评价等场景 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-rate) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-row/changelog.md b/uni_modules/uni-row/changelog.md new file mode 100644 index 00000000..5b465bc6 --- /dev/null +++ b/uni_modules/uni-row/changelog.md @@ -0,0 +1,10 @@ +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-row](https://uniapp.dcloud.io/component/uniui/uni-row) +## 0.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-02-05) +- 调整为uni_modules目录规范 +- 新增uni-row组件 diff --git a/uni_modules/uni-row/components/uni-col/uni-col.vue b/uni_modules/uni-row/components/uni-col/uni-col.vue new file mode 100644 index 00000000..d5f37283 --- /dev/null +++ b/uni_modules/uni-row/components/uni-col/uni-col.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/uni_modules/uni-row/components/uni-row/uni-row.vue b/uni_modules/uni-row/components/uni-row/uni-row.vue new file mode 100644 index 00000000..c7d93701 --- /dev/null +++ b/uni_modules/uni-row/components/uni-row/uni-row.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/uni_modules/uni-row/package.json b/uni_modules/uni-row/package.json new file mode 100644 index 00000000..3f52fa64 --- /dev/null +++ b/uni_modules/uni-row/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-row", + "displayName": "uni-row 布局-行", + "version": "1.0.0", + "description": "流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。", + "keywords": [ + "uni-ui", + "uniui", + "栅格", + "布局", + "layout" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-row/readme.md b/uni_modules/uni-row/readme.md new file mode 100644 index 00000000..3c9c8b99 --- /dev/null +++ b/uni_modules/uni-row/readme.md @@ -0,0 +1,10 @@ +## Layout 布局 + +> **组件名 uni-row、uni-col** +> 代码块: `uRow`、`uCol` + + +流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-row) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 00000000..b863bb0f --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 00000000..1744a5f9 --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 00000000..7cc0ccb7 --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 00000000..b7d1c25f --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 00000000..ffac4fec --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 00000000..12a11c32 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 00000000..1ededd94 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 00000000..9a0428bb --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 00000000..3c895289 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 00000000..689afec6 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 00000000..a34d08f3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 00000000..557d3d7c --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 00000000..ac6f63e5 --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 00000000..80ee62f7 --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 00000000..1c062d42 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/uni_modules/uni-search-bar/changelog.md b/uni_modules/uni-search-bar/changelog.md new file mode 100644 index 00000000..b41fdd3b --- /dev/null +++ b/uni_modules/uni-search-bar/changelog.md @@ -0,0 +1,33 @@ +## 1.2.3(2022-05-24) +- 新增 readonly 属性,组件只读 +## 1.2.2(2022-05-06) +- 修复 vue3 input 事件不生效的bug +## 1.2.1(2022-05-06) +- 修复 多余代码导致的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-search-bar](https://uniapp.dcloud.io/component/uniui/uni-search-bar) +## 1.1.2(2021-08-30) +- 修复 value 属性与 modelValue 属性不兼容的Bug +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 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/i18n/en.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json new file mode 100644 index 00000000..dd083a53 --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json @@ -0,0 +1,4 @@ +{ + "uni-search-bar.cancel": "cancel", + "uni-search-bar.placeholder": "Search enter content" +} \ No newline at end of file diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js new file mode 100644 index 00000000..de7509c8 --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json new file mode 100644 index 00000000..d4e5c120 --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json @@ -0,0 +1,4 @@ +{ + "uni-search-bar.cancel": "cancel", + "uni-search-bar.placeholder": "请输入搜索内容" +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json new file mode 100644 index 00000000..318b6ef1 --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json @@ -0,0 +1,4 @@ +{ + "uni-search-bar.cancel": "cancel", + "uni-search-bar.placeholder": "請輸入搜索內容" +} 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 00000000..5a518a8c --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/uni_modules/uni-search-bar/package.json b/uni_modules/uni-search-bar/package.json new file mode 100644 index 00000000..9352c574 --- /dev/null +++ b/uni_modules/uni-search-bar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-search-bar", + "displayName": "uni-search-bar 搜索栏", + "version": "1.2.3", + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ 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 00000000..253092f0 --- /dev/null +++ b/uni_modules/uni-search-bar/readme.md @@ -0,0 +1,14 @@ + + +## SearchBar 搜索栏 + +> **组件名:uni-search-bar** +> 代码块: `uSearchBar` + + +搜索栏组件 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-search-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-segmented-control/changelog.md b/uni_modules/uni-segmented-control/changelog.md new file mode 100644 index 00000000..a44385d7 --- /dev/null +++ b/uni_modules/uni-segmented-control/changelog.md @@ -0,0 +1,9 @@ +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-segmented-control](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.5(2021-05-12) +- 新增 项目示例地址 +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue new file mode 100644 index 00000000..ddbcf884 --- /dev/null +++ b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/uni_modules/uni-segmented-control/package.json b/uni_modules/uni-segmented-control/package.json new file mode 100644 index 00000000..6cae41db --- /dev/null +++ b/uni_modules/uni-segmented-control/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-segmented-control", + "displayName": "uni-segmented-control 分段器", + "version": "1.2.0", + "description": "分段器由至少 2 个分段控件组成,用作不同视图的显示", + "keywords": [ + "uni-ui", + "uniui", + "分段器", + "segement", + "顶部选择" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-segmented-control/readme.md b/uni_modules/uni-segmented-control/readme.md new file mode 100644 index 00000000..3527b03f --- /dev/null +++ b/uni_modules/uni-segmented-control/readme.md @@ -0,0 +1,13 @@ + + +## SegmentedControl 分段器 +> **组件名:uni-segmented-control** +> 代码块: `uSegmentedControl` + + +用作不同视图的显示 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-steps/changelog.md b/uni_modules/uni-steps/changelog.md new file mode 100644 index 00000000..cb9d3679 --- /dev/null +++ b/uni_modules/uni-steps/changelog.md @@ -0,0 +1,16 @@ +## 1.1.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-steps](https://uniapp.dcloud.io/component/uniui/uni-steps) +## 1.0.8(2021-05-12) +- 新增 项目示例地址 +## 1.0.7(2021-05-06) +- 修复 uni-steps 横向布局时,多行文字高度不合理的 bug +## 1.0.6(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-steps/components/uni-steps/uni-steps.vue b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue new file mode 100644 index 00000000..a6c8f287 --- /dev/null +++ b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue @@ -0,0 +1,269 @@ + + + + + diff --git a/uni_modules/uni-steps/package.json b/uni_modules/uni-steps/package.json new file mode 100644 index 00000000..c687b40a --- /dev/null +++ b/uni_modules/uni-steps/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-steps", + "displayName": "uni-steps 步骤条", + "version": "1.1.1", + "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-scss", + "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-steps/readme.md b/uni_modules/uni-steps/readme.md new file mode 100644 index 00000000..da7a4bfa --- /dev/null +++ b/uni_modules/uni-steps/readme.md @@ -0,0 +1,13 @@ + + +## Steps 步骤条 +> **组件名:uni-steps** +> 代码块: `uSteps` + + +步骤条,常用于显示进度 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-steps) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-swipe-action/changelog.md b/uni_modules/uni-swipe-action/changelog.md new file mode 100644 index 00000000..c007cb5c --- /dev/null +++ b/uni_modules/uni-swipe-action/changelog.md @@ -0,0 +1,41 @@ +## 1.3.7(2022-06-06) +- 修复 vue3 下使用组件不能正常运行的Bug +## 1.3.6(2022-05-31) +- 修复 h5端点击click触发两次的Bug +## 1.3.5(2022-05-23) +- 修复 isPC 找不到的Bug +## 1.3.4(2022-05-19) +- 修复 在 nvue 下 disabled 失效的bug +## 1.3.3(2022-03-31) +- 修复 按钮字体大小不能设置的bug +## 1.3.2(2022-03-16) +- 修复 h5和app端下报el错误的bug +## 1.3.1(2022-03-07) +- 修复 HBuilderX 1.4.X 版本中,h5和app端下报错的bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swipe-action](https://uniapp.dcloud.io/component/uniui/uni-swipe-action) +## 1.2.4(2021-08-20) +- 优化 close-all 方法 +## 1.2.3(2021-08-20) +- 新增 close-all 方法,关闭所有已打开的组件 +## 1.2.2(2021-08-17) +- 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件 +- 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 +- 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题 +## 1.2.1(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +- 修复 跨页面修改组件数据 ,导致不能滑动的问题 +## 1.1.10(2021-06-17) +- 修复 按钮点击执行两次的bug +## 1.1.9(2021-05-12) +- 新增 项目示例地址 +## 1.1.8(2021-03-26) +- 修复 微信小程序 nv_navigator is not defined 报错的bug +## 1.1.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 左侧滑动 +- 新增 插槽使用方式 +- 新增 threshold 属性,可以控制滑动缺省值 +- 优化 长列表滚动性能 +- 修复 滚动页面时触发组件滑动的Bug diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js new file mode 100644 index 00000000..755c97c9 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js @@ -0,0 +1,302 @@ +let bindIngXMixins = {} + +// #ifdef APP-NVUE +const BindingX = uni.requireNativePlugin('bindingx'); +const dom = uni.requireNativePlugin('dom'); +const animation = uni.requireNativePlugin('animation'); + +bindIngXMixins = { + data() { + return {} + }, + + watch: { + show(newVal) { + if (this.autoClose) return + if (this.stop) return + this.stop = true + if (newVal) { + this.open(newVal) + } else { + this.close() + } + }, + leftOptions() { + this.getSelectorQuery() + this.init() + }, + rightOptions(newVal) { + this.init() + } + }, + created() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction.children !== undefined) { + this.swipeaction.children.push(this) + } + }, + mounted() { + this.box = this.getEl(this.$refs['selector-box--hock']) + this.selector = this.getEl(this.$refs['selector-content--hock']); + this.leftButton = this.getEl(this.$refs['selector-left-button--hock']); + this.rightButton = this.getEl(this.$refs['selector-right-button--hock']); + this.init() + }, + // beforeDestroy() { + // this.swipeaction.children.forEach((item, index) => { + // if (item === this) { + // this.swipeaction.children.splice(index, 1) + // } + // }) + // }, + methods: { + init() { + this.$nextTick(() => { + this.x = 0 + this.button = { + show: false + } + setTimeout(() => { + this.getSelectorQuery() + }, 200) + }) + }, + onClick(index, item, position) { + this.$emit('click', { + content: item, + index, + position + }) + }, + touchstart(e) { + // fix by mehaotian 禁止滑动 + if (this.disabled) return + // 每次只触发一次,避免多次监听造成闪烁 + if (this.stop) return + this.stop = true + if (this.autoClose) { + this.swipeaction.closeOther(this) + } + + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + let expression = this.range(this.x, -rightWidth, leftWidth) + let leftExpression = this.range(this.x - leftWidth, -leftWidth, 0) + let rightExpression = this.range(this.x + rightWidth, 0, rightWidth) + + this.eventpan = BindingX.bind({ + anchor: this.box, + eventType: 'pan', + props: [{ + element: this.selector, + property: 'transform.translateX', + expression + }, { + element: this.leftButton, + property: 'transform.translateX', + expression: leftExpression + }, { + element: this.rightButton, + property: 'transform.translateX', + expression: rightExpression + }, ] + }, (e) => { + // nope + if (e.state === 'end') { + this.x = e.deltaX + this.x; + this.isclick = true + this.bindTiming(e.deltaX) + } + }); + }, + touchend(e) { + if (this.isopen !== 'none' && !this.isclick) { + this.open('none') + } + }, + bindTiming(x) { + const left = this.x + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + const threshold = this.threshold + if (!this.isopen || this.isopen === 'none') { + if (left > threshold) { + this.open('left') + } else if (left < -threshold) { + this.open('right') + } else { + this.open('none') + } + } else { + if ((x > -leftWidth && x < 0) || x > rightWidth) { + if ((x > -threshold && x < 0) || (x - rightWidth > threshold)) { + this.open('left') + } else { + this.open('none') + } + } else { + if ((x < threshold && x > 0) || (x + leftWidth < -threshold)) { + this.open('right') + } else { + this.open('none') + } + } + } + }, + + /** + * 移动范围 + * @param {Object} num + * @param {Object} mix + * @param {Object} max + */ + range(num, mix, max) { + return `min(max(x+${num}, ${mix}), ${max})` + }, + + /** + * 开启swipe + */ + open(type) { + this.animation(type) + }, + + /** + * 关闭swipe + */ + close() { + this.animation('none') + }, + + /** + * 开启关闭动画 + * @param {Object} type + */ + animation(type) { + const time = 300 + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + if (this.eventpan && this.eventpan.token) { + BindingX.unbind({ + token: this.eventpan.token, + eventType: 'pan' + }) + } + + switch (type) { + case 'left': + Promise.all([ + this.move(this.selector, leftWidth), + this.move(this.leftButton, 0), + this.move(this.rightButton, rightWidth * 2) + ]).then(() => { + this.setEmit(leftWidth, type) + }) + break + case 'right': + Promise.all([ + this.move(this.selector, -rightWidth), + this.move(this.leftButton, -leftWidth * 2), + this.move(this.rightButton, 0) + ]).then(() => { + this.setEmit(-rightWidth, type) + }) + break + default: + Promise.all([ + this.move(this.selector, 0), + this.move(this.leftButton, -leftWidth), + this.move(this.rightButton, rightWidth) + ]).then(() => { + this.setEmit(0, type) + }) + + } + }, + setEmit(x, type) { + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + this.isopen = this.isopen || 'none' + this.stop = false + this.isclick = false + // 只有状态不一致才会返回结果 + if (this.isopen !== type && this.x !== x) { + if (type === 'left' && leftWidth > 0) { + this.$emit('change', 'left') + } + if (type === 'right' && rightWidth > 0) { + this.$emit('change', 'right') + } + if (type === 'none') { + this.$emit('change', 'none') + } + } + this.x = x + this.isopen = type + }, + move(ref, value) { + return new Promise((resolve, reject) => { + animation.transition(ref, { + styles: { + transform: `translateX(${value})`, + }, + duration: 150, //ms + timingFunction: 'linear', + needLayout: false, + delay: 0 //ms + }, function(res) { + resolve(res) + }) + }) + + }, + + /** + * 获取ref + * @param {Object} el + */ + getEl(el) { + return el.ref + }, + /** + * 获取节点信息 + */ + getSelectorQuery() { + Promise.all([ + this.getDom('left'), + this.getDom('right'), + ]).then((data) => { + let show = 'none' + if (this.autoClose) { + show = 'none' + } else { + show = this.show + } + + if (show === 'none') { + // this.close() + } else { + this.open(show) + } + + }) + + }, + getDom(str) { + return new Promise((resolve, reject) => { + dom.getComponentRect(this.$refs[`selector-${str}-button--hock`], (data) => { + if (data) { + this.button[str] = data.size + resolve(data) + } else { + reject() + } + }) + }) + } + } +} + +// #endif + +export default bindIngXMixins diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js new file mode 100644 index 00000000..917cb489 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js @@ -0,0 +1,12 @@ +export function isPC() { + var userAgentInfo = navigator.userAgent; + var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + var flag = true; + for (let v = 0; v < Agents.length - 1; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js new file mode 100644 index 00000000..43cd56bd --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js @@ -0,0 +1,193 @@ +export default { + data() { + return { + x: 0, + transition: false, + width: 0, + viewWidth: 0, + swipeShow: 0 + } + }, + watch: { + show(newVal) { + if (this.autoClose) return + if (newVal && newVal !== 'none') { + this.transition = true + this.open(newVal) + } else { + this.close() + } + } + }, + created() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction.children !== undefined) { + this.swipeaction.children.push(this) + } + }, + mounted() { + this.isopen = false + setTimeout(() => { + this.getQuerySelect() + }, 50) + }, + methods: { + appTouchStart(e) { + const { + clientX + } = e.changedTouches[0] + this.clientX = clientX + this.timestamp = new Date().getTime() + }, + appTouchEnd(e, index, item, position) { + const { + clientX + } = e.changedTouches[0] + // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 + let diff = Math.abs(this.clientX - clientX) + let time = (new Date().getTime()) - this.timestamp + if (diff < 40 && time < 300) { + this.$emit('click', { + content: item, + index, + position + }) + } + }, + /** + * 移动触发 + * @param {Object} e + */ + onChange(e) { + this.moveX = e.detail.x + this.isclose = false + }, + touchstart(e) { + this.transition = false + this.isclose = true + this.autoClose && this.swipeaction.closeOther(this) + }, + touchmove(e) {}, + touchend(e) { + // 0的位置什么都不执行 + if (this.isclose && this.isopen === 'none') return + if (this.isclose && this.isopen !== 'none') { + this.transition = true + this.close() + } else { + this.move(this.moveX + this.leftWidth) + } + }, + + /** + * 移动 + * @param {Object} moveX + */ + move(moveX) { + // 打开关闭的处理逻辑不太一样 + this.transition = true + // 未打开状态 + if (!this.isopen || this.isopen === 'none') { + if (moveX > this.threshold) { + this.open('left') + } else if (moveX < -this.threshold) { + this.open('right') + } else { + this.close() + } + } else { + if (moveX < 0 && moveX < this.rightWidth) { + const rightX = this.rightWidth + moveX + if (rightX < this.threshold) { + this.open('right') + } else { + this.close() + } + } else if (moveX > 0 && moveX < this.leftWidth) { + const leftX = this.leftWidth - moveX + if (leftX < this.threshold) { + this.open('left') + } else { + this.close() + } + } + + } + + }, + + /** + * 打开 + */ + open(type) { + this.x = this.moveX + this.animation(type) + }, + + /** + * 关闭 + */ + close() { + this.x = this.moveX + // TODO 解决 x 值不更新的问题,所以会多触发一次 nextTick ,待优化 + this.$nextTick(() => { + this.x = -this.leftWidth + if (this.isopen !== 'none') { + this.$emit('change', 'none') + } + this.isopen = 'none' + }) + }, + + /** + * 执行结束动画 + * @param {Object} type + */ + animation(type) { + this.$nextTick(() => { + if (type === 'left') { + this.x = 0 + } else { + this.x = -this.rightWidth - this.leftWidth + } + + if (this.isopen !== type) { + this.$emit('change', type) + } + this.isopen = type + }) + + }, + getSlide(x) {}, + getQuerySelect() { + const query = uni.createSelectorQuery().in(this); + query.selectAll('.movable-view--hock').boundingClientRect(data => { + this.leftWidth = data[1].width + this.rightWidth = data[2].width + this.width = data[0].width + this.viewWidth = this.width + this.rightWidth + this.leftWidth + if (this.leftWidth === 0) { + // TODO 疑似bug ,初始化的时候如果x 是0,会导致移动位置错误,所以让元素超出一点 + this.x = -0.1 + } else { + this.x = -this.leftWidth + } + this.moveX = this.x + this.$nextTick(() => { + this.swipeShow = 1 + }) + + if (!this.buttonWidth) { + this.disabledView = true + } + + if (this.autoClose) return + if (this.show !== 'none') { + this.transition = true + this.open(this.shows) + } + }).exec(); + + } + } +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js new file mode 100644 index 00000000..9a8bcbb6 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js @@ -0,0 +1,259 @@ +let otherMixins = {} + +// #ifndef APP-PLUS|| MP-WEIXIN || H5 +const MIN_DISTANCE = 10; +otherMixins = { + data() { + // TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug + const elClass = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}` + return { + uniShow: false, + left: 0, + buttonShow: 'none', + ani: false, + moveLeft: '', + elClass + } + }, + watch: { + show(newVal) { + if (this.autoClose) return + this.openState(newVal) + }, + left() { + this.moveLeft = `translateX(${this.left}px)` + }, + buttonShow(newVal) { + if (this.autoClose) return + this.openState(newVal) + }, + leftOptions() { + this.init() + }, + rightOptions() { + this.init() + } + }, + mounted() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction.children !== undefined) { + this.swipeaction.children.push(this) + } + this.init() + }, + methods: { + init() { + clearTimeout(this.timer) + this.timer = setTimeout(() => { + this.getSelectorQuery() + }, 100) + // 移动距离 + this.left = 0 + this.x = 0 + }, + + closeSwipe(e) { + if (!this.autoClose) return + this.swipeaction.closeOther(this) + }, + appTouchStart(e) { + const { + clientX + } = e.changedTouches[0] + this.clientX = clientX + this.timestamp = new Date().getTime() + }, + appTouchEnd(e, index, item, position) { + const { + clientX + } = e.changedTouches[0] + // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 + let diff = Math.abs(this.clientX - clientX) + let time = (new Date().getTime()) - this.timestamp + if (diff < 40 && time < 300) { + this.$emit('click', { + content: item, + index, + position + }) + } + }, + touchstart(e) { + if (this.disabled) return + this.ani = false + this.x = this.left || 0 + this.stopTouchStart(e) + this.autoClose && this.closeSwipe() + }, + touchmove(e) { + if (this.disabled) return + // 是否可以滑动页面 + this.stopTouchMove(e); + if (this.direction !== 'horizontal') { + return; + } + this.move(this.x + this.deltaX) + return false + }, + touchend() { + if (this.disabled) return + this.moveDirection(this.left) + }, + /** + * 设置移动距离 + * @param {Object} value + */ + move(value) { + value = value || 0 + const leftWidth = this.leftWidth + const rightWidth = this.rightWidth + // 获取可滑动范围 + this.left = this.range(value, -rightWidth, leftWidth); + }, + + /** + * 获取范围 + * @param {Object} num + * @param {Object} min + * @param {Object} max + */ + range(num, min, max) { + return Math.min(Math.max(num, min), max); + }, + /** + * 移动方向判断 + * @param {Object} left + * @param {Object} value + */ + moveDirection(left) { + const threshold = this.threshold + const isopen = this.isopen || 'none' + const leftWidth = this.leftWidth + const rightWidth = this.rightWidth + if (this.deltaX === 0) { + this.openState('none') + return + } + if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > + 0 && rightWidth + + left < threshold)) { + // right + this.openState('right') + } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > + 0 && + leftWidth - left < threshold)) { + // left + this.openState('left') + } else { + // default + this.openState('none') + } + }, + + /** + * 开启状态 + * @param {Boolean} type + */ + openState(type) { + const leftWidth = this.leftWidth + const rightWidth = this.rightWidth + let left = '' + this.isopen = this.isopen ? this.isopen : 'none' + switch (type) { + case "left": + left = leftWidth + break + case "right": + left = -rightWidth + break + default: + left = 0 + } + + + if (this.isopen !== type) { + this.throttle = true + this.$emit('change', type) + } + + this.isopen = type + // 添加动画类 + this.ani = true + this.$nextTick(() => { + this.move(left) + }) + // 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的 + }, + close() { + this.openState('none') + }, + getDirection(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; + }, + + /** + * 重置滑动状态 + * @param {Object} event + */ + resetTouchStatus() { + this.direction = ''; + this.deltaX = 0; + this.deltaY = 0; + this.offsetX = 0; + this.offsetY = 0; + }, + + /** + * 设置滑动开始位置 + * @param {Object} event + */ + stopTouchStart(event) { + this.resetTouchStatus(); + const touch = event.touches[0]; + this.startX = touch.clientX; + this.startY = touch.clientY; + }, + + /** + * 滑动中,是否禁止打开 + * @param {Object} event + */ + stopTouchMove(event) { + const touch = event.touches[0]; + this.deltaX = touch.clientX - this.startX; + this.deltaY = touch.clientY - this.startY; + this.offsetX = Math.abs(this.deltaX); + this.offsetY = Math.abs(this.deltaY); + this.direction = this.direction || this.getDirection(this.offsetX, this.offsetY); + }, + + getSelectorQuery() { + const views = uni.createSelectorQuery().in(this) + views + .selectAll('.' + this.elClass) + .boundingClientRect(data => { + if (data.length === 0) return + let show = 'none' + if (this.autoClose) { + show = 'none' + } else { + show = this.show + } + this.leftWidth = data[0].width || 0 + this.rightWidth = data[1].width || 0 + this.buttonShow = show + }) + .exec() + } + } +} + +// #endif + +export default otherMixins diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js new file mode 100644 index 00000000..435e0fbc --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js @@ -0,0 +1,83 @@ +let mpMixins = {} +let is_pc = null +// #ifdef H5 +import { + isPC +} from "./isPC" +is_pc = isPC() +// #endif +// #ifdef APP-VUE|| MP-WEIXIN || H5 + +mpMixins = { + data() { + return { + is_show: 'none' + } + }, + watch: { + show(newVal) { + this.is_show = this.show + } + }, + created() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction.children !== undefined) { + this.swipeaction.children.push(this) + } + }, + mounted() { + this.is_show = this.show + }, + methods: { + // wxs 中调用 + closeSwipe(e) { + if (!this.autoClose) return + this.swipeaction.closeOther(this) + }, + + change(e) { + this.$emit('change', e.open) + if (this.is_show !== e.open) { + this.is_show = e.open + } + }, + + appTouchStart(e) { + if (is_pc) return + const { + clientX + } = e.changedTouches[0] + this.clientX = clientX + this.timestamp = new Date().getTime() + }, + appTouchEnd(e, index, item, position) { + if (is_pc) return + const { + clientX + } = e.changedTouches[0] + // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 + let diff = Math.abs(this.clientX - clientX) + let time = (new Date().getTime()) - this.timestamp + if (diff < 40 && time < 300) { + this.$emit('click', { + content: item, + index, + position + }) + } + }, + onClickForPC(index, item, position) { + if (!is_pc) return + // #ifdef H5 + this.$emit('click', { + content: item, + index, + position + }) + // #endif + } + } +} + +// #endif +export default mpMixins diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js new file mode 100644 index 00000000..78f0ec60 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js @@ -0,0 +1,270 @@ +const MIN_DISTANCE = 10; +export default { + showWatch(newVal, oldVal, ownerInstance, instance, self) { + var state = self.state + var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el + if (!$el) return + this.getDom(instance, ownerInstance, self) + if (newVal && newVal !== 'none') { + this.openState(newVal, instance, ownerInstance, self) + return + } + + if (state.left) { + this.openState('none', instance, ownerInstance, self) + } + this.resetTouchStatus(instance, self) + }, + + /** + * 开始触摸操作 + * @param {Object} e + * @param {Object} ins + */ + touchstart(e, ownerInstance, self) { + let instance = e.instance; + let disabled = instance.getDataset().disabled + let state = self.state; + this.getDom(instance, ownerInstance, self) + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = this.getDisabledType(disabled) + if (disabled) return + // 开始触摸时移除动画类 + instance.requestAnimationFrame(function() { + instance.removeClass('ani'); + ownerInstance.callMethod('closeSwipe'); + }) + + // 记录上次的位置 + state.x = state.left || 0 + // 计算滑动开始位置 + this.stopTouchStart(e, ownerInstance, self) + }, + + /** + * 开始滑动操作 + * @param {Object} e + * @param {Object} ownerInstance + */ + touchmove(e, ownerInstance, self) { + let instance = e.instance; + // 删除之后已经那不到实例了 + if (!instance) return; + let disabled = instance.getDataset().disabled + let state = self.state + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = this.getDisabledType(disabled) + if (disabled) return + // 是否可以滑动页面 + this.stopTouchMove(e, self); + if (state.direction !== 'horizontal') { + return; + } + if (e.preventDefault) { + // 阻止页面滚动 + e.preventDefault() + } + let x = state.x + state.deltaX + this.move(x, instance, ownerInstance, self) + }, + + /** + * 结束触摸操作 + * @param {Object} e + * @param {Object} ownerInstance + */ + touchend(e, ownerInstance, self) { + let instance = e.instance; + let disabled = instance.getDataset().disabled + let state = self.state + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = this.getDisabledType(disabled) + + if (disabled) return + // 滑动过程中触摸结束,通过阙值判断是开启还是关闭 + // fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13 + this.moveDirection(state.left, instance, ownerInstance, self) + + }, + + /** + * 设置移动距离 + * @param {Object} value + * @param {Object} instance + * @param {Object} ownerInstance + */ + move(value, instance, ownerInstance, self) { + value = value || 0 + let state = self.state + let leftWidth = state.leftWidth + let rightWidth = state.rightWidth + // 获取可滑动范围 + state.left = this.range(value, -rightWidth, leftWidth); + instance.requestAnimationFrame(function() { + instance.setStyle({ + transform: 'translateX(' + state.left + 'px)', + '-webkit-transform': 'translateX(' + state.left + 'px)' + }) + }) + + }, + + /** + * 获取元素信息 + * @param {Object} instance + * @param {Object} ownerInstance + */ + getDom(instance, ownerInstance, self) { + var state = self.state + var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el + var leftDom = $el.querySelector('.button-group--left') + var rightDom = $el.querySelector('.button-group--right') + + state.leftWidth = leftDom.offsetWidth || 0 + state.rightWidth = rightDom.offsetWidth || 0 + state.threshold = instance.getDataset().threshold + }, + + getDisabledType(value) { + return (typeof(value) === 'string' ? JSON.parse(value) : value) || false; + }, + + /** + * 获取范围 + * @param {Object} num + * @param {Object} min + * @param {Object} max + */ + range(num, min, max) { + return Math.min(Math.max(num, min), max); + }, + + + /** + * 移动方向判断 + * @param {Object} left + * @param {Object} value + * @param {Object} ownerInstance + * @param {Object} ins + */ + moveDirection(left, ins, ownerInstance, self) { + var state = self.state + var threshold = state.threshold + var position = state.position + var isopen = state.isopen || 'none' + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + if (state.deltaX === 0) { + this.openState('none', ins, ownerInstance, self) + return + } + if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 && + rightWidth + + left < threshold)) { + // right + this.openState('right', ins, ownerInstance, self) + } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 && + leftWidth - left < threshold)) { + // left + this.openState('left', ins, ownerInstance, self) + } else { + // default + this.openState('none', ins, ownerInstance, self) + } + }, + + + /** + * 开启状态 + * @param {Boolean} type + * @param {Object} ins + * @param {Object} ownerInstance + */ + openState(type, ins, ownerInstance, self) { + let state = self.state + let leftWidth = state.leftWidth + let rightWidth = state.rightWidth + let left = '' + state.isopen = state.isopen ? state.isopen : 'none' + switch (type) { + case "left": + left = leftWidth + break + case "right": + left = -rightWidth + break + default: + left = 0 + } + + // && !state.throttle + + if (state.isopen !== type) { + state.throttle = true + ownerInstance.callMethod('change', { + open: type + }) + + } + + state.isopen = type + // 添加动画类 + ins.requestAnimationFrame(() => { + ins.addClass('ani'); + this.move(left, ins, ownerInstance, self) + }) + }, + + + getDirection(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; + }, + + /** + * 重置滑动状态 + * @param {Object} event + */ + resetTouchStatus(instance, self) { + let state = self.state; + state.direction = ''; + state.deltaX = 0; + state.deltaY = 0; + state.offsetX = 0; + state.offsetY = 0; + }, + + /** + * 设置滑动开始位置 + * @param {Object} event + */ + stopTouchStart(event, ownerInstance, self) { + let instance = event.instance; + let state = self.state + this.resetTouchStatus(instance, self); + var touch = event.touches[0]; + state.startX = touch.clientX; + state.startY = touch.clientY; + }, + + /** + * 滑动中,是否禁止打开 + * @param {Object} event + */ + stopTouchMove(event, self) { + let instance = event.instance; + let state = self.state; + let touch = event.touches[0]; + + state.deltaX = touch.clientX - state.startX; + state.deltaY = touch.clientY - state.startY; + state.offsetY = Math.abs(state.deltaY); + state.offsetX = Math.abs(state.deltaX); + state.direction = state.direction || this.getDirection(state.offsetX, state.offsetY); + } +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue new file mode 100644 index 00000000..d79c2979 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue @@ -0,0 +1,347 @@ + + + + + + diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs new file mode 100644 index 00000000..b394244f --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs @@ -0,0 +1,341 @@ +var MIN_DISTANCE = 10; + +/** + * 判断当前是否为H5、app-vue + */ +var IS_HTML5 = false +if (typeof window === 'object') IS_HTML5 = true + +/** + * 监听页面内值的变化,主要用于动态开关swipe-action + * @param {Object} newValue + * @param {Object} oldValue + * @param {Object} ownerInstance + * @param {Object} instance + */ +function showWatch(newVal, oldVal, ownerInstance, instance) { + var state = instance.getState() + getDom(instance, ownerInstance) + if (newVal && newVal !== 'none') { + openState(newVal, instance, ownerInstance) + return + } + + if (state.left) { + openState('none', instance, ownerInstance) + } + resetTouchStatus(instance) +} + +/** + * 开始触摸操作 + * @param {Object} e + * @param {Object} ins + */ +function touchstart(e, ownerInstance) { + var instance = e.instance; + var disabled = instance.getDataset().disabled + var state = instance.getState(); + getDom(instance, ownerInstance) + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; + if (disabled) return + // 开始触摸时移除动画类 + instance.requestAnimationFrame(function() { + instance.removeClass('ani'); + ownerInstance.callMethod('closeSwipe'); + }) + + // 记录上次的位置 + state.x = state.left || 0 + // 计算滑动开始位置 + stopTouchStart(e, ownerInstance) +} + +/** + * 开始滑动操作 + * @param {Object} e + * @param {Object} ownerInstance + */ +function touchmove(e, ownerInstance) { + var instance = e.instance; + var disabled = instance.getDataset().disabled + var state = instance.getState() + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; + if (disabled) return + // 是否可以滑动页面 + stopTouchMove(e); + if (state.direction !== 'horizontal') { + return; + } + + if (e.preventDefault) { + // 阻止页面滚动 + e.preventDefault() + } + + move(state.x + state.deltaX, instance, ownerInstance) +} + +/** + * 结束触摸操作 + * @param {Object} e + * @param {Object} ownerInstance + */ +function touchend(e, ownerInstance) { + var instance = e.instance; + var disabled = instance.getDataset().disabled + var state = instance.getState() + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; + + if (disabled) return + // 滑动过程中触摸结束,通过阙值判断是开启还是关闭 + // fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13 + moveDirection(state.left, instance, ownerInstance) + +} + +/** + * 设置移动距离 + * @param {Object} value + * @param {Object} instance + * @param {Object} ownerInstance + */ +function move(value, instance, ownerInstance) { + value = value || 0 + var state = instance.getState() + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + // 获取可滑动范围 + state.left = range(value, -rightWidth, leftWidth); + instance.requestAnimationFrame(function() { + instance.setStyle({ + transform: 'translateX(' + state.left + 'px)', + '-webkit-transform': 'translateX(' + state.left + 'px)' + }) + }) + +} + +/** + * 获取元素信息 + * @param {Object} instance + * @param {Object} ownerInstance + */ +function getDom(instance, ownerInstance) { + var state = instance.getState() + var leftDom = ownerInstance.selectComponent('.button-group--left') + var rightDom = ownerInstance.selectComponent('.button-group--right') + var leftStyles = { + width: 0 + } + var rightStyles = { + width: 0 + } + leftStyles = leftDom.getBoundingClientRect() + rightStyles = rightDom.getBoundingClientRect() + + state.leftWidth = leftStyles.width || 0 + state.rightWidth = rightStyles.width || 0 + state.threshold = instance.getDataset().threshold +} + +/** + * 获取范围 + * @param {Object} num + * @param {Object} min + * @param {Object} max + */ +function range(num, min, max) { + return Math.min(Math.max(num, min), max); +} + + +/** + * 移动方向判断 + * @param {Object} left + * @param {Object} value + * @param {Object} ownerInstance + * @param {Object} ins + */ +function moveDirection(left, ins, ownerInstance) { + var state = ins.getState() + var threshold = state.threshold + var position = state.position + var isopen = state.isopen || 'none' + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + if (state.deltaX === 0) { + openState('none', ins, ownerInstance) + return + } + if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 && + rightWidth + + left < threshold)) { + // right + openState('right', ins, ownerInstance) + } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 && + leftWidth - left < threshold)) { + // left + openState('left', ins, ownerInstance) + } else { + // default + openState('none', ins, ownerInstance) + } +} + + +/** + * 开启状态 + * @param {Boolean} type + * @param {Object} ins + * @param {Object} ownerInstance + */ +function openState(type, ins, ownerInstance) { + var state = ins.getState() + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + var left = '' + state.isopen = state.isopen ? state.isopen : 'none' + switch (type) { + case "left": + left = leftWidth + break + case "right": + left = -rightWidth + break + default: + left = 0 + } + + // && !state.throttle + + if (state.isopen !== type) { + state.throttle = true + ownerInstance.callMethod('change', { + open: type + }) + + } + + state.isopen = type + // 添加动画类 + ins.requestAnimationFrame(function() { + ins.addClass('ani'); + move(left, ins, ownerInstance) + }) + // 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的 +} + + +function getDirection(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; +} + +/** + * 重置滑动状态 + * @param {Object} event + */ +function resetTouchStatus(instance) { + var state = instance.getState(); + state.direction = ''; + state.deltaX = 0; + state.deltaY = 0; + state.offsetX = 0; + state.offsetY = 0; +} + +/** + * 设置滑动开始位置 + * @param {Object} event + */ +function stopTouchStart(event) { + var instance = event.instance; + var state = instance.getState(); + resetTouchStatus(instance); + var touch = event.touches[0]; + if (IS_HTML5 && isPC()) { + touch = event; + } + state.startX = touch.clientX; + state.startY = touch.clientY; +} + +/** + * 滑动中,是否禁止打开 + * @param {Object} event + */ +function stopTouchMove(event) { + var instance = event.instance; + var state = instance.getState(); + var touch = event.touches[0]; + if (IS_HTML5 && isPC()) { + touch = event; + } + state.deltaX = touch.clientX - state.startX; + state.deltaY = touch.clientY - state.startY; + state.offsetY = Math.abs(state.deltaY); + state.offsetX = Math.abs(state.deltaX); + state.direction = state.direction || getDirection(state.offsetX, state.offsetY); +} + +function isPC() { + var userAgentInfo = navigator.userAgent; + var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + var flag = true; + for (var v = 0; v < Agents.length - 1; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} + +var movable = false + +function mousedown(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + touchstart(e, ins) + movable = true +} + +function mousemove(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + if (!movable) return + touchmove(e, ins) +} + +function mouseup(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + touchend(e, ins) + movable = false +} + +function mouseleave(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + movable = false +} + +module.exports = { + showWatch: showWatch, + touchstart: touchstart, + touchmove: touchmove, + touchend: touchend, + mousedown: mousedown, + mousemove: mousemove, + mouseup: mouseup, + mouseleave: mouseleave +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue b/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue new file mode 100644 index 00000000..49717824 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/uni_modules/uni-swipe-action/package.json b/uni_modules/uni-swipe-action/package.json new file mode 100644 index 00000000..c8998d9d --- /dev/null +++ b/uni_modules/uni-swipe-action/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-swipe-action", + "displayName": "uni-swipe-action 滑动操作", + "version": "1.3.7", + "description": "SwipeAction 滑动操作操作组件", + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-swipe-action/readme.md b/uni_modules/uni-swipe-action/readme.md new file mode 100644 index 00000000..93a5cac6 --- /dev/null +++ b/uni_modules/uni-swipe-action/readme.md @@ -0,0 +1,11 @@ + + +## SwipeAction 滑动操作 +> **组件名:uni-swipe-action** +> 代码块: `uSwipeAction`、`uSwipeActionItem` + + +通过滑动触发选项的容器 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swipe-action) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-swiper-dot/changelog.md b/uni_modules/uni-swiper-dot/changelog.md new file mode 100644 index 00000000..85cf54d2 --- /dev/null +++ b/uni_modules/uni-swiper-dot/changelog.md @@ -0,0 +1,12 @@ +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swiper-dot](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.6(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 clickItem 事件,支持指示点控制轮播 +- 新增 支持 pc 可用 diff --git a/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue new file mode 100644 index 00000000..e5befae1 --- /dev/null +++ b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/uni_modules/uni-swiper-dot/package.json b/uni_modules/uni-swiper-dot/package.json new file mode 100644 index 00000000..f2dd8d2a --- /dev/null +++ b/uni_modules/uni-swiper-dot/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-swiper-dot", + "displayName": "uni-swiper-dot 轮播图指示点", + "version": "1.2.0", + "description": "自定义轮播图指示点组件", + "keywords": [ + "uni-ui", + "uniui", + "轮播图指示点", + "dot", + "swiper" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-swiper-dot/readme.md b/uni_modules/uni-swiper-dot/readme.md new file mode 100644 index 00000000..7d397e2c --- /dev/null +++ b/uni_modules/uni-swiper-dot/readme.md @@ -0,0 +1,11 @@ + + +## SwiperDot 轮播图指示点 +> **组件名:uni-swiper-dot** +> 代码块: `uSwiperDot` + + +自定义轮播图指示点 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-table/changelog.md b/uni_modules/uni-table/changelog.md new file mode 100644 index 00000000..8233b20f --- /dev/null +++ b/uni_modules/uni-table/changelog.md @@ -0,0 +1,23 @@ +## 1.2.1(2022-06-06) +- 修复 微信小程序存在无使用组件的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-table](https://uniapp.dcloud.io/component/uniui/uni-table) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-07-08) +- 新增 uni-th 支持 date 日期筛选范围 +## 1.0.6(2021-07-05) +- 新增 uni-th 支持 range 筛选范围 +## 1.0.5(2021-06-28) +- 新增 uni-th 筛选功能 +## 1.0.4(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.3(2021-04-16) +- 新增 sortable 属性,是否开启单列排序 +- 优化 表格多选逻辑 +## 1.0.2(2021-03-22) +- uni-tr 添加 disabled 属性,用于 type=selection 时,设置某行是否可由全选按钮控制 +## 1.0.1(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-table/components/uni-table/uni-table.vue b/uni_modules/uni-table/components/uni-table/uni-table.vue new file mode 100644 index 00000000..91b74fa7 --- /dev/null +++ b/uni_modules/uni-table/components/uni-table/uni-table.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue new file mode 100644 index 00000000..fbe1bdcb --- /dev/null +++ b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-td/uni-td.vue b/uni_modules/uni-table/components/uni-td/uni-td.vue new file mode 100644 index 00000000..9ce93e93 --- /dev/null +++ b/uni_modules/uni-table/components/uni-td/uni-td.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/filter-dropdown.vue b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue new file mode 100644 index 00000000..bc9a0e3b --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/uni-th.vue b/uni_modules/uni-table/components/uni-th/uni-th.vue new file mode 100644 index 00000000..883e3f2a --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/uni-th.vue @@ -0,0 +1,278 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-thead/uni-thead.vue b/uni_modules/uni-table/components/uni-thead/uni-thead.vue new file mode 100644 index 00000000..0dd18cd8 --- /dev/null +++ b/uni_modules/uni-table/components/uni-thead/uni-thead.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/table-checkbox.vue b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue new file mode 100644 index 00000000..158f3ffd --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/uni-tr.vue b/uni_modules/uni-table/components/uni-tr/uni-tr.vue new file mode 100644 index 00000000..f9b96716 --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/uni-tr.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/uni_modules/uni-table/i18n/en.json b/uni_modules/uni-table/i18n/en.json new file mode 100644 index 00000000..e32023cc --- /dev/null +++ b/uni_modules/uni-table/i18n/en.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reset", + "filter-dropdown.search": "Search", + "filter-dropdown.submit": "Submit", + "filter-dropdown.filter": "Filter", + "filter-dropdown.gt": "Greater or equal to", + "filter-dropdown.lt": "Less than or equal to", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/es.json b/uni_modules/uni-table/i18n/es.json new file mode 100644 index 00000000..9afd04bb --- /dev/null +++ b/uni_modules/uni-table/i18n/es.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reiniciar", + "filter-dropdown.search": "Búsqueda", + "filter-dropdown.submit": "Entregar", + "filter-dropdown.filter": "Filtrar", + "filter-dropdown.gt": "Mayor o igual a", + "filter-dropdown.lt": "Menos que o igual a", + "filter-dropdown.date": "Fecha" +} diff --git a/uni_modules/uni-table/i18n/fr.json b/uni_modules/uni-table/i18n/fr.json new file mode 100644 index 00000000..b0062371 --- /dev/null +++ b/uni_modules/uni-table/i18n/fr.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Réinitialiser", + "filter-dropdown.search": "Chercher", + "filter-dropdown.submit": "Soumettre", + "filter-dropdown.filter": "Filtre", + "filter-dropdown.gt": "Supérieur ou égal à", + "filter-dropdown.lt": "Inférieur ou égal à", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/index.js b/uni_modules/uni-table/i18n/index.js new file mode 100644 index 00000000..2469dd02 --- /dev/null +++ b/uni_modules/uni-table/i18n/index.js @@ -0,0 +1,12 @@ +import en from './en.json' +import es from './es.json' +import fr from './fr.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + es, + fr, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-table/i18n/zh-Hans.json b/uni_modules/uni-table/i18n/zh-Hans.json new file mode 100644 index 00000000..862af179 --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hans.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "确定", + "filter-dropdown.filter": "筛选", + "filter-dropdown.gt": "大于等于", + "filter-dropdown.lt": "小于等于", + "filter-dropdown.date": "日期范围" +} diff --git a/uni_modules/uni-table/i18n/zh-Hant.json b/uni_modules/uni-table/i18n/zh-Hant.json new file mode 100644 index 00000000..64f80615 --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hant.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "確定", + "filter-dropdown.filter": "篩選", + "filter-dropdown.gt": "大於等於", + "filter-dropdown.lt": "小於等於", + "filter-dropdown.date": "日期範圍" +} diff --git a/uni_modules/uni-table/package.json b/uni_modules/uni-table/package.json new file mode 100644 index 00000000..f224ab72 --- /dev/null +++ b/uni_modules/uni-table/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-table", + "displayName": "uni-table 表格", + "version": "1.2.1", + "description": "表格组件,多用于展示多条结构类似的数据,如", + "keywords": [ + "uni-ui", + "uniui", + "table", + "表格" +], + "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-scss","uni-datetime-picker"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "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", + "字节跳动": "n", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-table/readme.md b/uni_modules/uni-table/readme.md new file mode 100644 index 00000000..bb08c791 --- /dev/null +++ b/uni_modules/uni-table/readme.md @@ -0,0 +1,13 @@ + + +## Table 表单 +> 组件名:``uni-table``,代码块: `uTable`。 + +用于展示多条结构类似的数据 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-table) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + diff --git a/uni_modules/uni-tag/changelog.md b/uni_modules/uni-tag/changelog.md new file mode 100644 index 00000000..c0c5839b --- /dev/null +++ b/uni_modules/uni-tag/changelog.md @@ -0,0 +1,21 @@ +## 2.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-tag](https://uniapp.dcloud.io/component/uniui/uni-tag) +## 2.0.0(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +- 移除 插槽 +- 移除 type 属性的 royal 选项 +## 1.1.1(2021-08-11) +- type 不是 default 时,size 为 small 字体大小显示不正确 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-06-18) +- 修复 uni-tag 在字节跳动小程序上 css 类名编译错误的 bug +## 1.0.6(2021-06-04) +- 修复 未定义 sass 变量 "$uni-color-royal" 的bug +## 1.0.5(2021-05-10) +- 修复 royal 类型无效的bug +- 修复 uni-tag 宽度不自适应的bug +- 新增 uni-tag 支持属性 custom-style 自定义样式 +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-tag/components/uni-tag/uni-tag.vue b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue new file mode 100644 index 00000000..6378a0b9 --- /dev/null +++ b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/uni_modules/uni-tag/package.json b/uni_modules/uni-tag/package.json new file mode 100644 index 00000000..18780886 --- /dev/null +++ b/uni_modules/uni-tag/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-tag", + "displayName": "uni-tag 标签", + "version": "2.1.0", + "description": "Tag 组件,用于展示1个或多个文字标签,可点击切换选中、不选中的状态。", + "keywords": [ + "uni-ui", + "uniui", + "", + "tag", + "标签" +], + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-tag/readme.md b/uni_modules/uni-tag/readme.md new file mode 100644 index 00000000..6e78ff5e --- /dev/null +++ b/uni_modules/uni-tag/readme.md @@ -0,0 +1,13 @@ + + +## Tag 标签 +> **组件名:uni-tag** +> 代码块: `uTag` + + +用于展示1个或多个文字标签,可点击切换选中、不选中的状态 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tag) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-title/changelog.md b/uni_modules/uni-title/changelog.md new file mode 100644 index 00000000..76262165 --- /dev/null +++ b/uni_modules/uni-title/changelog.md @@ -0,0 +1,10 @@ +## 1.1.1(2022-05-19) +- 修改组件描述 +## 1.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-title](https://uniapp.dcloud.io/component/uniui/uni-title) +## 1.0.2(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.1(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-title/components/uni-title/uni-title.vue b/uni_modules/uni-title/components/uni-title/uni-title.vue new file mode 100644 index 00000000..bf4f9265 --- /dev/null +++ b/uni_modules/uni-title/components/uni-title/uni-title.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/uni_modules/uni-title/package.json b/uni_modules/uni-title/package.json new file mode 100644 index 00000000..2249f5a1 --- /dev/null +++ b/uni_modules/uni-title/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-title", + "displayName": "uni-title 章节标题", + "version": "1.1.1", + "description": "章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题", + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-title/readme.md b/uni_modules/uni-title/readme.md new file mode 100644 index 00000000..0e60b1b9 --- /dev/null +++ b/uni_modules/uni-title/readme.md @@ -0,0 +1,14 @@ + + +## Title 标题 +> **组件名:uni-title** +> 代码块: `uTitle` + + +章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-title) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + diff --git a/uni_modules/uni-tooltip/changelog.md b/uni_modules/uni-tooltip/changelog.md new file mode 100644 index 00000000..00f1572d --- /dev/null +++ b/uni_modules/uni-tooltip/changelog.md @@ -0,0 +1,10 @@ +## 0.2.1(2022-05-09) +- 修复 content 为空时仍然弹出的bug +## 0.2.0(2022-05-07) +**注意:破坏性更新** +- 更新 text 属性变更为 content +- 更新 移除 width 属性 +## 0.1.1(2022-04-27) +- 修复 组件根 text 嵌套组件 warning +## 0.1.0(2022-04-21) +- 初始化 diff --git a/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue new file mode 100644 index 00000000..ffbb6fa5 --- /dev/null +++ b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/uni_modules/uni-tooltip/package.json b/uni_modules/uni-tooltip/package.json new file mode 100644 index 00000000..e88ecf8d --- /dev/null +++ b/uni_modules/uni-tooltip/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-tooltip", + "displayName": "uni-tooltip 提示文字", + "version": "0.2.1", + "description": "Tooltip 提示文字", + "keywords": [ + "uni-tooltip", + "uni-ui", + "tooltip", + "tip", + "文字提示" + ], + "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": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-tooltip/readme.md b/uni_modules/uni-tooltip/readme.md new file mode 100644 index 00000000..faafa2ec --- /dev/null +++ b/uni_modules/uni-tooltip/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-tooltip** +> 代码块: `uTooltip` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tooltip) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md new file mode 100644 index 00000000..b1a824b8 --- /dev/null +++ b/uni_modules/uni-transition/changelog.md @@ -0,0 +1,20 @@ +## 1.3.1(2021-11-23) +- 修复 init 方法初始化问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) +## 1.2.1(2021-09-27) +- 修复 init 方法不生效的 Bug +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.1(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的 Bug +## 1.1.0(2021-04-22) +- 新增 通过方法自定义动画 +- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- 优化 动画触发逻辑,使动画更流畅 +- 优化 支持单独的动画类型 +- 优化 文档示例 +## 1.0.2(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js new file mode 100644 index 00000000..5f54365e --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -0,0 +1,128 @@ +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + this.animation = uni.createAnimation(options) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' + } + let unit = '' + if(type === 'rotate'){ + unit = 'deg' + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return + return new Promise((resolve, reject) => { + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + + step(config = {}) { + // #ifndef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE + this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) + this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin + this.next++ + // #endif + return this + } + + run(fn) { + // #ifndef APP-NVUE + this.$.animationData = this.animation.export() + this.$.timer = setTimeout(() => { + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE + this.isEnd = false + let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref + if(!ref) return + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { + // #ifndef APP-NVUE + this.animation[type](...args) + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + +export function createAnimation(option, _this) { + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) +} diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue new file mode 100644 index 00000000..0d739bd5 --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json new file mode 100644 index 00000000..d15fdf01 --- /dev/null +++ b/uni_modules/uni-transition/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-transition", + "displayName": "uni-transition 过渡动画", + "version": "1.3.1", + "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-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md new file mode 100644 index 00000000..2f8a77e1 --- /dev/null +++ b/uni_modules/uni-transition/readme.md @@ -0,0 +1,11 @@ + + +## Transition 过渡动画 +> **组件名:uni-transition** +> 代码块: `uTransition` + + +元素过渡动画 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/utils/auth.js b/utils/auth.js new file mode 100644 index 00000000..cf27e275 --- /dev/null +++ b/utils/auth.js @@ -0,0 +1,22 @@ +const AccessTokenKey = 'ACCESS_TOKEN' +const RefreshTokenKey = 'REFRESH_TOKEN' + +// ========== Token 相关 ========== + +export function getAccessToken() { + return uni.getStorageSync(AccessTokenKey) +} + +export function getRefreshToken() { + return uni.getStorageSync(RefreshTokenKey) +} + +export function setToken(token) { + uni.setStorageSync(AccessTokenKey, token.accessToken) + uni.setStorageSync(RefreshTokenKey, token.refreshToken) +} + +export function removeToken() { + uni.removeStorageSync(AccessTokenKey) + uni.removeStorageSync(RefreshTokenKey) +} diff --git a/utils/common.js b/utils/common.js new file mode 100644 index 00000000..00d4137d --- /dev/null +++ b/utils/common.js @@ -0,0 +1,54 @@ +/** +* 显示消息提示框 +* @param content 提示的标题 +*/ +export function toast(content) { + uni.showToast({ + icon: 'none', + title: content + }) +} + +/** +* 显示模态弹窗 +* @param content 提示的标题 +*/ +export function showConfirm(content) { + return new Promise((resolve, reject) => { + uni.showModal({ + title: '提示', + content: content, + cancelText: '取消', + confirmText: '确定', + success: function(res) { + resolve(res) + } + }) + }) +} + +/** +* 参数处理 +* @param params 参数 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName] + var part = encodeURIComponent(propName) + "=" + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']' + var subPart = encodeURIComponent(params) + "=" + result += subPart + encodeURIComponent(value[key]) + "&" + } + } + } else { + result += part + encodeURIComponent(value) + "&" + } + } + } + return result +} \ No newline at end of file diff --git a/utils/constant.js b/utils/constant.js new file mode 100644 index 00000000..8becd84f --- /dev/null +++ b/utils/constant.js @@ -0,0 +1,8 @@ +const constant = { + avatar: 'vuex_avatar', + name: 'vuex_name', + roles: 'vuex_roles', + permissions: 'vuex_permissions' + } + + export default constant diff --git a/utils/errorCode.js b/utils/errorCode.js new file mode 100644 index 00000000..d2111ee1 --- /dev/null +++ b/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} diff --git a/utils/permission.js b/utils/permission.js new file mode 100644 index 00000000..17969f2f --- /dev/null +++ b/utils/permission.js @@ -0,0 +1,51 @@ +import store from '@/store' + +/** + * 字符权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkPermi(value) { + if (value && value instanceof Array && value.length > 0) { + const permissions = store.getters && store.getters.permissions + const permissionDatas = value + const all_permission = "*:*:*" + + const hasPermission = permissions.some(permission => { + return all_permission === permission || permissionDatas.includes(permission) + }) + + if (!hasPermission) { + return false + } + return true + } else { + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) + return false + } +} + +/** + * 角色权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkRole(value) { + if (value && value instanceof Array && value.length > 0) { + const roles = store.getters && store.getters.roles + const permissionRoles = value + const super_admin = "admin" + + const hasRole = roles.some(role => { + return super_admin === role || permissionRoles.includes(role) + }) + + if (!hasRole) { + return false + } + return true + } else { + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false + } +} \ No newline at end of file diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 00000000..4799e746 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,76 @@ +import store from '@/store' +import config from '@/config' +import { getAccessToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { toast, showConfirm, tansParams } from '@/utils/common' + +let timeout = 10000 +const baseUrl = config.baseUrl + config.baseApi; + +const request = config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + config.header = config.header || {} + if (getAccessToken() && !isToken) { + config.header['Authorization'] = 'Bearer ' + getAccessToken() + } + // 设置租户 TODO 芋艿:强制 1 先 + config.header['tenant-id'] = '1'; + // get请求映射params参数 + if (config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.url = url + } + return new Promise((resolve, reject) => { + uni.request({ + method: config.method || 'get', + timeout: config.timeout || timeout, + url: config.baseUrl || baseUrl + config.url, + data: config.data, + // header: config.header, + header: config.header, + dataType: 'json' + }).then(response => { + let [error, res] = response + if (error) { + toast('后端接口连接异常') + reject('后端接口连接异常') + return + } + const code = res.data.code || 200 + const msg = errorCode[code] || res.data.msg || errorCode['default'] + if (code === 401) { + showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录?').then(res => { + if (res.confirm) { + store.dispatch('LogOut').then(res => { + uni.reLaunch({ url: '/pages/login' }) + }) + } + }) + reject('无效的会话,或者会话已过期,请重新登录。') + } else if (code === 500) { + toast(msg) + reject('500') + } else if (code !== 200) { + toast(msg) + reject(code) + } + resolve(res.data) + }) + .catch(error => { + let { message } = error + if (message === 'Network Error') { + message = '后端接口连接异常' + } else if (message.includes('timeout')) { + message = '系统接口请求超时' + } else if (message.includes('Request failed with status code')) { + message = '系统接口' + message.substr(message.length - 3) + '异常' + } + toast(message) + reject(error) + }) + }) +} + +export default request diff --git a/utils/ruoyi.js b/utils/ruoyi.js new file mode 100644 index 00000000..fb602175 --- /dev/null +++ b/utils/ruoyi.js @@ -0,0 +1,47 @@ +/** + * 通用js方法封装处理 + * Copyright (c) 2019 ruoyi + */ + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm),''); + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { + return ['日', '一', '二', '三', '四', '五', '六'][value] + } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} diff --git a/utils/storage.js b/utils/storage.js new file mode 100644 index 00000000..dd5c38bb --- /dev/null +++ b/utils/storage.js @@ -0,0 +1,33 @@ +import constant from './constant' + +// 存储变量名 +let storageKey = 'storage_data' + +// 存储节点变量名 +let storageNodeKeys = [constant.avatar, constant.name, constant.roles, constant.permissions] + +// 存储的数据 +let storageData = uni.getStorageSync(storageKey) || {} + +const storage = { + set: function(key, value) { + if (storageNodeKeys.indexOf(key) != -1) { + let tmp = uni.getStorageSync(storageKey) + tmp = tmp ? tmp : {} + tmp[key] = value + uni.setStorageSync(storageKey, tmp) + } + }, + get: function(key) { + return storageData[key] || "" + }, + remove: function(key) { + delete storageData[key] + uni.setStorageSync(storageKey, storageData) + }, + clean: function() { + uni.removeStorageSync(storageKey) + } +} + +export default storage diff --git a/utils/upload.js b/utils/upload.js new file mode 100644 index 00000000..fb6b3798 --- /dev/null +++ b/utils/upload.js @@ -0,0 +1,73 @@ +import store from '@/store' +import config from '@/config' +import { getAccessToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { toast, showConfirm, tansParams } from '@/utils/common' + +let timeout = 10000 +const baseUrl = config.baseUrl + +const upload = config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + config.header = config.header || {} + if (getAccessToken() && !isToken) { + config.header['Authorization'] = 'Bearer ' + getAccessToken() + } + // get请求映射params参数 + if (config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.url = url + } + // 设置租户 TODO 芋艿:强制 1 先 + config.header['tenant-id'] = '1'; + return new Promise((resolve, reject) => { + uni.uploadFile({ + timeout: config.timeout || timeout, + url: baseUrl + config.url, + filePath: config.filePath, + name: config.name || 'file', + header: config.header, + formData: config.formData, + method: config.method || 'post', + success: (res) => { + let result = JSON.parse(res.data) + const code = result.code || 200 + const msg = errorCode[code] || result.msg || errorCode['default'] + if (code === 200) { + resolve(result) + } else if (code == 401) { + showConfirm("登录状态已过期,您可以继续留在该页面,或者重新登录?").then(res => { + if (res.confirm) { + store.dispatch('LogOut').then(res => { + uni.reLaunch({ url: '/pages/login/login' }) + }) + } + }) + reject('无效的会话,或者会话已过期,请重新登录。') + } else if (code === 500) { + toast(msg) + reject('500') + } else if (code !== 200) { + toast(msg) + reject(code) + } + }, + fail: (error) => { + let { message } = error + if (message == 'Network Error') { + message = '后端接口连接异常' + } else if (message.includes('timeout')) { + message = '系统接口请求超时' + } else if (message.includes('Request failed with status code')) { + message = '系统接口' + message.substr(message.length - 3) + '异常' + } + toast(message) + reject(error) + } + }) + }) +} + +export default upload