From 85c436551f661ba5d862b080303fe5132b00b5a0 Mon Sep 17 00:00:00 2001 From: yangyao Date: Thu, 8 Jan 2026 11:07:35 +0800 Subject: [PATCH] =?UTF-8?q?=EF=BC=9B=E4=BC=98=E5=8C=96=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=BB=84=E4=BB=B6=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/CustomTabBar.vue | 58 +- config.js | 2 +- pages.json | 18 +- pages/index/index.vue | 85 +- pages/mbti/api.js | 7 + pages/mbti/index.vue | 113 ++ pages/memory/api.js | 7 + pages/memory/index.vue | 113 ++ static/tabbar/active-head.png | Bin 0 -> 8881 bytes static/tabbar/active-love.png | Bin 0 -> 5297 bytes static/tabbar/find.png | Bin 5510 -> 5733 bytes static/tabbar/head.png | Bin 0 -> 8641 bytes static/tabbar/home.png | Bin 4103 -> 4127 bytes static/tabbar/love.png | Bin 0 -> 5131 bytes static/tabbar/mine.png | Bin 4800 -> 5038 bytes uni_modules/uv-action-sheet/changelog.md | 7 + .../components/uv-action-sheet/props.js | 50 + .../uv-action-sheet/uv-action-sheet.vue | 280 ++++ uni_modules/uv-action-sheet/package.json | 92 ++ uni_modules/uv-action-sheet/readme.md | 13 + uni_modules/uv-album/changelog.md | 10 + .../uv-album/components/uv-album/uv-album.vue | 312 ++++ uni_modules/uv-album/package.json | 88 ++ uni_modules/uv-album/readme.md | 21 + uni_modules/uv-alert/changelog.md | 7 + .../uv-alert/components/uv-alert/props.js | 45 + .../uv-alert/components/uv-alert/uv-alert.vue | 246 +++ uni_modules/uv-alert/package.json | 88 ++ uni_modules/uv-alert/readme.md | 15 + uni_modules/uv-avatar/changelog.md | 13 + .../components/uv-avatar-group/props.js | 53 + .../uv-avatar-group/uv-avatar-group.vue | 106 ++ .../uv-avatar/components/uv-avatar/props.js | 80 + .../components/uv-avatar/uv-avatar.vue | 175 +++ uni_modules/uv-avatar/package.json | 89 ++ uni_modules/uv-avatar/readme.md | 11 + uni_modules/uv-back-top/changelog.md | 8 + .../components/uv-back-top/props.js | 58 + .../components/uv-back-top/uv-back-top.vue | 116 ++ uni_modules/uv-back-top/package.json | 89 ++ uni_modules/uv-back-top/readme.md | 11 + uni_modules/uv-badge/changelog.md | 7 + .../uv-badge/components/uv-badge/props.js | 73 + .../uv-badge/components/uv-badge/uv-badge.vue | 176 +++ uni_modules/uv-badge/package.json | 87 ++ uni_modules/uv-badge/readme.md | 11 + uni_modules/uv-button/changelog.md | 33 + .../uv-button/components/uv-button/nvue.scss | 46 + .../uv-button/components/uv-button/props.js | 163 ++ .../components/uv-button/uv-button.vue | 528 +++++++ .../uv-button/components/uv-button/vue.scss | 93 ++ uni_modules/uv-button/package.json | 89 ++ uni_modules/uv-button/readme.md | 19 + uni_modules/uv-calendar/changelog.md | 16 + .../components/uv-calendar/calendar.js | 546 +++++++ .../components/uv-calendar/header.vue | 104 ++ .../components/uv-calendar/month.vue | 616 ++++++++ .../components/uv-calendar/props.js | 145 ++ .../components/uv-calendar/uv-calendar.vue | 390 +++++ uni_modules/uv-calendar/package.json | 89 ++ uni_modules/uv-calendar/readme.md | 21 + uni_modules/uv-calendars/changelog.md | 40 + .../components/uv-calendars/calendar-body.vue | 376 +++++ .../components/uv-calendars/calendar-item.vue | 248 +++ .../components/uv-calendars/calendar.js | 546 +++++++ .../components/uv-calendars/i18n/en.json | 12 + .../components/uv-calendars/i18n/index.js | 8 + .../components/uv-calendars/i18n/zh-Hans.json | 12 + .../components/uv-calendars/i18n/zh-Hant.json | 12 + .../components/uv-calendars/util.js | 435 ++++++ .../components/uv-calendars/uv-calendars.vue | 452 ++++++ uni_modules/uv-calendars/package.json | 89 ++ uni_modules/uv-calendars/readme.md | 23 + uni_modules/uv-cell/changelog.md | 13 + .../uv-cell/components/uv-cell-group/props.js | 15 + .../uv-cell-group/uv-cell-group.vue | 63 + .../uv-cell/components/uv-cell/props.js | 116 ++ .../uv-cell/components/uv-cell/uv-cell.vue | 209 +++ uni_modules/uv-cell/package.json | 89 ++ uni_modules/uv-cell/readme.md | 11 + uni_modules/uv-checkbox/changelog.md | 34 + .../components/uv-checkbox-group/props.js | 84 ++ .../uv-checkbox-group/uv-checkbox-group.vue | 119 ++ .../components/uv-checkbox/props.js | 70 + .../components/uv-checkbox/uv-checkbox.vue | 370 +++++ uni_modules/uv-checkbox/package.json | 88 ++ uni_modules/uv-checkbox/readme.md | 19 + uni_modules/uv-code-input/changelog.md | 13 + .../components/uv-code-input/props.js | 83 + .../uv-code-input/uv-code-input.vue | 272 ++++ uni_modules/uv-code-input/package.json | 87 ++ uni_modules/uv-code-input/readme.md | 19 + uni_modules/uv-code/changelog.md | 9 + .../uv-code/components/uv-code/props.js | 35 + .../uv-code/components/uv-code/uv-code.vue | 136 ++ uni_modules/uv-code/package.json | 87 ++ uni_modules/uv-code/readme.md | 11 + uni_modules/uv-collapse/changelog.md | 5 + .../components/uv-collapse-item/props.js | 60 + .../uv-collapse-item/uv-collapse-item.vue | 229 +++ .../components/uv-collapse/props.js | 20 + .../components/uv-collapse/uv-collapse.vue | 86 ++ uni_modules/uv-collapse/package.json | 89 ++ uni_modules/uv-collapse/readme.md | 11 + uni_modules/uv-count-down/changelog.md | 9 + .../components/uv-count-down/props.js | 25 + .../components/uv-count-down/utils.js | 62 + .../uv-count-down/uv-count-down.vue | 169 +++ uni_modules/uv-count-down/package.json | 87 ++ uni_modules/uv-count-down/readme.md | 11 + uni_modules/uv-count-to/changelog.md | 13 + .../components/uv-count-to/props.js | 60 + .../components/uv-count-to/uv-count-to.vue | 187 +++ uni_modules/uv-count-to/package.json | 87 ++ uni_modules/uv-count-to/readme.md | 11 + uni_modules/uv-datetime-picker/changelog.md | 34 + .../components/uv-datetime-picker/props.js | 130 ++ .../uv-datetime-picker/uv-datetime-picker.vue | 360 +++++ uni_modules/uv-datetime-picker/package.json | 89 ++ uni_modules/uv-datetime-picker/readme.md | 19 + uni_modules/uv-divider/changelog.md | 11 + .../uv-divider/components/uv-divider/props.js | 45 + .../components/uv-divider/uv-divider.vue | 113 ++ uni_modules/uv-divider/package.json | 88 ++ uni_modules/uv-divider/readme.md | 11 + uni_modules/uv-drop-down/changelog.md | 13 + .../uv-drop-down-item/uv-drop-down-item.vue | 169 +++ .../uv-drop-down-popup/uv-drop-down-popup.vue | 242 +++ .../components/uv-drop-down/uv-drop-down.vue | 135 ++ uni_modules/uv-drop-down/package.json | 91 ++ uni_modules/uv-drop-down/readme.md | 23 + uni_modules/uv-empty/changelog.md | 13 + .../uv-empty/components/uv-empty/props.js | 60 + .../uv-empty/components/uv-empty/uv-empty.vue | 126 ++ uni_modules/uv-empty/package.json | 88 ++ uni_modules/uv-empty/readme.md | 19 + uni_modules/uv-form/changelog.md | 23 + .../uv-form/components/uv-form-item/props.js | 49 + .../components/uv-form-item/uv-form-item.vue | 226 +++ .../uv-form/components/uv-form/props.js | 46 + .../uv-form/components/uv-form/uv-form.vue | 209 +++ .../uv-form/components/uv-form/valid.js | 1343 +++++++++++++++++ uni_modules/uv-form/package.json | 93 ++ uni_modules/uv-form/readme.md | 19 + uni_modules/uv-gap/changelog.md | 5 + uni_modules/uv-gap/components/uv-gap/props.js | 25 + .../uv-gap/components/uv-gap/uv-gap.vue | 36 + uni_modules/uv-gap/package.json | 87 ++ uni_modules/uv-gap/readme.md | 12 + uni_modules/uv-grid/changelog.md | 21 + .../uv-grid/components/uv-grid-item/props.js | 15 + .../components/uv-grid-item/uv-grid-item.vue | 226 +++ .../uv-grid/components/uv-grid/props.js | 20 + .../uv-grid/components/uv-grid/uv-grid.vue | 100 ++ uni_modules/uv-grid/package.json | 88 ++ uni_modules/uv-grid/readme.md | 17 + uni_modules/uv-icon/changelog.md | 31 + .../uv-icon/components/uv-icon/icons.js | 160 ++ .../uv-icon/components/uv-icon/props.js | 90 ++ .../uv-icon/components/uv-icon/uv-icon.vue | 226 +++ .../uv-icon/components/uv-icon/uvicons.ttf | Bin 0 -> 39632 bytes uni_modules/uv-icon/package.json | 83 + uni_modules/uv-icon/readme.md | 15 + uni_modules/uv-image/changelog.md | 36 + .../uv-image/components/uv-image/props.js | 95 ++ .../uv-image/components/uv-image/uv-image.vue | 287 ++++ uni_modules/uv-image/package.json | 89 ++ uni_modules/uv-image/readme.md | 15 + uni_modules/uv-index-list/changelog.md | 18 + .../components/uv-index-anchor/props.js | 30 + .../uv-index-anchor/uv-index-anchor.vue | 98 ++ .../uv-index-item/uv-index-item.vue | 87 ++ .../components/uv-index-list/props.js | 30 + .../uv-index-list/uv-index-list.vue | 461 ++++++ uni_modules/uv-index-list/package.json | 88 ++ uni_modules/uv-index-list/readme.md | 19 + uni_modules/uv-input/changelog.md | 29 + .../uv-input/components/uv-input/props.js | 175 +++ .../uv-input/components/uv-input/uv-input.vue | 348 +++++ uni_modules/uv-input/package.json | 88 ++ uni_modules/uv-input/readme.md | 19 + uni_modules/uv-keyboard/changelog.md | 17 + .../components/uv-keyboard-car/props.js | 24 + .../uv-keyboard-car/uv-keyboard-car.vue | 347 +++++ .../components/uv-keyboard-number/props.js | 19 + .../uv-keyboard-number/uv-keyboard-number.vue | 201 +++ .../components/uv-keyboard/props.js | 95 ++ .../components/uv-keyboard/uv-keyboard.vue | 180 +++ uni_modules/uv-keyboard/package.json | 89 ++ uni_modules/uv-keyboard/readme.md | 19 + uni_modules/uv-line-progress/changelog.md | 7 + .../components/uv-line-progress/props.js | 29 + .../uv-line-progress/uv-line-progress.vue | 146 ++ uni_modules/uv-line-progress/package.json | 87 ++ uni_modules/uv-line-progress/readme.md | 11 + uni_modules/uv-line/changelog.md | 5 + .../uv-line/components/uv-line/props.js | 34 + .../uv-line/components/uv-line/uv-line.vue | 60 + uni_modules/uv-line/package.json | 87 ++ uni_modules/uv-line/readme.md | 11 + uni_modules/uv-link/changelog.md | 7 + .../uv-link/components/uv-link/props.js | 40 + .../uv-link/components/uv-link/uv-link.vue | 83 + uni_modules/uv-link/package.json | 87 ++ uni_modules/uv-link/readme.md | 11 + uni_modules/uv-list/changelog.md | 25 + .../components/uv-list-item/uv-list-item.vue | 535 +++++++ .../uv-list/components/uv-list/uv-list.vue | 147 ++ uni_modules/uv-list/package.json | 87 ++ uni_modules/uv-list/readme.md | 27 + uni_modules/uv-load-more/changelog.md | 7 + .../components/uv-load-more/props.js | 95 ++ .../components/uv-load-more/uv-load-more.vue | 152 ++ uni_modules/uv-load-more/package.json | 89 ++ uni_modules/uv-load-more/readme.md | 11 + uni_modules/uv-loading-icon/changelog.md | 9 + .../components/uv-loading-icon/props.js | 67 + .../uv-loading-icon/uv-loading-icon.vue | 347 +++++ uni_modules/uv-loading-icon/package.json | 87 ++ uni_modules/uv-loading-icon/readme.md | 19 + uni_modules/uv-loading-page/changelog.md | 11 + .../components/uv-loading-page/props.js | 55 + .../uv-loading-page/uv-loading-page.vue | 96 ++ uni_modules/uv-loading-page/package.json | 89 ++ uni_modules/uv-loading-page/readme.md | 11 + uni_modules/uv-modal/changelog.md | 28 + .../uv-modal/components/uv-modal/props.js | 90 ++ .../uv-modal/components/uv-modal/uv-modal.vue | 245 +++ uni_modules/uv-modal/package.json | 90 ++ uni_modules/uv-modal/readme.md | 23 + uni_modules/uv-navbar/changelog.md | 17 + .../uv-navbar/components/uv-navbar/props.js | 89 ++ .../components/uv-navbar/uv-navbar.vue | 245 +++ uni_modules/uv-navbar/package.json | 89 ++ uni_modules/uv-navbar/readme.md | 19 + uni_modules/uv-no-network/changelog.md | 5 + .../components/uv-no-network/props.js | 20 + .../uv-no-network/uv-no-network.vue | 222 +++ uni_modules/uv-no-network/package.json | 90 ++ uni_modules/uv-no-network/readme.md | 11 + uni_modules/uv-notice-bar/changelog.md | 19 + .../components/uv-column-notice/props.js | 61 + .../uv-column-notice/uv-column-notice.vue | 176 +++ .../components/uv-notice-bar/props.js | 76 + .../uv-notice-bar/uv-notice-bar.vue | 110 ++ .../components/uv-row-notice/props.js | 40 + .../uv-row-notice/uv-row-notice.vue | 341 +++++ uni_modules/uv-notice-bar/package.json | 88 ++ uni_modules/uv-notice-bar/readme.md | 19 + uni_modules/uv-notify/changelog.md | 9 + .../uv-notify/components/uv-notify/props.js | 45 + .../components/uv-notify/uv-notify.vue | 220 +++ uni_modules/uv-notify/package.json | 90 ++ uni_modules/uv-notify/readme.md | 11 + uni_modules/uv-number-box/changelog.md | 7 + .../components/uv-number-box/props.js | 113 ++ .../uv-number-box/uv-number-box.vue | 395 +++++ uni_modules/uv-number-box/package.json | 88 ++ uni_modules/uv-number-box/readme.md | 11 + uni_modules/uv-overlay/changelog.md | 9 + .../uv-overlay/components/uv-overlay/props.js | 25 + .../components/uv-overlay/uv-overlay.vue | 85 ++ uni_modules/uv-overlay/package.json | 88 ++ uni_modules/uv-overlay/readme.md | 11 + uni_modules/uv-parse/changelog.md | 13 + .../components/uv-parse/node/node.vue | 576 +++++++ .../uv-parse/components/uv-parse/parser.js | 1335 ++++++++++++++++ .../uv-parse/components/uv-parse/uv-parse.vue | 498 ++++++ uni_modules/uv-parse/package.json | 87 ++ uni_modules/uv-parse/readme.md | 21 + .../static/app-plus/uv-parse/js/handler.js | 224 +++ .../app-plus/uv-parse/js/uni.webview.min.js | 19 + .../static/app-plus/uv-parse/local.html | 1 + uni_modules/uv-pick-color/changelog.md | 18 + .../components/uv-pick-color/colors.js | 217 +++ .../components/uv-pick-color/props.js | 47 + .../uv-pick-color/uv-pick-color.vue | 551 +++++++ uni_modules/uv-pick-color/package.json | 89 ++ uni_modules/uv-pick-color/readme.md | 19 + uni_modules/uv-picker/changelog.md | 33 + .../uv-picker/components/uv-picker/props.js | 95 ++ .../components/uv-picker/uv-picker.vue | 330 ++++ uni_modules/uv-picker/package.json | 90 ++ uni_modules/uv-picker/readme.md | 21 + uni_modules/uv-popup/changelog.md | 18 + .../uv-popup/components/uv-popup/keypress.js | 45 + .../uv-popup/components/uv-popup/uv-popup.vue | 539 +++++++ uni_modules/uv-popup/package.json | 92 ++ uni_modules/uv-popup/readme.md | 21 + uni_modules/uv-qrcode/changelog.md | 13 + .../uv-qrcode/components/uv-qrcode/cache.js | 1 + .../uv-qrcode/gcanvas/bridge/bridge-weex.js | 241 +++ .../context-2d/FillStyleLinearGradient.js | 18 + .../gcanvas/context-2d/FillStylePattern.js | 8 + .../context-2d/FillStyleRadialGradient.js | 17 + .../gcanvas/context-2d/RenderingContext.js | 666 ++++++++ .../gcanvas/context-webgl/ActiveInfo.js | 11 + .../uv-qrcode/gcanvas/context-webgl/Buffer.js | 21 + .../gcanvas/context-webgl/Framebuffer.js | 21 + .../uv-qrcode/gcanvas/context-webgl/GLenum.js | 298 ++++ .../gcanvas/context-webgl/GLmethod.js | 142 ++ .../uv-qrcode/gcanvas/context-webgl/GLtype.js | 23 + .../gcanvas/context-webgl/Program.js | 21 + .../gcanvas/context-webgl/Renderbuffer.js | 21 + .../gcanvas/context-webgl/RenderingContext.js | 1191 +++++++++++++++ .../uv-qrcode/gcanvas/context-webgl/Shader.js | 22 + .../context-webgl/ShaderPrecisionFormat.js | 11 + .../gcanvas/context-webgl/Texture.js | 22 + .../gcanvas/context-webgl/UniformLocation.js | 22 + .../gcanvas/context-webgl/classUtils.js | 3 + .../uv-qrcode/gcanvas/env/canvas.js | 74 + .../components/uv-qrcode/gcanvas/env/image.js | 96 ++ .../components/uv-qrcode/gcanvas/env/tool.js | 24 + .../components/uv-qrcode/gcanvas/index.js | 39 + .../uv-qrcode/components/uv-qrcode/props.js | 85 ++ .../uv-qrcode/components/uv-qrcode/qrcode.js | 34 + .../uv-qrcode/components/uv-qrcode/queue.js | 41 + .../components/uv-qrcode/uv-qrcode.vue | 1038 +++++++++++++ uni_modules/uv-qrcode/package.json | 87 ++ uni_modules/uv-qrcode/readme.md | 21 + uni_modules/uv-radio/changelog.md | 31 + .../components/uv-radio-group/props.js | 89 ++ .../uv-radio-group/uv-radio-group.vue | 115 ++ .../uv-radio/components/uv-radio/props.js | 65 + .../uv-radio/components/uv-radio/uv-radio.vue | 348 +++++ uni_modules/uv-radio/package.json | 88 ++ uni_modules/uv-radio/readme.md | 19 + uni_modules/uv-rate/changelog.md | 17 + .../uv-rate/components/uv-rate/props.js | 73 + .../uv-rate/components/uv-rate/uv-rate.vue | 274 ++++ uni_modules/uv-rate/package.json | 88 ++ uni_modules/uv-rate/readme.md | 19 + uni_modules/uv-read-more/changelog.md | 7 + .../components/uv-read-more/props.js | 62 + .../components/uv-read-more/uv-read-more.vue | 162 ++ uni_modules/uv-read-more/package.json | 89 ++ uni_modules/uv-read-more/readme.md | 11 + uni_modules/uv-row/changelog.md | 5 + uni_modules/uv-row/components/uv-col/props.js | 30 + .../uv-row/components/uv-col/uv-col.vue | 165 ++ uni_modules/uv-row/components/uv-row/props.js | 20 + .../uv-row/components/uv-row/uv-row.vue | 95 ++ uni_modules/uv-row/package.json | 87 ++ uni_modules/uv-row/readme.md | 11 + uni_modules/uv-safe-bottom/changelog.md | 11 + .../uv-safe-bottom/uv-safe-bottom.vue | 67 + uni_modules/uv-safe-bottom/package.json | 87 ++ uni_modules/uv-safe-bottom/readme.md | 11 + uni_modules/uv-scroll-list/changelog.md | 12 + .../components/uv-scroll-list/nvue.js | 29 + .../components/uv-scroll-list/props.js | 35 + .../components/uv-scroll-list/scrollWxs.wxs | 51 + .../uv-scroll-list/uv-scroll-list.vue | 218 +++ uni_modules/uv-scroll-list/package.json | 87 ++ uni_modules/uv-scroll-list/readme.md | 19 + uni_modules/uv-search/changelog.md | 25 + .../uv-search/components/uv-search/props.js | 127 ++ .../components/uv-search/uv-search.vue | 311 ++++ uni_modules/uv-search/package.json | 89 ++ uni_modules/uv-search/readme.md | 19 + uni_modules/uv-skeleton/changelog.md | 9 + .../components/uv-skeleton/props.js | 65 + .../components/uv-skeleton/uv-skeleton.vue | 250 +++ uni_modules/uv-skeleton/package.json | 87 ++ uni_modules/uv-skeleton/readme.md | 11 + uni_modules/uv-skeletons/changelog.md | 4 + .../components/uv-skeletons/uv-skeletons.vue | 247 +++ uni_modules/uv-skeletons/package.json | 88 ++ uni_modules/uv-skeletons/readme.md | 23 + uni_modules/uv-slider/changelog.md | 9 + .../uv-slider/components/uv-slider/props.js | 58 + .../components/uv-slider/uv-slider.vue | 58 + uni_modules/uv-slider/package.json | 87 ++ uni_modules/uv-slider/readme.md | 15 + uni_modules/uv-status-bar/changelog.md | 7 + .../components/uv-status-bar/props.js | 8 + .../uv-status-bar/uv-status-bar.vue | 54 + uni_modules/uv-status-bar/package.json | 87 ++ uni_modules/uv-status-bar/readme.md | 10 + uni_modules/uv-steps/changelog.md | 10 + .../components/uv-steps-item/props.js | 25 + .../uv-steps-item/uv-steps-item.vue | 347 +++++ .../uv-steps/components/uv-steps/props.js | 40 + .../uv-steps/components/uv-steps/uv-steps.vue | 83 + uni_modules/uv-steps/package.json | 89 ++ uni_modules/uv-steps/readme.md | 11 + uni_modules/uv-sticky/changelog.md | 11 + .../uv-sticky/components/uv-sticky/props.js | 41 + .../components/uv-sticky/uv-sticky.vue | 223 +++ uni_modules/uv-sticky/package.json | 87 ++ uni_modules/uv-sticky/readme.md | 11 + uni_modules/uv-subsection/changelog.md | 10 + .../components/uv-subsection/props.js | 54 + .../uv-subsection/uv-subsection.vue | 269 ++++ uni_modules/uv-subsection/package.json | 87 ++ uni_modules/uv-subsection/readme.md | 11 + uni_modules/uv-swipe-action/changelog.md | 11 + .../uv-swipe-action-item/index - backup.wxs | 256 ++++ .../components/uv-swipe-action-item/index.wxs | 225 +++ .../uv-swipe-action-item/nvue - backup.js | 264 ++++ .../components/uv-swipe-action-item/nvue.js | 182 +++ .../components/uv-swipe-action-item/props.js | 40 + .../uv-swipe-action-item.vue | 200 +++ .../components/uv-swipe-action-item/wxs.js | 15 + .../components/uv-swipe-action/props.js | 10 + .../uv-swipe-action/uv-swipe-action.vue | 65 + uni_modules/uv-swipe-action/package.json | 88 ++ uni_modules/uv-swipe-action/readme.md | 11 + uni_modules/uv-swiper/changelog.md | 16 + .../components/uv-swiper-indicator/props.js | 30 + .../uv-swiper-indicator.vue | 112 ++ .../uv-swiper/components/uv-swiper/props.js | 136 ++ .../components/uv-swiper/uv-swiper.vue | 263 ++++ uni_modules/uv-swiper/package.json | 88 ++ uni_modules/uv-swiper/readme.md | 19 + uni_modules/uv-switch/changelog.md | 14 + .../uv-switch/components/uv-switch/props.js | 58 + .../components/uv-switch/uv-switch.vue | 192 +++ uni_modules/uv-switch/package.json | 88 ++ uni_modules/uv-switch/readme.md | 19 + uni_modules/uv-tabbar/changelog.md | 14 + .../components/uv-tabbar-item/props.js | 40 + .../uv-tabbar-item/uv-tabbar-item.vue | 146 ++ .../uv-tabbar/components/uv-tabbar/props.js | 50 + .../components/uv-tabbar/uv-tabbar.vue | 146 ++ uni_modules/uv-tabbar/package.json | 90 ++ uni_modules/uv-tabbar/readme.md | 21 + uni_modules/uv-tabs/changelog.md | 22 + .../uv-tabs/components/uv-tabs/props.js | 71 + .../uv-tabs/components/uv-tabs/uv-tabs.vue | 390 +++++ uni_modules/uv-tabs/package.json | 90 ++ uni_modules/uv-tabs/readme.md | 19 + uni_modules/uv-tags/changelog.md | 10 + .../uv-tags/components/uv-tags/props.js | 95 ++ .../uv-tags/components/uv-tags/uv-tags.vue | 379 +++++ uni_modules/uv-tags/package.json | 89 ++ uni_modules/uv-tags/readme.md | 11 + uni_modules/uv-text/changelog.md | 11 + .../uv-text/components/uv-text/props.js | 113 ++ .../uv-text/components/uv-text/uv-text.vue | 218 +++ .../uv-text/components/uv-text/value.js | 87 ++ uni_modules/uv-text/package.json | 89 ++ uni_modules/uv-text/readme.md | 17 + uni_modules/uv-textarea/changelog.md | 28 + .../components/uv-textarea/props.js | 138 ++ .../components/uv-textarea/uv-textarea.vue | 238 +++ uni_modules/uv-textarea/package.json | 87 ++ uni_modules/uv-textarea/readme.md | 19 + uni_modules/uv-toast/changelog.md | 10 + .../uv-toast/components/uv-toast/uv-toast.vue | 333 ++++ uni_modules/uv-toast/package.json | 90 ++ uni_modules/uv-toast/readme.md | 11 + uni_modules/uv-toolbar/changelog.md | 2 + .../uv-toolbar/components/uv-toolbar/props.js | 40 + .../components/uv-toolbar/uv-toolbar.vue | 109 ++ uni_modules/uv-toolbar/package.json | 87 ++ uni_modules/uv-toolbar/readme.md | 31 + uni_modules/uv-tooltip/changelog.md | 13 + .../uv-tooltip/components/uv-tooltip/props.js | 60 + .../components/uv-tooltip/uv-tooltip.vue | 372 +++++ uni_modules/uv-tooltip/package.json | 90 ++ uni_modules/uv-tooltip/readme.md | 11 + uni_modules/uv-transition/changelog.md | 19 + .../uv-transition/createAnimation.js | 131 ++ .../components/uv-transition/props.js | 31 + .../uv-transition/uv-transition.vue | 320 ++++ uni_modules/uv-transition/package.json | 87 ++ uni_modules/uv-transition/readme.md | 15 + uni_modules/uv-ui-tools/changelog.md | 76 + .../components/uv-ui-tools/uv-ui-tools.vue | 6 + uni_modules/uv-ui-tools/index.js | 79 + uni_modules/uv-ui-tools/index.scss | 7 + uni_modules/uv-ui-tools/libs/config/config.js | 34 + uni_modules/uv-ui-tools/libs/css/color.scss | 32 + uni_modules/uv-ui-tools/libs/css/common.scss | 100 ++ .../uv-ui-tools/libs/css/components.scss | 23 + .../uv-ui-tools/libs/css/variable.scss | 111 ++ uni_modules/uv-ui-tools/libs/css/vue.scss | 40 + .../libs/function/colorGradient.js | 134 ++ .../uv-ui-tools/libs/function/debounce.js | 29 + .../uv-ui-tools/libs/function/digit.js | 167 ++ .../uv-ui-tools/libs/function/index.js | 734 +++++++++ .../uv-ui-tools/libs/function/platform.js | 75 + uni_modules/uv-ui-tools/libs/function/test.js | 287 ++++ .../uv-ui-tools/libs/function/throttle.js | 30 + .../libs/luch-request/adapters/index.js | 132 ++ .../luch-request/core/InterceptorManager.js | 51 + .../libs/luch-request/core/Request.js | 201 +++ .../libs/luch-request/core/buildFullPath.js | 20 + .../libs/luch-request/core/defaults.js | 33 + .../libs/luch-request/core/dispatchRequest.js | 6 + .../libs/luch-request/core/mergeConfig.js | 126 ++ .../libs/luch-request/core/settle.js | 16 + .../libs/luch-request/helpers/buildURL.js | 64 + .../libs/luch-request/helpers/combineURLs.js | 14 + .../luch-request/helpers/isAbsoluteURL.js | 14 + .../uv-ui-tools/libs/luch-request/index.d.ts | 197 +++ .../uv-ui-tools/libs/luch-request/index.js | 2 + .../uv-ui-tools/libs/luch-request/utils.js | 135 ++ .../libs/luch-request/utils/clone.js | 264 ++++ uni_modules/uv-ui-tools/libs/mixin/button.js | 13 + uni_modules/uv-ui-tools/libs/mixin/mixin.js | 172 +++ uni_modules/uv-ui-tools/libs/mixin/mpMixin.js | 8 + uni_modules/uv-ui-tools/libs/mixin/mpShare.js | 13 + .../uv-ui-tools/libs/mixin/openType.js | 47 + uni_modules/uv-ui-tools/libs/mixin/touch.js | 59 + uni_modules/uv-ui-tools/libs/util/dayjs.js | 216 +++ uni_modules/uv-ui-tools/libs/util/route.js | 126 ++ uni_modules/uv-ui-tools/package.json | 81 + uni_modules/uv-ui-tools/readme.md | 23 + uni_modules/uv-ui-tools/theme.scss | 43 + uni_modules/uv-ui/changelog.md | 353 +++++ uni_modules/uv-ui/components/uv-ui/uv-ui.vue | 7 + uni_modules/uv-ui/package.json | 162 ++ uni_modules/uv-ui/readme.md | 164 ++ uni_modules/uv-upload/changelog.md | 17 + .../uv-preview-video/uv-preview-video.vue | 52 + .../uv-upload/components/uv-upload/mixin.js | 22 + .../uv-upload/components/uv-upload/props.js | 130 ++ .../uv-upload/components/uv-upload/utils.js | 151 ++ .../components/uv-upload/uv-upload.vue | 488 ++++++ uni_modules/uv-upload/package.json | 90 ++ uni_modules/uv-upload/readme.md | 11 + uni_modules/uv-vtabs/changelog.md | 20 + .../uv-vtabs-item/uv-vtabs-item.vue | 68 + .../uv-vtabs/components/uv-vtabs/props.js | 79 + .../uv-vtabs/components/uv-vtabs/uv-vtabs.vue | 438 ++++++ uni_modules/uv-vtabs/package.json | 87 ++ uni_modules/uv-vtabs/readme.md | 19 + uni_modules/uv-waterfall/changelog.md | 24 + .../components/uv-waterfall/props.js | 69 + .../components/uv-waterfall/uv-waterfall.vue | 265 ++++ uni_modules/uv-waterfall/package.json | 89 ++ uni_modules/uv-waterfall/readme.md | 19 + 534 files changed, 54404 insertions(+), 39 deletions(-) create mode 100644 pages/mbti/api.js create mode 100644 pages/mbti/index.vue create mode 100644 pages/memory/api.js create mode 100644 pages/memory/index.vue create mode 100644 static/tabbar/active-head.png create mode 100644 static/tabbar/active-love.png create mode 100644 static/tabbar/head.png create mode 100644 static/tabbar/love.png create mode 100644 uni_modules/uv-action-sheet/changelog.md create mode 100644 uni_modules/uv-action-sheet/components/uv-action-sheet/props.js create mode 100644 uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue create mode 100644 uni_modules/uv-action-sheet/package.json create mode 100644 uni_modules/uv-action-sheet/readme.md create mode 100644 uni_modules/uv-album/changelog.md create mode 100644 uni_modules/uv-album/components/uv-album/uv-album.vue create mode 100644 uni_modules/uv-album/package.json create mode 100644 uni_modules/uv-album/readme.md create mode 100644 uni_modules/uv-alert/changelog.md create mode 100644 uni_modules/uv-alert/components/uv-alert/props.js create mode 100644 uni_modules/uv-alert/components/uv-alert/uv-alert.vue create mode 100644 uni_modules/uv-alert/package.json create mode 100644 uni_modules/uv-alert/readme.md create mode 100644 uni_modules/uv-avatar/changelog.md create mode 100644 uni_modules/uv-avatar/components/uv-avatar-group/props.js create mode 100644 uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue create mode 100644 uni_modules/uv-avatar/components/uv-avatar/props.js create mode 100644 uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue create mode 100644 uni_modules/uv-avatar/package.json create mode 100644 uni_modules/uv-avatar/readme.md create mode 100644 uni_modules/uv-back-top/changelog.md create mode 100644 uni_modules/uv-back-top/components/uv-back-top/props.js create mode 100644 uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue create mode 100644 uni_modules/uv-back-top/package.json create mode 100644 uni_modules/uv-back-top/readme.md create mode 100644 uni_modules/uv-badge/changelog.md create mode 100644 uni_modules/uv-badge/components/uv-badge/props.js create mode 100644 uni_modules/uv-badge/components/uv-badge/uv-badge.vue create mode 100644 uni_modules/uv-badge/package.json create mode 100644 uni_modules/uv-badge/readme.md create mode 100644 uni_modules/uv-button/changelog.md create mode 100644 uni_modules/uv-button/components/uv-button/nvue.scss create mode 100644 uni_modules/uv-button/components/uv-button/props.js create mode 100644 uni_modules/uv-button/components/uv-button/uv-button.vue create mode 100644 uni_modules/uv-button/components/uv-button/vue.scss create mode 100644 uni_modules/uv-button/package.json create mode 100644 uni_modules/uv-button/readme.md create mode 100644 uni_modules/uv-calendar/changelog.md create mode 100644 uni_modules/uv-calendar/components/uv-calendar/calendar.js create mode 100644 uni_modules/uv-calendar/components/uv-calendar/header.vue create mode 100644 uni_modules/uv-calendar/components/uv-calendar/month.vue create mode 100644 uni_modules/uv-calendar/components/uv-calendar/props.js create mode 100644 uni_modules/uv-calendar/components/uv-calendar/uv-calendar.vue create mode 100644 uni_modules/uv-calendar/package.json create mode 100644 uni_modules/uv-calendar/readme.md create mode 100644 uni_modules/uv-calendars/changelog.md create mode 100644 uni_modules/uv-calendars/components/uv-calendars/calendar-body.vue create mode 100644 uni_modules/uv-calendars/components/uv-calendars/calendar-item.vue create mode 100644 uni_modules/uv-calendars/components/uv-calendars/calendar.js create mode 100644 uni_modules/uv-calendars/components/uv-calendars/i18n/en.json create mode 100644 uni_modules/uv-calendars/components/uv-calendars/i18n/index.js create mode 100644 uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hans.json create mode 100644 uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hant.json create mode 100644 uni_modules/uv-calendars/components/uv-calendars/util.js create mode 100644 uni_modules/uv-calendars/components/uv-calendars/uv-calendars.vue create mode 100644 uni_modules/uv-calendars/package.json create mode 100644 uni_modules/uv-calendars/readme.md create mode 100644 uni_modules/uv-cell/changelog.md create mode 100644 uni_modules/uv-cell/components/uv-cell-group/props.js create mode 100644 uni_modules/uv-cell/components/uv-cell-group/uv-cell-group.vue create mode 100644 uni_modules/uv-cell/components/uv-cell/props.js create mode 100644 uni_modules/uv-cell/components/uv-cell/uv-cell.vue create mode 100644 uni_modules/uv-cell/package.json create mode 100644 uni_modules/uv-cell/readme.md create mode 100644 uni_modules/uv-checkbox/changelog.md create mode 100644 uni_modules/uv-checkbox/components/uv-checkbox-group/props.js create mode 100644 uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue create mode 100644 uni_modules/uv-checkbox/components/uv-checkbox/props.js create mode 100644 uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue create mode 100644 uni_modules/uv-checkbox/package.json create mode 100644 uni_modules/uv-checkbox/readme.md create mode 100644 uni_modules/uv-code-input/changelog.md create mode 100644 uni_modules/uv-code-input/components/uv-code-input/props.js create mode 100644 uni_modules/uv-code-input/components/uv-code-input/uv-code-input.vue create mode 100644 uni_modules/uv-code-input/package.json create mode 100644 uni_modules/uv-code-input/readme.md create mode 100644 uni_modules/uv-code/changelog.md create mode 100644 uni_modules/uv-code/components/uv-code/props.js create mode 100644 uni_modules/uv-code/components/uv-code/uv-code.vue create mode 100644 uni_modules/uv-code/package.json create mode 100644 uni_modules/uv-code/readme.md create mode 100644 uni_modules/uv-collapse/changelog.md create mode 100644 uni_modules/uv-collapse/components/uv-collapse-item/props.js create mode 100644 uni_modules/uv-collapse/components/uv-collapse-item/uv-collapse-item.vue create mode 100644 uni_modules/uv-collapse/components/uv-collapse/props.js create mode 100644 uni_modules/uv-collapse/components/uv-collapse/uv-collapse.vue create mode 100644 uni_modules/uv-collapse/package.json create mode 100644 uni_modules/uv-collapse/readme.md create mode 100644 uni_modules/uv-count-down/changelog.md create mode 100644 uni_modules/uv-count-down/components/uv-count-down/props.js create mode 100644 uni_modules/uv-count-down/components/uv-count-down/utils.js create mode 100644 uni_modules/uv-count-down/components/uv-count-down/uv-count-down.vue create mode 100644 uni_modules/uv-count-down/package.json create mode 100644 uni_modules/uv-count-down/readme.md create mode 100644 uni_modules/uv-count-to/changelog.md create mode 100644 uni_modules/uv-count-to/components/uv-count-to/props.js create mode 100644 uni_modules/uv-count-to/components/uv-count-to/uv-count-to.vue create mode 100644 uni_modules/uv-count-to/package.json create mode 100644 uni_modules/uv-count-to/readme.md create mode 100644 uni_modules/uv-datetime-picker/changelog.md create mode 100644 uni_modules/uv-datetime-picker/components/uv-datetime-picker/props.js create mode 100644 uni_modules/uv-datetime-picker/components/uv-datetime-picker/uv-datetime-picker.vue create mode 100644 uni_modules/uv-datetime-picker/package.json create mode 100644 uni_modules/uv-datetime-picker/readme.md create mode 100644 uni_modules/uv-divider/changelog.md create mode 100644 uni_modules/uv-divider/components/uv-divider/props.js create mode 100644 uni_modules/uv-divider/components/uv-divider/uv-divider.vue create mode 100644 uni_modules/uv-divider/package.json create mode 100644 uni_modules/uv-divider/readme.md create mode 100644 uni_modules/uv-drop-down/changelog.md create mode 100644 uni_modules/uv-drop-down/components/uv-drop-down-item/uv-drop-down-item.vue create mode 100644 uni_modules/uv-drop-down/components/uv-drop-down-popup/uv-drop-down-popup.vue create mode 100644 uni_modules/uv-drop-down/components/uv-drop-down/uv-drop-down.vue create mode 100644 uni_modules/uv-drop-down/package.json create mode 100644 uni_modules/uv-drop-down/readme.md create mode 100644 uni_modules/uv-empty/changelog.md create mode 100644 uni_modules/uv-empty/components/uv-empty/props.js create mode 100644 uni_modules/uv-empty/components/uv-empty/uv-empty.vue create mode 100644 uni_modules/uv-empty/package.json create mode 100644 uni_modules/uv-empty/readme.md create mode 100644 uni_modules/uv-form/changelog.md create mode 100644 uni_modules/uv-form/components/uv-form-item/props.js create mode 100644 uni_modules/uv-form/components/uv-form-item/uv-form-item.vue create mode 100644 uni_modules/uv-form/components/uv-form/props.js create mode 100644 uni_modules/uv-form/components/uv-form/uv-form.vue create mode 100644 uni_modules/uv-form/components/uv-form/valid.js create mode 100644 uni_modules/uv-form/package.json create mode 100644 uni_modules/uv-form/readme.md create mode 100644 uni_modules/uv-gap/changelog.md create mode 100644 uni_modules/uv-gap/components/uv-gap/props.js create mode 100644 uni_modules/uv-gap/components/uv-gap/uv-gap.vue create mode 100644 uni_modules/uv-gap/package.json create mode 100644 uni_modules/uv-gap/readme.md create mode 100644 uni_modules/uv-grid/changelog.md create mode 100644 uni_modules/uv-grid/components/uv-grid-item/props.js create mode 100644 uni_modules/uv-grid/components/uv-grid-item/uv-grid-item.vue create mode 100644 uni_modules/uv-grid/components/uv-grid/props.js create mode 100644 uni_modules/uv-grid/components/uv-grid/uv-grid.vue create mode 100644 uni_modules/uv-grid/package.json create mode 100644 uni_modules/uv-grid/readme.md create mode 100644 uni_modules/uv-icon/changelog.md create mode 100644 uni_modules/uv-icon/components/uv-icon/icons.js create mode 100644 uni_modules/uv-icon/components/uv-icon/props.js create mode 100644 uni_modules/uv-icon/components/uv-icon/uv-icon.vue create mode 100644 uni_modules/uv-icon/components/uv-icon/uvicons.ttf create mode 100644 uni_modules/uv-icon/package.json create mode 100644 uni_modules/uv-icon/readme.md create mode 100644 uni_modules/uv-image/changelog.md create mode 100644 uni_modules/uv-image/components/uv-image/props.js create mode 100644 uni_modules/uv-image/components/uv-image/uv-image.vue create mode 100644 uni_modules/uv-image/package.json create mode 100644 uni_modules/uv-image/readme.md create mode 100644 uni_modules/uv-index-list/changelog.md create mode 100644 uni_modules/uv-index-list/components/uv-index-anchor/props.js create mode 100644 uni_modules/uv-index-list/components/uv-index-anchor/uv-index-anchor.vue create mode 100644 uni_modules/uv-index-list/components/uv-index-item/uv-index-item.vue create mode 100644 uni_modules/uv-index-list/components/uv-index-list/props.js create mode 100644 uni_modules/uv-index-list/components/uv-index-list/uv-index-list.vue create mode 100644 uni_modules/uv-index-list/package.json create mode 100644 uni_modules/uv-index-list/readme.md create mode 100644 uni_modules/uv-input/changelog.md create mode 100644 uni_modules/uv-input/components/uv-input/props.js create mode 100644 uni_modules/uv-input/components/uv-input/uv-input.vue create mode 100644 uni_modules/uv-input/package.json create mode 100644 uni_modules/uv-input/readme.md create mode 100644 uni_modules/uv-keyboard/changelog.md create mode 100644 uni_modules/uv-keyboard/components/uv-keyboard-car/props.js create mode 100644 uni_modules/uv-keyboard/components/uv-keyboard-car/uv-keyboard-car.vue create mode 100644 uni_modules/uv-keyboard/components/uv-keyboard-number/props.js create mode 100644 uni_modules/uv-keyboard/components/uv-keyboard-number/uv-keyboard-number.vue create mode 100644 uni_modules/uv-keyboard/components/uv-keyboard/props.js create mode 100644 uni_modules/uv-keyboard/components/uv-keyboard/uv-keyboard.vue create mode 100644 uni_modules/uv-keyboard/package.json create mode 100644 uni_modules/uv-keyboard/readme.md create mode 100644 uni_modules/uv-line-progress/changelog.md create mode 100644 uni_modules/uv-line-progress/components/uv-line-progress/props.js create mode 100644 uni_modules/uv-line-progress/components/uv-line-progress/uv-line-progress.vue create mode 100644 uni_modules/uv-line-progress/package.json create mode 100644 uni_modules/uv-line-progress/readme.md create mode 100644 uni_modules/uv-line/changelog.md create mode 100644 uni_modules/uv-line/components/uv-line/props.js create mode 100644 uni_modules/uv-line/components/uv-line/uv-line.vue create mode 100644 uni_modules/uv-line/package.json create mode 100644 uni_modules/uv-line/readme.md create mode 100644 uni_modules/uv-link/changelog.md create mode 100644 uni_modules/uv-link/components/uv-link/props.js create mode 100644 uni_modules/uv-link/components/uv-link/uv-link.vue create mode 100644 uni_modules/uv-link/package.json create mode 100644 uni_modules/uv-link/readme.md create mode 100644 uni_modules/uv-list/changelog.md create mode 100644 uni_modules/uv-list/components/uv-list-item/uv-list-item.vue create mode 100644 uni_modules/uv-list/components/uv-list/uv-list.vue create mode 100644 uni_modules/uv-list/package.json create mode 100644 uni_modules/uv-list/readme.md create mode 100644 uni_modules/uv-load-more/changelog.md create mode 100644 uni_modules/uv-load-more/components/uv-load-more/props.js create mode 100644 uni_modules/uv-load-more/components/uv-load-more/uv-load-more.vue create mode 100644 uni_modules/uv-load-more/package.json create mode 100644 uni_modules/uv-load-more/readme.md create mode 100644 uni_modules/uv-loading-icon/changelog.md create mode 100644 uni_modules/uv-loading-icon/components/uv-loading-icon/props.js create mode 100644 uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon.vue create mode 100644 uni_modules/uv-loading-icon/package.json create mode 100644 uni_modules/uv-loading-icon/readme.md create mode 100644 uni_modules/uv-loading-page/changelog.md create mode 100644 uni_modules/uv-loading-page/components/uv-loading-page/props.js create mode 100644 uni_modules/uv-loading-page/components/uv-loading-page/uv-loading-page.vue create mode 100644 uni_modules/uv-loading-page/package.json create mode 100644 uni_modules/uv-loading-page/readme.md create mode 100644 uni_modules/uv-modal/changelog.md create mode 100644 uni_modules/uv-modal/components/uv-modal/props.js create mode 100644 uni_modules/uv-modal/components/uv-modal/uv-modal.vue create mode 100644 uni_modules/uv-modal/package.json create mode 100644 uni_modules/uv-modal/readme.md create mode 100644 uni_modules/uv-navbar/changelog.md create mode 100644 uni_modules/uv-navbar/components/uv-navbar/props.js create mode 100644 uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue create mode 100644 uni_modules/uv-navbar/package.json create mode 100644 uni_modules/uv-navbar/readme.md create mode 100644 uni_modules/uv-no-network/changelog.md create mode 100644 uni_modules/uv-no-network/components/uv-no-network/props.js create mode 100644 uni_modules/uv-no-network/components/uv-no-network/uv-no-network.vue create mode 100644 uni_modules/uv-no-network/package.json create mode 100644 uni_modules/uv-no-network/readme.md create mode 100644 uni_modules/uv-notice-bar/changelog.md create mode 100644 uni_modules/uv-notice-bar/components/uv-column-notice/props.js create mode 100644 uni_modules/uv-notice-bar/components/uv-column-notice/uv-column-notice.vue create mode 100644 uni_modules/uv-notice-bar/components/uv-notice-bar/props.js create mode 100644 uni_modules/uv-notice-bar/components/uv-notice-bar/uv-notice-bar.vue create mode 100644 uni_modules/uv-notice-bar/components/uv-row-notice/props.js create mode 100644 uni_modules/uv-notice-bar/components/uv-row-notice/uv-row-notice.vue create mode 100644 uni_modules/uv-notice-bar/package.json create mode 100644 uni_modules/uv-notice-bar/readme.md create mode 100644 uni_modules/uv-notify/changelog.md create mode 100644 uni_modules/uv-notify/components/uv-notify/props.js create mode 100644 uni_modules/uv-notify/components/uv-notify/uv-notify.vue create mode 100644 uni_modules/uv-notify/package.json create mode 100644 uni_modules/uv-notify/readme.md create mode 100644 uni_modules/uv-number-box/changelog.md create mode 100644 uni_modules/uv-number-box/components/uv-number-box/props.js create mode 100644 uni_modules/uv-number-box/components/uv-number-box/uv-number-box.vue create mode 100644 uni_modules/uv-number-box/package.json create mode 100644 uni_modules/uv-number-box/readme.md create mode 100644 uni_modules/uv-overlay/changelog.md create mode 100644 uni_modules/uv-overlay/components/uv-overlay/props.js create mode 100644 uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue create mode 100644 uni_modules/uv-overlay/package.json create mode 100644 uni_modules/uv-overlay/readme.md create mode 100644 uni_modules/uv-parse/changelog.md create mode 100644 uni_modules/uv-parse/components/uv-parse/node/node.vue create mode 100644 uni_modules/uv-parse/components/uv-parse/parser.js create mode 100644 uni_modules/uv-parse/components/uv-parse/uv-parse.vue create mode 100644 uni_modules/uv-parse/package.json create mode 100644 uni_modules/uv-parse/readme.md create mode 100644 uni_modules/uv-parse/static/app-plus/uv-parse/js/handler.js create mode 100644 uni_modules/uv-parse/static/app-plus/uv-parse/js/uni.webview.min.js create mode 100644 uni_modules/uv-parse/static/app-plus/uv-parse/local.html create mode 100644 uni_modules/uv-pick-color/changelog.md create mode 100644 uni_modules/uv-pick-color/components/uv-pick-color/colors.js create mode 100644 uni_modules/uv-pick-color/components/uv-pick-color/props.js create mode 100644 uni_modules/uv-pick-color/components/uv-pick-color/uv-pick-color.vue create mode 100644 uni_modules/uv-pick-color/package.json create mode 100644 uni_modules/uv-pick-color/readme.md create mode 100644 uni_modules/uv-picker/changelog.md create mode 100644 uni_modules/uv-picker/components/uv-picker/props.js create mode 100644 uni_modules/uv-picker/components/uv-picker/uv-picker.vue create mode 100644 uni_modules/uv-picker/package.json create mode 100644 uni_modules/uv-picker/readme.md create mode 100644 uni_modules/uv-popup/changelog.md create mode 100644 uni_modules/uv-popup/components/uv-popup/keypress.js create mode 100644 uni_modules/uv-popup/components/uv-popup/uv-popup.vue create mode 100644 uni_modules/uv-popup/package.json create mode 100644 uni_modules/uv-popup/readme.md create mode 100644 uni_modules/uv-qrcode/changelog.md create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/cache.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/bridge/bridge-weex.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-2d/FillStyleLinearGradient.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-2d/FillStylePattern.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-2d/FillStyleRadialGradient.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-2d/RenderingContext.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/ActiveInfo.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/Buffer.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/Framebuffer.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/GLenum.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/GLmethod.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/GLtype.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/Program.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/Renderbuffer.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/RenderingContext.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/Shader.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/ShaderPrecisionFormat.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/Texture.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/UniformLocation.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/context-webgl/classUtils.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/env/canvas.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/env/image.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/env/tool.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/gcanvas/index.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/props.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/qrcode.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/queue.js create mode 100644 uni_modules/uv-qrcode/components/uv-qrcode/uv-qrcode.vue create mode 100644 uni_modules/uv-qrcode/package.json create mode 100644 uni_modules/uv-qrcode/readme.md create mode 100644 uni_modules/uv-radio/changelog.md create mode 100644 uni_modules/uv-radio/components/uv-radio-group/props.js create mode 100644 uni_modules/uv-radio/components/uv-radio-group/uv-radio-group.vue create mode 100644 uni_modules/uv-radio/components/uv-radio/props.js create mode 100644 uni_modules/uv-radio/components/uv-radio/uv-radio.vue create mode 100644 uni_modules/uv-radio/package.json create mode 100644 uni_modules/uv-radio/readme.md create mode 100644 uni_modules/uv-rate/changelog.md create mode 100644 uni_modules/uv-rate/components/uv-rate/props.js create mode 100644 uni_modules/uv-rate/components/uv-rate/uv-rate.vue create mode 100644 uni_modules/uv-rate/package.json create mode 100644 uni_modules/uv-rate/readme.md create mode 100644 uni_modules/uv-read-more/changelog.md create mode 100644 uni_modules/uv-read-more/components/uv-read-more/props.js create mode 100644 uni_modules/uv-read-more/components/uv-read-more/uv-read-more.vue create mode 100644 uni_modules/uv-read-more/package.json create mode 100644 uni_modules/uv-read-more/readme.md create mode 100644 uni_modules/uv-row/changelog.md create mode 100644 uni_modules/uv-row/components/uv-col/props.js create mode 100644 uni_modules/uv-row/components/uv-col/uv-col.vue create mode 100644 uni_modules/uv-row/components/uv-row/props.js create mode 100644 uni_modules/uv-row/components/uv-row/uv-row.vue create mode 100644 uni_modules/uv-row/package.json create mode 100644 uni_modules/uv-row/readme.md create mode 100644 uni_modules/uv-safe-bottom/changelog.md create mode 100644 uni_modules/uv-safe-bottom/components/uv-safe-bottom/uv-safe-bottom.vue create mode 100644 uni_modules/uv-safe-bottom/package.json create mode 100644 uni_modules/uv-safe-bottom/readme.md create mode 100644 uni_modules/uv-scroll-list/changelog.md create mode 100644 uni_modules/uv-scroll-list/components/uv-scroll-list/nvue.js create mode 100644 uni_modules/uv-scroll-list/components/uv-scroll-list/props.js create mode 100644 uni_modules/uv-scroll-list/components/uv-scroll-list/scrollWxs.wxs create mode 100644 uni_modules/uv-scroll-list/components/uv-scroll-list/uv-scroll-list.vue create mode 100644 uni_modules/uv-scroll-list/package.json create mode 100644 uni_modules/uv-scroll-list/readme.md create mode 100644 uni_modules/uv-search/changelog.md create mode 100644 uni_modules/uv-search/components/uv-search/props.js create mode 100644 uni_modules/uv-search/components/uv-search/uv-search.vue create mode 100644 uni_modules/uv-search/package.json create mode 100644 uni_modules/uv-search/readme.md create mode 100644 uni_modules/uv-skeleton/changelog.md create mode 100644 uni_modules/uv-skeleton/components/uv-skeleton/props.js create mode 100644 uni_modules/uv-skeleton/components/uv-skeleton/uv-skeleton.vue create mode 100644 uni_modules/uv-skeleton/package.json create mode 100644 uni_modules/uv-skeleton/readme.md create mode 100644 uni_modules/uv-skeletons/changelog.md create mode 100644 uni_modules/uv-skeletons/components/uv-skeletons/uv-skeletons.vue create mode 100644 uni_modules/uv-skeletons/package.json create mode 100644 uni_modules/uv-skeletons/readme.md create mode 100644 uni_modules/uv-slider/changelog.md create mode 100644 uni_modules/uv-slider/components/uv-slider/props.js create mode 100644 uni_modules/uv-slider/components/uv-slider/uv-slider.vue create mode 100644 uni_modules/uv-slider/package.json create mode 100644 uni_modules/uv-slider/readme.md create mode 100644 uni_modules/uv-status-bar/changelog.md create mode 100644 uni_modules/uv-status-bar/components/uv-status-bar/props.js create mode 100644 uni_modules/uv-status-bar/components/uv-status-bar/uv-status-bar.vue create mode 100644 uni_modules/uv-status-bar/package.json create mode 100644 uni_modules/uv-status-bar/readme.md create mode 100644 uni_modules/uv-steps/changelog.md create mode 100644 uni_modules/uv-steps/components/uv-steps-item/props.js create mode 100644 uni_modules/uv-steps/components/uv-steps-item/uv-steps-item.vue create mode 100644 uni_modules/uv-steps/components/uv-steps/props.js create mode 100644 uni_modules/uv-steps/components/uv-steps/uv-steps.vue create mode 100644 uni_modules/uv-steps/package.json create mode 100644 uni_modules/uv-steps/readme.md create mode 100644 uni_modules/uv-sticky/changelog.md create mode 100644 uni_modules/uv-sticky/components/uv-sticky/props.js create mode 100644 uni_modules/uv-sticky/components/uv-sticky/uv-sticky.vue create mode 100644 uni_modules/uv-sticky/package.json create mode 100644 uni_modules/uv-sticky/readme.md create mode 100644 uni_modules/uv-subsection/changelog.md create mode 100644 uni_modules/uv-subsection/components/uv-subsection/props.js create mode 100644 uni_modules/uv-subsection/components/uv-subsection/uv-subsection.vue create mode 100644 uni_modules/uv-subsection/package.json create mode 100644 uni_modules/uv-subsection/readme.md create mode 100644 uni_modules/uv-swipe-action/changelog.md create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action-item/index - backup.wxs create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action-item/index.wxs create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action-item/nvue - backup.js create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action-item/nvue.js create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action-item/props.js create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action-item/uv-swipe-action-item.vue create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action-item/wxs.js create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action/props.js create mode 100644 uni_modules/uv-swipe-action/components/uv-swipe-action/uv-swipe-action.vue create mode 100644 uni_modules/uv-swipe-action/package.json create mode 100644 uni_modules/uv-swipe-action/readme.md create mode 100644 uni_modules/uv-swiper/changelog.md create mode 100644 uni_modules/uv-swiper/components/uv-swiper-indicator/props.js create mode 100644 uni_modules/uv-swiper/components/uv-swiper-indicator/uv-swiper-indicator.vue create mode 100644 uni_modules/uv-swiper/components/uv-swiper/props.js create mode 100644 uni_modules/uv-swiper/components/uv-swiper/uv-swiper.vue create mode 100644 uni_modules/uv-swiper/package.json create mode 100644 uni_modules/uv-swiper/readme.md create mode 100644 uni_modules/uv-switch/changelog.md create mode 100644 uni_modules/uv-switch/components/uv-switch/props.js create mode 100644 uni_modules/uv-switch/components/uv-switch/uv-switch.vue create mode 100644 uni_modules/uv-switch/package.json create mode 100644 uni_modules/uv-switch/readme.md create mode 100644 uni_modules/uv-tabbar/changelog.md create mode 100644 uni_modules/uv-tabbar/components/uv-tabbar-item/props.js create mode 100644 uni_modules/uv-tabbar/components/uv-tabbar-item/uv-tabbar-item.vue create mode 100644 uni_modules/uv-tabbar/components/uv-tabbar/props.js create mode 100644 uni_modules/uv-tabbar/components/uv-tabbar/uv-tabbar.vue create mode 100644 uni_modules/uv-tabbar/package.json create mode 100644 uni_modules/uv-tabbar/readme.md create mode 100644 uni_modules/uv-tabs/changelog.md create mode 100644 uni_modules/uv-tabs/components/uv-tabs/props.js create mode 100644 uni_modules/uv-tabs/components/uv-tabs/uv-tabs.vue create mode 100644 uni_modules/uv-tabs/package.json create mode 100644 uni_modules/uv-tabs/readme.md create mode 100644 uni_modules/uv-tags/changelog.md create mode 100644 uni_modules/uv-tags/components/uv-tags/props.js create mode 100644 uni_modules/uv-tags/components/uv-tags/uv-tags.vue create mode 100644 uni_modules/uv-tags/package.json create mode 100644 uni_modules/uv-tags/readme.md create mode 100644 uni_modules/uv-text/changelog.md create mode 100644 uni_modules/uv-text/components/uv-text/props.js create mode 100644 uni_modules/uv-text/components/uv-text/uv-text.vue create mode 100644 uni_modules/uv-text/components/uv-text/value.js create mode 100644 uni_modules/uv-text/package.json create mode 100644 uni_modules/uv-text/readme.md create mode 100644 uni_modules/uv-textarea/changelog.md create mode 100644 uni_modules/uv-textarea/components/uv-textarea/props.js create mode 100644 uni_modules/uv-textarea/components/uv-textarea/uv-textarea.vue create mode 100644 uni_modules/uv-textarea/package.json create mode 100644 uni_modules/uv-textarea/readme.md create mode 100644 uni_modules/uv-toast/changelog.md create mode 100644 uni_modules/uv-toast/components/uv-toast/uv-toast.vue create mode 100644 uni_modules/uv-toast/package.json create mode 100644 uni_modules/uv-toast/readme.md create mode 100644 uni_modules/uv-toolbar/changelog.md create mode 100644 uni_modules/uv-toolbar/components/uv-toolbar/props.js create mode 100644 uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.vue create mode 100644 uni_modules/uv-toolbar/package.json create mode 100644 uni_modules/uv-toolbar/readme.md create mode 100644 uni_modules/uv-tooltip/changelog.md create mode 100644 uni_modules/uv-tooltip/components/uv-tooltip/props.js create mode 100644 uni_modules/uv-tooltip/components/uv-tooltip/uv-tooltip.vue create mode 100644 uni_modules/uv-tooltip/package.json create mode 100644 uni_modules/uv-tooltip/readme.md create mode 100644 uni_modules/uv-transition/changelog.md create mode 100644 uni_modules/uv-transition/components/uv-transition/createAnimation.js create mode 100644 uni_modules/uv-transition/components/uv-transition/props.js create mode 100644 uni_modules/uv-transition/components/uv-transition/uv-transition.vue create mode 100644 uni_modules/uv-transition/package.json create mode 100644 uni_modules/uv-transition/readme.md create mode 100644 uni_modules/uv-ui-tools/changelog.md create mode 100644 uni_modules/uv-ui-tools/components/uv-ui-tools/uv-ui-tools.vue create mode 100644 uni_modules/uv-ui-tools/index.js create mode 100644 uni_modules/uv-ui-tools/index.scss create mode 100644 uni_modules/uv-ui-tools/libs/config/config.js create mode 100644 uni_modules/uv-ui-tools/libs/css/color.scss create mode 100644 uni_modules/uv-ui-tools/libs/css/common.scss create mode 100644 uni_modules/uv-ui-tools/libs/css/components.scss create mode 100644 uni_modules/uv-ui-tools/libs/css/variable.scss create mode 100644 uni_modules/uv-ui-tools/libs/css/vue.scss create mode 100644 uni_modules/uv-ui-tools/libs/function/colorGradient.js create mode 100644 uni_modules/uv-ui-tools/libs/function/debounce.js create mode 100644 uni_modules/uv-ui-tools/libs/function/digit.js create mode 100644 uni_modules/uv-ui-tools/libs/function/index.js create mode 100644 uni_modules/uv-ui-tools/libs/function/platform.js create mode 100644 uni_modules/uv-ui-tools/libs/function/test.js create mode 100644 uni_modules/uv-ui-tools/libs/function/throttle.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/adapters/index.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/core/InterceptorManager.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/core/Request.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/core/buildFullPath.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/core/defaults.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/core/dispatchRequest.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/core/mergeConfig.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/core/settle.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/helpers/buildURL.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/helpers/combineURLs.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/index.d.ts create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/index.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/utils.js create mode 100644 uni_modules/uv-ui-tools/libs/luch-request/utils/clone.js create mode 100644 uni_modules/uv-ui-tools/libs/mixin/button.js create mode 100644 uni_modules/uv-ui-tools/libs/mixin/mixin.js create mode 100644 uni_modules/uv-ui-tools/libs/mixin/mpMixin.js create mode 100644 uni_modules/uv-ui-tools/libs/mixin/mpShare.js create mode 100644 uni_modules/uv-ui-tools/libs/mixin/openType.js create mode 100644 uni_modules/uv-ui-tools/libs/mixin/touch.js create mode 100644 uni_modules/uv-ui-tools/libs/util/dayjs.js create mode 100644 uni_modules/uv-ui-tools/libs/util/route.js create mode 100644 uni_modules/uv-ui-tools/package.json create mode 100644 uni_modules/uv-ui-tools/readme.md create mode 100644 uni_modules/uv-ui-tools/theme.scss create mode 100644 uni_modules/uv-ui/changelog.md create mode 100644 uni_modules/uv-ui/components/uv-ui/uv-ui.vue create mode 100644 uni_modules/uv-ui/package.json create mode 100644 uni_modules/uv-ui/readme.md create mode 100644 uni_modules/uv-upload/changelog.md create mode 100644 uni_modules/uv-upload/components/uv-preview-video/uv-preview-video.vue create mode 100644 uni_modules/uv-upload/components/uv-upload/mixin.js create mode 100644 uni_modules/uv-upload/components/uv-upload/props.js create mode 100644 uni_modules/uv-upload/components/uv-upload/utils.js create mode 100644 uni_modules/uv-upload/components/uv-upload/uv-upload.vue create mode 100644 uni_modules/uv-upload/package.json create mode 100644 uni_modules/uv-upload/readme.md create mode 100644 uni_modules/uv-vtabs/changelog.md create mode 100644 uni_modules/uv-vtabs/components/uv-vtabs-item/uv-vtabs-item.vue create mode 100644 uni_modules/uv-vtabs/components/uv-vtabs/props.js create mode 100644 uni_modules/uv-vtabs/components/uv-vtabs/uv-vtabs.vue create mode 100644 uni_modules/uv-vtabs/package.json create mode 100644 uni_modules/uv-vtabs/readme.md create mode 100644 uni_modules/uv-waterfall/changelog.md create mode 100644 uni_modules/uv-waterfall/components/uv-waterfall/props.js create mode 100644 uni_modules/uv-waterfall/components/uv-waterfall/uv-waterfall.vue create mode 100644 uni_modules/uv-waterfall/package.json create mode 100644 uni_modules/uv-waterfall/readme.md diff --git a/components/CustomTabBar.vue b/components/CustomTabBar.vue index a2c0d83..d3da577 100644 --- a/components/CustomTabBar.vue +++ b/components/CustomTabBar.vue @@ -3,24 +3,45 @@ - - + + + {{ homeTab.text }} + + + + + + + {{ memoryTab.text }} + + - - + + + + + + + + + {{ mbitTab.text }} + + - - + + + {{ mineTab.text }} @@ -37,16 +58,22 @@ onLoad } from '@dcloudio/uni-app' - // ========== 配置数据 ========== // 从你原来的配置迁移过来的数据 - const color = '#999999' - const selectedColor = '#000' + const color = '#cdcdcd' + const selectedColor = '#2c2c2c' //首页配置 const homeTab = { pagePath: "pages/index/index", iconPath: "/static/tabbar/home.png", selectedIconPath: "/static/tabbar/active-home.png", - text: "首页" + text: "home" + } + //记忆 + const memoryTab = { + pagePath: "pages/memory/index", + iconPath: "/static/tabbar/love.png", + selectedIconPath: "/static/tabbar/active-love.png", + text: "memory" } //发现页 @@ -54,8 +81,15 @@ pagePath: "pages/order/index", iconPath: "/static/tabbar/find.png", selectedIconPath: "/static/tabbar/active-find.png", - text: "发现" + text: "find" } + //mbit + const mbitTab = { + pagePath: "pages/mbti/index", + iconPath: "/static/tabbar/head.png", + selectedIconPath: "/static/tabbar/active-head.png", + text: "MBIT" + } //个人页 const mineTab = { pagePath: "pages/mine/index", @@ -100,7 +134,7 @@ height: 50px; /* 根据需要调整高度 */ background-color: #ffffff; - + /* 对应 borderStyle: black */ z-index: 999; } diff --git a/config.js b/config.js index 381c434..5ed9d5a 100644 --- a/config.js +++ b/config.js @@ -8,7 +8,7 @@ export default { * 边框色系(border-theme) * 页面:首页/pages/index/index、产品列表页/pages/product/index、客服页/pages/customer/index、个人中心/pages/mine/index */ - theme: '#00A88E', + theme: '#2c2c2c', /** * 用法: 浅背景主题色(bg-theme-opacity) * 页面: 产品列表页/pages/product/index diff --git a/pages.json b/pages.json index d6484f9..4d52608 100644 --- a/pages.json +++ b/pages.json @@ -12,7 +12,7 @@ { "path": "pages/index/index", "style": { - "navigationStyle": "custom" + } }, { @@ -35,12 +35,24 @@ "style": { "navigationStyle": "custom" } + }, + { + "path": "pages/memory/index", + "style": { + "navigationStyle": "custom" + } + }, + { + "path": "pages/mbti/index", + "style": { + "navigationStyle": "custom" + } } ], "globalStyle": { "navigationBarTextStyle": "black", - "navigationBarTitleText": "跳跳糖", + "navigationBarTitleText": "话话糖", "navigationBarBackgroundColor": "#fff", "backgroundColor": "#F2F3F9" }, @@ -53,7 +65,9 @@ "backgroundColor": "#ffffff", "list": [ {"pagePath": "pages/index/index"}, + {"pagePath": "pages/memory/index"}, {"pagePath": "pages/order/index"}, + {"pagePath": "pages/mbti/index"}, {"pagePath": "pages/mine/index"} ] } diff --git a/pages/index/index.vue b/pages/index/index.vue index 6964aef..1cb7d58 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -79,35 +79,72 @@ const handleBook = (productId) => { - diff --git a/pages/mbti/api.js b/pages/mbti/api.js new file mode 100644 index 0000000..1114055 --- /dev/null +++ b/pages/mbti/api.js @@ -0,0 +1,7 @@ +import { get, post, put, dele } from '@/utils/request'; +/** + * @desc 获取产品列表 + */ +export const getProducts = (params) => { + return get('/api/products/', params) +} \ No newline at end of file diff --git a/pages/mbti/index.vue b/pages/mbti/index.vue new file mode 100644 index 0000000..ec9a77d --- /dev/null +++ b/pages/mbti/index.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/pages/memory/api.js b/pages/memory/api.js new file mode 100644 index 0000000..1114055 --- /dev/null +++ b/pages/memory/api.js @@ -0,0 +1,7 @@ +import { get, post, put, dele } from '@/utils/request'; +/** + * @desc 获取产品列表 + */ +export const getProducts = (params) => { + return get('/api/products/', params) +} \ No newline at end of file diff --git a/pages/memory/index.vue b/pages/memory/index.vue new file mode 100644 index 0000000..ec9a77d --- /dev/null +++ b/pages/memory/index.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/static/tabbar/active-head.png b/static/tabbar/active-head.png new file mode 100644 index 0000000000000000000000000000000000000000..19abc2adfac6ed3f836e3cb863f6c33cb519cf99 GIT binary patch literal 8881 zcmXwfcRbtQ_dgL8qlDNqh+QhE+9C~N)ZSIKO3~JAOU)1(8Y`4&&7!I`Ym~NTW2aV8 zvlOk-s=e1YeSdzxKaxBiugAUTp8LAbbI$XgXX4FF^e-~-GEh-bT{J+WEGWO-|307# zl<#u8id-rxkzfOqj#Y5>TFy|&l*(9Kvd7+cLt68{k35MCNNaE-pohcGvJJt3s%SN& z&5)6|#;oKty?4|}Kc3l$OxEvRCyCG#pt|U=JUSL;0X|^Ast^^j_G?;FQj(P#CMd{# zkbY4Da4>s*_9*T!q2=tzM|ad8xg#mT=)fIzytj6Z023A)ylk$pviq2?`D!P=s_<6i z>8^0n!o_a_`rSSB?lK9<>G6IBrA$bB3t2mt`=#nhxHQ&o?eoKd6qKNZfkNu@{L_o0 z(bl)e%B8#7h8R({`17;G>KUnp}Qr6yV(z_TJ-Cp)a?$WVr zF|KUH6|#cnLG=T?)WvmBcFna9t$#M61Uo_p^;&!VGp%MV${#mXUF0W!BX9>F-F>kGk(&9T$-8 z@WDWn=-V4QF98(~JUuo-m>e_oI*>Okk2X^K6oN#&RKGJ|Z$8rsoOW}#rtnstiN2BZ z$!jwd3Ee1bCqdv`C`Jr+MtLTMdi>SORMtqrLJ0Dm6^XME$JcEk*HjmVd9hQP4e!$h zJ7mE6dCwM1t|wfy4Kur1d>?pJk~e)B9$CWfqNkl0RLigqY=7us^1z@6Ykw%Cc!(={ zx=6JVRy%j*MiyaW8J$f!4Hg4?EJaNm3MxW4=mvO&)!z{NVhV0l_|7(mx7S8T_%83O ze`xygu8@{8(k40dO%#E_V2r{4kF!`-6~WQXLFYVEBRSjcVJ(#}(DlU~4Sb6}Upcso zd8)Z3f6BWKm%2&U;PHdpFUHF1s%*Z(0Pn@cVRbGS@7$?nsu?`QyP|7d<#- zJZ8)sm_*`BBT5#d(fzDFY&8o}!NOp+-$~NxOydqKpVu55m^_(|4zJ_K2O7wt$c<~O zNi@TSwY=A*O)3Q8HFtJulBC&HCy+bkp}7_~1EGTRewS{@%#A+Qua7a~F!uPJ{t`sB zNJYoIZr81d!=K5K=f|^w2nY*s-}Fk~OBN^vMeh?!59*sHF&m=Q!N>bxK-(Ji z0QaN#(>JMc`@Ygw|DK4XpbBu)=EK1vm<#j5cWW|WbNXbBI6RyXhu{k*Z4#}xx)hr$ zVVZ_MI#4~-Sy557NC{=ESK3s4D+(#&UmeHhB<*rdWcpP0x zXCaz>XGPgZR&c0LiMeL<$)YbD3luj6+LO_OqF1f~R`(Vlr`e#vr7L^1`$5=V8Bd!;dZ77o>Mt~7&uB>n6Z1L#vxJ4{4Sx;s&?EBc<%V;lA;N-B6^?1e zS95RTCTX{(d|MLJTF!^N5Ysj7KMF=b?M}mwIQC`0=#{TLgh{kS%9!N~gg0lW;`4m+ zoUgo3%%ah23#ntI@EY$5aQJaHBUUzEOWw&XZkS5rVD!jPr6<#@I2vu#bjjeOo*JfB zums?uuE5F~PF%CRik#q?<|O#as#d-d9lm-eD8}pJ8n3D*W-+Pwo(cq)K;z=*rp%xi zT)y-h@6*=MNh}?F($4Z5R>!Ija2fqu<4s4jmM5HMS>En7hCO+uU&=JVmr04g7j7SZ z#lQSiTx21xb592<3Ji$J()}?zuTjK^Z3r=bVF#8)cgU~KBL5` zl8ZIF4u>Ku_;_U1-4*t0r0*T5RK5OqVBlUuQ18QsXVF>u1*rQk5JB1eo|T)sJemE% zdP^Yp_!W+4z-UVv!jfQ(B#VanCCR>nSngqH))=8C0da5rw(zi6{5GrNQ`|92X}PoU zKbRCF@)F*;G8ItrumwYHfnvXAydv0$sC)nLOtn9uh^qcA``Wj6qev*^C_FLCAoZ9F z-RWW;`ApZX7t7_=T&zN!SG#)oCTDRi0<@96N^t!Qxox35$g4tX5I3NNI5x^o!i$xA z-64SON$797Cm%*{7%|s+7TpGzZ#;-X|Aps7nR>_TTkc54wmmtr?-G4=Q6^VL&%a}d z#$%He(AY+fEuTs+oRu;5WJfO(u@R;@2ADlw4jgh8$rc*lGSG18;=N#5=Hhe&dW^Q8 z&&?w`Mr$EIUM2e2dr-^uS9=rJ^fBNoy_!^2LdWzuzR&pX-|K9=UZn{3&bKl>$V=yJ zi>4a)Bs#dKd>*GG=dMnTE?`F;1LA4-wjcRfkrtRQ9k(@lp4{JK3IvGDn&}jUp|! zmVpGofW8|Fo_cb%OEfI9!@ZFthcd@ZThgXmfzH&~KW4-sM8k6pe!;#I`vhc;;H5P} zk8cq)I>U^lfNhh5vvq?^V#y{@ZOr;^{<7Y6LspTkd6q4a&iZx-XpkXfp3#HT6c`Al zbDnCUqLV)f{+#LkB=o{`pzyJ+ye-qF7ffJaZYzp@Q!d2c%nX>5{rb%Liam~Y4B)a0 z5?lI_{vz^MCqz{kXDgJ7vdBZLVeSqsnPB~6?0EuqqaAOenRS7#u*d-oQKFs+z8sxF z6q2mqng5D5;SY24`Z-SbF>(KovMbrjk#Vsorsvv1Iu&m(PiBRRSKeRf`QK7Nf})-7 zSeeMWyyc2{nRCbu@B!R|Q$omCTrE7x5%+O)aWVW2gr&qfPd+CGt?=Gq44~7Nx(J-{ z=uzV!nu!}r>KSGSoRWGNfwv;sGQ*9RpebbQBK_)iJt%PaLz5+D?v2?iVvA+3-!Nd} zXq~r4`JMQ~-`ILqP-}jq?XR@7ZsB+LHP_BKu49)zuTiW~RRyhM$Un z?s!Svvt2U(%(N#>{f*hlJcE#F=`9yoaK;B(qZw{R#>(grG#Vy)SQ4FZRjYj4<%5UK zfl9ij9V1C0U-7E*ome;aqmS|M-_WluvA~z$@w&xz z`pSlt^rL0xlLB}0bKD|->Ls{hfq$oKR+=P4RRNTqnoaU}dU&DBSKhMP%hTvLusvf5ZZPYh2|t7O^F;DAtYeRz z+-#z!t^Bb&@LvjP?Ev%TWkON}i44?lDq(5N*`R+x5~o@+W;P;Q-JP5mmd4oad>lI? zghE)e(jq-aZktgjySDaI@~oeQy?2m%T`Bb*{W$8u`>lmhpdWXk8sEOpm70Cv0co0`PfH<@d1CPdN+(3@_BWkQ6b4 zOB80h#XvB9FB>D$WBaV!j0s6Eb~?9=VXO8gFJvzzhNp9aa{98bJ0X{nyx;1+EECg& z_9hfDi_uKVQ!?S!(Njdg`)3c3YTjC_o)$E~8cyi?Ska7w^dM#3vz?W}oagDr%RA;d z-l>;T-79lt2x{p}cRr)_+MArwH&Xe*uH}k#5x<6(wm3-poc?(EQ@=o(j=#7{!@csWBBlP3w z06n2i%iMYJTdrbYf(TTqVzkJr!zZ=su`v-k!bRav-l9AQP;h%ip0l?23S>T^IW~Z_ z$bdz7gA-M-)_2y=vwqNk7U2fxDR;Y4NbxY56Yrv*0GG0>_y^cS2G`d&-a;!5z|#*E zXrp5)(qLKWi*s`qM};(|Wl4~`gy;U@w~fQe#&;(t1Hc&YF>7^8o3Wc-3!Y!K6ws#g z&EWccFg<;pyZ8rZ@ku{>`g$Psjc7%-ppIfo^s?EOHgsguF5FHpRL?;gJU!l(oNRD3 zwu;fB9nm*U-b#2ys*Wj|G`pE%XSCX$ayN3gGhJ)HG3-7|Xn#%rvui(Q#HRLY=5p5? zmK*}|2maZZZ*eYjBR9!+?&IN|8jqdmflGKlld<9Foiq}>jJ*VRh1%5BIi-V%b_o&K z^N4e?pB&Qc2?bwdyV}H6?|I4iFex6n zEus!|pvLLpgkyNMQJkmW>*iTkq8a5n7+s&A1NRUn=9GEN3BVkX&*;M)zh*K5_zb93 z=07ds0+X^B_XnShQHRg^Wig&AQ;gSg80^tyRs_GiOrt6s0Ys3EZtWB!Re37XfA1meYZW^j>!p0&Q}p+b$C>k0bC zd}Z(1aQ9Kg?dpZ~E_zdXmn6rRGGAADj#NS?B7$?PNgoE(8fV4?WV{z`Pj$v0F1oL{_mtam`P&&4gWU7&7Z~=avxrwM z5GfF42g!(?N0QOw0ms3{8jM)r-?Y|S^4qVKo~B^c6n)ro{SOlqdg7||YahkfGyGL8 z8CJev0gkBmi+q$aqNl+MTDYX-B>))!R2#pe18|txB0IWuTCVPn$~ z$EJ1pUldpMBm?L7*a(vpybCM8C*8(|5dHvP_FU;Srq#bW_c~SuPyhspwNCpTL9A~! zdzsj_Nu6dZWK3d_$I`#(o9!$zF|i9rA_O&b8F@FF1*9ejU?MRB(J>!jZb@Z^3G1pT|34Mab`2KN=D z%{B0Vy$8un+n7&QcA9P{FOA4y0OGu;Q#!3*_J@LmKT}# z#jFktCa0kIDczg=?`F6BXVJV-q5rB=X@kble1x6`8z>OhtbWym0D~%1Kghc*!}^V{ zm*BQ}W4h*tPkGeZHl1{VFU`?MPUp8LD4}nz2FWkmo?HGD>-s2ik&AkE-~TMHCwDg1 z!_VXv!T8#7tMnGF;!~a;ZxZ#v^gn#`=vn3Az99a{FZOaYzH7UmJ$rW6l*{UYo+UgX32`IMrU5mgclK>05m>=ye9;w&@m?miq`1VI*U>SQex|Vv6=9 zvR9|!-c*4Vgdy@P<8uqHP641>mK>`%lqqI z98`bH`<>8Vy(<#qeCE-hABU^CATc!PB+jAI;Md zoVfNsjZph8qP>c}t|8F5GdyvGDT!HZ36&fXwr|hTkeQmnfNh?k@Za7MS+=b`wQ8dK zc7EOms@G^&xt49saTT%j>_s!P$aS`Qq;2rIfDs{wU{Q?d+VrErU>+F3t{_~ z<1&WnE;J+Uyz~zziz}YP-8VL$Mx)1YsN)Ymwz7nxuMfJunUyLX#7VEs^y%GgJA}C8 zp{b5WZ2Ve~k-l%F51<8xvF@jBp0|H!={bmlkJuABVD`~CI8$j(n+9JMV`Ep)7nblf z^JdFdozl>HC2$wWW!jnZ2jo1Vq=Pkk$wF%+ zh2M=(rETrs`|;L!p-9Z+2$%Jw4&D8+eM*`*bf!^%XO;sWjufhde+?GtrtznuRvs3? z*x{SlU^B7?SKG^&R?^i|tuf6Jvtmtbp#8C1)`|XOJeeVj3D~`agu)@~1uIs!z) z^Kvs<6@vQxYpjev{oEsE&vW-^b*m~0%I6OQPcn4e_X)cb(B(?A&{V=8`G9Tc+Ycv< zWRNSR$5ss}AlqknT=oP_4(7)aXta-?k@$xS(9FQ_D}=Nva@0D{ExbL?i{pDe*QF_z zXfO@Wow2dElgs^(k=fcsE@dw(cs&68&YB+EnE( zG^uKrg{jdO#xrOmDF_03;5*Q?N;Y>TTAY>J0pqo|=U|l>dFo zwEquJcildSzw&fcqr2rKKXi#i4RS|nQ@Fp|`#veL6akIN= z^l(wt#1X1yMao=B+9RuUiB5U&lfiFwcE4_#gKJFi1CS6g%%A)ky)A*?(+1W$P)49a z=XBRLo6$|i3@yvJ9Z|xCL2ImM7J53*F1P0KC3ud`A92!O-Wq0)gK3ZoD=6ur-ycm6 zX_cM{w%-gNW=dvLKbhbrXX$(j5$s`XRig>$W<|N1@`dMm-c+fVmY2A{ifJ3;O@PQM z%Jn>5DYsz-;Q%@ulo0-<@)+8x>^DJD2Iuj375tk$mj=qq_P6I1?-(#nfRxgIm?+6h zHt6@XqYZX-Wpb^z86Ti{V0cFO+QXxxJiM8s%!m>`1lW9w{p57B9Kp|pa}&OT{C>Ur zqmMDya)of16m#)A#73do7Nt_$|Fd{;tfK?0G5@e+a{_b2^h?VftDMMOjx=E3OiUF8uYY&Cu#W-l<9 zM;p%LmJzKLSv;)8cl0TPU78V_B)77xPge2(j-$I+4#ZQGG3&^lkh%-h(}WYq!>iN- zRa^Dh5Z{1wM0oIvbzbfnPU!%!Q8LdFe2&^t;UkDa(*{{iDCjTLG+t)E!*R?Ff0c3Hb-lbQ^xLJG(`IOxH-NsD21Q+!r}ICrE_#H*_P(_N5o0ra&&Q_+d$DR|MX)NFZU67K-3 z2QSNkWd1`FYYdi9-63M`YpQrF+4pfiEq@0rgIIqadp!4qxwUS#lm)7}rio}B1(JLS}Q7HT`+cDkN$b01%7g~7! zOWR_hV%ln}-yPQcgj0yp5BA>pK<|7$l6<5-g$0TJddD$$m6Grbbu{?YPf9O=>s1&% zHsHUUR(YBBn@j?<1ZKBd-@p@m96EZD7JMr}3+^ogiI3Eq(|-2qazF)P^Gdj-u+D4) zzZnK==8u(IUt{QWrkt(|xLXzSm#v1Cg5GkIzcFfL&^uOrXm1y6VcGZT_I`ll|IC3% zLkBN-p3%Mp=M$xORk4_RcAUE|;h%4d-TmJ4BjN+o?_Sox3B!#n3LJD*y0J?rXokT@ z)aeqj*rjeY(0iA-nC;+Ssh9affx^7`>5B@rvO!o<-GqnNyi-a8qZIv(x6?}kcBy6s zwb>@nh&dFLq30tsq>BP7@Qn9GdvP~8#%mV;ct_J<^ZoMZhT9T0$Ih4jYjk@8D6P+Q zHu^QX+Dbr=tDXYSX4F3$#?XW>(l1}551O|{Fatg>lppMJ=YPDISzZFc38`>^(mtKJ z8X1e^`Fq6(A1JOmg1fmU*WCWnV#0nMdWhr>QpoFL_L7utQMSViUm4g!uZNsb_|-IH zd*6(cKky)F)J^vP4O)T{$ZLaI;GXAs_9@HnVUNj~&2Ikq69gOW$oGGCyjekzh&&!` z0-lAX262h+4XBMY4&P1xZ8n^hiqg|~N%3ez1YGU033YDsF#zC(Yjh#bVp925{j zAJ3N1edoq^i-h^x0Qh}TN;O`?9;DvVWlexSX=KxpC2hSCOq7=b3`iOEQDvW!Uvwgk~?K);d8snQx^c3W6^zC@@ zZ|oAS>{KHzq$-`wE;JSG0@_xxT1s&=SMOGTcYfRfXTXj+y|)%M{zl%wq|#6nHA&c4 z2L+Rw;QX&V;+;DeI^7p>!1iEdkJE~b4t|z(zD^0x1#t0jkXKBEf8F@|0K(SW?N7f* z(EyK#Kj=g+E<8nugBE!MFMs&rn)gPL9A|VHT7b6$VT-yGhsLyh;Vki~kK;ExLRa;A z9z^hUhccUog-S4DP_COkR50E9_`6eE0`>O3&vSu+IkTKZu}m^S2);l6RXTcZ7xL>e zF{BKPmQ>A7Kse*HMZCayz?V}vAF>s=CmK@DNVaj?RNqtgfMHYlO?088_nX>MQ-#4a zA`?)8BH7B%^|!XYCx3E$hYa^!sqZx+oy4plKq*Tl&{c7J9z}_^p0~ulF^o!pZM!T> znIQE8xe^gD_k0?fmn1`ZHJ=?6v>@h_(rn>-Ri{N+aJx$E0gM0vsw()$O8|T^8 zDHsTRV`L}?d$GGZ#0g#jVDNAs>b$T{35XX_utPoQZ9Cixf0*I=Stqh3YB4KC;~P;~ z1G*eFDMO?}mTp=@xaTv`yq!iENgNCT+b536Gs*@lXBDK?DFG?MlgcZi4Ro<{f1&~b zOC7KLGX{Qt!zP*4V9}B)T0efz34h_ru{jP)?u0CSGFT5 kARr(W1Xx+_o;#;%ICO6~9OqJ@{1t`DK-UCSfpm`kKf$R|X8-^I literal 0 HcmV?d00001 diff --git a/static/tabbar/active-love.png b/static/tabbar/active-love.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb5d7bbf5af2aa51996e33d19aeb27be3c45535 GIT binary patch literal 5297 zcmcIo`#%%j|F_xPFGJW+ZOk=li*l(LX3Qw1n_QM+Z;B)&<-0zQ$M-+@ejkr>`Q@DRI_Er}ujhH4SBjIPwWOGmn1FzQB;E$= z%U%IR|??mx~jDxLV!0Ib-rC<|3Ro`}1Lwe&#ETM9+m3 z(O#4-iUP%nYCw9lxWwj1C7b-C+jY_@WyF_bYkJOB6B@$vDD!&bG4 z57XBBZ7y}bZr>I8c0?sWWoc78KDIY3VSl<_zaUgSwV?e-dkQ==Oiv4Ry4;TEW)$6f z=EL=su4o-vG*~cY-f$NY7wBAAu?Bgi>6uM#jS9)aFjg3yhsKBt85267Q~XIwBA@&( zQq$+?JF5_cy-|oQWMyF8!@{NG%)s5z7|Lnk>}zGob&iQP5zS5YbMZev)7!~=8!wL~ zN6LX@>>6xjY%N@B7FD9}j);MLSXzbgdd-S6`vt@WlVb@x3(3;=rHta0fB#r|SnfFv zn>1Lo&Zn=~Yjqu6pS~5DF(SIS^e`bEyLg^}yeQN)g140)a+?NNL)B=c;S+fz$$Z5= zS!bE1onPB?E<8xSj0oV6-28S9ds9Hx&AN|F%Op=h8yyUf%&IXj?3xb=6vw}OW;oIZ zwn%I!yAuIsFHbCO{{H=2Fu5z{*Y0=i`1@mYl`XNoGQnZ6Nlb=h?K#S(apxTS&4^`| zbn0=}fN6A913VKaoTC$hg_{IBIle-vy+ep>sh_&El=Gr9jNtf-aDW3#ZlT@v(!8JJ zKu{F9_;(FzS7s6M>u9FTs@kNtnv_>Dui$vuXBCN~#_x>-^MlPJN#5mTKEFH%zafNFVYnIv)kI*?CuE}E;XKLRFCu5&k8f2E0-QT z&mOgt);03nE*X4*d%o`H~%WwVJH&$%^n8jV4vHTTLqc{{PyeD63-L5gzOW)pV@y-O;)XCOiFiWLn{F$9%>VUfO^RsJU zV>wS`7pT@I^Wur1_7I1}%T(#U9XR`w!nc(j+MI^R%V3Gi;nR=~2lZirZ&7;5($qyq z6b0oMU!pvIrAMUTIc~TTT|P%x=cvEeu5vJSqCa>OrZ=o1*Np58$y`Wn*qjB)*c8x4 z-y9Pw-E)vbO_gr?ImP&+@0W1R#D!s~Rxs5_Rp!mu?V^%^O1{^{5oj)JPZHlqiKequxj-9tPg#4-J#&qPr@ zrg2?VF+R;h{OC>1-mmsr?D+;|9Ot@X?^l*-Ft>0uc9<~#TrDCrooBB{34EqqWvZIN zeycVByfW?75ySi|z(0M>2je)<;AcTW zUyq2lEBz$Fl8);74VN+!FL}yTR4ZWmmfzZwh-ZEMAVJpK`9kwBl(DpO4i<7>{~#aF z;s7)$%bddb*Eu8Mq!)^|abPwQvLU%ekA3k6R zilGLzCISMy2EEmJVgnrGrt1tIsA<_?-c?~hH7CK_qzfDrbfOl1Ot>Tc>x%X8exlK} z`1dtpGwv;KyQ|H(6DnlAEHJl*>=wN3oqeJHbw@)(bbLZWLP}6&L0Vp=E~KpPb<$7r z-^V-$Y*;Vm=Zt@!>3!=lX*AdUgG(Fh)(}7|!5fDBMf>|1eU;Zt=b#8hjt{#3$@YIDvPfQNjOCbqyQq*0 zEAy!XJ|7rb!awnbUv9a7qM(XKo``wTtFY9Ed-VK50P0xW_Yzn5@FDc`eu?p<7vpz* z3;@8Ul2fH_bdN=v2a+v+N33K-bU}bpLWJsBw&S?J!K$T#yC#$p?#_QQ@+vo@m2kH+ zo`dtnqZdPvN3Qj;@& z?D!tlIO>nXL!jgG$)T4VYqxqd>2HKqJL8Yem@YH(wm-UNp4yr}Bs&C>P5F>=Az7tHD%V%359j?0 z?emM2#_I+E@qc!B{ONX*q+(v64!s5eohs*E__61-!I3-yE())ujwGGpPv@@~aZ)~6 z?^05pSH-QY{es2^EZHYxlg3Io7bjv{d7hi#nSNBt$x0;o78m^sa`2>lOHwE9P|=p(StFS@84iL zlx96d-YjEc@(#C#6Jtql0_8V0$qQT5qEEbkgr@}w+V)Y&V^X_@%RRA?F%v7Ft)0_GWWdy%MD`h?49Pe|VZE zD750L!&kJV=CF~vYkcV%dg1(Xy|28Eda73@MQ{YT01U3OI)KeYwdH#&;q;&d)iV8{ z@mv$P;lxi8in-zJ{+y^r495j6VXakF=Ir~vreKqN_{k%6NWN9hr{mb#*M<7SNX=nn z3KVArz2m#V7g32HTQ)If#Ek*t$fCQLJNFKk-53Ng`EXCnt4VQ|K5zU3JeRZKT+#6P z$>Wi8-vN(Dj0{+%PF1W5_p9O!uX8&VPzcYMT8s^s)L7~Zc}+v7FFd1|U<5EgE$ z#ny6o-&zBMB)6~MsM2_KU*lUbnxciUs^vcw*Af!;0pnA|>qrQDbaIiCVHvjLm6l=| z#5c&qVvmvrOxqNVdg>_+&{yCM_&_55=;@6X4TR$2OX#RlvUZexTW*9U0((5bE26s= zximT@%MW1JZ|-aZ<3?m|3&O4y*Qr9lY0C=hD&I8k9jljYRflXLNF9AFq(pRYeCCS- zKPNy%x_Md5CAsLNT&!956X^r`QfX2atuG=*zxUYyF~ikbHNHV?cW}}CbA+Q^_&R zA&q(K`^Tz#24Rekk{`(|qX;R(zQlS`4qjE|xV6?#l^b1a`0&*qWd~dA;OS`n{!p2~ zHo#%6ijieQM@>-Cyl+$l^LCpRuwHUTmH@D6G$chOuDDjrz$jXQ*m9mLFhuYca}mV; zYYHa_my++}+ZFl1&NWl@geB(}x&Y59sOI{%7spV>LzNo=2Dss^=hXM=QkDg&Bzf!f z_u3|!83E9ISztJem&Bxvv>U5K7;2mM8_!D+13ZK|g^})XvDEE9x?l(@a(VIjq{V5~ zz3Z*r-^uZJU zNT20Z;!XLBYLKKv9*~s&gZ?R%xybN7!}xl5{X6t>F#beYOwVu}XZYaDyESgWbByVX z&Qe(n67;H`l8wQiD7-IEQTVX)14KgBCWYi<9v~Q^fYW`O)cKE*N}a~PM#jqxNtVxE z0MAWbdy9E6){4l{$;4iR3gvsqTtz=!Ny`~D?wKXj6X0UzX`=s1j4NX!Qfx-h(M+p% zH=by`Qr^36$$QKlFrK+mf9Vh5SMR%Ap%_I*uh)yz%_fetrYKVZRf>=R$w=D*K8npf zrK#I0Ee*Otcei&!Y}O=i*{uz|ofW~FtNGd{VS%gR=G9i+yPwZDSAYb3PCGkW?dW`X zc7D?qE~W%i&2$AaXr0?vl`s72u|IWW%8QEvHAByn7N^>ZqxneV3xYF!rP`d>>#^yN zp18b=SWh(#Y;(W;NwS^ChZM0~ig{4j=V)^^jID+2ai5%I_zoA4E`kVQn5DU1N%LxO z5j-=eB*%yDePlnKXmc3lbb5>Bs!5Llt}m zxk3rV668zM3osU)wk-ayly*`RBDyo$fTioe9#hiO?8_D?ZQ zl%0?BKZoL72e~( z;FAXLoHIioS{{Q8=0y$SZx=sf5>_2%`p}eCfi#eus6oACNEo+1S#m6aQiHIR`RRQY!Bl{hw2O*S8YTq?Nd#Jl^A%AFu* zU{ri}U>u8=_F77D68(p{6Uxuz_~-2e)e8OltAh6P6qAhm%rC+fi6csPT+2m1uq?xj z_SN3!>h(SG1y%^CUANC1L0Pho7bELh);LtH$o#KTt!$t{k?(#Wj4)JX_h%2J>=6#9r zCuKr;A#Iw+N8KA(0Z@GtI`3+tBkM02D`yDNfJk3x)kJd9{@J77al?OXokmlxcXNMb ze&K&(zd-tt&pFpo_Hcl=MoKQ;Kj(h$Y;UN5oDKX!Hp?R$IkwS^om7rQpK>GLP(x{C zBo?p{)1BGF8vQCKrMQg?gEvFe-N-o@rNk&aa_*9Kf^{(U*sU(iWmvASvLq20lp#cm zFx=Tn;b2+rC`z3`>EsTNr(Lu;c5UEq&&Fb&;(uQ0cb+8th0!PA0u=nIGDMiD_una&gESF%29qQQUGt|h<$3|P5mEVxrb2z literal 0 HcmV?d00001 diff --git a/static/tabbar/find.png b/static/tabbar/find.png index 6286ac4fb20555fd58a19911a84faac2b44f4a84..5829f194faf962d6cfca1e59716568a6508e3e9e 100644 GIT binary patch literal 5733 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 pk}^h1GYMxh{s#z4TTlQ1 literal 5510 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 MjjfHU4Q|B#ALk1N)c^nh literal 0 HcmV?d00001 diff --git a/static/tabbar/home.png b/static/tabbar/home.png index 578ce02a7985ebf530a12c20171fc92fcf2c8c01..37825dae54885c7cf364c9d6bbc2cf1a932b8f80 100644 GIT binary patch literal 4127 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 literal 4103 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 diff --git a/static/tabbar/love.png b/static/tabbar/love.png new file mode 100644 index 0000000000000000000000000000000000000000..9e757adf531cabee62f9b6341da4731aecfbfccb GIT binary patch literal 5131 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 HZj}E8!|pjr literal 0 HcmV?d00001 diff --git a/static/tabbar/mine.png b/static/tabbar/mine.png index 901303302e30c0c21d1e2a4a6d66aa6b941c4b6c..b72ea92c46dbbf15186841bfe34f33b1c7a90cc1 100644 GIT binary patch literal 5038 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 QKb(*~;UxZV>+=c!15J4D9smFU literal 4800 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 [] + }, + // 取消按钮的文字,不为空时显示按钮 + cancelText: { + type: String, + default: '' + }, + // 点击某个菜单项时是否关闭弹窗 + closeOnClickAction: { + type: Boolean, + default: true + }, + // 处理底部安全区(默认true) + safeAreaInsetBottom: { + type: Boolean, + default: true + }, + // 小程序的打开方式 + openType: { + type: String, + default: '' + }, + // 点击遮罩是否允许关闭 (默认true) + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: 0 + }, + ...uni.$uv?.props?.actionSheet + } +} \ No newline at end of file diff --git a/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue b/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue new file mode 100644 index 0000000..edca089 --- /dev/null +++ b/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue @@ -0,0 +1,280 @@ + + + + + + diff --git a/uni_modules/uv-action-sheet/package.json b/uni_modules/uv-action-sheet/package.json new file mode 100644 index 0000000..e7b6173 --- /dev/null +++ b/uni_modules/uv-action-sheet/package.json @@ -0,0 +1,92 @@ +{ + "id": "uv-action-sheet", + "displayName": "uv-action-sheet 底部操作菜单 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "该组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheet API,配置更加灵活,所有平台都表现一致。", + "keywords": [ + "action-sheet", + "uvui", + "uv-ui", + "操作菜单", + "菜单选择" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-icon", + "uv-line", + "uv-loading-icon", + "uv-gap" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-action-sheet/readme.md b/uni_modules/uv-action-sheet/readme.md new file mode 100644 index 0000000..9ea5487 --- /dev/null +++ b/uni_modules/uv-action-sheet/readme.md @@ -0,0 +1,13 @@ +## ActionSheet 操作菜单 + +> **组件名:uv-action-sheet** + +本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。 + +本组件功能类似于uni的uni.showActionSheet API,配置更加灵活,所有平台都表现一致。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-album/changelog.md b/uni_modules/uv-album/changelog.md new file mode 100644 index 0000000..42ab5e2 --- /dev/null +++ b/uni_modules/uv-album/changelog.md @@ -0,0 +1,10 @@ +## 1.0.4(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.3(2023-10-23) +1. 修复报错的BUG +## 1.0.2(2023-10-23) +1. 修复设置singleSize、multipleSize、space等值带单位,存在不显示的BUG +## 1.0.1(2023-09-13) +1. 添加依赖 +## 1.0.0(2023-08-30) +1. 新增uv-album相册组件 diff --git a/uni_modules/uv-album/components/uv-album/uv-album.vue b/uni_modules/uv-album/components/uv-album/uv-album.vue new file mode 100644 index 0000000..835d792 --- /dev/null +++ b/uni_modules/uv-album/components/uv-album/uv-album.vue @@ -0,0 +1,312 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-album/package.json b/uni_modules/uv-album/package.json new file mode 100644 index 0000000..700602f --- /dev/null +++ b/uni_modules/uv-album/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-album", + "displayName": "uv-album 相册 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.4", + "description": "本组件提供一个类似相册的功能,让开发者开发起来更加得心应手,功能齐全,灵活配置可以,开箱即用。减少重复的模板代码", + "keywords": [ + "album", + "uv-ui", + "uvui", + "相册", + "图片" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-text" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-album/readme.md b/uni_modules/uv-album/readme.md new file mode 100644 index 0000000..edd2f0b --- /dev/null +++ b/uni_modules/uv-album/readme.md @@ -0,0 +1,21 @@ +# Album 相册 + +> **组件名:uv-album** + +本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。 + +功能齐全,灵活配置可以,开箱即用。减少重复的模板代码。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-alert/changelog.md b/uni_modules/uv-alert/changelog.md new file mode 100644 index 0000000..71cca03 --- /dev/null +++ b/uni_modules/uv-alert/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-01) +1. 修复点击触发两次实践的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-alert 警告提示组件 diff --git a/uni_modules/uv-alert/components/uv-alert/props.js b/uni_modules/uv-alert/components/uv-alert/props.js new file mode 100644 index 0000000..cc8edc1 --- /dev/null +++ b/uni_modules/uv-alert/components/uv-alert/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 显示文字 + title: { + type: String, + default: '' + }, + // 主题,success/warning/info/error + type: { + type: String, + default: 'warning' + }, + // 辅助性文字 + description: { + type: String, + default: '' + }, + // 是否可关闭 + closable: { + type: Boolean, + default: false + }, + // 是否显示图标 + showIcon: { + type: Boolean, + default: false + }, + // 浅或深色调,light-浅色,dark-深色 + effect: { + type: String, + default: 'light' + }, + // 文字是否居中 + center: { + type: Boolean, + default: false + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 14 + }, + ...uni.$uv?.props?.alert + } +} \ No newline at end of file diff --git a/uni_modules/uv-alert/components/uv-alert/uv-alert.vue b/uni_modules/uv-alert/components/uv-alert/uv-alert.vue new file mode 100644 index 0000000..ba3965e --- /dev/null +++ b/uni_modules/uv-alert/components/uv-alert/uv-alert.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/uni_modules/uv-alert/package.json b/uni_modules/uv-alert/package.json new file mode 100644 index 0000000..34bec20 --- /dev/null +++ b/uni_modules/uv-alert/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-alert", + "displayName": "uv-alert 警告提示 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-alert 警告提示,展现需要关注的信息。灵活配置,功能齐全,兼容全端", + "keywords": [ + "alert", + "uvui", + "uv-ui", + "警告提示" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-alert/readme.md b/uni_modules/uv-alert/readme.md new file mode 100644 index 0000000..63dda76 --- /dev/null +++ b/uni_modules/uv-alert/readme.md @@ -0,0 +1,15 @@ +## Alert 警告提示 + +> **组件名:uv-alert** + +警告提示,展现需要关注的信息。 + +当某个页面需要向用户显示警告的信息时。 + +非浮层的静态展现形式,始终展现,不会自动消失,用户可以点击关闭。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-avatar/changelog.md b/uni_modules/uv-avatar/changelog.md new file mode 100644 index 0000000..8631c86 --- /dev/null +++ b/uni_modules/uv-avatar/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-12-06) +1. 优化 +## 1.0.4(2023-12-06) +1. 优化 +## 1.0.3(2023-12-06) +1. 阻止事件冒泡处理,单个头像模式 +## 1.0.2(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-avatar 头像组件 diff --git a/uni_modules/uv-avatar/components/uv-avatar-group/props.js b/uni_modules/uv-avatar/components/uv-avatar-group/props.js new file mode 100644 index 0000000..a610ab4 --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar-group/props.js @@ -0,0 +1,53 @@ +export default { + props: { + // 头像图片组 + urls: { + type: Array, + default: () => [] + }, + // 最多展示的头像数量 + maxCount: { + type: [String, Number], + default: 5 + }, + // 头像形状 + shape: { + type: String, + default: 'circle' + }, + // 图片裁剪模式 + mode: { + type: String, + default: 'scaleToFill' + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: true + }, + // 头像大小 + size: { + type: [String, Number], + default: 40 + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: '' + }, + // 头像之间的遮挡比例 + gap: { + type: [String, Number], + validator(value) { + return value >= 0 && value <= 1 + }, + default: 0.5 + }, + // 需额外显示的值 + extraValue: { + type: [Number, String], + default: 0 + }, + ...uni.$uv?.props?.avatarGroup + } +} \ No newline at end of file diff --git a/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue b/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue new file mode 100644 index 0000000..59481f6 --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/uni_modules/uv-avatar/components/uv-avatar/props.js b/uni_modules/uv-avatar/components/uv-avatar/props.js new file mode 100644 index 0000000..6c8d725 --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar/props.js @@ -0,0 +1,80 @@ +import { range } from '@/uni_modules/uv-ui-tools/libs/function/test.js' +export default { + props: { + // 头像图片路径(不能为相对路径) + src: { + type: String, + default: '' + }, + // 头像形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'circle' + }, + // 头像尺寸 + size: { + type: [String, Number], + default: 40 + }, + // 裁剪模式 + mode: { + type: String, + default: 'scaleToFill' + }, + // 显示的文字 + text: { + type: String, + default: '' + }, + // 背景色 + bgColor: { + type: String, + default: '#c0c4cc' + }, + // 文字颜色 + color: { + type: String, + default: '#fff' + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: 18 + }, + // 显示的图标 + icon: { + type: String, + default: '' + }, + // 显示小程序头像,只对百度,微信,QQ小程序有效 + mpAvatar: { + type: Boolean, + default: false + }, + // 是否使用随机背景色 + randomBgColor: { + type: Boolean, + default: false + }, + // 加载失败的默认头像(组件有内置默认图片) + defaultUrl: { + type: String, + default: '' + }, + // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间 + colorIndex: { + type: [String, Number], + // 校验参数规则,索引在0-19之间 + validator(n) { + return range(n, [0, 19]) || n === '' + }, + default: '' + }, + // 组件标识符 + name: { + type: String, + default: '' + }, + ...uni.$uv?.props?.avatar + } +} \ No newline at end of file diff --git a/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue b/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue new file mode 100644 index 0000000..0959d6a --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/uni_modules/uv-avatar/package.json b/uni_modules/uv-avatar/package.json new file mode 100644 index 0000000..e77ab68 --- /dev/null +++ b/uni_modules/uv-avatar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-avatar", + "displayName": "uv-avatar 头像 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.5", + "description": "uv-avatar 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。", + "keywords": [ + "uv-avatar", + "uvui", + "uv-ui", + "avatar", + "头像" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-text" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-avatar/readme.md b/uni_modules/uv-avatar/readme.md new file mode 100644 index 0000000..1f068eb --- /dev/null +++ b/uni_modules/uv-avatar/readme.md @@ -0,0 +1,11 @@ +## Avatar 头像 + +> **组件名:uv-avatar** + +本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-back-top/changelog.md b/uni_modules/uv-back-top/changelog.md new file mode 100644 index 0000000..9772262 --- /dev/null +++ b/uni_modules/uv-back-top/changelog.md @@ -0,0 +1,8 @@ +## 1.0.2(2023-07-03) +1. 优化插槽自定义内容部分 +2. 增加backToTop方法说明 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-back-top 返回顶部 diff --git a/uni_modules/uv-back-top/components/uv-back-top/props.js b/uni_modules/uv-back-top/components/uv-back-top/props.js new file mode 100644 index 0000000..74daff4 --- /dev/null +++ b/uni_modules/uv-back-top/components/uv-back-top/props.js @@ -0,0 +1,58 @@ +export default { + props: { + // 返回顶部的形状,circle-圆形,square-方形 + mode: { + type: String, + default: 'circle' + }, + // 自定义图标 + icon: { + type: String, + default: 'arrow-upward' + }, + // 提示文字 + text: { + type: String, + default: '' + }, + // 返回顶部滚动时间 + duration: { + type: [String, Number], + default: 100 + }, + // 滚动距离 + scrollTop: { + type: [String, Number], + default: 0 + }, + // 距离顶部多少距离显示,单位px + top: { + type: [String, Number], + default: 400 + }, + // 返回顶部按钮到底部的距离,单位px + bottom: { + type: [String, Number], + default: 100 + }, + // 返回顶部按钮到右边的距离,单位px + right: { + type: [String, Number], + default: 20 + }, + // 层级 + zIndex: { + type: [String, Number], + default: 9 + }, + // 图标的样式,对象形式 + iconStyle: { + type: Object, + default: () => ({ + color: '#909399', + fontSize: '19px' + }) + }, + ...uni.$uv?.props?.backtop + } +} \ No newline at end of file diff --git a/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue b/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue new file mode 100644 index 0000000..fad73d4 --- /dev/null +++ b/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-back-top/package.json b/uni_modules/uv-back-top/package.json new file mode 100644 index 0000000..a2035a5 --- /dev/null +++ b/uni_modules/uv-back-top/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-back-top", + "displayName": "uv-back-top 返回顶部 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "返回顶部 组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。", + "keywords": [ + "uv-back-top", + "uvui", + "uv-ui", + "avatar", + "返回顶部" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-back-top/readme.md b/uni_modules/uv-back-top/readme.md new file mode 100644 index 0000000..d6a2aec --- /dev/null +++ b/uni_modules/uv-back-top/readme.md @@ -0,0 +1,11 @@ +## BackTop 返回顶部 + +> **组件名:uv-back-top** + +该组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-badge/changelog.md b/uni_modules/uv-badge/changelog.md new file mode 100644 index 0000000..b0ba104 --- /dev/null +++ b/uni_modules/uv-badge/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-04) +1. 修复type等属性为null的时候不显示徽标的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-badge 徽标数,数字角标 diff --git a/uni_modules/uv-badge/components/uv-badge/props.js b/uni_modules/uv-badge/components/uv-badge/props.js new file mode 100644 index 0000000..c6369c3 --- /dev/null +++ b/uni_modules/uv-badge/components/uv-badge/props.js @@ -0,0 +1,73 @@ +export default { + props: { + // 是否显示圆点 + isDot: { + type: Boolean, + default: false + }, + // 显示的内容 + value: { + type: [Number, String], + default: '' + }, + // 是否显示 + show: { + type: Boolean, + default: true + }, + // 最大值,超过最大值会显示 '{max}+' + max: { + type: [Number, String], + default: 999 + }, + // 主题类型,error|warning|success|primary + type: { + type: [String,undefined,null], + default: 'error' + }, + // 当数值为 0 时,是否展示 Badge + showZero: { + type: Boolean, + default: false + }, + // 背景颜色,优先级比type高,如设置,type参数会失效 + bgColor: { + type: [String, null], + default: null + }, + // 字体颜色 + color: { + type: [String, null], + default: null + }, + // 徽标形状,circle-四角均为圆角,horn-左下角为直角 + shape: { + type: [String,undefined,null], + default: 'circle' + }, + // 设置数字的显示方式,overflow|ellipsis|limit + // overflow会根据max字段判断,超出显示`${max}+` + // ellipsis会根据max判断,超出显示`${max}...` + // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数 + numberType: { + type: [String,undefined,null], + default: 'overflow' + }, + // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效 + offset: { + type: Array, + default: () => [] + }, + // 是否反转背景和字体颜色 + inverted: { + type: Boolean, + default: false + }, + // 是否绝对定位 + absolute: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.badge + } +} \ No newline at end of file diff --git a/uni_modules/uv-badge/components/uv-badge/uv-badge.vue b/uni_modules/uv-badge/components/uv-badge/uv-badge.vue new file mode 100644 index 0000000..f7d3911 --- /dev/null +++ b/uni_modules/uv-badge/components/uv-badge/uv-badge.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/uni_modules/uv-badge/package.json b/uni_modules/uv-badge/package.json new file mode 100644 index 0000000..5a81386 --- /dev/null +++ b/uni_modules/uv-badge/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-badge", + "displayName": "uv-badge 徽标数,数字角标 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "徽标数一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。", + "keywords": [ + "uv-badge", + "uvui", + "uv-ui", + "徽标数", + "数字角标" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-badge/readme.md b/uni_modules/uv-badge/readme.md new file mode 100644 index 0000000..cf597eb --- /dev/null +++ b/uni_modules/uv-badge/readme.md @@ -0,0 +1,11 @@ +## Badge 徽标数 + +> **组件名:uv-badge** + +该组件一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-button/changelog.md b/uni_modules/uv-button/changelog.md new file mode 100644 index 0000000..11e954e --- /dev/null +++ b/uni_modules/uv-button/changelog.md @@ -0,0 +1,33 @@ +## 1.0.15(2023-12-20) +1. 优化 +## 1.0.14(2023-12-06) +1. 优化 +## 1.0.13(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.12(2023-10-19) +1. 增加后置插槽 +## 1.0.11(2023-09-21) +1. 修复通过customStyle修改按钮宽度,组件中最外层节点不改变的问题 +## 1.0.10(2023-09-15) +1. 按钮支持open-type="agreePrivacyAuthorization" +## 1.0.9(2023-09-11) +1. 增加参数iconSize,用于控制图标的大小 +## 1.0.8(2023-09-10) +1. 修复多个按钮在一行宽度不正常的BUG +## 1.0.7(2023-09-07) +1. 修复warning颜色对应错误的BUG +## 1.0.6(2023-07-25) +1. 增加customTextStyle属性,方便自定义文字样式 +## 1.0.5(2023-07-20) +1. 解决微信小程序动态设置hover-class点击态不消失的BUG +## 1.0.4(2023-06-29) +1. 修改上次更新出现nvue报错异常 +## 1.0.3(2023-06-28) + 修复:设置open-type="chooseAvatar"等值不生效的BUG +## 1.0.2(2023-06-01) +1. 修复按钮点击触发两次的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-button 按钮 diff --git a/uni_modules/uv-button/components/uv-button/nvue.scss b/uni_modules/uv-button/components/uv-button/nvue.scss new file mode 100644 index 0000000..be6c16e --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/nvue.scss @@ -0,0 +1,46 @@ +$uv-button-active-opacity:0.75 !default; +$uv-button-loading-text-margin-left:4px !default; +$uv-button-text-color: #FFFFFF !default; +$uv-button-text-plain-error-color:$uv-error !default; +$uv-button-text-plain-warning-color:$uv-warning !default; +$uv-button-text-plain-success-color:$uv-success !default; +$uv-button-text-plain-info-color:$uv-info !default; +$uv-button-text-plain-primary-color:$uv-primary !default; +.uv-button { + &--active { + opacity: $uv-button-active-opacity; + } + + &--active--plain { + background-color: rgb(217, 217, 217); + } + + &__loading-text { + margin-left:$uv-button-loading-text-margin-left; + } + + &__text, + &__loading-text { + color:$uv-button-text-color; + } + + &__text--plain--error { + color:$uv-button-text-plain-error-color; + } + + &__text--plain--warning { + color:$uv-button-text-plain-warning-color; + } + + &__text--plain--success{ + color:$uv-button-text-plain-success-color; + } + + &__text--plain--info { + color:$uv-button-text-plain-info-color; + } + + &__text--plain--primary { + color:$uv-button-text-plain-primary-color; + } +} \ No newline at end of file diff --git a/uni_modules/uv-button/components/uv-button/props.js b/uni_modules/uv-button/components/uv-button/props.js new file mode 100644 index 0000000..6275ad5 --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/props.js @@ -0,0 +1,163 @@ +export default { + props: { + // 是否细边框 + hairline: { + type: Boolean, + default: true + }, + // 按钮的预置样式,info,primary,error,warning,success + type: { + type: String, + default: 'info' + }, + // 按钮尺寸,large,normal,small,mini + size: { + type: String, + default: 'normal' + }, + // 按钮形状,circle(两边为半圆),square(带圆角) + shape: { + type: String, + default: 'square' + }, + // 按钮是否镂空 + plain: { + type: Boolean, + default: false + }, + // 是否禁止状态 + disabled: { + type: Boolean, + default: false + }, + // 是否加载中 + loading: { + type: Boolean, + default: false + }, + // 加载中提示文字 + loadingText: { + type: [String, Number], + default: '' + }, + // 加载状态图标类型 + loadingMode: { + type: String, + default: 'spinner' + }, + // 加载图标大小 + loadingSize: { + type: [String, Number], + default: 14 + }, + // 开放能力,具体请看uniapp稳定关于button组件部分说明 + // https://uniapp.dcloud.io/component/button + openType: { + type: String, + default: '' + }, + // 用于
组件,点击分别会触发 组件的 submit/reset 事件 + // 取值为submit(提交表单),reset(重置表单) + formType: { + type: String, + default: '' + }, + // 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 + // 只微信小程序、QQ小程序有效 + appParameter: { + type: String, + default: '' + }, + // 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效 + hoverStopPropagation: { + type: Boolean, + default: true + }, + // 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效 + lang: { + type: String, + default: 'en' + }, + // 会话来源,open-type="contact"时有效。只微信小程序有效 + sessionFrom: { + type: String, + default: '' + }, + // 会话内消息卡片标题,open-type="contact"时有效 + // 默认当前标题,只微信小程序有效 + sendMessageTitle: { + type: String, + default: '' + }, + // 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效 + // 默认当前分享路径,只微信小程序有效 + sendMessagePath: { + type: String, + default: '' + }, + // 会话内消息卡片图片,open-type="contact"时有效 + // 默认当前页面截图,只微信小程序有效 + sendMessageImg: { + type: String, + default: '' + }, + // 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示, + // 用户点击后可以快速发送小程序消息,open-type="contact"时有效 + showMessageCard: { + type: Boolean, + default: true + }, + // 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取 + dataName: { + type: String, + default: '' + }, + // 节流,一定时间内只能触发一次 + throttleTime: { + type: [String, Number], + default: 0 + }, + // 按住后多久出现点击态,单位毫秒 + hoverStartTime: { + type: [String, Number], + default: 0 + }, + // 手指松开后点击态保留时间,单位毫秒 + hoverStayTime: { + type: [String, Number], + default: 200 + }, + // 按钮文字,之所以通过props传入,是因为slot传入的话 + // nvue中无法控制文字的样式 + text: { + type: [String, Number], + default: '' + }, + // 按钮图标 + icon: { + type: String, + default: '' + }, + // 按钮图标大小 + iconSize: { + type: [String, Number], + default: '' + }, + // 按钮图标颜色 + iconColor: { + type: String, + default: '#000000' + }, + // 按钮颜色,支持传入linear-gradient渐变色 + color: { + type: String, + default: '' + }, + // 自定义按钮文本样式 + customTextStyle: { + type: [Object,String], + default: '' + }, + ...uni.$uv?.props?.button + } +} diff --git a/uni_modules/uv-button/components/uv-button/uv-button.vue b/uni_modules/uv-button/components/uv-button/uv-button.vue new file mode 100644 index 0000000..3a2470a --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/uv-button.vue @@ -0,0 +1,528 @@ + + + + + diff --git a/uni_modules/uv-button/components/uv-button/vue.scss b/uni_modules/uv-button/components/uv-button/vue.scss new file mode 100644 index 0000000..7a089be --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/vue.scss @@ -0,0 +1,93 @@ +@import '@/uni_modules/uv-ui-tools/libs/css/color.scss'; +// nvue下hover-class无效 +$uv-button-before-top:50% !default; +$uv-button-before-left:50% !default; +$uv-button-before-width:100% !default; +$uv-button-before-height:100% !default; +$uv-button-before-transform:translate(-50%, -50%) !default; +$uv-button-before-opacity:0 !default; +$uv-button-before-background-color:#000 !default; +$uv-button-before-border-color:#000 !default; +$uv-button-active-before-opacity:.15 !default; +$uv-button-icon-margin-left:4px !default; +$uv-button-plain-uv-button-info-color:$uv-info; +$uv-button-plain-uv-button-success-color:$uv-success; +$uv-button-plain-uv-button-error-color:$uv-error; +$uv-button-plain-uv-button-warning-color:$uv-warning; + +.uv-button-wrapper { + position: relative; + &--dis { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 9; + } +} + +.uv-button { + width: 100%; + + &__text { + white-space: nowrap; + line-height: 1; + } + + &:before { + position: absolute; + top:$uv-button-before-top; + left:$uv-button-before-left; + width:$uv-button-before-width; + height:$uv-button-before-height; + border: inherit; + border-radius: inherit; + transform:$uv-button-before-transform; + opacity:$uv-button-before-opacity; + content: " "; + background-color:$uv-button-before-background-color; + border-color:$uv-button-before-border-color; + } + + &--active { + &:before { + opacity: .15 + } + } + + &__icon+&__text:not(:empty), + &__loading-text { + margin-left:$uv-button-icon-margin-left; + } + + &--plain { + &.uv-button--primary { + color: $uv-primary; + } + } + + &--plain { + &.uv-button--info { + color:$uv-button-plain-uv-button-info-color; + } + } + + &--plain { + &.uv-button--success { + color:$uv-button-plain-uv-button-success-color; + } + } + + &--plain { + &.uv-button--error { + color:$uv-button-plain-uv-button-error-color; + } + } + + &--plain { + &.uv-button--warning { + color:$uv-button-plain-uv-button-warning-color; + } + } +} diff --git a/uni_modules/uv-button/package.json b/uni_modules/uv-button/package.json new file mode 100644 index 0000000..c2a4a17 --- /dev/null +++ b/uni_modules/uv-button/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-button", + "displayName": "uv-button 按钮 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.15", + "description": "按钮组件内部实现以uni-app的button组件为基础,进行二次封装,灵活配置,功能齐全,兼容全端。", + "keywords": [ + "uv-button", + "uvui", + "uv-ui", + "button", + "按钮" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-loading-icon", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-button/readme.md b/uni_modules/uv-button/readme.md new file mode 100644 index 0000000..124a7f4 --- /dev/null +++ b/uni_modules/uv-button/readme.md @@ -0,0 +1,19 @@ +## Button 按钮 + +> **组件名:uv-button** + +该组件内部实现以`uni-app`的`button`组件为基础,进行二次封装,灵活配置,功能齐全,兼容全端。灵活配置,内置状态设置,开箱即用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-calendar/changelog.md b/uni_modules/uv-calendar/changelog.md new file mode 100644 index 0000000..581562a --- /dev/null +++ b/uni_modules/uv-calendar/changelog.md @@ -0,0 +1,16 @@ +## 1.0.6(2023-11-03) +1. **该版本不再维护**,推荐使用新版本[https://ext.dcloud.net.cn/plugin?name=uv-calendars](https://ext.dcloud.net.cn/plugin?name=uv-calendars) +## 1.0.5(2023-07-02) +uv-calendar 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/calendar.html +## 1.0.4(2023-06-15) +1. formatter格式化中增加topInfo参数 +## 1.0.3(2023-06-08) +1. 增加点击日期change回调 +2. 优化 +## 1.0.2(2023-06-05) +1. 修改多个时间选择的时候存在反选的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-calendar 日历 diff --git a/uni_modules/uv-calendar/components/uv-calendar/calendar.js b/uni_modules/uv-calendar/components/uv-calendar/calendar.js new file mode 100644 index 0000000..e006dea --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-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/uv-calendar/components/uv-calendar/header.vue b/uni_modules/uv-calendar/components/uv-calendar/header.vue new file mode 100644 index 0000000..d7daa7b --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/header.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/uni_modules/uv-calendar/components/uv-calendar/month.vue b/uni_modules/uv-calendar/components/uv-calendar/month.vue new file mode 100644 index 0000000..1a649bc --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/month.vue @@ -0,0 +1,616 @@ + + + + + diff --git a/uni_modules/uv-calendar/components/uv-calendar/props.js b/uni_modules/uv-calendar/components/uv-calendar/props.js new file mode 100644 index 0000000..c359293 --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/props.js @@ -0,0 +1,145 @@ +export default { + props: { + // 日历顶部标题 + title: { + type: String, + default: '日期选择' + }, + // 是否显示标题 + showTitle: { + type: Boolean, + default: true + }, + // 是否显示副标题 + showSubtitle: { + type: Boolean, + default: true + }, + // 日期类型选择,single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围 + mode: { + type: String, + default: 'single' + }, + // mode=range时,第一个日期底部的提示文字 + startText: { + type: String, + default: '开始' + }, + // mode=range时,最后一个日期底部的提示文字 + endText: { + type: String, + default: '结束' + }, + // 自定义列表 + customList: { + type: Array, + default: () => [] + }, + // 主题色,对底部按钮和选中日期有效 + color: { + type: String, + default: '#3c9cff' + }, + // 最小的可选日期 + minDate: { + type: [String, Number], + default: 0 + }, + // 最大可选日期 + maxDate: { + type: [String, Number], + default: 0 + }, + // 默认选中的日期,mode为multiple或range是必须为数组格式 + defaultDate: { + type: [Array, String, Date, null], + default: null + }, + // mode=multiple时,最多可选多少个日期 + maxCount: { + type: [String, Number], + default: Number.MAX_SAFE_INTEGER + }, + // 日期行高 + rowHeight: { + type: [String, Number], + default: 56 + }, + // 日期格式化函数 + formatter: { + type: [Function, null], + default: null + }, + // 是否显示农历 + showLunar: { + type: Boolean, + default: false + }, + // 是否显示月份背景色 + showMark: { + type: Boolean, + default: true + }, + // 确定按钮的文字 + confirmText: { + type: String, + default: '确定' + }, + // 确认按钮处于禁用状态时的文字 + confirmDisabledText: { + type: String, + default: '确定' + }, + // 是否允许点击遮罩关闭日历 + closeOnClickOverlay: { + type: Boolean, + default: false + }, + // 是否允许点击确认按钮关闭日历 + closeOnClickConfirm: { + type: Boolean, + default: true + }, + // 是否为只读状态,只读状态下禁止选择日期 + readonly: { + type: Boolean, + default: false + }, + // 是否展示确认按钮 + showConfirm: { + type: Boolean, + default: true + }, + // 日期区间最多可选天数,默认无限制,mode = range时有效 Infinity + maxRange: { + type: [Number, String], + default: Number.MAX_SAFE_INTEGER + }, + // 范围选择超过最多可选天数时的提示文案,mode = range时有效 + rangePrompt: { + type: String, + default: '' + }, + // 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效 + showRangePrompt: { + type: Boolean, + default: true + }, + // 是否允许日期范围的起止时间为同一天,mode = range时有效 + allowSameDay: { + type: Boolean, + default: false + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: 0 + }, + // 最多展示月份数量 + monthNum: { + type: [Number, String], + default: 3 + }, + ...uni.$uv?.props?.calendar + } +} \ No newline at end of file diff --git a/uni_modules/uv-calendar/components/uv-calendar/uv-calendar.vue b/uni_modules/uv-calendar/components/uv-calendar/uv-calendar.vue new file mode 100644 index 0000000..626e833 --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/uv-calendar.vue @@ -0,0 +1,390 @@ + + + + + diff --git a/uni_modules/uv-calendar/package.json b/uni_modules/uv-calendar/package.json new file mode 100644 index 0000000..03d8812 --- /dev/null +++ b/uni_modules/uv-calendar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-calendar", + "displayName": "uv-calendar 日历 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.6", + "description": "日历组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中,灵活配置,功能齐全,兼容全端。强烈推荐使用最新版日历组件,在下方跳入。", + "keywords": [ + "uv-calendar", + "uvui", + "uv-ui", + "calendar", + "日历" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-button", + "uv-popup" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-calendar/readme.md b/uni_modules/uv-calendar/readme.md new file mode 100644 index 0000000..3c2de54 --- /dev/null +++ b/uni_modules/uv-calendar/readme.md @@ -0,0 +1,21 @@ +## Calendar 日历 + +> **组件名:uv-calendar** + +此组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中。灵活配置,功能齐全,兼容全端。 + +## 温馨提示:该组件不再更新,强烈推荐使用最新版日历组件:[https://www.uvui.cn/components/calendars.html](https://www.uvui.cn/components/calendars.html)。基于 `uv-ui` 插件市场首款多功能日历组件,不仅可以查看、选择日期,还可以选择任意范围内的日期、打点操作、自定义主题颜色、自定义文案、农历显示等。追求的就是完美。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-calendars/changelog.md b/uni_modules/uv-calendars/changelog.md new file mode 100644 index 0000000..b3b2e38 --- /dev/null +++ b/uni_modules/uv-calendars/changelog.md @@ -0,0 +1,40 @@ +## 1.0.15(2023-11-08) +1. 增加readonly属性,是否为只读状态,只读状态下禁止选择日期 +## 1.0.14(2023-10-12) +1. 修复selected没有设置了info或者info设置为空字符串后,文本则无法恢复BUG +## 1.0.13(2023-09-19) +1. 修复range模式下,selected设置了info后选中后,导致文本不恢复的问题 +2. 修复multiple模式下,selected自定义信息的颜色没变,依然是白色 +## 1.0.12(2023-09-14) +1. 优化 +## 1.0.11(2023-09-14) +1. 增加allowSameDay参数,是否允许日期范围的起止时间为同一天,mode = range时有效 +2. 修复在vue2+小程序渲染时闪烁的问题 +## 1.0.10(2023-09-07) +1. 修复国际化失效的BUG +## 1.0.9(2023-09-01) +1. 修复在pages.json中设置easycom会报错的BUG +## 1.0.8(2023-08-29) +1. 修复mainjs中设置setConfig修改属性不生效的问题,出自评论区:https://ext.dcloud.net.cn/plugin?id=12287 +## 1.0.7(2023-08-26) +1. 去除range参数,由mode="range"替换 +2. 新增mode参数,不传 / multiple / range,分别为单日期, 多个日期,选择日期范围 +3. 与uv-calendar选择日期的功能保持一致 +## 1.0.6(2023-08-25) +1. 修复点击返回今天按钮时,monthSwitch方法回调参数返回月份不是当天对应月份:https://github.com/climblee/uv-ui/issues/7 +## 1.0.5(2023-08-13) +1. 修复选择月份弹窗层级的问题 +## 1.0.4(2023-08-06) +1. 优化 +## 1.0.3(2023-08-06) +1. 修复高度不对的BUG +2. 修复文案在小屏幕的BUG +## 1.0.2(2023-08-05) +1. 增加startText参数 +2. 增加endText参数 +3. 增加selected中的参数 +4. 优化日历范围选择 +## 1.0.1(2023-08-04) +1. 修复 自定义主题时 颜色错误的BUG +## 1.0.0(2023-08-03) +1. 新增 uv-calendars 新版日历发布 diff --git a/uni_modules/uv-calendars/components/uv-calendars/calendar-body.vue b/uni_modules/uv-calendars/components/uv-calendars/calendar-body.vue new file mode 100644 index 0000000..b675fbd --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/calendar-body.vue @@ -0,0 +1,376 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-calendars/components/uv-calendars/calendar-item.vue b/uni_modules/uv-calendars/components/uv-calendars/calendar-item.vue new file mode 100644 index 0000000..862d068 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/calendar-item.vue @@ -0,0 +1,248 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-calendars/components/uv-calendars/calendar.js b/uni_modules/uv-calendars/components/uv-calendars/calendar.js new file mode 100644 index 0000000..b8d7d6f --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/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/uv-calendars/components/uv-calendars/i18n/en.json b/uni_modules/uv-calendars/components/uv-calendars/i18n/en.json new file mode 100644 index 0000000..c83e8b2 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/i18n/en.json @@ -0,0 +1,12 @@ +{ + "uv-calender.ok": "ok", + "uv-calender.cancel": "cancel", + "uv-calender.today": "today", + "uv-calender.MON": "MON", + "uv-calender.TUE": "TUE", + "uv-calender.WED": "WED", + "uv-calender.THU": "THU", + "uv-calender.FRI": "FRI", + "uv-calender.SAT": "SAT", + "uv-calender.SUN": "SUN" +} diff --git a/uni_modules/uv-calendars/components/uv-calendars/i18n/index.js b/uni_modules/uv-calendars/components/uv-calendars/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/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/uv-calendars/components/uv-calendars/i18n/zh-Hans.json b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hans.json new file mode 100644 index 0000000..03c5486 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hans.json @@ -0,0 +1,12 @@ +{ + "uv-calender.ok": "确定", + "uv-calender.cancel": "取消", + "uv-calender.today": "今日", + "uv-calender.SUN": "日", + "uv-calender.MON": "一", + "uv-calender.TUE": "二", + "uv-calender.WED": "三", + "uv-calender.THU": "四", + "uv-calender.FRI": "五", + "uv-calender.SAT": "六" +} diff --git a/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hant.json b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hant.json new file mode 100644 index 0000000..95cf29e --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hant.json @@ -0,0 +1,12 @@ +{ + "uv-calender.ok": "確定", + "uv-calender.cancel": "取消", + "uv-calender.today": "今日", + "uv-calender.SUN": "日", + "uv-calender.MON": "一", + "uv-calender.TUE": "二", + "uv-calender.WED": "三", + "uv-calender.THU": "四", + "uv-calender.FRI": "五", + "uv-calender.SAT": "六" +} diff --git a/uni_modules/uv-calendars/components/uv-calendars/util.js b/uni_modules/uv-calendars/components/uv-calendars/util.js new file mode 100644 index 0000000..ae1c6d6 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/util.js @@ -0,0 +1,435 @@ +import CALENDAR from './calendar.js' +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range, + multiple, + allowSameDay + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + this.multiple = multiple + this.allowSameDay = allowSameDay + // 多选状态 + this.cleanRangeStatus() + // 范围状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date, status) { + if (this.range && status == 'init') { + this.cleanRangeStatus(); + if (Array.isArray(date)) { + this.rangeStatus.before = date[0]; + this.rangeStatus.after = date.length > 1 ? date[date.length - 1] : ''; + if (this.rangeStatus.after && this.dateCompare(this.rangeStatus.before, this.rangeStatus.after)) { + this.rangeStatus.data = this.geDateAll(this.rangeStatus.before, this.rangeStatus.after) + } + this.selectDate = this.getDate(date[0]) + this._getWeek(this.selectDate.fullDate) + } else { + this.selectDate = this.getDate(date) + this.rangeStatus.before = this.selectDate.fullDate; + this._getWeek(this.selectDate.fullDate) + } + } else if (this.multiple && status == 'init') { + this.cleanMultipleStatus(); + if (Array.isArray(date)) { + this.multipleStatus.data = date; + this.selectDate = this.getDate(date[0]) + this._getWeek(this.selectDate.fullDate) + } else { + this.selectDate = this.getDate(date) + this.multipleStatus.data = [this.selectDate.fullDate]; + this._getWeek(this.selectDate.fullDate) + } + } else { + if (Array.isArray(date)) { + this.selectDate = this.getDate(date[0]) + this._getWeek(this.selectDate.fullDate) + } else { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + } + } + /** + * 清理多选状态 + */ + cleanRangeStatus() { + this.rangeStatus = { + before: '', + after: '', + data: [] + } + } + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + 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 && AddDayCount > 0) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + const preMonth = dd.getMonth() + dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期 + const nextMonth = dd.getMonth() + // 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 + if (AddDayCount < 0 && preMonth !== 0 && nextMonth - preMonth > AddDayCount) { + dd.setMonth(nextMonth + (nextMonth - preMonth + AddDayCount)) + } + // 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 + if (AddDayCount > 0 && nextMonth - preMonth > AddDayCount) { + dd.setMonth(nextMonth - (nextMonth - preMonth - 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 ranges = this.rangeStatus.data + let checked = false + let rangesStatus = -1 + if (this.range) { + if (ranges) { + rangesStatus = ranges.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (rangesStatus !== -1) { + checked = true + } + } + let multiples = this.multipleStatus.data + let checked_multiple = false + let multiplesStatus = -1 + if (this.multiple) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked_multiple = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + range: this.range ? checked : false, + multiple: this.multiple ? checked_multiple : false, + beforeRange: this.dateEqual(this.rangeStatus.before, nowDate), + afterRange: this.dateEqual(this.rangeStatus.after, nowDate), + dateEqual: this.range && checked && this.dateEqual(this.rangeStatus.before, this.rangeStatus.after), + 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() + } else if (Array.isArray(date)) { + date = date[0] + } + 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 + } + } + /** + * 比较after时间是否大于before时间 + */ + dateAfterLgBefore(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (after.getTime() - before.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) { + if (!this.multiple) return + let multiples = this.multipleStatus.data; + const findIndex = multiples.findIndex(item => this.dateEqual(fullDate, item)); + if (findIndex < 0) { + this.multipleStatus.data = this.multipleStatus.data.concat([fullDate]); + } else { + this.multipleStatus.data.splice(findIndex, 1); + } + this._getWeek(fullDate) + } + /** + * 获取范围状态 + */ + setRange(fullDate) { + let { + before, + after + } = this.rangeStatus + if (!this.range) return + if (before && after) { + this.cleanRangeStatus(); + this.rangeStatus.before = fullDate + } else { + if (!before) { + this.rangeStatus.before = fullDate + } else { + if (this.allowSameDay && this.dateEqual(before, fullDate)) { + this.rangeStatus.after = fullDate + } else if (!this.dateAfterLgBefore(this.rangeStatus.before, fullDate)) { + this.cleanRangeStatus(); + this.rangeStatus.before = fullDate + this._getWeek(fullDate) + return; + } + this.rangeStatus.after = fullDate + if (this.dateCompare(this.rangeStatus.before, this.rangeStatus.after)) { + this.rangeStatus.data = this.geDateAll(this.rangeStatus.before, this.rangeStatus.after); + } else { + this.rangeStatus.data = this.geDateAll(this.rangeStatus.after, this.rangeStatus.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 \ No newline at end of file diff --git a/uni_modules/uv-calendars/components/uv-calendars/uv-calendars.vue b/uni_modules/uv-calendars/components/uv-calendars/uv-calendars.vue new file mode 100644 index 0000000..8d5b377 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/uv-calendars.vue @@ -0,0 +1,452 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-calendars/package.json b/uni_modules/uv-calendars/package.json new file mode 100644 index 0000000..7153510 --- /dev/null +++ b/uni_modules/uv-calendars/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-calendars", + "displayName": "uv-calendars 最新日历 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.15", + "description": "新版本uv-calendars,不仅拥有老版本的所有功能,还增加了更加适用的插入页面等强大功能,且更加简洁。查看日期、选择单个或多个或任意范围日期,打点操作,自定义文案,自定义主题等强大功能。", + "keywords": [ + "uv-ui", + "uvui", + "日历", + "打卡", + "日历选择" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration":{ + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-toolbar" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-calendars/readme.md b/uni_modules/uv-calendars/readme.md new file mode 100644 index 0000000..d986eb9 --- /dev/null +++ b/uni_modules/uv-calendars/readme.md @@ -0,0 +1,23 @@ +## Calendars 全新日历 + +> **组件名:uv-calendars** + +为了解决老版本`uv-calendar`性能问题,特别是对日期选择范围有很大限制,体验不友好等缺点。于是有了新版日历组件。 + +新版本`uv-calendars`,不仅拥有老版本的所有功能,还增加了更加适用的插入页面等强大功能,且更加简洁。查看日期、选择单个或多个或任意范围日期,打点操作,自定义文案,自定义主题等强大功能。 + +常用场景:酒店日期预订、火车机票选择购买日期、上下班打卡等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-cell/changelog.md b/uni_modules/uv-cell/changelog.md new file mode 100644 index 0000000..c342b0c --- /dev/null +++ b/uni_modules/uv-cell/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-12-06) +1. 修复uv-cell right-icon插槽编译到APP端不显示的BUG,问题来源:https://gitee.com/climblee/uv-ui/issues/I8LXZI +## 1.0.4(2023-09-19) +1. 增加cellStyle参数,方便自定义单元格的样式 +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-06-21) +1. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-cell 单元格 diff --git a/uni_modules/uv-cell/components/uv-cell-group/props.js b/uni_modules/uv-cell/components/uv-cell-group/props.js new file mode 100644 index 0000000..57deb4c --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell-group/props.js @@ -0,0 +1,15 @@ +export default { + props: { + // 分组标题 + title: { + type: String, + default: '' + }, + // 是否显示外边框 + border: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.cellGroup + } +} \ No newline at end of file diff --git a/uni_modules/uv-cell/components/uv-cell-group/uv-cell-group.vue b/uni_modules/uv-cell/components/uv-cell-group/uv-cell-group.vue new file mode 100644 index 0000000..0f17865 --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell-group/uv-cell-group.vue @@ -0,0 +1,63 @@ + + + + + + diff --git a/uni_modules/uv-cell/components/uv-cell/props.js b/uni_modules/uv-cell/components/uv-cell/props.js new file mode 100644 index 0000000..6579636 --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell/props.js @@ -0,0 +1,116 @@ +export default { + props: { + // 标题 + title: { + type: [String, Number], + default: '' + }, + // 标题下方的描述信息 + label: { + type: [String, Number], + default: '' + }, + // 右侧的内容 + value: { + type: [String, Number], + default: '' + }, + // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址) + icon: { + type: String, + default: '' + }, + // 是否禁用cell + disabled: { + type: Boolean, + default: false + }, + // 是否显示下边框 + border: { + type: Boolean, + default: true + }, + // 内容是否垂直居中(主要是针对右侧的value部分) + center: { + type: Boolean, + default: true + }, + // 点击后跳转的URL地址 + url: { + type: String, + default: '' + }, + // 链接跳转的方式,内部使用的是uvui封装的route方法,可能会进行拦截操作 + linkType: { + type: String, + default: 'navigateTo' + }, + // 是否开启点击反馈(表现为点击时加上灰色背景) + clickable: { + type: Boolean, + default: false + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: false + }, + // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) + required: { + type: Boolean, + default: false + }, + // 右侧的图标箭头 + rightIcon: { + type: String, + default: 'arrow-right' + }, + // 右侧箭头的方向,可选值为:left,up,down + arrowDirection: { + type: String, + default: '' + }, + // 左侧图标样式 + iconStyle: { + type: [Object, String], + default: () => { + return {} + } + }, + // 右侧箭头图标的样式 + rightIconStyle: { + type: [Object, String], + default: () => { + return {} + } + }, + // 标题的样式 + titleStyle: { + type: [Object, String], + default: () => { + return {} + } + }, + // 单位元的大小,可选值为large + size: { + type: String, + default: '' + }, + // 点击cell是否阻止事件传播 + stop: { + type: Boolean, + default: true + }, + // 标识符,cell被点击时返回 + name: { + type: [Number, String], + default: '' + }, + // 单元格自定义样式 + cellStyle: { + type: [Object, String], + default: () => {} + }, + ...uni.$uv?.props?.cell + } +} \ No newline at end of file diff --git a/uni_modules/uv-cell/components/uv-cell/uv-cell.vue b/uni_modules/uv-cell/components/uv-cell/uv-cell.vue new file mode 100644 index 0000000..bdd268e --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell/uv-cell.vue @@ -0,0 +1,209 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-cell/package.json b/uni_modules/uv-cell/package.json new file mode 100644 index 0000000..8ff5cf6 --- /dev/null +++ b/uni_modules/uv-cell/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-cell", + "displayName": "uv-cell 单元格 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.5", + "description": "cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。", + "keywords": [ + "uv-cell", + "uvui", + "uv-ui", + "单元格", + "设置页" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-line" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-cell/readme.md b/uni_modules/uv-cell/readme.md new file mode 100644 index 0000000..3ea9937 --- /dev/null +++ b/uni_modules/uv-cell/readme.md @@ -0,0 +1,11 @@ +## Cell 单元格 + +> **组件名:uv-cell** + +cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-checkbox/changelog.md b/uni_modules/uv-checkbox/changelog.md new file mode 100644 index 0000000..2a142ce --- /dev/null +++ b/uni_modules/uv-checkbox/changelog.md @@ -0,0 +1,34 @@ +## 1.0.14(2023-11-04) +1. 修复label文字较多不分行的问题 +## 1.0.13(2023-10-11) +1. 优化同类问题:https://gitee.com/climblee/uv-ui/issues/I872VD +## 1.0.12(2023-09-22) +1. 修复change回调中v-model值不更新的BUG +## 1.0.11(2023-09-01) +1. 修复点击空隙处无效的问题 +2. label支持插槽下可点击 +## 1.0.10(2023-08-27) +1. 修复label设置布尔值不生效的BUG +## 1.0.9(2023-08-16) +1. 解决数据多不换行的BUG +## 1.0.8(2023-07-13) +1. 修复 uv-checkbox设置value属性不生效的BUG +## 1.0.7(2023-07-05) +修复vue3模式下,动态修改v-model绑定的值无效的BUG +## 1.0.6(2023-06-29) +1. 增加label插槽,与radio保持一致 +2. 优化文档 +## 1.0.5(2023-06-12) +1. 修复1.0.4改出的问题 +## 1.0.4(2023-06-08) +1. 复选框修复全局设置不生效的BUG +## 1.0.3(2023-06-06) +1. uv-checkbox-group 兼容自定义样式customStyle,方便通过样式调整整体位置等; +2. .uv-checkbox-group--row增加flex-wrap: wrap;允许换行 +## 1.0.2(2023-05-30) +1. 修复error报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-checkbox 复选框 diff --git a/uni_modules/uv-checkbox/components/uv-checkbox-group/props.js b/uni_modules/uv-checkbox/components/uv-checkbox-group/props.js new file mode 100644 index 0000000..47bf005 --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox-group/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 绑定的值 + value: { + type: Array, + default: () => [] + }, + modelValue: { + type: Array, + default: () => [] + }, + // 标识符 + name: { + type: String, + default: '' + }, + // 形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'square' + }, + // 是否禁用全部checkbox + disabled: { + type: Boolean, + default: false + }, + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: '#2979ff' + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: '#c8c9cc' + }, + // 整个组件的尺寸,默认px + size: { + type: [String, Number], + default: 18 + }, + // 布局方式,row-横向,column-纵向 + placement: { + type: String, + default: 'row' + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: 14 + }, + // label的字体颜色 + labelColor: { + type: [String], + default: '#303133' + }, + // 是否禁止点击文本操作 + labelDisabled: { + type: Boolean, + default: false + }, + // 图标颜色 + iconColor: { + type: String, + default: '#fff' + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: 12 + }, + // 勾选图标的对齐方式,left-左边,right-右边 + iconPlacement: { + type: String, + default: 'left' + }, + // 竖向配列时,是否显示下划线 + borderBottom: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.checkboxGroup + } +} \ No newline at end of file diff --git a/uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue b/uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue new file mode 100644 index 0000000..d5ea81f --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/uni_modules/uv-checkbox/components/uv-checkbox/props.js b/uni_modules/uv-checkbox/components/uv-checkbox/props.js new file mode 100644 index 0000000..58ec890 --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox/props.js @@ -0,0 +1,70 @@ +export default { + props: { + // checkbox的名称 + name: { + type: [String, Number, Boolean], + default: '' + }, + // 形状,square为方形,circle为圆型 + shape: { + type: String, + default: '' + }, + // 整体的大小 + size: { + type: [String, Number], + default: '' + }, + // 是否默认选中 + checked: { + type: Boolean, + default: false + }, + // 是否禁用 + disabled: { + type: [String, Boolean], + default: '' + }, + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: '' + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: '' + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: '' + }, + // 图标颜色 + iconColor: { + type: String, + default: '' + }, + // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式 + label: { + type: [String, Number, Boolean], + default: '' + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: '' + }, + // label的颜色 + labelColor: { + type: String, + default: '' + }, + // 是否禁止点击提示语选中复选框 + labelDisabled: { + type: [String, Boolean], + default: '' + }, + ...uni.$uv?.props?.checkbox + } +} \ No newline at end of file diff --git a/uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue b/uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue new file mode 100644 index 0000000..dfd1912 --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue @@ -0,0 +1,370 @@ + + + + + diff --git a/uni_modules/uv-checkbox/package.json b/uni_modules/uv-checkbox/package.json new file mode 100644 index 0000000..44944d9 --- /dev/null +++ b/uni_modules/uv-checkbox/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-checkbox", + "displayName": "uv-checkbox 复选框 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.14", + "description": "复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便。", + "keywords": [ + "uv-checkbox", + "uvui", + "uv-ui", + "checkbox", + "复选框" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-checkbox/readme.md b/uni_modules/uv-checkbox/readme.md new file mode 100644 index 0000000..43b6f2e --- /dev/null +++ b/uni_modules/uv-checkbox/readme.md @@ -0,0 +1,19 @@ +## Checkbox 复选框 + +> **组件名:uv-checkbox** + +复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便。可配合 `uv-form` 组件进行表单验证等场景使用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-code-input/changelog.md b/uni_modules/uv-code-input/changelog.md new file mode 100644 index 0000000..1fefc03 --- /dev/null +++ b/uni_modules/uv-code-input/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-08-05) +在vue2模式下,v-model设置为0时不生效的BUG +## 1.0.4(2023-07-13) +1. 修复value/v-model更改不生效的BUG +## 1.0.3(2023-06-28) +修复:使用:disabledKeyboard="true"属性,事件全部失效的BUG +## 1.0.2(2023-06-23) +优化下边框 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-code-input 验证码输入 diff --git a/uni_modules/uv-code-input/components/uv-code-input/props.js b/uni_modules/uv-code-input/components/uv-code-input/props.js new file mode 100644 index 0000000..4a5e460 --- /dev/null +++ b/uni_modules/uv-code-input/components/uv-code-input/props.js @@ -0,0 +1,83 @@ +export default { + props: { + value: { + type: [String, Number], + default: '' + }, + modelValue: { + type: [String, Number], + default: '' + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: true + }, + // 最大输入长度 + maxlength: { + type: [String, Number], + default: 6 + }, + // 是否用圆点填充 + dot: { + type: Boolean, + default: false + }, + // 显示模式,box-盒子模式,line-底部横线模式 + mode: { + type: String, + default: 'box' + }, + // 是否细边框 + hairline: { + type: Boolean, + default: false + }, + // 字符间的距离 + space: { + type: [String, Number], + default: 10 + }, + // 是否自动获取焦点 + focus: { + type: Boolean, + default: false + }, + // 字体是否加粗 + bold: { + type: Boolean, + default: false + }, + // 字体颜色 + color: { + type: String, + default: '#606266' + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 18 + }, + // 输入框的大小,宽等于高 + size: { + type: [String, Number], + default: 35 + }, + // 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true + disabledKeyboard: { + type: Boolean, + default: false + }, + // 边框和线条颜色 + borderColor: { + type: String, + default: '#c9cacc' + }, + // 是否禁止输入"."符号 + disabledDot: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.codeInput + } +} \ No newline at end of file diff --git a/uni_modules/uv-code-input/components/uv-code-input/uv-code-input.vue b/uni_modules/uv-code-input/components/uv-code-input/uv-code-input.vue new file mode 100644 index 0000000..14ad8a2 --- /dev/null +++ b/uni_modules/uv-code-input/components/uv-code-input/uv-code-input.vue @@ -0,0 +1,272 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-code-input/package.json b/uni_modules/uv-code-input/package.json new file mode 100644 index 0000000..ab8762c --- /dev/null +++ b/uni_modules/uv-code-input/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-code-input", + "displayName": "uv-code-input 验证码输入 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "验证码输入组件一般用于验证用户短信验证码的场景,输入框或横线多种模式可选。", + "keywords": [ + "uv-code-input", + "uvui", + "uv-ui", + "code", + "验证码输入" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-code-input/readme.md b/uni_modules/uv-code-input/readme.md new file mode 100644 index 0000000..aa5b0a1 --- /dev/null +++ b/uni_modules/uv-code-input/readme.md @@ -0,0 +1,19 @@ +## CodeInput 验证码输入框 + +> **组件名:uv-code-input** + +该组件一般用于验证用户短信验证码的场景,输入框或横线多种模式可选。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-code/changelog.md b/uni_modules/uv-code/changelog.md new file mode 100644 index 0000000..7054a25 --- /dev/null +++ b/uni_modules/uv-code/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-10-13) +1. 优化 +## 1.0.2(2023-10-13) +1. unmounted兼容vue3 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-code 验证码倒计时 diff --git a/uni_modules/uv-code/components/uv-code/props.js b/uni_modules/uv-code/components/uv-code/props.js new file mode 100644 index 0000000..afc9d3c --- /dev/null +++ b/uni_modules/uv-code/components/uv-code/props.js @@ -0,0 +1,35 @@ +export default { + props: { + // 倒计时总秒数 + seconds: { + type: [String, Number], + default: 60 + }, + // 尚未开始时提示 + startText: { + type: String, + default: '获取验证码' + }, + // 正在倒计时中的提示 + changeText: { + type: String, + default: 'X秒重新获取' + }, + // 倒计时结束时的提示 + endText: { + type: String, + default: '重新获取' + }, + // 是否在H5刷新或各端返回再进入时继续倒计时 + keepRunning: { + type: Boolean, + default: false + }, + // 为了区分多个页面,或者一个页面多个倒计时组件本地存储的继续倒计时变了 + uniqueKey: { + type: String, + default: '' + }, + ...uni.$uv?.props?.code + } +} \ No newline at end of file diff --git a/uni_modules/uv-code/components/uv-code/uv-code.vue b/uni_modules/uv-code/components/uv-code/uv-code.vue new file mode 100644 index 0000000..de02c83 --- /dev/null +++ b/uni_modules/uv-code/components/uv-code/uv-code.vue @@ -0,0 +1,136 @@ + + \ No newline at end of file diff --git a/uni_modules/uv-code/package.json b/uni_modules/uv-code/package.json new file mode 100644 index 0000000..d4392c0 --- /dev/null +++ b/uni_modules/uv-code/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-code", + "displayName": "uv-code 验证码倒计时 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "考虑到用户实际发送验证码的场景,可能是一个按钮,也可能是一段文字,提示语各有不同,所以本组件不提供界面显示,只提供倒计时文本,由用户将文本嵌入到具体的场景。", + "keywords": [ + "uv-code", + "uvui", + "uv-ui", + "code", + "验证码倒计时" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-code/readme.md b/uni_modules/uv-code/readme.md new file mode 100644 index 0000000..cf2eb51 --- /dev/null +++ b/uni_modules/uv-code/readme.md @@ -0,0 +1,11 @@ +## Code 验证码输入框 + +> **组件名:uv-code** + +考虑到用户实际发送验证码的场景,可能是一个按钮,也可能是一段文字,提示语各有不同,所以本组件不提供界面显示,只提供倒计时文本,由用户将文本嵌入到具体的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-collapse/changelog.md b/uni_modules/uv-collapse/changelog.md new file mode 100644 index 0000000..0219560 --- /dev/null +++ b/uni_modules/uv-collapse/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-collapse 折叠面板 diff --git a/uni_modules/uv-collapse/components/uv-collapse-item/props.js b/uni_modules/uv-collapse/components/uv-collapse-item/props.js new file mode 100644 index 0000000..18983c1 --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse-item/props.js @@ -0,0 +1,60 @@ +export default { + props: { + // 标题 + title: { + type: String, + default: '' + }, + // 标题右侧内容 + value: { + type: String, + default: '' + }, + // 标题下方的描述信息 + label: { + type: String, + default: '' + }, + // 是否禁用折叠面板 + disabled: { + type: Boolean, + default: false + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: true + }, + // 是否开启点击反馈 + clickable: { + type: Boolean, + default: true + }, + // 是否显示内边框 + border: { + type: Boolean, + default: true + }, + // 标题的对齐方式 + align: { + type: String, + default: 'left' + }, + // 唯一标识符 + name: { + type: [String, Number], + default: '' + }, + // 标题左侧图片,可为绝对路径的图片或内置图标 + icon: { + type: String, + default: '' + }, + // 面板展开收起的过渡时间,单位ms + duration: { + type: Number, + default: 300 + }, + ...uni.$uv?.props?.collapseItem + } +} \ No newline at end of file diff --git a/uni_modules/uv-collapse/components/uv-collapse-item/uv-collapse-item.vue b/uni_modules/uv-collapse/components/uv-collapse-item/uv-collapse-item.vue new file mode 100644 index 0000000..840f28d --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse-item/uv-collapse-item.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/uni_modules/uv-collapse/components/uv-collapse/props.js b/uni_modules/uv-collapse/components/uv-collapse/props.js new file mode 100644 index 0000000..70fa04c --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse/props.js @@ -0,0 +1,20 @@ +export default { + props: { + // 当前展开面板的name,非手风琴模式:[],手风琴模式:string | number + value: { + type: [String, Number, Array, null], + default: null + }, + // 是否手风琴模式 + accordion: { + type: Boolean, + default: false + }, + // 是否显示外边框 + border: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.collapse + } +} \ No newline at end of file diff --git a/uni_modules/uv-collapse/components/uv-collapse/uv-collapse.vue b/uni_modules/uv-collapse/components/uv-collapse/uv-collapse.vue new file mode 100644 index 0000000..5e5c96d --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse/uv-collapse.vue @@ -0,0 +1,86 @@ + + + diff --git a/uni_modules/uv-collapse/package.json b/uni_modules/uv-collapse/package.json new file mode 100644 index 0000000..cf9565f --- /dev/null +++ b/uni_modules/uv-collapse/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-collapse", + "displayName": "uv-collapse 折叠面板 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "折叠面板组件,通过折叠面板收纳内容区域,点击可展开收起,多功能参数可配置。", + "keywords": [ + "uv-collapse", + "uvui", + "uv-ui", + "collapse", + "折叠面板" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-line", + "uv-cell" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-collapse/readme.md b/uni_modules/uv-collapse/readme.md new file mode 100644 index 0000000..cb340ba --- /dev/null +++ b/uni_modules/uv-collapse/readme.md @@ -0,0 +1,11 @@ +## Collapse 折叠面板 + +> **组件名:uv-collapse** + +通过折叠面板收纳内容区域,点击可展开收起,多功能参数可配置。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-count-down/changelog.md b/uni_modules/uv-count-down/changelog.md new file mode 100644 index 0000000..44392c2 --- /dev/null +++ b/uni_modules/uv-count-down/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-10-13) +1. unmounted兼容vue3 +## 1.0.2(2023-06-20) +1. 增加外部样式customStyle参数 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-count-down 倒计时 diff --git a/uni_modules/uv-count-down/components/uv-count-down/props.js b/uni_modules/uv-count-down/components/uv-count-down/props.js new file mode 100644 index 0000000..c5b5461 --- /dev/null +++ b/uni_modules/uv-count-down/components/uv-count-down/props.js @@ -0,0 +1,25 @@ +export default { + props: { + // 倒计时时长,单位ms + time: { + type: [String, Number], + default: 0 + }, + // 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 + format: { + type: String, + default: 'HH:mm:ss' + }, + // 是否自动开始倒计时 + autoStart: { + type: Boolean, + default: true + }, + // 是否展示毫秒倒计时 + millisecond: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.countDown + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-down/components/uv-count-down/utils.js b/uni_modules/uv-count-down/components/uv-count-down/utils.js new file mode 100644 index 0000000..8c75005 --- /dev/null +++ b/uni_modules/uv-count-down/components/uv-count-down/utils.js @@ -0,0 +1,62 @@ +// 补0,如1 -> 01 +function padZero(num, targetLength = 2) { + let str = `${num}` + while (str.length < targetLength) { + str = `0${str}` + } + return str +} +const SECOND = 1000 +const MINUTE = 60 * SECOND +const HOUR = 60 * MINUTE +const DAY = 24 * HOUR +export function parseTimeData(time) { + const days = Math.floor(time / DAY) + const hours = Math.floor((time % DAY) / HOUR) + const minutes = Math.floor((time % HOUR) / MINUTE) + const seconds = Math.floor((time % MINUTE) / SECOND) + const milliseconds = Math.floor(time % SECOND) + return { + days, + hours, + minutes, + seconds, + milliseconds + } +} +export function parseFormat(format, timeData) { + let { + days, + hours, + minutes, + seconds, + milliseconds + } = timeData + // 如果格式化字符串中不存在DD(天),则将天的时间转为小时中去 + if (format.indexOf('DD') === -1) { + hours += days * 24 + } else { + // 对天补0 + format = format.replace('DD', padZero(days)) + } + // 其他同理于DD的格式化处理方式 + if (format.indexOf('HH') === -1) { + minutes += hours * 60 + } else { + format = format.replace('HH', padZero(hours)) + } + if (format.indexOf('mm') === -1) { + seconds += minutes * 60 + } else { + format = format.replace('mm', padZero(minutes)) + } + if (format.indexOf('ss') === -1) { + milliseconds += seconds * 1000 + } else { + format = format.replace('ss', padZero(seconds)) + } + return format.replace('SSS', padZero(milliseconds, 3)) +} +export function isSameSecond(time1, time2) { + return Math.floor(time1 / 1000) === Math.floor(time2 / 1000) +} diff --git a/uni_modules/uv-count-down/components/uv-count-down/uv-count-down.vue b/uni_modules/uv-count-down/components/uv-count-down/uv-count-down.vue new file mode 100644 index 0000000..a758d31 --- /dev/null +++ b/uni_modules/uv-count-down/components/uv-count-down/uv-count-down.vue @@ -0,0 +1,169 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-count-down/package.json b/uni_modules/uv-count-down/package.json new file mode 100644 index 0000000..da501f1 --- /dev/null +++ b/uni_modules/uv-count-down/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-count-down", + "displayName": "uv-count-down 倒计时 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "该倒计时组件一般使用于某个活动的截止时间上,通过数字的变化,给用户明确的时间感受,提示用户进行某一个行为操作。", + "keywords": [ + "uv-count-down", + "uvui", + "uv-ui", + "countDown", + "倒计时" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-down/readme.md b/uni_modules/uv-count-down/readme.md new file mode 100644 index 0000000..0f326a8 --- /dev/null +++ b/uni_modules/uv-count-down/readme.md @@ -0,0 +1,11 @@ +## CountDown 倒计时 + +> **组件名:uv-count-down** + +该组件一般使用于某个活动的截止时间上,通过数字的变化,给用户明确的时间感受,提示用户进行某一个行为操作。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-count-to/changelog.md b/uni_modules/uv-count-to/changelog.md new file mode 100644 index 0000000..cf323f9 --- /dev/null +++ b/uni_modules/uv-count-to/changelog.md @@ -0,0 +1,13 @@ +## 1.0.4(2023-06-20) +1. 优化 +## 1.0.3(2023-06-20) +1. 修复继续滚动的函数 +2. 修复其他 +## 1.0.2(2023-06-20) +1. 适配px和rpx的单位 +2. 适配customStyle参数 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-count-to 数字滚动 diff --git a/uni_modules/uv-count-to/components/uv-count-to/props.js b/uni_modules/uv-count-to/components/uv-count-to/props.js new file mode 100644 index 0000000..498371a --- /dev/null +++ b/uni_modules/uv-count-to/components/uv-count-to/props.js @@ -0,0 +1,60 @@ +export default { + props: { + // 开始的数值,默认从0增长到某一个数 + startVal: { + type: [String, Number], + default: 0 + }, + // 要滚动的目标数值,必须 + endVal: { + type: [String, Number], + default: 0 + }, + // 滚动到目标数值的动画持续时间,单位为毫秒(ms) + duration: { + type: [String, Number], + default: 2000 + }, + // 设置数值后是否自动开始滚动 + autoplay: { + type: Boolean, + default: true + }, + // 要显示的小数位数 + decimals: { + type: [String, Number], + default: 0 + }, + // 是否在即将到达目标数值的时候,使用缓慢滚动的效果 + useEasing: { + type: Boolean, + default: true + }, + // 十进制分割 + decimal: { + type: [String, Number], + default: '.' + }, + // 字体颜色 + color: { + type: String, + default: '#606266' + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 22 + }, + // 是否加粗字体 + bold: { + type: Boolean, + default: false + }, + // 千位分隔符,类似金额的分割(¥23,321.05中的",") + separator: { + type: String, + default: '' + }, + ...uni.$uv?.props?.countTo + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-to/components/uv-count-to/uv-count-to.vue b/uni_modules/uv-count-to/components/uv-count-to/uv-count-to.vue new file mode 100644 index 0000000..5f34167 --- /dev/null +++ b/uni_modules/uv-count-to/components/uv-count-to/uv-count-to.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/uni_modules/uv-count-to/package.json b/uni_modules/uv-count-to/package.json new file mode 100644 index 0000000..1ed07dc --- /dev/null +++ b/uni_modules/uv-count-to/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-count-to", + "displayName": "uv-count-to 数字滚动 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.4", + "description": "该数字滚动组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值,一种数字上升的视觉冲击效果。", + "keywords": [ + "countTo", + "uvui", + "uv-ui", + "数字滚动", + "数字变化" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-to/readme.md b/uni_modules/uv-count-to/readme.md new file mode 100644 index 0000000..5d5f996 --- /dev/null +++ b/uni_modules/uv-count-to/readme.md @@ -0,0 +1,11 @@ +## CountTo 数字滚动 + +> **组件名:uv-count-to** + +该组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-datetime-picker/changelog.md b/uni_modules/uv-datetime-picker/changelog.md new file mode 100644 index 0000000..c56eabd --- /dev/null +++ b/uni_modules/uv-datetime-picker/changelog.md @@ -0,0 +1,34 @@ +## 1.0.15(2024-06-14) +1. 修复上次更改引出的BUG +## 1.0.14(2024-05-31) +1. 修复设置maxDate后存在选择不准确的BUG +## 1.0.13(2024-03-22) +1. 修复VUE3中出现的BUG +## 1.0.12(2023-11-27) +1. 增加round圆角属性 +## 1.0.11(2023-10-11) +1. 修复设置minDate出现选择错乱的BUG +## 1.0.10(2023-09-01) +1. 增加clearDate参数,是否清除上次选择,默认false +## 1.0.9(2023-08-31) +1. 增加mode="year",方便只选择年 +## 1.0.8(2023-07-17) +1. 优化文档 +2. 优化其他 +## 1.0.7(2023-07-13) +1. 修复 uv-datetime-picker 设置value属性不生效的BUG +## 1.0.6(2023-07-05) +修复vue3模式下,动态修改v-model绑定的值无效的BUG +## 1.0.5(2023-07-02) +uv-datetime-picker 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/datetimePicker.html +## 1.0.4(2023-06-29) +1. 修复抖音小程序报错的BUG +## 1.0.3(2023-06-07) +1. 取消defaultIndex参数,传该值没实际意义,后续更新文档 +## 1.0.2(2023-06-02) +1. 修复v-model重新赋值不更新的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-datetime-picker 时间选择器 diff --git a/uni_modules/uv-datetime-picker/components/uv-datetime-picker/props.js b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/props.js new file mode 100644 index 0000000..6031d84 --- /dev/null +++ b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/props.js @@ -0,0 +1,130 @@ +export default { + props: { + value: { + type: [String, Number], + default: '' + }, + modelValue: { + type: [String, Number], + default: '' + }, + // 是否打开组件 + show: { + type: Boolean, + default: false + }, + // 是否展示顶部的操作栏 + showToolbar: { + type: Boolean, + default: true + }, + // 顶部标题 + title: { + type: String, + default: '' + }, + // 展示格式,mode=date为日期选择,mode=time为时间选择,mode=year-month为年月选择,mode=datetime为日期时间选择 + mode: { + type: String, + default: 'datetime' + }, + // 可选的最大时间 + maxDate: { + type: Number, + // 最大默认值为后10年 + default: new Date(new Date().getFullYear() + 10, 0, 1).getTime() + }, + // 可选的最小时间 + minDate: { + type: Number, + // 最小默认值为前10年 + default: new Date(new Date().getFullYear() - 10, 0, 1).getTime() + }, + // 可选的最小小时,仅mode=time有效 + minHour: { + type: Number, + default: 0 + }, + // 可选的最大小时,仅mode=time有效 + maxHour: { + type: Number, + default: 23 + }, + // 可选的最小分钟,仅mode=time有效 + minMinute: { + type: Number, + default: 0 + }, + // 可选的最大分钟,仅mode=time有效 + maxMinute: { + type: Number, + default: 59 + }, + // 选项过滤函数 + filter: { + type: [Function, null], + default: null + }, + // 选项格式化函数 + formatter: { + type: [Function, null], + default: null + }, + // 是否显示加载中状态 + loading: { + type: Boolean, + default: false + }, + // 各列中,单个选项的高度 + itemHeight: { + type: [String, Number], + default: 44 + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: '取消' + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: '确认' + }, + // 取消按钮的颜色 + cancelColor: { + type: String, + default: '#909193' + }, + // 确认按钮的颜色 + confirmColor: { + type: String, + default: '#3c9cff' + }, + // 每列中可见选项的数量 + visibleItemCount: { + type: [String, Number], + default: 5 + }, + // 是否允许点击遮罩关闭选择器 + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 是否允许点击确认关闭选择器 + closeOnClickConfirm: { + type: Boolean, + default: true + }, + // 是否清空上次选择内容 + clearDate: { + type: Boolean, + default: false + }, + // 圆角 + round: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.datetimePicker + } +} \ No newline at end of file diff --git a/uni_modules/uv-datetime-picker/components/uv-datetime-picker/uv-datetime-picker.vue b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/uv-datetime-picker.vue new file mode 100644 index 0000000..d45c822 --- /dev/null +++ b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/uv-datetime-picker.vue @@ -0,0 +1,360 @@ + + \ No newline at end of file diff --git a/uni_modules/uv-datetime-picker/package.json b/uni_modules/uv-datetime-picker/package.json new file mode 100644 index 0000000..a2415b1 --- /dev/null +++ b/uni_modules/uv-datetime-picker/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-datetime-picker", + "displayName": "uv-datetime-picker 时间选择器 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.15", + "description": "时间选择器组件用于时间日期,主要用于年月日时分的选择,具体选择的精确度由参数控制。", + "keywords": [ + "datetime-picker", + "uvui", + "uv-ui", + "datetime", + "时间选择" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-picker" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-datetime-picker/readme.md b/uni_modules/uv-datetime-picker/readme.md new file mode 100644 index 0000000..0db9d9c --- /dev/null +++ b/uni_modules/uv-datetime-picker/readme.md @@ -0,0 +1,19 @@ +## DatetimePicker 时间选择器 + +> **组件名:uv-datetime-picker** + +此选择器用于时间日期,主要用于年月日时分的选择,具体选择的精确度由参数控制。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-divider/changelog.md b/uni_modules/uv-divider/changelog.md new file mode 100644 index 0000000..9ff8c52 --- /dev/null +++ b/uni_modules/uv-divider/changelog.md @@ -0,0 +1,11 @@ +## 1.0.4(2023-12-06) +1. 优化 +## 1.0.3(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.2(2023-06-01) +1. 修复点击触发两次事件的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-divider 分割线 diff --git a/uni_modules/uv-divider/components/uv-divider/props.js b/uni_modules/uv-divider/components/uv-divider/props.js new file mode 100644 index 0000000..7b97c2c --- /dev/null +++ b/uni_modules/uv-divider/components/uv-divider/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 是否虚线 + dashed: { + type: Boolean, + default: false + }, + // 是否细线 + hairline: { + type: Boolean, + default: true + }, + // 是否以点替代文字,优先于text字段起作用 + dot: { + type: Boolean, + default: false + }, + // 内容文本的位置,left-左边,center-中间,right-右边 + textPosition: { + type: String, + default: 'center' + }, + // 文本内容 + text: { + type: [String, Number], + default: '' + }, + // 文本大小 + textSize: { + type: [String, Number], + default: 14 + }, + // 文本颜色 + textColor: { + type: String, + default: '#909399' + }, + // 线条颜色 + lineColor: { + type: String, + default: '#dcdfe6' + }, + ...uni.$uv?.props?.divider + } +} \ No newline at end of file diff --git a/uni_modules/uv-divider/components/uv-divider/uv-divider.vue b/uni_modules/uv-divider/components/uv-divider/uv-divider.vue new file mode 100644 index 0000000..ba0dfa7 --- /dev/null +++ b/uni_modules/uv-divider/components/uv-divider/uv-divider.vue @@ -0,0 +1,113 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-divider/package.json b/uni_modules/uv-divider/package.json new file mode 100644 index 0000000..a54b458 --- /dev/null +++ b/uni_modules/uv-divider/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-divider", + "displayName": "uv-divider 分割线 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.4", + "description": "区隔内容的分割线,一般用于页面底部没有更多的提示。", + "keywords": [ + "divider", + "uvui", + "uv-ui", + "分割线", + "没有更多" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-line" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-divider/readme.md b/uni_modules/uv-divider/readme.md new file mode 100644 index 0000000..2384cba --- /dev/null +++ b/uni_modules/uv-divider/readme.md @@ -0,0 +1,11 @@ +## Divider 分割线 + +> **组件名:uv-divider** + +区隔内容的分割线,一般用于页面底部"没有更多"的提示。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-drop-down/changelog.md b/uni_modules/uv-drop-down/changelog.md new file mode 100644 index 0000000..637c605 --- /dev/null +++ b/uni_modules/uv-drop-down/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2024-01-02) +1. 修复parentData不变的BUG +## 1.0.4(2023-09-28) +1. 增加uv-sticky依赖 +## 1.0.3(2023-08-29) +1. 修复自定义内容,点击自定义内容时会自动关闭弹窗的问题 +## 1.0.2(2023-08-22) +1. 优化 +## 1.0.1(2023-08-22) +1. 增加@change回调,返回弹窗关闭状态 +2. 增加init方法,方便位置改变进行调整 +## 1.0.0(2023-07-30) +新增uv-drop-down 下拉筛选组件 diff --git a/uni_modules/uv-drop-down/components/uv-drop-down-item/uv-drop-down-item.vue b/uni_modules/uv-drop-down/components/uv-drop-down-item/uv-drop-down-item.vue new file mode 100644 index 0000000..9438a57 --- /dev/null +++ b/uni_modules/uv-drop-down/components/uv-drop-down-item/uv-drop-down-item.vue @@ -0,0 +1,169 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-drop-down/components/uv-drop-down-popup/uv-drop-down-popup.vue b/uni_modules/uv-drop-down/components/uv-drop-down-popup/uv-drop-down-popup.vue new file mode 100644 index 0000000..6a1efc8 --- /dev/null +++ b/uni_modules/uv-drop-down/components/uv-drop-down-popup/uv-drop-down-popup.vue @@ -0,0 +1,242 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-drop-down/components/uv-drop-down/uv-drop-down.vue b/uni_modules/uv-drop-down/components/uv-drop-down/uv-drop-down.vue new file mode 100644 index 0000000..9978b40 --- /dev/null +++ b/uni_modules/uv-drop-down/components/uv-drop-down/uv-drop-down.vue @@ -0,0 +1,135 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-drop-down/package.json b/uni_modules/uv-drop-down/package.json new file mode 100644 index 0000000..f4ad683 --- /dev/null +++ b/uni_modules/uv-drop-down/package.json @@ -0,0 +1,91 @@ +{ + "id": "uv-drop-down", + "displayName": "uv-drop-down 下拉筛选 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "该组件主要提供筛选下拉筛选框,内置基础筛选功能,可以根据自己的需求自定义筛选项", + "keywords": [ + "uv-drop-down", + "uvui", + "uv-ui", + "下拉筛选", + "筛选" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-text", + "uv-transition", + "uv-sticky" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-drop-down/readme.md b/uni_modules/uv-drop-down/readme.md new file mode 100644 index 0000000..31cbd24 --- /dev/null +++ b/uni_modules/uv-drop-down/readme.md @@ -0,0 +1,23 @@ +## DropDown 下拉筛选 + +> **组件名:uv-drop-down** + +该组件主要提供筛选下拉筛选框,内置基础筛选功能,可以根据自己的需求自定义筛选项。 + +为了兼容app-nvue,需要内置三个组件进行配合使用,uv-drop-down属于菜单项(其实还包括子组件uv-drop-down-item),uv-drop-down-popup属于筛选框。 + +只需要做简单的约定式配置,即可使用该功能,兼容性良好,已经在多端进行了多次测试。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-empty/changelog.md b/uni_modules/uv-empty/changelog.md new file mode 100644 index 0000000..a1cc2ad --- /dev/null +++ b/uni_modules/uv-empty/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-12-20) +1. 优化 +## 1.0.4(2023-08-04) +1. icon支持base64图片 +## 1.0.3(2023-07-17) +1. 修复 uv-empty 恢复设置mode属性的内置图标 +## 1.0.2(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-empty 内容为空 diff --git a/uni_modules/uv-empty/components/uv-empty/props.js b/uni_modules/uv-empty/components/uv-empty/props.js new file mode 100644 index 0000000..26c282d --- /dev/null +++ b/uni_modules/uv-empty/components/uv-empty/props.js @@ -0,0 +1,60 @@ +export default { + props: { + // 内置图标名称,或图片路径,建议绝对路径 + icon: { + type: String, + default: '' + }, + // 提示文字 + text: { + type: String, + default: '' + }, + // 文字颜色 + textColor: { + type: String, + default: '#c0c4cc' + }, + // 文字大小 + textSize: { + type: [String, Number], + default: 14 + }, + // 图标的颜色 + iconColor: { + type: String, + default: '#c0c4cc' + }, + // 图标的大小 + iconSize: { + type: [String, Number], + default: 90 + }, + // 选择预置的图标类型 + mode: { + type: String, + default: 'data' + }, + // 图标宽度,单位px + width: { + type: [String, Number], + default: 160 + }, + // 图标高度,单位px + height: { + type: [String, Number], + default: 160 + }, + // 是否显示组件 + show: { + type: Boolean, + default: true + }, + // 组件距离上一个元素之间的距离,默认px单位 + marginTop: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.empty + } +} \ No newline at end of file diff --git a/uni_modules/uv-empty/components/uv-empty/uv-empty.vue b/uni_modules/uv-empty/components/uv-empty/uv-empty.vue new file mode 100644 index 0000000..22a9264 --- /dev/null +++ b/uni_modules/uv-empty/components/uv-empty/uv-empty.vue @@ -0,0 +1,126 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-empty/package.json b/uni_modules/uv-empty/package.json new file mode 100644 index 0000000..e10f451 --- /dev/null +++ b/uni_modules/uv-empty/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-empty", + "displayName": "uv-empty 内容为空 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "该组件用于需要加载内容,但是加载的第一页数据就为空,提示一个 没有内容 的场景, 我们精心挑选了十几个场景的图标,方便您使用。", + "keywords": [ + "empty", + "uvui", + "uv-ui", + "空数据", + "暂无数据" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-empty/readme.md b/uni_modules/uv-empty/readme.md new file mode 100644 index 0000000..ecef14d --- /dev/null +++ b/uni_modules/uv-empty/readme.md @@ -0,0 +1,19 @@ +## Empty 内容为空 + +> **组件名:uv-empty** + +该组件用于需要加载内容,但是加载的第一页数据就为空,提示一个"没有内容"的场景, 我们精心挑选了十几个场景的图标,方便您使用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-form/changelog.md b/uni_modules/uv-form/changelog.md new file mode 100644 index 0000000..b229bca --- /dev/null +++ b/uni_modules/uv-form/changelog.md @@ -0,0 +1,23 @@ +## 1.0.9(2023-08-14) +1. 修复设置labelWidth属性时,节点渲染有闪动的BUG +## 1.0.8(2023-08-13) +1. 修复未设置rules的情况下报错的BUG +2. 优化错误提示 +## 1.0.7(2023-08-10) +1. 修复在vue3+setup语法糖中错误文字动画错乱 +## 1.0.6(2023-07-17) +1. 优化文档 +2. 优化其他 +## 1.0.5(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.4(2023-07-02) +uv-form 由于弹出层uv-transition的修改,组件内部做了相应的修改,参数不变。 +## 1.0.3(2023-06-18) +1. 修改某些情况下的BUG +## 1.0.2(2023-06-15) +1. 修复支付宝报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-form 表单 diff --git a/uni_modules/uv-form/components/uv-form-item/props.js b/uni_modules/uv-form/components/uv-form-item/props.js new file mode 100644 index 0000000..00a26bc --- /dev/null +++ b/uni_modules/uv-form/components/uv-form-item/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // input的label提示语 + label: { + type: String, + default: '' + }, + // 绑定的值 + prop: { + type: String, + default: '' + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: [Boolean], + default: false + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: '' + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: '' + }, + // 右侧图标 + rightIcon: { + type: String, + default: '' + }, + // 左侧图标 + leftIcon: { + type: String, + default: '' + }, + // 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置 + required: { + type: Boolean, + default: false + }, + leftIconStyle: { + type: [String, Object], + default: '' + }, + ...uni.$uv?.props?.formItem + } +} \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form-item/uv-form-item.vue b/uni_modules/uv-form/components/uv-form-item/uv-form-item.vue new file mode 100644 index 0000000..25d93ea --- /dev/null +++ b/uni_modules/uv-form/components/uv-form-item/uv-form-item.vue @@ -0,0 +1,226 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form/props.js b/uni_modules/uv-form/components/uv-form/props.js new file mode 100644 index 0000000..6cffb95 --- /dev/null +++ b/uni_modules/uv-form/components/uv-form/props.js @@ -0,0 +1,46 @@ +export default { + props: { + // 当前form的需要验证字段的集合 + model: { + type: Object, + default: () => ({}) + }, + // 验证规则 + rules: { + type: [Object, Function, Array], + default: () => ({}) + }, + // 有错误时的提示方式,message-提示信息,toast-进行toast提示 + // border-bottom-下边框呈现红色,none-无提示 + errorType: { + type: String, + default: 'message' + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: Boolean, + default: true + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: 'left' + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: 45 + }, + // lable字体的对齐方式 + labelAlign: { + type: String, + default: 'left' + }, + // lable的样式,对象形式 + labelStyle: { + type: Object, + default: () => ({}) + }, + ...uni.$uv?.props?.form + } +} \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form/uv-form.vue b/uni_modules/uv-form/components/uv-form/uv-form.vue new file mode 100644 index 0000000..bc0876f --- /dev/null +++ b/uni_modules/uv-form/components/uv-form/uv-form.vue @@ -0,0 +1,209 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form/valid.js b/uni_modules/uv-form/components/uv-form/valid.js new file mode 100644 index 0000000..9e114df --- /dev/null +++ b/uni_modules/uv-form/components/uv-form/valid.js @@ -0,0 +1,1343 @@ +function _extends() { + _extends = Object.assign || function (target) { + for (let i = 1; i < arguments.length; i++) { + const source = arguments[i] + + for (const key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target + } + + return _extends.apply(this, arguments) +} + +/* eslint no-console:0 */ +const formatRegExp = /%[sdj%]/g +let warning = function warning() {} // don't print warning message when in production env or node runtime + +if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window + !== 'undefined' && typeof document !== 'undefined') { + warning = function warning(type, errors) { + if (typeof console !== 'undefined' && console.warn) { + if (errors.every((e) => typeof e === 'string')) { + console.warn(type, errors) + } + } + } +} + +function convertFieldsError(errors) { + if (!errors || !errors.length) return null + const fields = {} + errors.forEach((error) => { + const { field } = error + fields[field] = fields[field] || [] + fields[field].push(error) + }) + return fields +} + +function format() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key] + } + + let i = 1 + const f = args[0] + const len = args.length + + if (typeof f === 'function') { + return f.apply(null, args.slice(1)) + } + + if (typeof f === 'string') { + let str = String(f).replace(formatRegExp, (x) => { + if (x === '%%') { + return '%' + } + + if (i >= len) { + return x + } + + switch (x) { + case '%s': + return String(args[i++]) + + case '%d': + return Number(args[i++]) + + case '%j': + try { + return JSON.stringify(args[i++]) + } catch (_) { + return '[Circular]' + } + + break + + default: + return x + } + }) + + for (let arg = args[i]; i < len; arg = args[++i]) { + str += ` ${arg}` + } + + return str + } + + return f +} + +function isNativeStringType(type) { + return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern' +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true + } + + if (type === 'array' && Array.isArray(value) && !value.length) { + return true + } + + if (isNativeStringType(type) && typeof value === 'string' && !value) { + return true + } + + return false +} + +function asyncParallelArray(arr, func, callback) { + const results = [] + let total = 0 + const arrLength = arr.length + + function count(errors) { + results.push.apply(results, errors) + total++ + + if (total === arrLength) { + callback(results) + } + } + + arr.forEach((a) => { + func(a, count) + }) +} + +function asyncSerialArray(arr, func, callback) { + let index = 0 + const arrLength = arr.length + + function next(errors) { + if (errors && errors.length) { + callback(errors) + return + } + + const original = index + index += 1 + + if (original < arrLength) { + func(arr[original], next) + } else { + callback([]) + } + } + + next([]) +} + +function flattenObjArr(objArr) { + const ret = [] + Object.keys(objArr).forEach((k) => { + ret.push.apply(ret, objArr[k]) + }) + return ret +} + +function asyncMap(objArr, option, func, callback) { + if (option.first) { + const _pending = new Promise((resolve, reject) => { + const next = function next(errors) { + callback(errors) + return errors.length ? reject({ + errors, + fields: convertFieldsError(errors) + }) : resolve() + } + + const flattenArr = flattenObjArr(objArr) + asyncSerialArray(flattenArr, func, next) + }) + + _pending.catch((e) => e) + + return _pending + } + + let firstFields = option.firstFields || [] + + if (firstFields === true) { + firstFields = Object.keys(objArr) + } + + const objArrKeys = Object.keys(objArr) + const objArrLength = objArrKeys.length + let total = 0 + const results = [] + const pending = new Promise((resolve, reject) => { + const next = function next(errors) { + results.push.apply(results, errors) + total++ + + if (total === objArrLength) { + callback(results) + return results.length ? reject({ + errors: results, + fields: convertFieldsError(results) + }) : resolve() + } + } + + if (!objArrKeys.length) { + callback(results) + resolve() + } + + objArrKeys.forEach((key) => { + const arr = objArr[key] + + if (firstFields.indexOf(key) !== -1) { + asyncSerialArray(arr, func, next) + } else { + asyncParallelArray(arr, func, next) + } + }) + }) + pending.catch((e) => e) + return pending +} + +function complementError(rule) { + return function (oe) { + if (oe && oe.message) { + oe.field = oe.field || rule.fullField + return oe + } + + return { + message: typeof oe === 'function' ? oe() : oe, + field: oe.field || rule.fullField + } + } +} + +function deepMerge(target, source) { + if (source) { + for (const s in source) { + if (source.hasOwnProperty(s)) { + const value = source[s] + + if (typeof value === 'object' && typeof target[s] === 'object') { + target[s] = { ...target[s], ...value } + } else { + target[s] = value + } + } + } + } + + return target +} + +/** + * Rule for validating required fields. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function required(rule, value, source, errors, options, type) { + if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) { + errors.push(format(options.messages.required, rule.fullField)) + } +} + +/** + * Rule for validating whitespace. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function whitespace(rule, value, source, errors, options) { + if (/^\s+$/.test(value) || value === '') { + errors.push(format(options.messages.whitespace, rule.fullField)) + } +} + +/* eslint max-len:0 */ + +const pattern = { + // http://emailregex.com/ + email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, + url: new RegExp( + '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', + 'i' + ), + hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i +} +var types = { + integer: function integer(value) { + return /^(-)?\d+$/.test(value); + }, + float: function float(value) { + return /^(-)?\d+(\.\d+)?$/.test(value); + }, + array: function array(value) { + return Array.isArray(value) + }, + regexp: function regexp(value) { + if (value instanceof RegExp) { + return true + } + + try { + return !!new RegExp(value) + } catch (e) { + return false + } + }, + date: function date(value) { + return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear + === 'function' + }, + number: function number(value) { + if (isNaN(value)) { + return false + } + + // 修改源码,将字符串数值先转为数值 + return typeof +value === 'number' + }, + object: function object(value) { + return typeof value === 'object' && !types.array(value) + }, + method: function method(value) { + return typeof value === 'function' + }, + email: function email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255 + }, + url: function url(value) { + return typeof value === 'string' && !!value.match(pattern.url) + }, + hex: function hex(value) { + return typeof value === 'string' && !!value.match(pattern.hex) + } +} +/** + * Rule for validating the type of a value. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function type(rule, value, source, errors, options) { + if (rule.required && value === undefined) { + required(rule, value, source, errors, options) + return + } + + const custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'] + const ruleType = rule.type + + if (custom.indexOf(ruleType) > -1) { + if (!types[ruleType](value)) { + errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) + } // straight typeof check + } else if (ruleType && typeof value !== rule.type) { + errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) + } +} + +/** + * Rule for validating minimum and maximum allowed values. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function range(rule, value, source, errors, options) { + const len = typeof rule.len === 'number' + const min = typeof rule.min === 'number' + const max = typeof rule.max === 'number' // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane) + + const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g + let val = value + let key = null + const num = typeof value === 'number' + const str = typeof value === 'string' + const arr = Array.isArray(value) + + if (num) { + key = 'number' + } else if (str) { + key = 'string' + } else if (arr) { + key = 'array' + } // if the value is not of a supported type for range validation + // the validation rule rule should use the + // type property to also test for a particular type + + if (!key) { + return false + } + + if (arr) { + val = value.length + } + + if (str) { + // 处理码点大于U+010000的文字length属性不准确的bug,如"𠮷𠮷𠮷".lenght !== 3 + val = value.replace(spRegexp, '_').length + } + + if (len) { + if (val !== rule.len) { + errors.push(format(options.messages[key].len, rule.fullField, rule.len)) + } + } else if (min && !max && val < rule.min) { + errors.push(format(options.messages[key].min, rule.fullField, rule.min)) + } else if (max && !min && val > rule.max) { + errors.push(format(options.messages[key].max, rule.fullField, rule.max)) + } else if (min && max && (val < rule.min || val > rule.max)) { + errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max)) + } +} + +const ENUM = 'enum' +/** + * Rule for validating a value exists in an enumerable list. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function enumerable(rule, value, source, errors, options) { + rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [] + + if (rule[ENUM].indexOf(value) === -1) { + errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', '))) + } +} + +/** + * Rule for validating a regular expression pattern. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function pattern$1(rule, value, source, errors, options) { + if (rule.pattern) { + if (rule.pattern instanceof RegExp) { + // if a RegExp instance is passed, reset `lastIndex` in case its `global` + // flag is accidentally set to `true`, which in a validation scenario + // is not necessary and the result might be misleading + rule.pattern.lastIndex = 0 + + if (!rule.pattern.test(value)) { + errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)) + } + } else if (typeof rule.pattern === 'string') { + const _pattern = new RegExp(rule.pattern) + + if (!_pattern.test(value)) { + errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)) + } + } + } +} + +const rules = { + required, + whitespace, + type, + range, + enum: enumerable, + pattern: pattern$1 +} + +/** + * Performs validation for string types. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function string(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'string') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, 'string') + + if (!isEmptyValue(value, 'string')) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + rules.pattern(rule, value, source, errors, options) + + if (rule.whitespace === true) { + rules.whitespace(rule, value, source, errors, options) + } + } + } + + callback(errors) +} + +/** + * Validates a function. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function method(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function number(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (value === '') { + value = undefined + } + + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a boolean. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function _boolean(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates the regular expression type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function regexp(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value)) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number is an integer. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function integer(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number is a floating point number. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function floatFn(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates an array. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function array(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'array') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, 'array') + + if (!isEmptyValue(value, 'array')) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates an object. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function object(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +const ENUM$1 = 'enum' +/** + * Validates an enumerable list. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function enumerable$1(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules[ENUM$1](rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a regular expression pattern. + * + * Performs validation when a rule only contains + * a pattern property but is not declared as a string type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function pattern$2(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'string') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value, 'string')) { + rules.pattern(rule, value, source, errors, options) + } + } + + callback(errors) +} + +function date(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value)) { + let dateObject + + if (typeof value === 'number') { + dateObject = new Date(value) + } else { + dateObject = value + } + + rules.type(rule, dateObject, source, errors, options) + + if (dateObject) { + rules.range(rule, dateObject.getTime(), source, errors, options) + } + } + } + + callback(errors) +} + +function required$1(rule, value, callback, source, options) { + const errors = [] + const type = Array.isArray(value) ? 'array' : typeof value + rules.required(rule, value, source, errors, options, type) + callback(errors) +} + +function type$1(rule, value, callback, source, options) { + const ruleType = rule.type + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, ruleType) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, ruleType) + + if (!isEmptyValue(value, ruleType)) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Performs validation for any type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function any(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + } + + callback(errors) +} + +const validators = { + string, + method, + number, + boolean: _boolean, + regexp, + integer, + float: floatFn, + array, + object, + enum: enumerable$1, + pattern: pattern$2, + date, + url: type$1, + hex: type$1, + email: type$1, + required: required$1, + any +} + +function newMessages() { + return { + default: 'Validation error on field %s', + required: '%s is required', + enum: '%s must be one of %s', + whitespace: '%s cannot be empty', + date: { + format: '%s date %s is invalid for format %s', + parse: '%s date could not be parsed, %s is invalid ', + invalid: '%s date %s is invalid' + }, + types: { + string: '%s is not a %s', + method: '%s is not a %s (function)', + array: '%s is not an %s', + object: '%s is not an %s', + number: '%s is not a %s', + date: '%s is not a %s', + boolean: '%s is not a %s', + integer: '%s is not an %s', + float: '%s is not a %s', + regexp: '%s is not a valid %s', + email: '%s is not a valid %s', + url: '%s is not a valid %s', + hex: '%s is not a valid %s' + }, + string: { + len: '%s must be exactly %s characters', + min: '%s must be at least %s characters', + max: '%s cannot be longer than %s characters', + range: '%s must be between %s and %s characters' + }, + number: { + len: '%s must equal %s', + min: '%s cannot be less than %s', + max: '%s cannot be greater than %s', + range: '%s must be between %s and %s' + }, + array: { + len: '%s must be exactly %s in length', + min: '%s cannot be less than %s in length', + max: '%s cannot be greater than %s in length', + range: '%s must be between %s and %s in length' + }, + pattern: { + mismatch: '%s value %s does not match pattern %s' + }, + clone: function clone() { + const cloned = JSON.parse(JSON.stringify(this)) + cloned.clone = this.clone + return cloned + } + } +} +const messages = newMessages() + +/** + * Encapsulates a validation schema. + * + * @param descriptor An object declaring validation rules + * for this schema. + */ + +function Schema(descriptor) { + this.rules = null + this._messages = messages + this.define(descriptor) +} + +Schema.prototype = { + messages: function messages(_messages) { + if (_messages) { + this._messages = deepMerge(newMessages(), _messages) + } + + return this._messages + }, + define: function define(rules) { + if (!rules) { + throw new Error('Cannot configure a schema with no rules') + } + + if (typeof rules !== 'object' || Array.isArray(rules)) { + throw new Error('Rules must be an object') + } + + this.rules = {} + let z + let item + + for (z in rules) { + if (rules.hasOwnProperty(z)) { + item = rules[z] + this.rules[z] = Array.isArray(item) ? item : [item] + } + } + }, + validate: function validate(source_, o, oc) { + const _this = this + + if (o === void 0) { + o = {} + } + + if (oc === void 0) { + oc = function oc() {} + } + + let source = source_ + let options = o + let callback = oc + + if (typeof options === 'function') { + callback = options + options = {} + } + + if (!this.rules || Object.keys(this.rules).length === 0) { + if (callback) { + callback() + } + + return Promise.resolve() + } + + function complete(results) { + let i + let errors = [] + let fields = {} + + function add(e) { + if (Array.isArray(e)) { + let _errors + + errors = (_errors = errors).concat.apply(_errors, e) + } else { + errors.push(e) + } + } + + for (i = 0; i < results.length; i++) { + add(results[i]) + } + + if (!errors.length) { + errors = null + fields = null + } else { + fields = convertFieldsError(errors) + } + + callback(errors, fields) + } + + if (options.messages) { + let messages$1 = this.messages() + + if (messages$1 === messages) { + messages$1 = newMessages() + } + + deepMerge(messages$1, options.messages) + options.messages = messages$1 + } else { + options.messages = this.messages() + } + + let arr + let value + const series = {} + const keys = options.keys || Object.keys(this.rules) + keys.forEach((z) => { + arr = _this.rules[z] + value = source[z] + arr.forEach((r) => { + let rule = r + + if (typeof rule.transform === 'function') { + if (source === source_) { + source = { ...source } + } + + value = source[z] = rule.transform(value) + } + + if (typeof rule === 'function') { + rule = { + validator: rule + } + } else { + rule = { ...rule } + } + + rule.validator = _this.getValidationMethod(rule) + rule.field = z + rule.fullField = rule.fullField || z + rule.type = _this.getType(rule) + + if (!rule.validator) { + return + } + + series[z] = series[z] || [] + series[z].push({ + rule, + value, + source, + field: z + }) + }) + }) + const errorFields = {} + return asyncMap(series, options, (data, doIt) => { + const { rule } = data + let deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField + === 'object') + deep = deep && (rule.required || !rule.required && data.value) + rule.field = data.field + + function addFullfield(key, schema) { + return { ...schema, fullField: `${rule.fullField}.${key}` } + } + + function cb(e) { + if (e === void 0) { + e = [] + } + + let errors = e + + if (!Array.isArray(errors)) { + errors = [errors] + } + + if (!options.suppressWarning && errors.length) { + Schema.warning('async-validator:', errors) + } + + if (errors.length && rule.message) { + errors = [].concat(rule.message) + } + + errors = errors.map(complementError(rule)) + + if (options.first && errors.length) { + errorFields[rule.field] = 1 + return doIt(errors) + } + + if (!deep) { + doIt(errors) + } else { + // if rule is required but the target object + // does not exist fail at the rule level and don't + // go deeper + if (rule.required && !data.value) { + if (rule.message) { + errors = [].concat(rule.message).map(complementError(rule)) + } else if (options.error) { + errors = [options.error(rule, format(options.messages.required, rule.field))] + } else { + errors = [] + } + + return doIt(errors) + } + + let fieldsSchema = {} + + if (rule.defaultField) { + for (const k in data.value) { + if (data.value.hasOwnProperty(k)) { + fieldsSchema[k] = rule.defaultField + } + } + } + + fieldsSchema = { ...fieldsSchema, ...data.rule.fields } + + for (const f in fieldsSchema) { + if (fieldsSchema.hasOwnProperty(f)) { + const fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]] + fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f)) + } + } + + const schema = new Schema(fieldsSchema) + schema.messages(options.messages) + + if (data.rule.options) { + data.rule.options.messages = options.messages + data.rule.options.error = options.error + } + + schema.validate(data.value, data.rule.options || options, (errs) => { + const finalErrors = [] + + if (errors && errors.length) { + finalErrors.push.apply(finalErrors, errors) + } + + if (errs && errs.length) { + finalErrors.push.apply(finalErrors, errs) + } + + doIt(finalErrors.length ? finalErrors : null) + }) + } + } + + let res + + if (rule.asyncValidator) { + res = rule.asyncValidator(rule, data.value, cb, data.source, options) + } else if (rule.validator) { + res = rule.validator(rule, data.value, cb, data.source, options) + + if (res === true) { + cb() + } else if (res === false) { + cb(rule.message || `${rule.field} fails`) + } else if (res instanceof Array) { + cb(res) + } else if (res instanceof Error) { + cb(res.message) + } + } + + if (res && res.then) { + res.then(() => cb(), (e) => cb(e)) + } + }, (results) => { + complete(results) + }) + }, + getType: function getType(rule) { + if (rule.type === undefined && rule.pattern instanceof RegExp) { + rule.type = 'pattern' + } + + if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) { + throw new Error(format('Unknown rule type %s', rule.type)) + } + + return rule.type || 'string' + }, + getValidationMethod: function getValidationMethod(rule) { + if (typeof rule.validator === 'function') { + return rule.validator + } + + const keys = Object.keys(rule) + const messageIndex = keys.indexOf('message') + + if (messageIndex !== -1) { + keys.splice(messageIndex, 1) + } + + if (keys.length === 1 && keys[0] === 'required') { + return validators.required + } + + return validators[this.getType(rule)] || false + } +} + +Schema.register = function register(type, validator) { + if (typeof validator !== 'function') { + throw new Error('Cannot register a validator by type, validator is not a function') + } + + validators[type] = validator +} + +Schema.warning = warning +Schema.messages = messages + +export default Schema +// # sourceMappingURL=index.js.map diff --git a/uni_modules/uv-form/package.json b/uni_modules/uv-form/package.json new file mode 100644 index 0000000..5e612c2 --- /dev/null +++ b/uni_modules/uv-form/package.json @@ -0,0 +1,93 @@ +{ + "id": "uv-form", + "displayName": "uv-form 表单 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.9", + "description": "此组件一般用于表单场景,可以配置Input输入框,Textarea文本域,Checkbox复选框,Radio单选框,开关选择器等,进行表单验证等。", + "keywords": [ + "form", + "uvui", + "uv-ui", + "表单", + "表单验证" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-line", + "uv-transition", + "uv-action-sheet", + "uv-input", + "uv-button" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-form/readme.md b/uni_modules/uv-form/readme.md new file mode 100644 index 0000000..0458a6a --- /dev/null +++ b/uni_modules/uv-form/readme.md @@ -0,0 +1,19 @@ +## Form 表单 + +> **组件名:uv-form** + +此组件一般用于表单场景,可以配置`Input`输入框,`Textarea`文本域,`Checkbox`复选框,`Radio`单选框,开关选择器等,进行表单验证等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-gap/changelog.md b/uni_modules/uv-gap/changelog.md new file mode 100644 index 0000000..7d603b4 --- /dev/null +++ b/uni_modules/uv-gap/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增间隔槽组件 diff --git a/uni_modules/uv-gap/components/uv-gap/props.js b/uni_modules/uv-gap/components/uv-gap/props.js new file mode 100644 index 0000000..0ad787c --- /dev/null +++ b/uni_modules/uv-gap/components/uv-gap/props.js @@ -0,0 +1,25 @@ +export default { + props: { + // 背景颜色(默认transparent) + bgColor: { + type: String, + default: 'transparent' + }, + // 分割槽高度,单位px(默认20) + height: { + type: [String, Number], + default: 20 + }, + // 与上一个组件的距离 + marginTop: { + type: [String, Number], + default: 0 + }, + // 与下一个组件的距离 + marginBottom: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.gap + } +} \ No newline at end of file diff --git a/uni_modules/uv-gap/components/uv-gap/uv-gap.vue b/uni_modules/uv-gap/components/uv-gap/uv-gap.vue new file mode 100644 index 0000000..55720a1 --- /dev/null +++ b/uni_modules/uv-gap/components/uv-gap/uv-gap.vue @@ -0,0 +1,36 @@ + + + diff --git a/uni_modules/uv-gap/package.json b/uni_modules/uv-gap/package.json new file mode 100644 index 0000000..3a17ec3 --- /dev/null +++ b/uni_modules/uv-gap/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-gap", + "displayName": "uv-gap 间隔槽 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "该组件一般用于内容块之间的用一个灰色块隔开的场景,方便用户风格统一,减少工作量。", + "keywords": [ + "gap", + "uvui", + "uv-ui", + "间隔槽", + "内容块" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-gap/readme.md b/uni_modules/uv-gap/readme.md new file mode 100644 index 0000000..dedd565 --- /dev/null +++ b/uni_modules/uv-gap/readme.md @@ -0,0 +1,12 @@ +## Gap 间隔槽 + +> **组件名:uv-gap** + +该组件一般用于内容块之间的用一个灰色块隔开的场景,方便用户风格统一,减少工作量。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 + diff --git a/uni_modules/uv-grid/changelog.md b/uni_modules/uv-grid/changelog.md new file mode 100644 index 0000000..8c61261 --- /dev/null +++ b/uni_modules/uv-grid/changelog.md @@ -0,0 +1,21 @@ +## 1.0.9(2023-12-06) +1. 优化 +## 1.0.8(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.7(2023-10-13) +1. unmounted兼容vue3 +## 1.0.6(2023-08-14) +1. 修复初始的时候闪动的BUG +## 1.0.5(2023-06-22) +1. 优化修改 +## 1.0.4(2023-06-21) +1. 修复BUG +## 1.0.3(2023-06-01) +1. 修复点击触发两次事件的BUG +## 1.0.2(2023-05-23) +1. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-grid 宫格布局 diff --git a/uni_modules/uv-grid/components/uv-grid-item/props.js b/uni_modules/uv-grid/components/uv-grid-item/props.js new file mode 100644 index 0000000..6b86298 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid-item/props.js @@ -0,0 +1,15 @@ +export default { + props: { + // 宫格的name + name: { + type: [String, Number, null], + default: null + }, + // 背景颜色 + bgColor: { + type: String, + default: 'transparent' + }, + ...uni.$uv?.props?.gridItem + } +} \ No newline at end of file diff --git a/uni_modules/uv-grid/components/uv-grid-item/uv-grid-item.vue b/uni_modules/uv-grid/components/uv-grid-item/uv-grid-item.vue new file mode 100644 index 0000000..9412852 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid-item/uv-grid-item.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/uni_modules/uv-grid/components/uv-grid/props.js b/uni_modules/uv-grid/components/uv-grid/props.js new file mode 100644 index 0000000..d5f8474 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid/props.js @@ -0,0 +1,20 @@ +export default { + props: { + // 分成几列 + col: { + type: [String, Number], + default: 3 + }, + // 是否显示边框 + border: { + type: Boolean, + default: false + }, + // 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右 + align: { + type: String, + default: 'left' + }, + ...uni.$uv?.props?.grid + } +} \ No newline at end of file diff --git a/uni_modules/uv-grid/components/uv-grid/uv-grid.vue b/uni_modules/uv-grid/components/uv-grid/uv-grid.vue new file mode 100644 index 0000000..0314b18 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid/uv-grid.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/uni_modules/uv-grid/package.json b/uni_modules/uv-grid/package.json new file mode 100644 index 0000000..0c93379 --- /dev/null +++ b/uni_modules/uv-grid/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-grid", + "displayName": "uv-grid 宫格布局 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.9", + "description": "uv-grid 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。", + "keywords": [ + "uv-grid", + "uvui", + "uv-ui", + "宫格布局", + "grid" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-grid/readme.md b/uni_modules/uv-grid/readme.md new file mode 100644 index 0000000..cd13cef --- /dev/null +++ b/uni_modules/uv-grid/readme.md @@ -0,0 +1,17 @@ +## Grid 宫格布局 + +> **组件名:uv-grid** + +宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。 + +# 查看文档 + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-icon/changelog.md b/uni_modules/uv-icon/changelog.md new file mode 100644 index 0000000..c610827 --- /dev/null +++ b/uni_modules/uv-icon/changelog.md @@ -0,0 +1,31 @@ +## 1.0.13(2023-12-06) +1. 优化 +## 1.0.12(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.11(2023-10-29) +1. imgMode默认值改成aspectFit +## 1.0.10(2023-08-13) +1. 优化nvue,方便自定义图标 +## 1.0.9(2023-07-28) +1. 修改几个对应错误图标的BUG +## 1.0.8(2023-07-24) +1. 优化 支持base64图片 +## 1.0.7(2023-07-17) +1. 修复 uv-icon 恢复uv-empty相关的图标 +## 1.0.6(2023-07-13) +1. 修复icon设置name属性对应图标错误的BUG +## 1.0.5(2023-07-04) +1. 更新图标,删除一些不常用的图标 +2. 删除base64,修改成ttf文件引入读取图标 +3. 自定义图标文档说明:https://www.uvui.cn/guide/customIcon.html +## 1.0.4(2023-07-03) +1. 修复主题颜色在APP不生效的BUG +## 1.0.3(2023-05-24) +1. 将线上ttf字体包替换成base64,避免加载时或者网络差时候显示白色方块 +## 1.0.2(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.1(2023-05-10) +1. 修复小程序中异常显示 +## 1.0.0(2023-05-04) +新发版 diff --git a/uni_modules/uv-icon/components/uv-icon/icons.js b/uni_modules/uv-icon/components/uv-icon/icons.js new file mode 100644 index 0000000..8469a2d --- /dev/null +++ b/uni_modules/uv-icon/components/uv-icon/icons.js @@ -0,0 +1,160 @@ +export default { + 'uvicon-level': 'e68f', + 'uvicon-checkbox-mark': 'e659', + 'uvicon-folder': 'e694', + 'uvicon-movie': 'e67c', + 'uvicon-star-fill': 'e61e', + 'uvicon-star': 'e618', + 'uvicon-phone-fill': 'e6ac', + 'uvicon-phone': 'e6ba', + 'uvicon-apple-fill': 'e635', + 'uvicon-backspace': 'e64d', + 'uvicon-attach': 'e640', + 'uvicon-empty-data': 'e671', + 'uvicon-empty-address': 'e68a', + 'uvicon-empty-favor': 'e662', + 'uvicon-empty-car': 'e657', + 'uvicon-empty-order': 'e66b', + 'uvicon-empty-list': 'e672', + 'uvicon-empty-search': 'e677', + 'uvicon-empty-permission': 'e67d', + 'uvicon-empty-news': 'e67e', + 'uvicon-empty-history': 'e685', + 'uvicon-empty-coupon': 'e69b', + 'uvicon-empty-page': 'e60e', + 'uvicon-empty-wifi-off': 'e6cc', + 'uvicon-reload': 'e627', + 'uvicon-order': 'e695', + 'uvicon-server-man': 'e601', + 'uvicon-search': 'e632', + 'uvicon-more-dot-fill': 'e66f', + 'uvicon-scan': 'e631', + 'uvicon-map': 'e665', + 'uvicon-map-fill': 'e6a8', + 'uvicon-tags': 'e621', + 'uvicon-tags-fill': 'e613', + 'uvicon-eye': 'e664', + 'uvicon-eye-fill': 'e697', + 'uvicon-eye-off': 'e69c', + 'uvicon-eye-off-outline': 'e688', + 'uvicon-mic': 'e66d', + 'uvicon-mic-off': 'e691', + 'uvicon-calendar': 'e65c', + 'uvicon-trash': 'e623', + 'uvicon-trash-fill': 'e6ce', + 'uvicon-play-left': 'e6bf', + 'uvicon-play-right': 'e6b3', + 'uvicon-minus': 'e614', + 'uvicon-plus': 'e625', + 'uvicon-info-circle': 'e69f', + 'uvicon-info-circle-fill': 'e6a7', + 'uvicon-question-circle': 'e622', + 'uvicon-question-circle-fill': 'e6bc', + 'uvicon-close': 'e65a', + 'uvicon-checkmark': 'e64a', + 'uvicon-checkmark-circle': 'e643', + 'uvicon-checkmark-circle-fill': 'e668', + 'uvicon-setting': 'e602', + 'uvicon-setting-fill': 'e6d0', + 'uvicon-heart': 'e6a2', + 'uvicon-heart-fill': 'e68b', + 'uvicon-camera': 'e642', + 'uvicon-camera-fill': 'e650', + 'uvicon-more-circle': 'e69e', + 'uvicon-more-circle-fill': 'e684', + 'uvicon-chat': 'e656', + 'uvicon-chat-fill': 'e63f', + 'uvicon-bag': 'e647', + 'uvicon-error-circle': 'e66e', + 'uvicon-error-circle-fill': 'e655', + 'uvicon-close-circle': 'e64e', + 'uvicon-close-circle-fill': 'e666', + 'uvicon-share': 'e629', + 'uvicon-share-fill': 'e6bb', + 'uvicon-share-square': 'e6c4', + 'uvicon-shopping-cart': 'e6cb', + 'uvicon-shopping-cart-fill': 'e630', + 'uvicon-bell': 'e651', + 'uvicon-bell-fill': 'e604', + 'uvicon-list': 'e690', + 'uvicon-list-dot': 'e6a9', + 'uvicon-zhifubao-circle-fill': 'e617', + 'uvicon-weixin-circle-fill': 'e6cd', + 'uvicon-weixin-fill': 'e620', + 'uvicon-qq-fill': 'e608', + 'uvicon-qq-circle-fill': 'e6b9', + 'uvicon-moments-circel-fill': 'e6c2', + 'uvicon-moments': 'e6a0', + 'uvicon-car': 'e64f', + 'uvicon-car-fill': 'e648', + 'uvicon-warning-fill': 'e6c7', + 'uvicon-warning': 'e6c1', + 'uvicon-clock-fill': 'e64b', + 'uvicon-clock': 'e66c', + 'uvicon-edit-pen': 'e65d', + 'uvicon-edit-pen-fill': 'e679', + 'uvicon-email': 'e673', + 'uvicon-email-fill': 'e683', + 'uvicon-minus-circle': 'e6a5', + 'uvicon-plus-circle': 'e603', + 'uvicon-plus-circle-fill': 'e611', + 'uvicon-file-text': 'e687', + 'uvicon-file-text-fill': 'e67f', + 'uvicon-pushpin': 'e6d1', + 'uvicon-pushpin-fill': 'e6b6', + 'uvicon-grid': 'e68c', + 'uvicon-grid-fill': 'e698', + 'uvicon-play-circle': 'e6af', + 'uvicon-play-circle-fill': 'e62a', + 'uvicon-pause-circle-fill': 'e60c', + 'uvicon-pause': 'e61c', + 'uvicon-pause-circle': 'e696', + 'uvicon-gift-fill': 'e6b0', + 'uvicon-gift': 'e680', + 'uvicon-kefu-ermai': 'e660', + 'uvicon-server-fill': 'e610', + 'uvicon-coupon-fill': 'e64c', + 'uvicon-coupon': 'e65f', + 'uvicon-integral': 'e693', + 'uvicon-integral-fill': 'e6b1', + 'uvicon-home-fill': 'e68e', + 'uvicon-home': 'e67b', + 'uvicon-account': 'e63a', + 'uvicon-account-fill': 'e653', + 'uvicon-thumb-down-fill': 'e628', + 'uvicon-thumb-down': 'e60a', + 'uvicon-thumb-up': 'e612', + 'uvicon-thumb-up-fill': 'e62c', + 'uvicon-lock-fill': 'e6a6', + 'uvicon-lock-open': 'e68d', + 'uvicon-lock-opened-fill': 'e6a1', + 'uvicon-lock': 'e69d', + 'uvicon-red-packet': 'e6c3', + 'uvicon-photo-fill': 'e6b4', + 'uvicon-photo': 'e60d', + 'uvicon-volume-off-fill': 'e6c8', + 'uvicon-volume-off': 'e6bd', + 'uvicon-volume-fill': 'e624', + 'uvicon-volume': 'e605', + 'uvicon-download': 'e670', + 'uvicon-arrow-up-fill': 'e636', + 'uvicon-arrow-down-fill': 'e638', + 'uvicon-play-left-fill': 'e6ae', + 'uvicon-play-right-fill': 'e6ad', + 'uvicon-arrow-downward': 'e634', + 'uvicon-arrow-leftward': 'e63b', + 'uvicon-arrow-rightward': 'e644', + 'uvicon-arrow-upward': 'e641', + 'uvicon-arrow-down': 'e63e', + 'uvicon-arrow-right': 'e63c', + 'uvicon-arrow-left': 'e646', + 'uvicon-arrow-up': 'e633', + 'uvicon-skip-back-left': 'e6c5', + 'uvicon-skip-forward-right': 'e61f', + 'uvicon-arrow-left-double': 'e637', + 'uvicon-man': 'e675', + 'uvicon-woman': 'e626', + 'uvicon-en': 'e6b8', + 'uvicon-twitte': 'e607', + 'uvicon-twitter-circle-fill': 'e6cf' +} \ No newline at end of file diff --git a/uni_modules/uv-icon/components/uv-icon/props.js b/uni_modules/uv-icon/components/uv-icon/props.js new file mode 100644 index 0000000..7668cf9 --- /dev/null +++ b/uni_modules/uv-icon/components/uv-icon/props.js @@ -0,0 +1,90 @@ +export default { + props: { + // 图标类名 + name: { + type: String, + default: '' + }, + // 图标颜色,可接受主题色 + color: { + type: String, + default: '#606266' + }, + // 字体大小,单位px + size: { + type: [String, Number], + default: '16px' + }, + // 是否显示粗体 + bold: { + type: Boolean, + default: false + }, + // 点击图标的时候传递事件出去的index(用于区分点击了哪一个) + index: { + type: [String, Number], + default: null + }, + // 触摸图标时的类名 + hoverClass: { + type: String, + default: '' + }, + // 自定义扩展前缀,方便用户扩展自己的图标库 + customPrefix: { + type: String, + default: 'uvicon' + }, + // 图标右边或者下面的文字 + label: { + type: [String, Number], + default: '' + }, + // label的位置,只能右边或者下边 + labelPos: { + type: String, + default: 'right' + }, + // label的大小 + labelSize: { + type: [String, Number], + default: '15px' + }, + // label的颜色 + labelColor: { + type: String, + default: '#606266' + }, + // label与图标的距离 + space: { + type: [String, Number], + default: '3px' + }, + // 图片的mode + imgMode: { + type: String, + default: 'aspectFit' + }, + // 用于显示图片小图标时,图片的宽度 + width: { + type: [String, Number], + default: '' + }, + // 用于显示图片小图标时,图片的高度 + height: { + type: [String, Number], + default: '' + }, + // 用于解决某些情况下,让图标垂直居中的用途 + top: { + type: [String, Number], + default: 0 + }, + // 是否阻止事件传播 + stop: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.icon + } +} \ No newline at end of file diff --git a/uni_modules/uv-icon/components/uv-icon/uv-icon.vue b/uni_modules/uv-icon/components/uv-icon/uv-icon.vue new file mode 100644 index 0000000..d61c9e5 --- /dev/null +++ b/uni_modules/uv-icon/components/uv-icon/uv-icon.vue @@ -0,0 +1,226 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-icon/components/uv-icon/uvicons.ttf b/uni_modules/uv-icon/components/uv-icon/uvicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9aedef864f7e685fbe1dac7e0f36fda281d35a7c GIT binary patch literal 39632 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 literal 0 HcmV?d00001 diff --git a/uni_modules/uv-icon/package.json b/uni_modules/uv-icon/package.json new file mode 100644 index 0000000..0a838d5 --- /dev/null +++ b/uni_modules/uv-icon/package.json @@ -0,0 +1,83 @@ +{ + "id": "uv-icon", + "displayName": "uv-icon 图标 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.13", + "description": "基于字体的图标集,包含了大多数常见场景的图标,支持自定义,支持自定义图片图标等。可自定义颜色、大小。", + "keywords": [ + "uv-ui,uvui,uv-icon,icon,图标,字体图标" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-icon/readme.md b/uni_modules/uv-icon/readme.md new file mode 100644 index 0000000..d526e1a --- /dev/null +++ b/uni_modules/uv-icon/readme.md @@ -0,0 +1,15 @@ +## uv-icon 图标库 + +> **组件名:uv-icon** + +基于字体的图标集,包含了大多数常见场景的图标,支持自定义,支持自定义图片图标等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 diff --git a/uni_modules/uv-image/changelog.md b/uni_modules/uv-image/changelog.md new file mode 100644 index 0000000..e5a633d --- /dev/null +++ b/uni_modules/uv-image/changelog.md @@ -0,0 +1,36 @@ +## 1.0.16(2023-12-21) +1. 修复设置show-menu-by-longpress不生效的BUG +## 1.0.15(2023-12-06) +1. 优化 +## 1.0.14(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.13(2023-11-15) +1. 修复webp之前未使用的BUG +## 1.0.12(2023-10-11) +1. 修复懒加载报错:https://gitee.com/climblee/uv-ui/issues/I869JS +## 1.0.11(2023-08-31) +1. 修复设置widthFix时出现显示不全的BUG +2. 修复抖音等平台在width和height属性改变时出现不显示的BUG +## 1.0.10(2023-08-29) +1. 修复异步修改宽高不生效的问题,问题来源:https://gitee.com/climblee/uv-ui/issues/I7WUQ3 +## 1.0.9(2023-08-21) +1. 修复设置宽高为百分比不生效的BUG +## 1.0.8(2023-07-24) +1. 优化 nvue模式下增加cellChild参数,是否在list中cell节点下,nvue中cell下建议设置成true +## 1.0.7(2023-07-02) +修复VUE3模式下可能不显示的BUG +## 1.0.6(2023-07-02) +优化修改 +## 1.0.5(2023-06-28) +修复duration属性不生效的BUG +## 1.0.4(2023-05-27) +1. 修复可能报错的问题 +## 1.0.3(2023-05-24) +1. 去掉template中存在的this.导致头条小程序编译警告 +## 1.0.2(2023-05-23) +1. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-image 图片 diff --git a/uni_modules/uv-image/components/uv-image/props.js b/uni_modules/uv-image/components/uv-image/props.js new file mode 100644 index 0000000..6ef04a5 --- /dev/null +++ b/uni_modules/uv-image/components/uv-image/props.js @@ -0,0 +1,95 @@ +export default { + props: { + // 图片地址 + src: { + type: String, + default: '' + }, + // 裁剪模式 + mode: { + type: String, + default: 'aspectFill' + }, + // 宽度,单位任意 + width: { + type: [String, Number], + default: '300' + }, + // 高度,单位任意 + height: { + type: [String, Number], + default: '225' + }, + // 图片形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'square' + }, + // 圆角,单位任意 + radius: { + type: [String, Number], + default: 0 + }, + // 是否懒加载,微信小程序、App、百度小程序、字节跳动小程序 + lazyLoad: { + type: Boolean, + default: true + }, + // 是否开启observer懒加载,nvue不生效 + observeLazyLoad: { + type: Boolean, + default: false + }, + // 开启长按图片显示识别微信小程序码菜单 + showMenuByLongpress: { + type: Boolean, + default: true + }, + // 加载中的图标,或者小图片 + loadingIcon: { + type: String, + default: 'photo' + }, + // 加载失败的图标,或者小图片 + errorIcon: { + type: String, + default: 'error-circle' + }, + // 是否显示加载中的图标或者自定义的slot + showLoading: { + type: Boolean, + default: true + }, + // 是否显示加载错误的图标或者自定义的slot + showError: { + type: Boolean, + default: true + }, + // 是否需要淡入效果 + fade: { + type: Boolean, + default: true + }, + // 只支持网络资源,只对微信小程序有效 + webp: { + type: Boolean, + default: false + }, + // 过渡时间,单位ms + duration: { + type: [String, Number], + default: 500 + }, + // 背景颜色,用于深色页面加载图片时,为了和背景色融合 + bgColor: { + type: String, + default: '#f3f4f6' + }, + // nvue模式下 是否直接显示,在uv-list等cell下面使用就需要设置 + cellChild: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.image + } +} \ No newline at end of file diff --git a/uni_modules/uv-image/components/uv-image/uv-image.vue b/uni_modules/uv-image/components/uv-image/uv-image.vue new file mode 100644 index 0000000..2ab4a78 --- /dev/null +++ b/uni_modules/uv-image/components/uv-image/uv-image.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/uni_modules/uv-image/package.json b/uni_modules/uv-image/package.json new file mode 100644 index 0000000..796089e --- /dev/null +++ b/uni_modules/uv-image/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-image", + "displayName": "uv-image 图片 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.16", + "description": "uv-image 此组件为uni-app的image组件的加强版,在继承了原有功能外,增加observer懒加载功能,还支持淡入动画、加载中、加载失败提示、圆角值和形状等。", + "keywords": [ + "uv-image", + "uvui", + "uv-ui", + "image", + "图片" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-image/readme.md b/uni_modules/uv-image/readme.md new file mode 100644 index 0000000..0ecc120 --- /dev/null +++ b/uni_modules/uv-image/readme.md @@ -0,0 +1,15 @@ +## Image 图片 + +> **组件名:uv-image** + +此组件为`uni-app`的`image`组件的加强版,在继承了原有功能外,增加`observer`懒加载功能,还支持淡入动画、加载中、加载失败提示、圆角值和形状等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 diff --git a/uni_modules/uv-index-list/changelog.md b/uni_modules/uv-index-list/changelog.md new file mode 100644 index 0000000..deda715 --- /dev/null +++ b/uni_modules/uv-index-list/changelog.md @@ -0,0 +1,18 @@ +## 1.0.7(2023-11-07) +1. 修复sticky属性不生效的BUG +## 1.0.6(2023-09-01) +1. 修复设置customNavHeight导致定位不准确的BUG +## 1.0.5(2023-08-23) +1. 修复ios端快速滑动+点击右侧导航会出现白屏的BUG +## 1.0.4(2023-07-25) +1. 修复全局设置成rpx存在的高度BUG +2. 修复其他BUG +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-05-27) +1. select事件修复 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-index-list 索引列表 diff --git a/uni_modules/uv-index-list/components/uv-index-anchor/props.js b/uni_modules/uv-index-list/components/uv-index-anchor/props.js new file mode 100644 index 0000000..9ec949e --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-anchor/props.js @@ -0,0 +1,30 @@ +export default { + props: { + // 列表锚点文本内容 + text: { + type: [String, Number], + default: '' + }, + // 列表锚点文字颜色 + color: { + type: String, + default: '#606266' + }, + // 列表锚点文字大小,单位默认px + size: { + type: [String, Number], + default: 14 + }, + // 列表锚点背景颜色 + bgColor: { + type: String, + default: '#dedede' + }, + // 列表锚点高度,单位默认px + height: { + type: [String, Number], + default: 32 + }, + ...uni.$uv?.props?.indexAnchor + } +} \ No newline at end of file diff --git a/uni_modules/uv-index-list/components/uv-index-anchor/uv-index-anchor.vue b/uni_modules/uv-index-list/components/uv-index-anchor/uv-index-anchor.vue new file mode 100644 index 0000000..e566aa7 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-anchor/uv-index-anchor.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/uni_modules/uv-index-list/components/uv-index-item/uv-index-item.vue b/uni_modules/uv-index-list/components/uv-index-item/uv-index-item.vue new file mode 100644 index 0000000..f6e8901 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-item/uv-index-item.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/uni_modules/uv-index-list/components/uv-index-list/props.js b/uni_modules/uv-index-list/components/uv-index-list/props.js new file mode 100644 index 0000000..0cf6356 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-list/props.js @@ -0,0 +1,30 @@ +export default { + props: { + // 右边锚点非激活的颜色 + inactiveColor: { + type: String, + default: '#606266' + }, + // 右边锚点激活的颜色 + activeColor: { + type: String, + default: '#5677fc' + }, + // 索引字符列表,数组形式 + indexList: { + type: Array, + default: () => [] + }, + // 是否开启锚点自动吸顶 + sticky: { + type: Boolean, + default: true + }, + // 自定义导航栏的高度 + customNavHeight: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.indexList + } +} \ No newline at end of file diff --git a/uni_modules/uv-index-list/components/uv-index-list/uv-index-list.vue b/uni_modules/uv-index-list/components/uv-index-list/uv-index-list.vue new file mode 100644 index 0000000..e610323 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-list/uv-index-list.vue @@ -0,0 +1,461 @@ + + + + + diff --git a/uni_modules/uv-index-list/package.json b/uni_modules/uv-index-list/package.json new file mode 100644 index 0000000..133736b --- /dev/null +++ b/uni_modules/uv-index-list/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-index-list", + "displayName": "uv-index-list 索引列表 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.7", + "description": "该组件用于展示索引列表,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景。类似于微信通讯录页面", + "keywords": [ + "uv-index-list", + "uvui", + "uv-ui", + "index-list", + "索引列表" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-index-list/readme.md b/uni_modules/uv-index-list/readme.md new file mode 100644 index 0000000..605741c --- /dev/null +++ b/uni_modules/uv-index-list/readme.md @@ -0,0 +1,19 @@ +## IndexList 索引列表 + +> **组件名:uv-index-list** + +用于展示索引列表,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景,类似于微信通讯录页面。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-input/changelog.md b/uni_modules/uv-input/changelog.md new file mode 100644 index 0000000..2b354d0 --- /dev/null +++ b/uni_modules/uv-input/changelog.md @@ -0,0 +1,29 @@ +## 1.0.13(2023-12-06) +1. 优化 +## 1.0.12(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.11(2023-11-10) +1. 调整清除按钮样式的marginLeft,避免微信上多数情况触发不了的BUG +## 1.0.10(2023-10-07) +1. 修复搜狗输入法下存在不可清空的情况 +## 1.0.9(2023-09-14) +1. 修复H5等情况设置禁用或可读情况下,点击事件无效的问题 +## 1.0.8(2023-08-22) +1. 修复无法@keyboardheightchange无法获取键盘高度的BUG +## 1.0.7(2023-08-18) +1. 修复ios端不能输入的BUG +## 1.0.6(2023-08-05) +1. 修复在vue2模式下,v-model设置为0时不生效的BUG +## 1.0.5(2023-07-18) +1. 修复在微信小程序端清除内容存在不能清除的BUG +## 1.0.4(2023-07-13) +1. 修复value/v-model更改不生效的BUG +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.1(2023-05-12) +1. 修复vue3双向绑定的BUG +## 1.0.0(2023-05-10) +uv-input 输入框 diff --git a/uni_modules/uv-input/components/uv-input/props.js b/uni_modules/uv-input/components/uv-input/props.js new file mode 100644 index 0000000..e969493 --- /dev/null +++ b/uni_modules/uv-input/components/uv-input/props.js @@ -0,0 +1,175 @@ +export default { + props: { + value: { + type: [String, Number], + default: '' + }, + modelValue: { + type: [String, Number], + default: '' + }, + // 输入框类型 + // number-数字输入键盘,app-vue下可以输入浮点数,app-nvue和小程序平台下只能输入整数 + // idcard-身份证输入键盘,微信、支付宝、百度、QQ小程序 + // digit-带小数点的数字键盘,App的nvue页面、微信、支付宝、百度、头条、QQ小程序 + // text-文本输入键盘 + type: { + type: String, + default: 'text' + }, + // 是否禁用输入框 + disabled: { + type: Boolean, + default: false + }, + // 禁用状态时的背景色 + disabledColor: { + type: String, + default: '#f5f7fa' + }, + // 是否显示清除控件 + clearable: { + type: Boolean, + default: false + }, + // 是否密码类型 + password: { + type: Boolean, + default: false + }, + // 最大输入长度,设置为 -1 的时候不限制最大长度 + maxlength: { + type: [String, Number], + default: -1 + }, + // 输入框为空时的占位符 + placeholder: { + type: String, + default: null + }, + // 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ + placeholderClass: { + type: String, + default: 'input-placeholder' + }, + // 指定placeholder的样式 + placeholderStyle: { + type: [String, Object], + default: 'color: #c0c4cc' + }, + // 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档 + // https://uniapp.dcloud.io/component/input + // https://uniapp.dcloud.io/component/textarea + confirmType: { + type: String, + default: 'done' + }, + // 点击键盘右下角按钮时是否保持键盘不收起,H5无效 + confirmHold: { + type: Boolean, + default: false + }, + // focus时,点击页面的时候不收起键盘,微信小程序有效 + holdKeyboard: { + type: Boolean, + default: false + }, + // 自动获取焦点 + // 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点 + focus: { + type: Boolean, + default: false + }, + // 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效 + autoBlur: { + type: Boolean, + default: false + }, + // 指定focus时光标的位置 + cursor: { + type: [String, Number], + default: -1 + }, + // 输入框聚焦时底部与键盘的距离 + cursorSpacing: { + type: [String, Number], + default: 30 + }, + // 光标起始位置,自动聚集时有效,需与selection-end搭配使用 + selectionStart: { + type: [String, Number], + default: -1 + }, + // 光标结束位置,自动聚集时有效,需与selection-start搭配使用 + selectionEnd: { + type: [String, Number], + default: -1 + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: true + }, + // 输入框内容对齐方式,可选值为:left|center|right + inputAlign: { + type: String, + default: 'left' + }, + // 输入框字体的大小 + fontSize: { + type: [String, Number], + default: '14px' + }, + // 输入框字体颜色 + color: { + type: String, + default: '#303133' + }, + // 输入框前置图标 + prefixIcon: { + type: String, + default: '' + }, + // 前置图标样式,对象或字符串 + prefixIconStyle: { + type: [String, Object], + default: '' + }, + // 输入框后置图标 + suffixIcon: { + type: String, + default: '' + }, + // 后置图标样式,对象或字符串 + suffixIconStyle: { + type: [String, Object], + default: '' + }, + // 边框类型,surround-四周边框,bottom-底部边框,none-无边框 + border: { + type: String, + default: 'surround' + }, + // 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会 + readonly: { + type: Boolean, + default: false + }, + // 输入框形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'square' + }, + // 用于处理或者过滤输入框内容的方法 + formatter: { + type: [Function, null], + default: null + }, + // 是否忽略组件内对文本合成系统事件的处理 + ignoreCompositionEvent: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.input + } +} \ No newline at end of file diff --git a/uni_modules/uv-input/components/uv-input/uv-input.vue b/uni_modules/uv-input/components/uv-input/uv-input.vue new file mode 100644 index 0000000..20c1801 --- /dev/null +++ b/uni_modules/uv-input/components/uv-input/uv-input.vue @@ -0,0 +1,348 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-input/package.json b/uni_modules/uv-input/package.json new file mode 100644 index 0000000..6981fa9 --- /dev/null +++ b/uni_modules/uv-input/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-input", + "displayName": "uv-input 输入框 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.13", + "description": "uv-input 该组件为一个输入框,默认没有边框和样式,是专门为配合表单组件uv-form而设计的,利用它可以快速实现表单验证,输入内容,下拉选择等功能。", + "keywords": [ + "uv-input", + "uvui", + "uv-ui", + "input", + "输入框" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-input/readme.md b/uni_modules/uv-input/readme.md new file mode 100644 index 0000000..00f47e4 --- /dev/null +++ b/uni_modules/uv-input/readme.md @@ -0,0 +1,19 @@ +## Input 输入框 + +> **组件名:uv-input** + +此组件为一个输入框,默认没有边框和样式,是专门为配合表单组件uv-form而设计的,利用它可以快速实现表单验证,输入内容,下拉选择等功能。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-keyboard/changelog.md b/uni_modules/uv-keyboard/changelog.md new file mode 100644 index 0000000..1d1be01 --- /dev/null +++ b/uni_modules/uv-keyboard/changelog.md @@ -0,0 +1,17 @@ +## 1.0.5(2023-10-12) +1. 增加disKeys参数,mode = "car"下,被禁用的键,如:['I','O'] +2. 增加customabc参数,mode = "car"下,是否启用自定义中英文切换内容模式,为了兼容支付宝等小程序不兼容嵌套插槽,导致同时显示自定义内容和原始内容 +3. 增加ref方法changeCarMode,mode = "car"下, 调用此方法可以切换中英文模式 +4. 增加@changeCarInputMode,mode = "car"下,调用此方法可以进行切换中英文 +5. 增加插槽abc,mode = "car"下,自定义中英文切换内容,具体参考[车牌键盘自定义中英文切换及禁用键等设置](https://www.uvui.cn/components/keyboard.html#车牌键盘自定义中英文切换及禁用键等设置) +## 1.0.4(2023-09-04) +1. 优化,修改文件名称 +## 1.0.3(2023-09-04) +1. 修复键盘change回调事件产生冲突的BUG +## 1.0.2(2023-07-02) +uv-keyboard 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/keyboard.html +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-keyboard 键盘 diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-car/props.js b/uni_modules/uv-keyboard/components/uv-keyboard-car/props.js new file mode 100644 index 0000000..3dd93cc --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-car/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: false + }, + // 被禁用的键 + disKeys: { + type: Array, + default: ()=>[] + }, + // 是否自定义abc + customabc: { + type: Boolean, + default: false + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-car/uv-keyboard-car.vue b/uni_modules/uv-keyboard/components/uv-keyboard-car/uv-keyboard-car.vue new file mode 100644 index 0000000..e99e910 --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-car/uv-keyboard-car.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-number/props.js b/uni_modules/uv-keyboard/components/uv-keyboard-number/props.js new file mode 100644 index 0000000..60d63d4 --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-number/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘 + mode: { + type: String, + default: 'number' + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: false + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-number/uv-keyboard-number.vue b/uni_modules/uv-keyboard/components/uv-keyboard-number/uv-keyboard-number.vue new file mode 100644 index 0000000..b7c0b8b --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-number/uv-keyboard-number.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/uni_modules/uv-keyboard/components/uv-keyboard/props.js b/uni_modules/uv-keyboard/components/uv-keyboard/props.js new file mode 100644 index 0000000..05dd76a --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard/props.js @@ -0,0 +1,95 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘 + mode: { + type: String, + default: 'number' + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: false + }, + // 是否显示顶部工具条 + tooltip: { + type: Boolean, + default: true + }, + // 是否显示工具条中间的提示 + showTips: { + type: Boolean, + default: true + }, + // 工具条中间的提示文字 + tips: { + type: String, + default: '' + }, + // 是否显示工具条左边的"取消"按钮 + showCancel: { + type: Boolean, + default: true + }, + // 是否显示工具条右边的"完成"按钮 + showConfirm: { + type: Boolean, + default: true + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + }, + // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距 + safeAreaInsetBottom: { + type: Boolean, + default: true + }, + // 是否允许通过点击遮罩关闭键盘 + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 是否允许点击确认按钮关闭组件 + closeOnClickConfirm: { + type: Boolean, + default: true + }, + // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩 + overlay: { + type: Boolean, + default: true + }, + // z-index值 + zIndex: { + type: [String, Number], + default: 10075 + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: '取消' + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: '确定' + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: false + }, + // 被禁用的键 + disKeys: { + type: Array, + default: ()=>[] + }, + // 是否自定义abc + customabc: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.keyboard + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/components/uv-keyboard/uv-keyboard.vue b/uni_modules/uv-keyboard/components/uv-keyboard/uv-keyboard.vue new file mode 100644 index 0000000..60b15bf --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard/uv-keyboard.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/uni_modules/uv-keyboard/package.json b/uni_modules/uv-keyboard/package.json new file mode 100644 index 0000000..69844c6 --- /dev/null +++ b/uni_modules/uv-keyboard/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-keyboard", + "displayName": "uv-keyboard 键盘 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "uv-keyboard 该组件为自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。", + "keywords": [ + "uv-keyboard", + "uvui", + "uv-ui", + "keyboard", + "键盘" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/readme.md b/uni_modules/uv-keyboard/readme.md new file mode 100644 index 0000000..9cbef6c --- /dev/null +++ b/uni_modules/uv-keyboard/readme.md @@ -0,0 +1,19 @@ +## Keyboard 键盘 + +> **组件名:uv-keyboard** + +该组件为自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-line-progress/changelog.md b/uni_modules/uv-line-progress/changelog.md new file mode 100644 index 0000000..975acce --- /dev/null +++ b/uni_modules/uv-line-progress/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-20) +1. 适配height参数携带单位 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-line-progress 线形进度条 diff --git a/uni_modules/uv-line-progress/components/uv-line-progress/props.js b/uni_modules/uv-line-progress/components/uv-line-progress/props.js new file mode 100644 index 0000000..23138c7 --- /dev/null +++ b/uni_modules/uv-line-progress/components/uv-line-progress/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 激活部分的颜色 + activeColor: { + type: String, + default: '#19be6b' + }, + inactiveColor: { + type: String, + default: '#ececec' + }, + // 进度百分比,数值 + percentage: { + type: [String, Number], + default: 0 + }, + // 是否在进度条内部显示百分比的值 + showText: { + type: Boolean, + default: true + }, + // 进度条的高度,单位px + height: { + type: [String, Number], + default: 12 + }, + ...uni.$uv?.props?.lineProgress + } +} \ No newline at end of file diff --git a/uni_modules/uv-line-progress/components/uv-line-progress/uv-line-progress.vue b/uni_modules/uv-line-progress/components/uv-line-progress/uv-line-progress.vue new file mode 100644 index 0000000..229c2aa --- /dev/null +++ b/uni_modules/uv-line-progress/components/uv-line-progress/uv-line-progress.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/uni_modules/uv-line-progress/package.json b/uni_modules/uv-line-progress/package.json new file mode 100644 index 0000000..01e550e --- /dev/null +++ b/uni_modules/uv-line-progress/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-line-progress", + "displayName": "uv-line-progress 线形进度条 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-line-progress 该组件展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。", + "keywords": [ + "uv-line-progress", + "uvui", + "uv-ui", + "progress", + "进度条" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-line-progress/readme.md b/uni_modules/uv-line-progress/readme.md new file mode 100644 index 0000000..98e5d49 --- /dev/null +++ b/uni_modules/uv-line-progress/readme.md @@ -0,0 +1,11 @@ +## LineProgress 线形进度条 + +> **组件名:uv-line-progress** + +展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-line/changelog.md b/uni_modules/uv-line/changelog.md new file mode 100644 index 0000000..5eb7ba8 --- /dev/null +++ b/uni_modules/uv-line/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增线条组件 diff --git a/uni_modules/uv-line/components/uv-line/props.js b/uni_modules/uv-line/components/uv-line/props.js new file mode 100644 index 0000000..75b1007 --- /dev/null +++ b/uni_modules/uv-line/components/uv-line/props.js @@ -0,0 +1,34 @@ +export default { + props: { + color: { + type: String, + default: '#d6d7d9' + }, + // 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等 + length: { + type: [String, Number], + default: '100%' + }, + // 线条方向,col-竖向,row-横向 + direction: { + type: String, + default: 'row' + }, + // 是否显示细边框 + hairline: { + type: Boolean, + default: true + }, + // 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px" + margin: { + type: [String, Number], + default: 0 + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.line + } +} \ No newline at end of file diff --git a/uni_modules/uv-line/components/uv-line/uv-line.vue b/uni_modules/uv-line/components/uv-line/uv-line.vue new file mode 100644 index 0000000..866c507 --- /dev/null +++ b/uni_modules/uv-line/components/uv-line/uv-line.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/uni_modules/uv-line/package.json b/uni_modules/uv-line/package.json new file mode 100644 index 0000000..036446a --- /dev/null +++ b/uni_modules/uv-line/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-line", + "displayName": "uv-line 线条 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "uv-line 此组件一般用于显示一根线条,用于分隔内容块,有横向和竖向两种模式,且能设置0.5px线条,使用也很简单。", + "keywords": [ + "uv-line", + "uvui", + "uv-ui", + "line", + "线条" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-line/readme.md b/uni_modules/uv-line/readme.md new file mode 100644 index 0000000..e47533c --- /dev/null +++ b/uni_modules/uv-line/readme.md @@ -0,0 +1,11 @@ +## Line 线条 + +> **组件名:uv-line** + +此组件一般用于显示一根线条,用于分隔内容块,有横向和竖向两种模式,且能设置0.5px线条,使用也很简单。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-link/changelog.md b/uni_modules/uv-link/changelog.md new file mode 100644 index 0000000..ce52f84 --- /dev/null +++ b/uni_modules/uv-link/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-08-13) +1. 修复报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-link 超链接组件 diff --git a/uni_modules/uv-link/components/uv-link/props.js b/uni_modules/uv-link/components/uv-link/props.js new file mode 100644 index 0000000..b3f56a1 --- /dev/null +++ b/uni_modules/uv-link/components/uv-link/props.js @@ -0,0 +1,40 @@ +export default { + props: { + // 文字颜色 + color: { + type: String, + default: '' + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: 14 + }, + // 是否显示下划线 + underLine: { + type: Boolean, + default: false + }, + // 要跳转的链接 + href: { + type: String, + default: '' + }, + // 小程序中复制到粘贴板的提示语 + mpTips: { + type: String, + default: '链接已复制,请在浏览器打开' + }, + // 下划线颜色 + lineColor: { + type: String, + default: '' + }, + // 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色 + text: { + type: String, + default: '' + }, + ...uni.$uv?.props?.link + } +} \ No newline at end of file diff --git a/uni_modules/uv-link/components/uv-link/uv-link.vue b/uni_modules/uv-link/components/uv-link/uv-link.vue new file mode 100644 index 0000000..4c9258e --- /dev/null +++ b/uni_modules/uv-link/components/uv-link/uv-link.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/uni_modules/uv-link/package.json b/uni_modules/uv-link/package.json new file mode 100644 index 0000000..1b115f4 --- /dev/null +++ b/uni_modules/uv-link/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-link", + "displayName": "uv-link 超链接 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-link 该组件为超链接组件", + "keywords": [ + "uv-link", + "uvui", + "uv-ui", + "link", + "超链接" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-link/readme.md b/uni_modules/uv-link/readme.md new file mode 100644 index 0000000..6e8ce92 --- /dev/null +++ b/uni_modules/uv-link/readme.md @@ -0,0 +1,11 @@ +## Link 超链接 + +> **组件名:uv-link** + +该组件为超链接组件,在不同平台有不同表现形式。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-list/changelog.md b/uni_modules/uv-list/changelog.md new file mode 100644 index 0000000..6c130f0 --- /dev/null +++ b/uni_modules/uv-list/changelog.md @@ -0,0 +1,25 @@ +## 1.0.9(2023-11-10) +1. 修复设置ellipsis不生效的BUG +## 1.0.8(2023-09-20) +1. listItem优化可使用customStyle变量进行样式控制 +## 1.0.7(2023-08-29) +1. 修复边框的BUG +## 1.0.6(2023-08-16) +1. 修复switch开关返回undefined的问题 +2. 优化初始化可能导致的闪动 +## 1.0.5(2023-08-07) +1. 修复分包页面在ios端,nvue编译不能滚动的BUG +## 1.0.4(2023-08-04) +1. nvue修复 触底不触发事件的BUG +2. 更新文档说明事件触发 +## 1.0.3(2023-07-28) +1. 修改可能造成样式污染的BUG +## 1.0.2(2023-07-26) +1. 全面重构,用法与之前保持一致,参数全部变化 +2. 新增多个功能参数,方便一键构建列表 +3. List列表组件,包含基本列表样式、默认插槽机制、可扩展插槽机制、长列表性能优化、多端兼容。 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-list 列表 diff --git a/uni_modules/uv-list/components/uv-list-item/uv-list-item.vue b/uni_modules/uv-list/components/uv-list-item/uv-list-item.vue new file mode 100644 index 0000000..193b48d --- /dev/null +++ b/uni_modules/uv-list/components/uv-list-item/uv-list-item.vue @@ -0,0 +1,535 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-list/components/uv-list/uv-list.vue b/uni_modules/uv-list/components/uv-list/uv-list.vue new file mode 100644 index 0000000..3f3e5c2 --- /dev/null +++ b/uni_modules/uv-list/components/uv-list/uv-list.vue @@ -0,0 +1,147 @@ + + + + diff --git a/uni_modules/uv-list/package.json b/uni_modules/uv-list/package.json new file mode 100644 index 0000000..1b1156c --- /dev/null +++ b/uni_modules/uv-list/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-list", + "displayName": "uv-list 列表 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.9", + "description": "uv-list 多功能高性能列表组件", + "keywords": [ + "uv-list", + "uvui", + "uv-ui", + "list", + "列表" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-list/readme.md b/uni_modules/uv-list/readme.md new file mode 100644 index 0000000..930cbd4 --- /dev/null +++ b/uni_modules/uv-list/readme.md @@ -0,0 +1,27 @@ +## List 列表 + +> **组件名:uv-list** + +List列表组件,包含基本列表样式、默认插槽机制、可扩展插槽机制、长列表性能优化、多端兼容。 + +在vue页面里,它默认使用页面级滚动,这样做的目的是性能更加友好。在app-nvue页面里,它默认使用原生list组件滚动,这样的长列表,在滚动出屏幕外后,系统会回收不可见区域的渲染内存资源,不会造成滚动越长手机越卡的问题。 + +uv-list组件是父容器,里面的核心是uv-list-item子组件,它代表列表中的一个可重复行,子组件可以无限循环。 + +uv-list-item有很多风格,uv-list-item组件通过内置的属性,满足一些常用的场景。当内置属性不满足需求时,可以通过扩展插槽来自定义列表内容,插槽包括:默认插槽(完全自定义内容)、具名插槽(header | body | footer),根据需求进行扩展。 + +内置属性可以覆盖的场景包括:导航列表、设置列表、小图标列表等,其他不能满足的场景使用插槽进行扩展。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-load-more/changelog.md b/uni_modules/uv-load-more/changelog.md new file mode 100644 index 0000000..a2e0fed --- /dev/null +++ b/uni_modules/uv-load-more/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-21) +1. 优化customStyle属性 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-load-more 加载更多 diff --git a/uni_modules/uv-load-more/components/uv-load-more/props.js b/uni_modules/uv-load-more/components/uv-load-more/props.js new file mode 100644 index 0000000..c6bc287 --- /dev/null +++ b/uni_modules/uv-load-more/components/uv-load-more/props.js @@ -0,0 +1,95 @@ +export default { + props: { + // 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态 + status: { + type: String, + default: 'loadmore' + }, + // 组件背景色 + bgColor: { + type: String, + default: 'transparent' + }, + // 是否显示加载中的图标 + icon: { + type: Boolean, + default: true + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 14 + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: 16 + }, + // 字体颜色 + color: { + type: String, + default: '#606266' + }, + // 加载中状态的图标,spinner-花朵状图标,circle-圆圈状,semicircle-半圆 + loadingIcon: { + type: String, + default: 'spinner' + }, + // 加载前的提示语 + loadmoreText: { + type: String, + default: '加载更多' + }, + // 加载中提示语 + loadingText: { + type: String, + default: '正在加载...' + }, + // 没有更多的提示语 + nomoreText: { + type: String, + default: '没有更多了' + }, + // 在“没有更多”状态下,是否显示粗点 + isDot: { + type: Boolean, + default: false + }, + // 加载中图标的颜色 + iconColor: { + type: String, + default: '#b7b7b7' + }, + // 上边距 + marginTop: { + type: [String, Number], + default: 10 + }, + // 下边距 + marginBottom: { + type: [String, Number], + default: 10 + }, + // 高度,单位px + height: { + type: [String, Number], + default: 'auto' + }, + // 是否显示左边分割线 + line: { + type: Boolean, + default: false + }, + // 线条颜色 + lineColor: { + type: String, + default: '#E6E8EB' + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.loadmore + } +} \ No newline at end of file diff --git a/uni_modules/uv-load-more/components/uv-load-more/uv-load-more.vue b/uni_modules/uv-load-more/components/uv-load-more/uv-load-more.vue new file mode 100644 index 0000000..2b5057c --- /dev/null +++ b/uni_modules/uv-load-more/components/uv-load-more/uv-load-more.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/uni_modules/uv-load-more/package.json b/uni_modules/uv-load-more/package.json new file mode 100644 index 0000000..bc502e3 --- /dev/null +++ b/uni_modules/uv-load-more/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-load-more", + "displayName": "uv-load-more 加载更多 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-load-more 此组件一般用于标识页面底部加载数据时的状态,共有三种状态:加载前、加载中、加载后。", + "keywords": [ + "uv-load-more", + "uvui", + "uv-ui", + "more", + "加载更多" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-line", + "uv-loading-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-load-more/readme.md b/uni_modules/uv-load-more/readme.md new file mode 100644 index 0000000..2e9334e --- /dev/null +++ b/uni_modules/uv-load-more/readme.md @@ -0,0 +1,11 @@ +## LoadMore 加载更多 + +> **组件名:uv-load-more** + +此组件一般用于标识页面底部加载数据时的状态,共有三种状态:加载前、加载中、加载后。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-loading-icon/changelog.md b/uni_modules/uv-loading-icon/changelog.md new file mode 100644 index 0000000..f17e074 --- /dev/null +++ b/uni_modules/uv-loading-icon/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-08-14) +1. 新增参数textStyle,自定义文本样式 +## 1.0.2(2023-06-27) +优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增uv-loading-icon组件 diff --git a/uni_modules/uv-loading-icon/components/uv-loading-icon/props.js b/uni_modules/uv-loading-icon/components/uv-loading-icon/props.js new file mode 100644 index 0000000..4ef0e94 --- /dev/null +++ b/uni_modules/uv-loading-icon/components/uv-loading-icon/props.js @@ -0,0 +1,67 @@ +export default { + props: { + // 是否显示组件 + show: { + type: Boolean, + default: true + }, + // 颜色 + color: { + type: String, + default: '#909193' + }, + // 提示文字颜色 + textColor: { + type: String, + default: '#909193' + }, + // 文字和图标是否垂直排列 + vertical: { + type: Boolean, + default: false + }, + // 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形 + mode: { + type: String, + default: 'spinner' + }, + // 图标大小,单位默认px + size: { + type: [String, Number], + default: 24 + }, + // 文字大小 + textSize: { + type: [String, Number], + default: 15 + }, + // 文字样式 + textStyle: { + type: Object, + default () { + return {} + } + }, + // 文字内容 + text: { + type: [String, Number], + default: '' + }, + // 动画模式 https://www.runoob.com/cssref/css3-pr-animation-timing-function.html + timingFunction: { + type: String, + default: 'linear' + }, + // 动画执行周期时间 + duration: { + type: [String, Number], + default: 1200 + }, + // mode=circle时的暗边颜色 + inactiveColor: { + type: String, + default: '' + }, + ...uni.$uv?.props?.loadingIcon + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon.vue b/uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon.vue new file mode 100644 index 0000000..5650470 --- /dev/null +++ b/uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/uni_modules/uv-loading-icon/package.json b/uni_modules/uv-loading-icon/package.json new file mode 100644 index 0000000..1485897 --- /dev/null +++ b/uni_modules/uv-loading-icon/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-loading-icon", + "displayName": "uv-loading-icon 加载动画 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.3", + "description": "此组件为一个小动画,目前用在uv-ui的uv-load-more加载更多等组件,还可以运用在项目中正在加载状态场景。", + "keywords": [ + "uv-loading-icon", + "uvui", + "uv-ui", + "loading", + "加载动画" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-icon/readme.md b/uni_modules/uv-loading-icon/readme.md new file mode 100644 index 0000000..7b0cf0f --- /dev/null +++ b/uni_modules/uv-loading-icon/readme.md @@ -0,0 +1,19 @@ +## LoadingIcon 加载动画 + +> **组件名:uv-loading-icon** + +此组件为一个小动画,目前用在 `uv-ui` 的 `uv-load-more` 加载更多等组件,还可以运用在项目中正在加载状态场景。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-loading-page/changelog.md b/uni_modules/uv-loading-page/changelog.md new file mode 100644 index 0000000..4b7ef61 --- /dev/null +++ b/uni_modules/uv-loading-page/changelog.md @@ -0,0 +1,11 @@ +## 1.0.4(2024-01-20) +1. 修改上版本带出的问题 +## 1.0.3(2024-01-15) +1. 重构,避免初始加载的时候先显示页面的问题 +## 1.0.2(2023-07-02) +uv-loading-page 由于弹出层uv-transition的修改,组件内部做了相应的修改,参数不变。 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-loading-page 加载页 diff --git a/uni_modules/uv-loading-page/components/uv-loading-page/props.js b/uni_modules/uv-loading-page/components/uv-loading-page/props.js new file mode 100644 index 0000000..f1a8a06 --- /dev/null +++ b/uni_modules/uv-loading-page/components/uv-loading-page/props.js @@ -0,0 +1,55 @@ +export default { + props: { + // 提示内容 + loadingText: { + type: [String, Number], + default: '' + }, + // 文字上方用于替换loading动画的图片 + image: { + type: String, + default: '' + }, + // 加载动画的模式,circle-圆形,spinner-花朵形,semicircle-半圆形 + loadingMode: { + type: String, + default: 'circle' + }, + // 是否加载中 + loading: { + type: Boolean, + default: false + }, + // 背景色 + bgColor: { + type: String, + default: '#fff' + }, + // 文字颜色 + color: { + type: String, + default: '#C8C8C8' + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: 16 + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: 26 + }, + // 加载中图标的颜色,只能rgb或者十六进制颜色值 + loadingColor: { + type: String, + default: '#C8C8C8' + }, + // 过渡时间 + duration: { + type: [String, Number], + default: 300 + }, + ...uni.$uv?.props?.loadingPage + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-page/components/uv-loading-page/uv-loading-page.vue b/uni_modules/uv-loading-page/components/uv-loading-page/uv-loading-page.vue new file mode 100644 index 0000000..8fb26d1 --- /dev/null +++ b/uni_modules/uv-loading-page/components/uv-loading-page/uv-loading-page.vue @@ -0,0 +1,96 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-loading-page/package.json b/uni_modules/uv-loading-page/package.json new file mode 100644 index 0000000..cc9b171 --- /dev/null +++ b/uni_modules/uv-loading-page/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-loading-page", + "displayName": "uv-loading-page 加载页 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.4", + "description": "uv-loading-page 该组件是一个页面级的加载效果,可以在页面初始化数据等场景使用,与骨架屏有相似之处。", + "keywords": [ + "uv-loading-page", + "uvui", + "uv-ui", + "page", + "loading" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition", + "uv-loading-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-page/readme.md b/uni_modules/uv-loading-page/readme.md new file mode 100644 index 0000000..3a5dd96 --- /dev/null +++ b/uni_modules/uv-loading-page/readme.md @@ -0,0 +1,11 @@ +## LoadingPage 加载页 + +> **组件名:uv-loading-page** + +该组件是一个页面级的加载效果,可以在页面初始化数据等场景使用,与骨架屏有相似之处。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-modal/changelog.md b/uni_modules/uv-modal/changelog.md new file mode 100644 index 0000000..d532286 --- /dev/null +++ b/uni_modules/uv-modal/changelog.md @@ -0,0 +1,28 @@ +## 1.0.11(2023-12-20) +1. 优化 +## 1.0.10(2023-12-19) +1. 修复confirm中快速使用closeLoading关闭加载状态失效的BUG +## 1.0.9(2023-11-28) +1. 修复上版本引出的确认和取消按钮均不显示,还有高度的BUG +## 1.0.8(2023-09-08) +1. 修复两个按钮之间竖线不显示的问题 +2. uv-ui项目自定义按钮示例修改 +## 1.0.7(2023-08-30) +1. 增加align参数,设置文本对齐方式,left center right +2. 增加textStyle参数,设置文本样式 +## 1.0.6(2023-08-23) +1. 修复异步loading时,确认回调还会一直触发 +## 1.0.5(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.4(2023-07-02) +uv-modal 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/modal.html +## 1.0.3(2023-06-29) +1. 增加closeLoading方法,方便异步加载手动取消 +2. 更新文档 +## 1.0.2(2023-06-11) +1. 新增zIndex参数 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-modal 模态框 diff --git a/uni_modules/uv-modal/components/uv-modal/props.js b/uni_modules/uv-modal/components/uv-modal/props.js new file mode 100644 index 0000000..6cb1f41 --- /dev/null +++ b/uni_modules/uv-modal/components/uv-modal/props.js @@ -0,0 +1,90 @@ +export default { + props: { + // 标题 + title: { + type: [String], + default: '' + }, + // 弹窗内容 + content: { + type: String, + default: '' + }, + // 确认文案 + confirmText: { + type: String, + default: '确认' + }, + // 取消文案 + cancelText: { + type: String, + default: '取消' + }, + // 是否显示确认按钮 + showConfirmButton: { + type: Boolean, + default: true + }, + // 是否显示取消按钮 + showCancelButton: { + type: Boolean, + default: false + }, + // 确认按钮颜色 + confirmColor: { + type: String, + default: '#2979ff' + }, + // 取消文字颜色 + cancelColor: { + type: String, + default: '#606266' + }, + // 对调确认和取消的位置 + buttonReverse: { + type: Boolean, + default: false + }, + // 是否开启缩放效果 + zoom: { + type: Boolean, + default: true + }, + // 层级 + zIndex: { + type: [String, Number], + default: 10075 + }, + // 是否异步关闭,只对确定按钮有效 + asyncClose: { + type: Boolean, + default: false + }, + // 是否允许点击遮罩关闭modal + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 给一个负的margin-top,往上偏移,避免和键盘重合的情况 + negativeTop: { + type: [String, Number], + default: 0 + }, + // modal宽度,不支持百分比,可以数值,px,rpx单位 + width: { + type: [String, Number], + default: '650rpx' + }, + // 文本对齐方式,默认left + align: { + type: String, + default: 'left' + }, + // 文本自定义样式 + textStyle: { + type: [Object, String], + default: '' + }, + ...uni.$uv?.props?.modal + } +} \ No newline at end of file diff --git a/uni_modules/uv-modal/components/uv-modal/uv-modal.vue b/uni_modules/uv-modal/components/uv-modal/uv-modal.vue new file mode 100644 index 0000000..4577b99 --- /dev/null +++ b/uni_modules/uv-modal/components/uv-modal/uv-modal.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/uni_modules/uv-modal/package.json b/uni_modules/uv-modal/package.json new file mode 100644 index 0000000..2a815c0 --- /dev/null +++ b/uni_modules/uv-modal/package.json @@ -0,0 +1,90 @@ +{ + "id": "uv-modal", + "displayName": "uv-modal 模态框 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.11", + "description": "支持自定义内容,与uniapp提供的API uni.showModal类似,但是功能更强大,更加灵活", + "keywords": [ + "uv-modal", + "uvui", + "uv-ui", + "modal", + "模态框" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-line", + "uv-loading-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-modal/readme.md b/uni_modules/uv-modal/readme.md new file mode 100644 index 0000000..e1aec02 --- /dev/null +++ b/uni_modules/uv-modal/readme.md @@ -0,0 +1,23 @@ +## Modal 模态框 + +> **组件名:uv-modal** + +弹出模态框,常用于消息提示、消息确认、在当前页面内完成特定的交互操作。 + +特性:支持自定义内容,与uniapp提供的API `uni.showModal` 类似,但是功能更强大,更加灵活。 + +运用场景:弹窗验证码输入等场景 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-navbar/changelog.md b/uni_modules/uv-navbar/changelog.md new file mode 100644 index 0000000..01cc4fd --- /dev/null +++ b/uni_modules/uv-navbar/changelog.md @@ -0,0 +1,17 @@ +## 1.0.7(2023-08-16) +1. 修复ios可能存在点击返回按钮点不到的情况 +## 1.0.6(2023-08-07) +1. 修复nvue在ios端可能存在背景图样式错乱的BUG +## 1.0.5(2023-08-04) +1. bgColor设置背景图片,增加imgMode属性 +## 1.0.4(2023-08-01) +1. bgColor属性支持背景图片,在线图片或base64图片都可以 +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-06-05) +1. 兼容渐变背景色 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-navbar 自定义导航栏 diff --git a/uni_modules/uv-navbar/components/uv-navbar/props.js b/uni_modules/uv-navbar/components/uv-navbar/props.js new file mode 100644 index 0000000..47fe150 --- /dev/null +++ b/uni_modules/uv-navbar/components/uv-navbar/props.js @@ -0,0 +1,89 @@ +export default { + props: { + // 是否开启顶部安全区适配 + safeAreaInsetTop: { + type: Boolean, + default: true + }, + // 固定在顶部时,是否生成一个等高元素,以防止塌陷 + placeholder: { + type: Boolean, + default: false + }, + // 是否固定在顶部 + fixed: { + type: Boolean, + default: true + }, + // 是否显示下边框 + border: { + type: Boolean, + default: false + }, + // 左边的图标 + leftIcon: { + type: String, + default: 'arrow-left' + }, + // 左边的提示文字 + leftText: { + type: String, + default: '' + }, + // 左右的提示文字 + rightText: { + type: String, + default: '' + }, + // 右边的图标 + rightIcon: { + type: String, + default: '' + }, + // 标题 + title: { + type: [String, Number], + default: '' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#ffffff' + }, + imgMode: { + type: String, + default: 'aspectFill' + }, + // 标题的宽度 + titleWidth: { + type: [String, Number], + default: '400rpx' + }, + // 导航栏高度 + height: { + type: [String, Number], + default: '44px' + }, + // 左侧返回图标的大小 + leftIconSize: { + type: [String, Number], + default: 20 + }, + // 左侧返回图标的颜色 + leftIconColor: { + type: String, + default: '#303133' + }, + // 点击左侧区域(返回图标),是否自动返回上一页 + autoBack: { + type: Boolean, + default: false + }, + // 标题的样式,对象或字符串 + titleStyle: { + type: [String, Object], + default: '' + }, + ...uni.$uv?.props?.navbar + } +} \ No newline at end of file diff --git a/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue b/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue new file mode 100644 index 0000000..a46ad7a --- /dev/null +++ b/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/uni_modules/uv-navbar/package.json b/uni_modules/uv-navbar/package.json new file mode 100644 index 0000000..8d429de --- /dev/null +++ b/uni_modules/uv-navbar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-navbar", + "displayName": "uv-navbar 自定义导航栏 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.7", + "description": "uv-navbar 此组件一般用于在特殊情况下,需要自定义导航栏的时候用到,一般建议使用自带的原生导航栏。", + "keywords": [ + "uv-navbar", + "uvui", + "uv-ui", + "navbar", + "自定义导航栏" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-status-bar" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-navbar/readme.md b/uni_modules/uv-navbar/readme.md new file mode 100644 index 0000000..412ea7b --- /dev/null +++ b/uni_modules/uv-navbar/readme.md @@ -0,0 +1,19 @@ +## Navbar 自定义导航栏 + +> **组件名:uv-navbar** + +此组件一般用于在特殊情况下,需要自定义导航栏的时候用到,一般建议使用自带的原生导航栏,支持渐变色、透明色、图片背景。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-no-network/changelog.md b/uni_modules/uv-no-network/changelog.md new file mode 100644 index 0000000..b6fc0ed --- /dev/null +++ b/uni_modules/uv-no-network/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-no-network 无网络提示 diff --git a/uni_modules/uv-no-network/components/uv-no-network/props.js b/uni_modules/uv-no-network/components/uv-no-network/props.js new file mode 100644 index 0000000..595b1fc --- /dev/null +++ b/uni_modules/uv-no-network/components/uv-no-network/props.js @@ -0,0 +1,20 @@ +export default { + props: { + // 页面文字提示 + tips: { + type: String, + default: '哎呀,网络信号丢失' + }, + // 一个z-index值,用于设置没有网络这个组件的层次,因为页面可能会有其他定位的元素层级过高,导致此组件被覆盖 + zIndex: { + type: [String, Number], + default: '' + }, + // image 没有网络的图片提示 + image: { + type: String, + default: 'data:image/png;base64,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' + }, + ...uni.$uv?.props?.noNetwork + } +} \ No newline at end of file diff --git a/uni_modules/uv-no-network/components/uv-no-network/uv-no-network.vue b/uni_modules/uv-no-network/components/uv-no-network/uv-no-network.vue new file mode 100644 index 0000000..5f134fa --- /dev/null +++ b/uni_modules/uv-no-network/components/uv-no-network/uv-no-network.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/uni_modules/uv-no-network/package.json b/uni_modules/uv-no-network/package.json new file mode 100644 index 0000000..cb48aa9 --- /dev/null +++ b/uni_modules/uv-no-network/package.json @@ -0,0 +1,90 @@ +{ + "id": "uv-no-network", + "displayName": "uv-no-network 无网络提示 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "uv-no-network 该组件在没有任何网络的情况下,显示在内容上方,无需任何配置,引入即可,内部自动处理所有功能和事件。", + "keywords": [ + "uv-no-network", + "uvui", + "uv-ui", + "network", + "无网络" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-overlay", + "uv-icon", + "uv-button" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-no-network/readme.md b/uni_modules/uv-no-network/readme.md new file mode 100644 index 0000000..0e4a1a2 --- /dev/null +++ b/uni_modules/uv-no-network/readme.md @@ -0,0 +1,11 @@ +## NoNetwork 无网络提示 + +> **组件名:uv-no-network** + +该组件在没有任何网络的情况下,显示在内容上方,无需任何配置,引入即可,内部自动处理所有功能和事件。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-notice-bar/changelog.md b/uni_modules/uv-notice-bar/changelog.md new file mode 100644 index 0000000..cdfec7d --- /dev/null +++ b/uni_modules/uv-notice-bar/changelog.md @@ -0,0 +1,19 @@ +## 1.0.7(2023-10-13) +1. unmounted兼容vue3 +## 1.0.6(2023-08-03) +1. 竖向滚动时候增加change回调 +## 1.0.5(2023-07-21) +1. 增加icon类型,支持设置false不显示图标 +2. 优化文档 +## 1.0.4(2023-07-03) +1. 增加disableScroll 属性,禁止自动滚动 +2. 优化文档 +## 1.0.3(2023-06-04) +1. 修复text传值为null报错的问题 +## 1.0.2(2023-05-30) +1. 修复error报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-notice-bar 滚动通知 diff --git a/uni_modules/uv-notice-bar/components/uv-column-notice/props.js b/uni_modules/uv-notice-bar/components/uv-column-notice/props.js new file mode 100644 index 0000000..d93917c --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-column-notice/props.js @@ -0,0 +1,61 @@ +export default { + props: { + // 显示的内容,字符串 + text: { + type: [Array], + default: '' + }, + // 是否显示左侧的音量图标 + icon: { + type: [String, Boolean, null], + default: 'volume' + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: '' + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: '#f9ae3d' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#fdf6ec' + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: 14 + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: 80 + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: false + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: 1500 + }, + // 是否禁止用手滑动切换,仅`direction="column"生效` + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: true + }, + // 是否禁止滚动,仅`direction="column"生效` + disableScroll: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.columnNotice + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/components/uv-column-notice/uv-column-notice.vue b/uni_modules/uv-notice-bar/components/uv-column-notice/uv-column-notice.vue new file mode 100644 index 0000000..73c6bfc --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-column-notice/uv-column-notice.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/uni_modules/uv-notice-bar/components/uv-notice-bar/props.js b/uni_modules/uv-notice-bar/components/uv-notice-bar/props.js new file mode 100644 index 0000000..3fe0b44 --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-notice-bar/props.js @@ -0,0 +1,76 @@ +export default { + props: { + // 显示的内容,数组 + text: { + type: [Array, String], + default: () => [] + }, + // 通告滚动模式,row-横向滚动,column-竖向滚动 + direction: { + type: String, + default: 'row' + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: false + }, + // 是否显示左侧的音量图标 + icon: { + type: [String, Boolean, null], + default: 'volume' + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: '' + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: '#f9ae3d' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#fdf6ec' + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: 80 + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 14 + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: 2000 + }, + // 跳转的页面路径 + url: { + type: String, + default: '' + }, + // 页面跳转的类型 + linkType: { + type: String, + default: 'navigateTo' + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: true + }, + // 是否禁止滚动,仅`direction="column"生效` + disableScroll: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.noticeBar + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/components/uv-notice-bar/uv-notice-bar.vue b/uni_modules/uv-notice-bar/components/uv-notice-bar/uv-notice-bar.vue new file mode 100644 index 0000000..14dd7c5 --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-notice-bar/uv-notice-bar.vue @@ -0,0 +1,110 @@ + + + + diff --git a/uni_modules/uv-notice-bar/components/uv-row-notice/props.js b/uni_modules/uv-notice-bar/components/uv-row-notice/props.js new file mode 100644 index 0000000..cba1823 --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-row-notice/props.js @@ -0,0 +1,40 @@ +export default { + props: { + // 显示的内容,字符串 + text: { + type: String, + default: '' + }, + // 是否显示左侧的音量图标 + icon: { + type: [String, Boolean, null], + default: 'volume' + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: '' + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: '#f9ae3d' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#fdf6ec' + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: 14 + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(rpx),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: 80 + }, + ...uni.$uv?.props?.rowNotice + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/components/uv-row-notice/uv-row-notice.vue b/uni_modules/uv-notice-bar/components/uv-row-notice/uv-row-notice.vue new file mode 100644 index 0000000..16117dd --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-row-notice/uv-row-notice.vue @@ -0,0 +1,341 @@ + + + + diff --git a/uni_modules/uv-notice-bar/package.json b/uni_modules/uv-notice-bar/package.json new file mode 100644 index 0000000..f1bca29 --- /dev/null +++ b/uni_modules/uv-notice-bar/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-notice-bar", + "displayName": "uv-notice-bar 滚动通知 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.7", + "description": "uv-notice-bar 该组件用于滚动通告场景,有多种模式可供选择。", + "keywords": [ + "uv-notice-bar", + "uvui", + "uv-ui", + "notice", + "滚动公告" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/readme.md b/uni_modules/uv-notice-bar/readme.md new file mode 100644 index 0000000..61eb131 --- /dev/null +++ b/uni_modules/uv-notice-bar/readme.md @@ -0,0 +1,19 @@ +## NoticeBar 滚动通知 + +> **组件名:uv-notice-bar** + +该组件用于滚动通告场景,有多种模式可供选择。灵活配置,开箱即用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-notify/changelog.md b/uni_modules/uv-notify/changelog.md new file mode 100644 index 0000000..5d818ba --- /dev/null +++ b/uni_modules/uv-notify/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-10-13) +1. unmounted兼容vue3 +## 1.0.2(2023-07-02) +uv-notify 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/notify.html +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-notify 消息提示 diff --git a/uni_modules/uv-notify/components/uv-notify/props.js b/uni_modules/uv-notify/components/uv-notify/props.js new file mode 100644 index 0000000..5728276 --- /dev/null +++ b/uni_modules/uv-notify/components/uv-notify/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 到顶部的距离 + top: { + type: [String, Number], + default: 0 + }, + // type主题,primary,success,warning,error + type: { + type: String, + default: 'primary' + }, + // 字体颜色 + color: { + type: String, + default: '#ffffff' + }, + // 背景颜色 + bgColor: { + type: String, + default: '' + }, + // 展示的文字内容 + message: { + type: String, + default: '' + }, + // 展示时长,为0时不消失,单位ms + duration: { + type: [String, Number], + default: 3000 + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 15 + }, + // 是否留出顶部安全距离(状态栏高度) + safeAreaInsetTop: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.notify + } +} \ No newline at end of file diff --git a/uni_modules/uv-notify/components/uv-notify/uv-notify.vue b/uni_modules/uv-notify/components/uv-notify/uv-notify.vue new file mode 100644 index 0000000..96c1566 --- /dev/null +++ b/uni_modules/uv-notify/components/uv-notify/uv-notify.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/uni_modules/uv-notify/package.json b/uni_modules/uv-notify/package.json new file mode 100644 index 0000000..921949b --- /dev/null +++ b/uni_modules/uv-notify/package.json @@ -0,0 +1,90 @@ +{ + "id": "uv-notify", + "displayName": "uv-notify 消息提示 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "uv-notify 该组件一般用于页面顶部向下滑出一个提示,后自动收起的场景。", + "keywords": [ + "uv-notify", + "uvui", + "uv-ui", + "notify", + "消息提示" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-status-bar", + "uv-overlay", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-notify/readme.md b/uni_modules/uv-notify/readme.md new file mode 100644 index 0000000..482344a --- /dev/null +++ b/uni_modules/uv-notify/readme.md @@ -0,0 +1,11 @@ +## Notify 消息提示 + +> **组件名:uv-notify** + +该组件一般用于页面顶部向下滑出一个提示,后自动收起的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-number-box/changelog.md b/uni_modules/uv-number-box/changelog.md new file mode 100644 index 0000000..3f07995 --- /dev/null +++ b/uni_modules/uv-number-box/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-07-13) +1. 修复 uv-number-box设置value属性不生效的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-number-box 步进器 diff --git a/uni_modules/uv-number-box/components/uv-number-box/props.js b/uni_modules/uv-number-box/components/uv-number-box/props.js new file mode 100644 index 0000000..64b633b --- /dev/null +++ b/uni_modules/uv-number-box/components/uv-number-box/props.js @@ -0,0 +1,113 @@ +export default { + props: { + value: { + type: [String, Number], + default: 0 + }, + modelValue: { + type: [String, Number], + default: 0 + }, + // 步进器标识符,在change回调返回 + name: { + type: [String, Number], + default: '' + }, + // 最小值 + min: { + type: [String, Number], + default: 1 + }, + // 最大值 + max: { + type: [String, Number], + default: Number.MAX_SAFE_INTEGER + }, + // 加减的步长,可为小数 + step: { + type: [String, Number], + default: 1 + }, + // 是否只允许输入整数 + integer: { + type: Boolean, + default: false + }, + // 是否禁用,包括输入框,加减按钮 + disabled: { + type: Boolean, + default: false + }, + // 是否禁用输入框 + disabledInput: { + type: Boolean, + default: false + }, + // 是否开启异步变更,开启后需要手动控制输入值 + asyncChange: { + type: Boolean, + default: false + }, + // 输入框宽度,单位为px + inputWidth: { + type: [String, Number], + default: 35 + }, + // 是否显示减少按钮 + showMinus: { + type: Boolean, + default: true + }, + // 是否显示增加按钮 + showPlus: { + type: Boolean, + default: true + }, + // 显示的小数位数 + decimalLength: { + type: [String, Number, null], + default: null + }, + // 是否开启长按加减手势 + longPress: { + type: Boolean, + default: true + }, + // 输入框文字和加减按钮图标的颜色 + color: { + type: String, + default: '#323233' + }, + // 按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致 + buttonSize: { + type: [String, Number], + default: 30 + }, + // 输入框和按钮的背景颜色 + bgColor: { + type: String, + default: '#EBECEE' + }, + // 指定光标于键盘的距离,避免键盘遮挡输入框,单位px + cursorSpacing: { + type: [String, Number], + default: 100 + }, + // 是否禁用增加按钮 + disablePlus: { + type: Boolean, + default: false + }, + // 是否禁用减少按钮 + disableMinus: { + type: Boolean, + default: false + }, + // 加减按钮图标的样式 + iconStyle: { + type: [Object, String], + default: '' + }, + ...uni.$uv?.props?.numberBox + } +} \ No newline at end of file diff --git a/uni_modules/uv-number-box/components/uv-number-box/uv-number-box.vue b/uni_modules/uv-number-box/components/uv-number-box/uv-number-box.vue new file mode 100644 index 0000000..6937e89 --- /dev/null +++ b/uni_modules/uv-number-box/components/uv-number-box/uv-number-box.vue @@ -0,0 +1,395 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-number-box/package.json b/uni_modules/uv-number-box/package.json new file mode 100644 index 0000000..771e6eb --- /dev/null +++ b/uni_modules/uv-number-box/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-number-box", + "displayName": "uv-number-box 步进器 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-number-box 该组件一般用于商城购物选择物品数量的场景。", + "keywords": [ + "uv-number-box", + "uvui", + "uv-ui", + "number", + "步进器" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-number-box/readme.md b/uni_modules/uv-number-box/readme.md new file mode 100644 index 0000000..6b83da9 --- /dev/null +++ b/uni_modules/uv-number-box/readme.md @@ -0,0 +1,11 @@ +## NumberBox 步进器 + +> **组件名:uv-number-box** + +该组件一般用于商城购物选择物品数量的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-overlay/changelog.md b/uni_modules/uv-overlay/changelog.md new file mode 100644 index 0000000..ff14713 --- /dev/null +++ b/uni_modules/uv-overlay/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-07-02) +uv-overlay 由于弹出层uv-transition的修改,组件内部做了相应的修改,参数不变。 +## 1.0.2(2023-06-29) +1. 优化,H5端禁止穿透滚动 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增uv-overlay组件 diff --git a/uni_modules/uv-overlay/components/uv-overlay/props.js b/uni_modules/uv-overlay/components/uv-overlay/props.js new file mode 100644 index 0000000..267c613 --- /dev/null +++ b/uni_modules/uv-overlay/components/uv-overlay/props.js @@ -0,0 +1,25 @@ +export default { + props: { + // 是否显示遮罩 + show: { + type: Boolean, + default: false + }, + // 层级z-index + zIndex: { + type: [String, Number], + default: 10070 + }, + // 遮罩的过渡时间,单位为ms + duration: { + type: [String, Number], + default: 300 + }, + // 不透明度值,当做rgba的第四个参数 + opacity: { + type: [String, Number], + default: 0.5 + }, + ...uni.$uv?.props?.overlay + } +} \ No newline at end of file diff --git a/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue b/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue new file mode 100644 index 0000000..53568c0 --- /dev/null +++ b/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue @@ -0,0 +1,85 @@ + + + + diff --git a/uni_modules/uv-overlay/package.json b/uni_modules/uv-overlay/package.json new file mode 100644 index 0000000..a664f3a --- /dev/null +++ b/uni_modules/uv-overlay/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-overlay", + "displayName": "uv-overlay 遮罩层 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "uv-overlay 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景,uv-popup、uv-toast、uv-tooltip等组件就是用了该组件。", + "keywords": [ + "uv-overlay", + "uvui", + "uv-ui", + "overlay", + "遮罩层" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "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", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-overlay/readme.md b/uni_modules/uv-overlay/readme.md new file mode 100644 index 0000000..4e8af4b --- /dev/null +++ b/uni_modules/uv-overlay/readme.md @@ -0,0 +1,11 @@ +## Overlay 遮罩层 + +> **组件名:uv-overlay** + +创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景,uv-popup、uv-toast、uv-tooltip等组件就是用了该组件。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui、官方QQ群 diff --git a/uni_modules/uv-parse/changelog.md b/uni_modules/uv-parse/changelog.md new file mode 100644 index 0000000..4575e07 --- /dev/null +++ b/uni_modules/uv-parse/changelog.md @@ -0,0 +1,13 @@ +## 1.0.4(2023-07-17) +1. 优化文档 +2. 优化其他 +## 1.0.3(2023-06-19) +1. 修复nvue模式下不显示的BUG +## 1.0.2(2023-06-02) +1. 修复可能存在的BUG +2. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-parse 富文本解析器 diff --git a/uni_modules/uv-parse/components/uv-parse/node/node.vue b/uni_modules/uv-parse/components/uv-parse/node/node.vue new file mode 100644 index 0000000..5857077 --- /dev/null +++ b/uni_modules/uv-parse/components/uv-parse/node/node.vue @@ -0,0 +1,576 @@ +