From 09831dce916aea4b60ca83173d925806c9cfffc3 Mon Sep 17 00:00:00 2001 From: Augcl <1767466882@163.com> Date: Thu, 24 Jul 2025 15:31:45 +0800 Subject: [PATCH] Initial commit --- .gitignore | 14 + App.vue | 23 + README.en.md | 36 + README.md | 411 ++++++ api/api.js | 105 ++ api/http.js | 77 ++ api/model/index.js | 215 ++++ api/model/info.js | 115 ++ api/model/login.js | 35 + api/model/vip.js | 20 + common.scss | 40 + components/base/navbar.vue | 143 +++ components/base/tabbar.vue | 134 ++ components/config/PrivacyAgreementPoup.vue | 169 +++ components/config/configPopup.vue | 48 + components/config/customerServicePopup.vue | 122 ++ components/user/productList.vue | 112 ++ components/userShop/userShopCommission.vue | 130 ++ config.js | 56 + index.html | 20 + main.js | 45 + manifest.json | 105 ++ mixins/configList.js | 47 + mixins/list.js | 78 ++ mixins/order.js | 70 + package.json | 20 + pages.json | 84 ++ pages/index/cart.vue | 260 ++++ pages/index/category.vue | 191 +++ pages/index/center.vue | 353 +++++ pages/index/index.vue | 412 ++++++ pages/index/order.vue | 263 ++++ .../auth/loginAndRegisterAndForgetPassword.vue | 514 ++++++++ pages_order/auth/wxLogin.vue | 155 +++ pages_order/auth/wxUserInfo.vue | 133 ++ pages_order/components/address/addressList.vue | 244 ++++ pages_order/components/address/redactAddress.vue | 220 ++++ pages_order/components/product/submit.vue | 77 ++ .../components/product/submitUnitSelect.vue | 367 ++++++ pages_order/mine/address.vue | 213 ++++ pages_order/mine/help.vue | 172 +++ pages_order/mine/promotion.vue | 283 +++++ pages_order/mine/purse.vue | 109 ++ pages_order/mine/runningWater.vue | 88 ++ pages_order/order/orderDetail.vue | 567 +++++++++ pages_order/order/refundsOrExchange.vue | 353 +++++ pages_order/product/productDetail.vue | 169 +++ pages_order/static/address/icon.png | Bin 0 -> 4586 bytes pages_order/static/address/selectIcon.png | Bin 0 -> 1366 bytes pages_order/static/auth/headImage.png | Bin 0 -> 1443 bytes pages_order/static/auth/wx.png | Bin 0 -> 453 bytes pages_order/static/help/uploading.png | Bin 0 -> 7380 bytes pages_order/static/order/icon.png | Bin 0 -> 3091 bytes pages_order/static/product/like.png | Bin 0 -> 1128 bytes static/image/PrivacyAgreementPoup/icon.png | Bin 0 -> 1007 bytes static/image/cart/1.png | Bin 0 -> 1933 bytes static/image/cart/2.png | Bin 0 -> 5540 bytes static/image/center/1.png | Bin 0 -> 1215 bytes static/image/center/10.png | Bin 0 -> 45856 bytes static/image/center/11.svg | 1 + static/image/center/2.png | Bin 0 -> 6235 bytes static/image/center/3.png | Bin 0 -> 6082 bytes static/image/center/4.png | Bin 0 -> 1783 bytes static/image/center/5.png | Bin 0 -> 2887 bytes static/image/center/6.png | Bin 0 -> 2123 bytes static/image/center/7.png | Bin 0 -> 2439 bytes static/image/center/8.png | Bin 0 -> 2576 bytes static/image/center/9.png | Bin 0 -> 2167 bytes static/image/home/0.png | Bin 0 -> 14285 bytes static/image/home/1.png | Bin 0 -> 13719 bytes static/image/home/2.png | Bin 0 -> 12604 bytes static/image/home/3.png | Bin 0 -> 11689 bytes static/image/home/address-icon.png | Bin 0 -> 1407 bytes static/image/home/arrow-icon.png | Bin 0 -> 296 bytes static/image/home/search-icon.png | Bin 0 -> 1873 bytes static/image/product/favorable.png | Bin 0 -> 282 bytes static/image/tabbar/cart-a.png | Bin 0 -> 958 bytes static/image/tabbar/cart.png | Bin 0 -> 953 bytes static/image/tabbar/category-a.png | Bin 0 -> 1139 bytes static/image/tabbar/category.png | Bin 0 -> 1183 bytes static/image/tabbar/center-a.png | Bin 0 -> 915 bytes static/image/tabbar/center.png | Bin 0 -> 937 bytes static/image/tabbar/home-a.png | Bin 0 -> 2280 bytes static/image/tabbar/home.png | Bin 0 -> 2208 bytes static/image/tabbar/order-a.png | Bin 0 -> 691 bytes static/image/tabbar/order.png | Bin 0 -> 736 bytes static/logo.png | Bin 0 -> 4023 bytes store/store.js | 110 ++ uni.promisify.adaptor.js | 10 + uni.scss | 96 ++ uni_modules/uv-action-sheet/changelog.md | 7 + .../components/uv-action-sheet/props.js | 50 + .../components/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 + uni_modules/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 + .../uv-avatar/components/uv-avatar-group/props.js | 53 + .../components/uv-avatar-group/uv-avatar-group.vue | 106 ++ .../uv-avatar/components/uv-avatar/props.js | 80 ++ .../uv-avatar/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 + .../uv-back-top/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 + uni_modules/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 +++ .../uv-button/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 + .../uv-calendar/components/uv-calendar/calendar.js | 546 ++++++++ .../uv-calendar/components/uv-calendar/header.vue | 104 ++ .../uv-calendar/components/uv-calendar/month.vue | 616 +++++++++ .../uv-calendar/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 + .../uv-calendars/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 + .../components/uv-cell-group/uv-cell-group.vue | 63 + uni_modules/uv-cell/components/uv-cell/props.js | 116 ++ uni_modules/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 ++ .../uv-checkbox/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 ++ .../components/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 + uni_modules/uv-code/components/uv-code/props.js | 35 + uni_modules/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 ++++ .../uv-collapse/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 + .../components/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 + .../uv-count-to/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 + uni_modules/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 ++++ uni_modules/uv-form/components/uv-form/props.js | 46 + uni_modules/uv-form/components/uv-form/uv-form.vue | 209 +++ uni_modules/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 + uni_modules/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 ++++ uni_modules/uv-grid/components/uv-grid/props.js | 20 + uni_modules/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 + uni_modules/uv-icon/components/uv-icon/icons.js | 160 +++ uni_modules/uv-icon/components/uv-icon/props.js | 90 ++ uni_modules/uv-icon/components/uv-icon/uv-icon.vue | 226 ++++ uni_modules/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 + uni_modules/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 + .../components/uv-index-anchor/uv-index-anchor.vue | 98 ++ .../components/uv-index-item/uv-index-item.vue | 87 ++ .../components/uv-index-list/props.js | 30 + .../components/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 + uni_modules/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 + .../components/uv-keyboard-car/uv-keyboard-car.vue | 347 +++++ .../components/uv-keyboard-number/props.js | 19 + .../uv-keyboard-number/uv-keyboard-number.vue | 201 +++ .../uv-keyboard/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 + uni_modules/uv-line/components/uv-line/props.js | 34 + uni_modules/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 + uni_modules/uv-link/components/uv-link/props.js | 40 + uni_modules/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 ++++++++ uni_modules/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 + .../uv-load-more/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 + .../components/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 + .../components/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 + uni_modules/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 ++ .../uv-navbar/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 + .../components/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 ++ .../components/uv-notice-bar/uv-notice-bar.vue | 110 ++ .../components/uv-row-notice/props.js | 40 + .../components/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 + .../uv-notify/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 ++ .../components/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 + .../uv-parse/components/uv-parse/node/node.vue | 576 +++++++++ uni_modules/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 ++++ .../static/app-plus/uv-parse/js/uni.webview.min.js | 19 + .../uv-parse/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 + .../components/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 ++ .../uv-picker/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 ++++ .../gcanvas/context-2d/FillStyleLinearGradient.js | 18 + .../gcanvas/context-2d/FillStylePattern.js | 8 + .../gcanvas/context-2d/FillStyleRadialGradient.js | 17 + .../gcanvas/context-2d/RenderingContext.js | 666 ++++++++++ .../uv-qrcode/gcanvas/context-webgl/ActiveInfo.js | 11 + .../uv-qrcode/gcanvas/context-webgl/Buffer.js | 21 + .../uv-qrcode/gcanvas/context-webgl/Framebuffer.js | 21 + .../uv-qrcode/gcanvas/context-webgl/GLenum.js | 298 +++++ .../uv-qrcode/gcanvas/context-webgl/GLmethod.js | 142 +++ .../uv-qrcode/gcanvas/context-webgl/GLtype.js | 23 + .../uv-qrcode/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 + .../gcanvas/context-webgl/ShaderPrecisionFormat.js | 11 + .../uv-qrcode/gcanvas/context-webgl/Texture.js | 22 + .../gcanvas/context-webgl/UniformLocation.js | 22 + .../uv-qrcode/gcanvas/context-webgl/classUtils.js | 3 + .../components/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 + .../uv-qrcode/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 + .../uv-radio/components/uv-radio-group/props.js | 89 ++ .../components/uv-radio-group/uv-radio-group.vue | 115 ++ uni_modules/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 + uni_modules/uv-rate/components/uv-rate/props.js | 73 ++ uni_modules/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 + .../uv-read-more/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 + uni_modules/uv-row/components/uv-col/uv-col.vue | 165 +++ uni_modules/uv-row/components/uv-row/props.js | 20 + uni_modules/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 + .../components/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 + .../components/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 ++ .../uv-search/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 + .../uv-skeleton/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 + .../uv-slider/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 + .../components/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 + .../uv-steps/components/uv-steps-item/props.js | 25 + .../components/uv-steps-item/uv-steps-item.vue | 347 +++++ uni_modules/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 + .../uv-sticky/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 + .../components/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/uv-swipe-action-item.vue | 200 +++ .../components/uv-swipe-action-item/wxs.js | 15 + .../components/uv-swipe-action/props.js | 10 + .../components/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/uv-swiper-indicator.vue | 112 ++ .../uv-swiper/components/uv-swiper/props.js | 136 ++ .../uv-swiper/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 + .../uv-switch/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 + .../uv-tabbar/components/uv-tabbar-item/props.js | 40 + .../components/uv-tabbar-item/uv-tabbar-item.vue | 146 +++ .../uv-tabbar/components/uv-tabbar/props.js | 50 + .../uv-tabbar/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 + uni_modules/uv-tabs/components/uv-tabs/props.js | 71 ++ uni_modules/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 + uni_modules/uv-tags/components/uv-tags/props.js | 95 ++ uni_modules/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 + uni_modules/uv-text/components/uv-text/props.js | 113 ++ uni_modules/uv-text/components/uv-text/uv-text.vue | 218 ++++ uni_modules/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 + .../uv-textarea/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 + .../components/uv-transition/createAnimation.js | 131 ++ .../components/uv-transition/props.js | 31 + .../components/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 | 33 + uni_modules/uv-ui-tools/libs/css/common.scss | 100 ++ uni_modules/uv-ui-tools/libs/css/components.scss | 23 + uni_modules/uv-ui-tools/libs/css/variable.scss | 111 ++ uni_modules/uv-ui-tools/libs/css/vue.scss | 40 + .../uv-ui-tools/libs/function/colorGradient.js | 134 ++ uni_modules/uv-ui-tools/libs/function/debounce.js | 29 + uni_modules/uv-ui-tools/libs/function/digit.js | 167 +++ uni_modules/uv-ui-tools/libs/function/index.js | 734 +++++++++++ uni_modules/uv-ui-tools/libs/function/platform.js | 75 ++ uni_modules/uv-ui-tools/libs/function/test.js | 287 +++++ uni_modules/uv-ui-tools/libs/function/throttle.js | 30 + .../libs/luch-request/adapters/index.js | 132 ++ .../libs/luch-request/core/InterceptorManager.js | 51 + .../uv-ui-tools/libs/luch-request/core/Request.js | 201 +++ .../libs/luch-request/core/buildFullPath.js | 20 + .../uv-ui-tools/libs/luch-request/core/defaults.js | 33 + .../libs/luch-request/core/dispatchRequest.js | 6 + .../libs/luch-request/core/mergeConfig.js | 126 ++ .../uv-ui-tools/libs/luch-request/core/settle.js | 16 + .../libs/luch-request/helpers/buildURL.js | 64 + .../libs/luch-request/helpers/combineURLs.js | 14 + .../libs/luch-request/helpers/isAbsoluteURL.js | 14 + .../uv-ui-tools/libs/luch-request/index.d.ts | 197 +++ uni_modules/uv-ui-tools/libs/luch-request/index.js | 2 + uni_modules/uv-ui-tools/libs/luch-request/utils.js | 135 ++ .../uv-ui-tools/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 + uni_modules/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 +++ .../uv-upload/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 + .../components/uv-vtabs-item/uv-vtabs-item.vue | 68 + uni_modules/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 + .../uv-waterfall/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 + utils/authorize.js | 53 + utils/index.js | 77 ++ utils/lib/jweixin-module.js | 733 +++++++++++ utils/lib/md5.js | 876 +++++++++++++ utils/oss-upload/common/crypto/base64.js | 95 ++ utils/oss-upload/common/crypto/crypto.js.js | 117 ++ utils/oss-upload/common/crypto/hmac.js | 29 + utils/oss-upload/common/crypto/sha1.js | 59 + utils/oss-upload/oss/OSSConfig.js | 36 + utils/oss-upload/oss/index.js | 130 ++ utils/oss-upload/oss/web.js | 63 + utils/pay.js | 47 + utils/position.js | 184 +++ utils/share.js | 75 ++ utils/timeUtils.js | 37 + utils/tree.js | 43 + utils/utils.js | 244 ++++ 626 files changed, 64773 insertions(+) create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 README.en.md create mode 100644 README.md create mode 100644 api/api.js create mode 100644 api/http.js create mode 100644 api/model/index.js create mode 100644 api/model/info.js create mode 100644 api/model/login.js create mode 100644 api/model/vip.js create mode 100644 common.scss create mode 100644 components/base/navbar.vue create mode 100644 components/base/tabbar.vue create mode 100644 components/config/PrivacyAgreementPoup.vue create mode 100644 components/config/configPopup.vue create mode 100644 components/config/customerServicePopup.vue create mode 100644 components/user/productList.vue create mode 100644 components/userShop/userShopCommission.vue create mode 100644 config.js create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 mixins/configList.js create mode 100644 mixins/list.js create mode 100644 mixins/order.js create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/index/cart.vue create mode 100644 pages/index/category.vue create mode 100644 pages/index/center.vue create mode 100644 pages/index/index.vue create mode 100644 pages/index/order.vue create mode 100644 pages_order/auth/loginAndRegisterAndForgetPassword.vue create mode 100644 pages_order/auth/wxLogin.vue create mode 100644 pages_order/auth/wxUserInfo.vue create mode 100644 pages_order/components/address/addressList.vue create mode 100644 pages_order/components/address/redactAddress.vue create mode 100644 pages_order/components/product/submit.vue create mode 100644 pages_order/components/product/submitUnitSelect.vue create mode 100644 pages_order/mine/address.vue create mode 100644 pages_order/mine/help.vue create mode 100644 pages_order/mine/promotion.vue create mode 100644 pages_order/mine/purse.vue create mode 100644 pages_order/mine/runningWater.vue create mode 100644 pages_order/order/orderDetail.vue create mode 100644 pages_order/order/refundsOrExchange.vue create mode 100644 pages_order/product/productDetail.vue create mode 100644 pages_order/static/address/icon.png create mode 100644 pages_order/static/address/selectIcon.png create mode 100644 pages_order/static/auth/headImage.png create mode 100644 pages_order/static/auth/wx.png create mode 100644 pages_order/static/help/uploading.png create mode 100644 pages_order/static/order/icon.png create mode 100644 pages_order/static/product/like.png create mode 100644 static/image/PrivacyAgreementPoup/icon.png create mode 100644 static/image/cart/1.png create mode 100644 static/image/cart/2.png create mode 100644 static/image/center/1.png create mode 100644 static/image/center/10.png create mode 100644 static/image/center/11.svg create mode 100644 static/image/center/2.png create mode 100644 static/image/center/3.png create mode 100644 static/image/center/4.png create mode 100644 static/image/center/5.png create mode 100644 static/image/center/6.png create mode 100644 static/image/center/7.png create mode 100644 static/image/center/8.png create mode 100644 static/image/center/9.png create mode 100644 static/image/home/0.png create mode 100644 static/image/home/1.png create mode 100644 static/image/home/2.png create mode 100644 static/image/home/3.png create mode 100644 static/image/home/address-icon.png create mode 100644 static/image/home/arrow-icon.png create mode 100644 static/image/home/search-icon.png create mode 100644 static/image/product/favorable.png create mode 100644 static/image/tabbar/cart-a.png create mode 100644 static/image/tabbar/cart.png create mode 100644 static/image/tabbar/category-a.png create mode 100644 static/image/tabbar/category.png create mode 100644 static/image/tabbar/center-a.png create mode 100644 static/image/tabbar/center.png create mode 100644 static/image/tabbar/home-a.png create mode 100644 static/image/tabbar/home.png create mode 100644 static/image/tabbar/order-a.png create mode 100644 static/image/tabbar/order.png create mode 100644 static/logo.png create mode 100644 store/store.js create mode 100644 uni.promisify.adaptor.js create mode 100644 uni.scss 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 create mode 100644 utils/authorize.js create mode 100644 utils/index.js create mode 100644 utils/lib/jweixin-module.js create mode 100644 utils/lib/md5.js create mode 100644 utils/oss-upload/common/crypto/base64.js create mode 100644 utils/oss-upload/common/crypto/crypto.js.js create mode 100644 utils/oss-upload/common/crypto/hmac.js create mode 100644 utils/oss-upload/common/crypto/sha1.js create mode 100644 utils/oss-upload/oss/OSSConfig.js create mode 100644 utils/oss-upload/oss/index.js create mode 100644 utils/oss-upload/oss/web.js create mode 100644 utils/pay.js create mode 100644 utils/position.js create mode 100644 utils/share.js create mode 100644 utils/timeUtils.js create mode 100644 utils/tree.js create mode 100644 utils/utils.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e23bc12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +.idea +package-lock.json +node_modules/ +unpackage/ +.hbuilderx +.vite \ No newline at end of file diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..cc1058b --- /dev/null +++ b/App.vue @@ -0,0 +1,23 @@ + + + diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..fff4890 --- /dev/null +++ b/README.en.md @@ -0,0 +1,36 @@ +# uniapp项目开发模板 + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md new file mode 100644 index 0000000..9a7916a --- /dev/null +++ b/README.md @@ -0,0 +1,411 @@ +# 商城项目文档 + +## 项目概述 +本项目是一个基于uni-app开发的商城小程序,采用Vue框架开发,集成了完整的商城功能模块。 + +## 目录结构 +``` +├── api # API接口目录 +│ ├── api.js # API统一出口 +│ ├── http.js # HTTP请求封装 +│ └── model # 业务模块API +├── components # 公共组件 +├── mixins # 混入文件 +├── pages # 页面文件 +├── static # 静态资源 +├── store # Vuex状态管理 +├── utils # 工具函数 +└── uni_modules # uni-app插件模块 +``` + +## 分包结构说明 + +### pages_order分包 +分包是小程序优化加载性能的重要手段,pages_order作为独立分包,包含以下模块: + +``` +├── auth # 认证相关页面 +│ ├── loginAndRegisterAndForgetPassword.vue # 登录注册 +│ ├── wxLogin.vue # 微信登录 +│ └── wxUserInfo.vue # 微信用户信息 +├── components # 分包内公共组件 +│ ├── address/ # 地址选择组件 +│ ├── areaSelector/ # 区域选择器 +│ └── product/ # 商品相关组件 +├── home # 首页相关 +│ ├── addEnterprise.vue # 添加企业 +│ ├── contact.vue # 联系我们 +│ ├── introduce.vue # 介绍页面 +│ ├── journalism.vue # 新闻资讯 +│ └── notice.vue # 公告 +├── mine # 我的模块 +│ ├── address.vue # 收货地址 +│ ├── balance.vue # 余额 +│ ├── commission.vue # 佣金 +│ ├── coupon.vue # 优惠券 +│ ├── memberCenter.vue # 会员中心 +│ └── more... # 更多功能页面 +├── order # 订单模块 +│ ├── createOrder.vue # 创建订单 +│ ├── orderDetail.vue # 订单详情 +│ └── giftList.vue # 礼品列表 +├── product # 商品模块 +│ └── productDetail.vue # 商品详情 +└── static # 分包静态资源 + ├── address/ # 地址相关图片 + ├── auth/ # 认证相关图片 + ├── coupon/ # 优惠券图片 + └── more... # 其他静态资源 +``` + +**分包特点:** +- 静态资源就近原则:分包相关的图片等静态资源存放在分包目录下,避免主包体积过大 +- 模块化组织:按功能模块划分目录,便于维护和管理 +- 组件复用:分包内的通用组件集中管理,提高代码复用性 + +## 配置文件说明 + +### config.js +项目核心配置文件,包含以下配置: + +**1. 环境配置** +```javascript +// 当前环境 +const type = 'prod' + +// 环境配置 +const config = { + dev: { + baseUrl: 'http://h5.xzaiyp.top/jewelry-admin', + }, + prod: { + baseUrl: 'https://jewelry-admin.hhlm1688.com/jewelry-admin', + } +} +``` + +**2. 默认配置** +```javascript +const defaultConfig = { + // 腾讯地图Key + mapKey: 'XMBBZ-BCPCV-SXPPQ-5Y7MY-PHZXK-YFFVU', + // 阿里云OSS配置 + aliOss: { + url: 'https://image.hhlm1688.com/', + config: { + region: 'oss-cn-guangzhou', + accessKeyId: '***', + accessKeySecret: '***', + bucket: 'hanhaiimage', + endpoint: 'oss-cn-shenzhen.aliyuncs.com', + } + } +} +``` + +**3. UI框架配置** +```javascript +uni.$uv.setConfig({ + config: { + unit: 'rpx' // 设置默认单位 + }, +}) + +// UI文档地址 https://www.uvui.cn/ +``` + +## 核心模块详解 + +### 1. Mixins 混入 + +#### 1.1 list.js - 列表数据加载混入 +提供列表数据的加载、分页、下拉刷新、上拉加载更多等功能。 + +**主要功能:** +- 统一的分页参数处理 +- 下拉刷新和上拉加载更多 +- 数据加载状态管理 + +**使用示例:** +```javascript +// 在页面中使用list混入 +import listMixin from '@/mixins/list.js' + +export default { + mixins: [listMixin], + data() { + return { + // 指定API接口 + mixinsListApi: 'productList' + } + } +} +``` + +#### 1.2 configList.js - 全局配置混入 +已全局引入的配置管理混入,无需手动引入即可使用。 + +**主要功能:** +- 统一的分享配置 +- 全局配置管理 +- 用户信息关联 + +**配置参数:** +```javascript +// 分享配置示例 +this.Gshare.title = '分享标题' +this.Gshare.path = '分享路径' +``` + +### 2. API 模块 + +#### 2.1 http.js - 请求封装 +统一的HTTP请求处理,包含: +- 请求拦截器 +- 响应拦截器 +- 统一的错误处理 +- Token管理 + +#### 2.2 api.js - 接口管理 +统一管理API接口,支持模块化组织。API模块采用分层结构,便于维护和扩展。 + +**目录结构:** +``` +api/ +├── api.js # API统一出口 +├── http.js # HTTP请求封装 +└── model/ # 业务模块API + ├── product.js # 商品相关接口 + ├── order.js # 订单相关接口 + └── user.js # 用户相关接口 +``` + +**接口定义示例:** +```javascript +// api/model/product.js +export default { + // GET请求示例 + list: { + url: '/api/product/list', + method: 'GET', + loading: true // 显示加载提示 + }, + + // POST请求示例 + create: { + url: '/api/product/create', + method: 'POST', + loading: true // 显示加载提示 + auth : true,//效验登录 + debounce : 1000,//接口防抖,1s + limit : 500,//接口限流,0.5s + }, +} +``` + +**调用接口示例:** +```javascript +// 第一种写法:callback方式处理响应 +this.$api('product.list', { + pageNo: 1, + pageSize: 10, + categoryId: '123' +}, res => { + // 处理列表数据 +}) + +// 第二种写法:Promise方式处理响应 +this.$api('product.create', { + name: '商品名称', + price: 99.99, + description: '商品描述' +}).then(res => { + if (res.code === 200) { + // 创建成功 + uni.showToast({ title: '创建成功' }) + } +}) +``` + + +### 3. 公共代码 + +#### 3.1 工具函数 (utils) +- authorize.js: 授权处理 +- pay.js: 微信网页支付相关 +- utils.js: 通用工具函数 +- timeUtils.js: 时间处理 +- position.js: 定位与位置计算 +- oss-upload: 阿里云OSS上传模块 + + +**使用示例:** +```javascript + +// 授权处理 +async preservationImg(img) { + await this.$authorize('scope.writePhotosAlbum') + //在执行$authorize之后,await下面的代码都是确保授权完成的情况下执行 +}, + +// 时间格式化 +const formattedTime = this.$timeUtils.formatTime(new Date()) + +// 项目中在Vue集成了dayjs >>,可以直接使用 +// 在utils/index中Vue.prototype.$dayjs +this.$dayjs() + +// 微信网页支付调用 +import { wxPay } from '@/utils/pay' +wxPay(orderData) +``` + +#### 3.2 公共组件 +- navbar.vue: 自定义导航栏 +- tabbar.vue: 底部导航栏 + +**使用示例:** +```html + +``` + + +#### 3.3 OSS上传模块 + +**配置说明:** +项目使用阿里云OSS进行文件存储,相关配置位于config.js中: + + +**使用示例:** + +1. 单文件上传 +```javascript +export default { + methods: { + onUpload(file) { + this.$Oss.ossUpload(file.path).then(url => { + this.filePath = url + }) + } + } +} +``` + +2. 在uv-upload组件中使用 +```html + + + +``` + +**注意事项:** +1. 上传前请确保OSS配置正确 +2. 建议对上传文件大小进行限制 +3. 支持的文件类型:图片、视频、文档等 +4. 上传失败时会抛出异常,请做好错误处理 + +## 最佳实践 + +### 1. 列表页面开发 +```javascript +// pages/product/list.vue +import listMixin from '@/mixins/list.js' + +export default { + mixins: [listMixin], + data() { + return { + mixinsListApi: 'productList', + } + }, + methods: { + // 分类切换 + onCategoryChange(categoryId) { + this.queryParams.categoryId = categoryId + this.getData() + } + } +} +``` + +### 2. 详情页面开发 +```javascript +// pages/product/detail.vue +import configMixin from '@/mixins/configList.js' + +export default { + mixins: [configMixin], + data() { + return { + productId: '', + detail: {} + } + }, + onLoad(options) { + this.productId = options.id + this.getDetail() + }, + methods: { + getDetail() { + this.$api('productDetail', { + id: this.productId + }, res => { + this.detail = res.result + // 设置分享信息 + this.Gshare.title = this.detail.name + this.Gshare.path = `/pages/product/detail?id=${this.productId}` + }) + } + } +} +``` + +## 注意事项 +1. 使用mixins时注意命名冲突 +2. API调用建议统一使用this.$api方式 +3. 页面开发建议继承相应的混入来复用通用功能 + +## 常见问题 +1. 列表加载失败 + - 检查mixinsListApi是否正确配置 + - 确认网络请求是否正常 + - 查看请求参数格式是否正确 + diff --git a/api/api.js b/api/api.js new file mode 100644 index 0000000..d566315 --- /dev/null +++ b/api/api.js @@ -0,0 +1,105 @@ +import http from './http.js' +import utils from '../utils/utils.js' + + +let limit = {} +let debounce = {} + +const models = ['login', 'index', 'vip', 'info'] + +const config = { + // 示例 + // wxLogin : {url : '/api/wxLogin', method : 'POST', + // auth : false, showLoading : true, loadingTitle : '加载中...', + // limit : 1000 + // }, + + getConfig : {url : '/config_common/getConfig', method : 'GET', limit : 500}, +} + + +export function api(key, data, callback, loadingTitle) { + let req = config[key] + + if (!req) { + console.error('无效key' + key); + return Promise.reject() + } + + if (typeof callback == 'string') { + loadingTitle = callback + } + + if (typeof data == 'function') { + callback = data + data = {} + } + + // 接口限流 + if (req.limit) { + let storageKey = req.url + let storage = limit[storageKey] + if (storage && new Date().getTime() - storage < req.limit) { + return Promise.reject() + } + limit[storageKey] = new Date().getTime() + } + + //必须登录 + if (req.auth) { + if (!uni.getStorageSync('token')) { + utils.toLogin() + console.error('需要登录', req.url) + return Promise.reject() + } + } + + // 接口防抖 + if(req.debounce){ + + let storageKey = req.url + let storage = debounce[storageKey] + + if (storage) { + clearTimeout(storage) + } + + debounce[storageKey] = setTimeout(() => { + + clearTimeout(storage) + + delete debounce[storageKey] + + http.http(req.url, data, callback, req.method, + loadingTitle || req.showLoading, loadingTitle || req.loadingTitle) + }, req.debounce) + + return Promise.reject() + } + + return http.http(req.url, data, callback, req.method, + loadingTitle || req.showLoading, loadingTitle || req.loadingTitle) +} + + +function addApiModel(model, key){ + for(let k in model){ + if(config[`${k}`]){ + console.error(`重名api------model=${key},key=${k}`); + uni.showModal({ + title: `重名api`, + content: `model=${key},key=${k}` + }) + continue + } + config[`${k}`] = model[k] + // config[`${key}_${k}`] = model[k] + } +} + +models.forEach(key => { + addApiModel(require(`./model/${key}.js`).default, key) +}) + + +export default api \ No newline at end of file diff --git a/api/http.js b/api/http.js new file mode 100644 index 0000000..6c3da63 --- /dev/null +++ b/api/http.js @@ -0,0 +1,77 @@ + +import Vue from 'vue' +import utils from '../utils/utils.js' +import store from '../store/store.js' + +function http(uri, data, callback, method = 'GET', showLoading, title) { + + if(showLoading){ + uni.showLoading({ + title: title || '加载中...' + }); + } + + let reject, resolve; + + let promise = new Promise((res, rej) => { + reject = rej + resolve = res + }) + + uni.request({ + url: Vue.prototype.$config.baseUrl + uri, + data, + method: method, + header: { + 'X-Access-Token': uni.getStorageSync('token'), + 'Content-Type' : 'application/x-www-form-urlencoded' + }, + success: (res) => { + // console.log(res,'res') + if(showLoading){ + uni.hideLoading(); + } + + if(res.statusCode == 401 || + res.data.message == '操作失败,token非法无效!' || + res.data.message == '操作失败,用户不存在!'){ + store.commit('logout') + console.error('登录过期'); + utils.toLogin() + } + + if(res.statusCode == 200 && res.data.code != 200 + && res.data.code != 902){ + uni.showToast({ + mask: true, + duration: 1000, + title: res.data.message, + icon:'none' + }); + } + + callback && callback(res.data) + resolve(res.data) + }, + + fail: () => { + reject('api fail') + uni.showLoading({}) + setTimeout(()=>{ + uni.hideLoading() + uni.showToast({icon:"none", title:"网络异常"}) + }, 3000) + + if(showLoading){ + uni.hideLoading(); + } + } + }); + + return promise +} + + +export default { + http: http, +} \ No newline at end of file diff --git a/api/model/index.js b/api/model/index.js new file mode 100644 index 0000000..3bd6c97 --- /dev/null +++ b/api/model/index.js @@ -0,0 +1,215 @@ +// 首页相关接口 + +const api = { + // 获取首页轮播图 + getRiceBanner: { + url: '/index_common/getRiceBanner', + method: 'GET', + }, + // 获取首页常规产品【废弃】 + // getRiceCommonProductList: { + // url: '/index_common/getRiceCommonProductList', + // method: 'GET', + // }, + // 获取首页跳转图标 + getRiceIconList: { + url: '/index_common/getRiceIconList', + method: 'GET', + }, + // 获取首页新闻详情 + getRiceNewsDetail: { + url: '/index_common/getCommonNewsDetail', + method: 'GET', + }, + // 获取首页新闻列表 + getRiceNewsList: { + url: '/index_common/getRiceNewsList', + method: 'GET', + }, + // 获取首页公告列表 + getRiceNoticeList: { + url: '/index_common/getRiceNoticeList', + method: 'GET', + }, + // 获取首页商品详情 + getRiceProductDetail: { + url: '/index_common/getRiceProductDetail', + method: 'GET', + }, + // 获取首页体验产品 + getRiceProductList: { + url: '/index_common/getRiceProductList', + method: 'GET', + }, + // 查询分类接口 + getCategoryList: { + url: '/index_common/getCategoryList', + method: 'GET', + }, + // 新查询分类以及商品数据接口 + getCategoryPidList: { + url: '/index_common/getCategoryPidList', + method: 'GET', + debounce : 250, + }, + // 查询一级分类接口 + getPidList: { + url: '/index_common/getCategoryPidList', + method: 'GET', + }, + // 获取分类分页商品列表接口 + getClassShopPageList: { + url: '/index_common/getClassShopPageList', + method: 'GET', + }, + // 加入购物车 + addCart: { + url: '/index_common/addCart', + method: 'GET', + auth: true, + showLoading: true, + limit : 500, + }, + // 删除购物车信息 + deleteCart: { + url: '/index_common/deleteCart', + method: 'DELETE', + auth: true, + showLoading: true, + }, + // 修改购物车信息数量 + updateCartNum: { + url: '/index_common/updateCartNum', + method: 'POST', + auth: true, + debounce: 300, + }, + // 创建订单 + createOrder: { + url: '/index_common/createOrder', + method: 'GET', + auth: true, + limit: 1000, + showLoading: true, + }, + // 创建订单-再次支付 + createOrderTwo: { + url: '/index_common/createOrderTwo', + method: 'GET', + auth: true, + limit: 1000, + showLoading: true, + }, + // 多商品创建订单 + createSumOrder: { + url: '/index_common/createSumOrder', + method: 'POST', + auth: true, + limit: 1000, + showLoading: true, + }, + // 多商品订单再次支付 + createSumOrderAgain: { + url: '/index_common/createSumOrderAgain', + method: 'POST', + auth: true, + limit: 1000, + showLoading: true, + }, + // 确认收货 + confirmOrder: { + url: '/index_common/confirmOrder', + method: 'GET', + auth: true, + limit: 1000, + showLoading: true, + }, + // 取消订单 + cancelOrder: { + url: '/index_common/cancelOrder', + method: 'GET', + auth: true, + limit: 1000, + showLoading: true, + }, + // 获取首页广告列表 + getRiceProductList: { + url: '/index_common/getRiceAdList', + method: 'GET', + }, + // 获取首页广告列表 + getRiceAdDetail: { + url: '/index_common/getRiceAdDetail', + method: 'GET', + }, + //获取优惠券信息 + getRiceCouponList: { + url: '/info_common/getRiceCouponList', + method: 'GET', + }, + //增加或者修改合伙人申请信息 + addOrUpdateCommonUser: { + url: '/index_common/addOrUpdateCommonUser', + method: 'POST', + }, + //根据用户查询渠合伙人申请信息表单 + getCommonUser: { + url: '/index_common/getCommonUser', + method: 'GET' + }, + //提交反馈信息 + addFeedback: { + url: '/info_common/addFeedback', + method: 'POST' + }, + // 获取我的直接推荐间接推荐用户列表带分页 + getHanHaiMemberUser: { + url: '/info_common/getHanHaiMemberUser', + method: 'GET' + }, + // 获取祝福背景图 + getRiceBlessing: { + url: '/index_common/getRiceBlessing', + method: 'GET' + }, + // 随机获取祝福语 + getRiceBlessingWords: { + url: '/index_common/getRiceBlessingWords', + method: 'GET' + }, + // 根据订单标识修改订单祝福语背景 + updateOrderBlessing: { + url: '/index_common/updateOrderBlessing', + method: 'POST', + auth : true, + limit : 1000, + }, + // 1.收礼流程 =》点击收礼 + getGiveShop: { + url: '/index_common/getGiveShop', + method: 'GET', + auth : true, + limit : 1000, + }, + // 2.点击抽奖 =》抽奖 + getGiveShopLottery: { + url: '/index_common/getGiveShopLottery', + method: 'GET', + auth : true, + limit : 1000, + }, + // 获取我的礼品订单 + getMyGiftOrder: { + url: '/index_common/getMyGiftOrder', + method: 'GET', + auth : true, + }, + // 获取我的礼品订单详情 + getMyGiftOrderDetail: { + url: '/index_common/getMyGiftOrderDetail', + method: 'GET', + auth : true, + }, +} + +export default api \ No newline at end of file diff --git a/api/model/info.js b/api/model/info.js new file mode 100644 index 0000000..a695abd --- /dev/null +++ b/api/model/info.js @@ -0,0 +1,115 @@ +// 个人相关接口 + +const api = { + // 充值 + recharge: { + url: '/info_common/withdraw', + method: 'GET', + auth: true, + limit: 1000, + showLoading: true, + }, + // 提现 + withdraw: { + url: '/info_common/withdraw', + method: 'GET', + auth: true, + limit: 1000, + showLoading: true, + }, + // 获取地址列表带分页 + getAddressPageList: { + url: '/info_common/getAddressPageList', + method: 'GET', + auth: true, + }, + // 增加或修改地址信息 + addOrUpdateAddress: { + url: '/info_common/addOrUpdateAddress', + method: 'POST', + limit: 500, + auth: true, + showLoading: true, + }, + // 删除地址 + deleteAddress: { + url: '/info_common/deleteAddress', + method: 'GET', + limit: 500, + auth: true, + showLoading: true, + }, + // 修改默认地址 + updateDefaultAddress: { + url: '/info_common/updateDefaultAddress', + method: 'GET', + auth: true, + limit: 1000, + }, + // 获取粉丝列表带分页 + getFansPageList: { + url: '/info_common/getFansPageList', + method: 'GET', + auth: true, + }, + // 获取相关介绍 + getInfoIntroduce: { + url: '/info_common/getInfoIntroduce', + method: 'GET', + auth: true, + }, + // 获取个人邀请码 + getInviteCode: { + url: '/info_common/getInviteCode', + method: 'GET', + auth: true, + }, + // 获取订单列表带分页 + getOrderPageList: { + url: '/info_common/getOrderPageList', + method: 'GET', + auth: true, + }, + // 获取订单详情 + getOrderDetail: { + url: '/info_common/getOrderDetail', + method: 'GET', + auth: true, + }, + // 获取流水记录带分页 + getWaterPageList: { + url: '/info_common/getWaterPageList', + method: 'GET', + auth: true, + }, + // 获取相关介绍 + getInfoIntroduce: { + url: '/info_common/getInfoIntroduce', + method: 'GET', + }, + // 获取相关介绍详情 + getInfoIntroduceDetail: { + url: '/info_common/getRiceNewsDetail', + method: 'GET', + }, + // 查询个人信息相关 + getRiceInfo: { + url: '/info_common/getRiceInfo', + method: 'GET', + limit: 500, + }, + // 获取购物车信息列表带分页 + getCartPageList: { + url: '/info_common/getCartPageList', + method: 'GET', + }, + // 领取新人优惠券 + getRiceCoupon: { + url: '/info_common/getRiceCoupon', + method: 'GET', + limit: 500, + auth: true, + }, +} + +export default api \ No newline at end of file diff --git a/api/model/login.js b/api/model/login.js new file mode 100644 index 0000000..c818a04 --- /dev/null +++ b/api/model/login.js @@ -0,0 +1,35 @@ + + +// 登录相关接口 + +const api = { + // 微信登录接口 + wxLogin: { + url: '/login_common/appletLogin', + method: 'GET', + limit : 500, + showLoading : true, + }, + // 获取绑定手机号码 + bindPhone: { + url: '/login_common/bindPhone', + method: 'GET', + auth: true, + }, + // 修改个人信息接口 + updateInfo: { + url: '/info_common/updateInfo', + method: 'POST', + auth: true, + limit : 500, + showLoading : true, + }, + // 获取个人信息 + getInfo: { + url: '/info_common/getInfo', + method: 'GET', + auth: true, + }, +} + +export default api \ No newline at end of file diff --git a/api/model/vip.js b/api/model/vip.js new file mode 100644 index 0000000..c2d4b7b --- /dev/null +++ b/api/model/vip.js @@ -0,0 +1,20 @@ + +// vip相关接口 + +const api = { + // 获取会员权益列表 + getRiceVipList: { + url: '/index_common/getVipInfoList', + method: 'GET', + }, + // 申请成为会员 + applyRiceVip: { + url: '/rice_vip/applyRiceVip', + method: 'POST', + limit : 500, + auth : true, + showLoading : true, + }, +} + +export default api \ No newline at end of file diff --git a/common.scss b/common.scss new file mode 100644 index 0000000..5fd3072 --- /dev/null +++ b/common.scss @@ -0,0 +1,40 @@ + +// 文字益处处理 +.text-ellipsis{ + overflow:hidden; //超出的文本隐藏 + text-overflow:ellipsis; //溢出用省略号显示 + white-space:nowrap; //溢出不换行 +} +.text-ellipsis-2{ + overflow: hidden; + text-overflow: ellipsis; + display:-webkit-box; //作为弹性伸缩盒子模型显示。 + -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列 + -webkit-line-clamp:2; //显示的行 +} +.text-ellipsis-3{ + overflow: hidden; + text-overflow: ellipsis; + display:-webkit-box; //作为弹性伸缩盒子模型显示。 + -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列 + -webkit-line-clamp:3; //显示的行 +} + + +.share{ + padding: 0; + margin: 0; + background-color: #fff; + display: flex !important; + flex-direction: column !important; + justify-content: center !important; + align-items: center !important; + font-size: 26rpx; +} +.share::after{ + border: none; + padding: 0; + margin: 0; + width: 0; + height: 0; +} \ No newline at end of file diff --git a/components/base/navbar.vue b/components/base/navbar.vue new file mode 100644 index 0000000..34d6fee --- /dev/null +++ b/components/base/navbar.vue @@ -0,0 +1,143 @@ + + + + + + \ No newline at end of file diff --git a/components/base/tabbar.vue b/components/base/tabbar.vue new file mode 100644 index 0000000..e86c4b1 --- /dev/null +++ b/components/base/tabbar.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/components/config/PrivacyAgreementPoup.vue b/components/config/PrivacyAgreementPoup.vue new file mode 100644 index 0000000..6eda2c6 --- /dev/null +++ b/components/config/PrivacyAgreementPoup.vue @@ -0,0 +1,169 @@ + + + + + \ No newline at end of file diff --git a/components/config/configPopup.vue b/components/config/configPopup.vue new file mode 100644 index 0000000..ef2d21c --- /dev/null +++ b/components/config/configPopup.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/components/config/customerServicePopup.vue b/components/config/customerServicePopup.vue new file mode 100644 index 0000000..4937467 --- /dev/null +++ b/components/config/customerServicePopup.vue @@ -0,0 +1,122 @@ + + + + + \ No newline at end of file diff --git a/components/user/productList.vue b/components/user/productList.vue new file mode 100644 index 0000000..ad16f79 --- /dev/null +++ b/components/user/productList.vue @@ -0,0 +1,112 @@ + + + + + \ No newline at end of file diff --git a/components/userShop/userShopCommission.vue b/components/userShop/userShopCommission.vue new file mode 100644 index 0000000..be66e89 --- /dev/null +++ b/components/userShop/userShopCommission.vue @@ -0,0 +1,130 @@ + + + + + \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000..4175d2b --- /dev/null +++ b/config.js @@ -0,0 +1,56 @@ + +import Vue from 'vue' +import api from '@/api/api.js' +import utils from './utils/utils.js' + +import uvUI from '@/uni_modules/uv-ui-tools' +Vue.use(uvUI); + +// 当前环境 +const type = 'dev' + + +// 环境配置 +const config = { + dev : { + baseUrl : 'http://www.gcosc.fun:82', + }, + prod : { + baseUrl : 'http://xxx.xxx.xxx/xxx', + } +} + + +// 默认配置 +const defaultConfig = { + mapKey : 'XMBBZ-BCPCV-SXPPQ-5Y7MY-PHZXK-YFFVU', + aliOss: { + url: 'https://image.hhlm1688.com/', + config: { + //桶的地址 + region: 'oss-cn-guangzhou', + //id + accessKeyId: 'LTAI5tQSs47izVy8DLVdwUU9', + //密钥 + accessKeySecret: 'qHI7C3PaXYZySr84HTToviC71AYlFq', + //桶的名字 + bucket: 'hanhaiimage', + endpoint: 'oss-cn-shenzhen.aliyuncs.com', + } + }, +} + + +uni.$uv.setConfig({ + // 修改$uv.config对象的属性 + config: { + // 修改默认单位为rpx,相当于执行 uni.$uv.config.unit = 'rpx' + unit: 'rpx' + }, +}) + +Vue.prototype.$config = utils.deepMergeObject(defaultConfig, config[type]) + +Vue.prototype.$api = api + +export default Vue.prototype.$config \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..f971a7f --- /dev/null +++ b/main.js @@ -0,0 +1,45 @@ +import App from './App' + +// #ifndef VUE3 +import Vue from 'vue' + +import './uni.promisify.adaptor' + +Vue.config.productionTip = false + +App.mpType = 'app' + +import store from '@/store/store' + +import './config' +import './utils/index.js' + +import mixinConfigList from '@/mixins/configList.js' + +Vue.mixin(mixinConfigList) + +//组件注册 +import configPopup from '@/components/config/configPopup.vue' +import navbar from '@/components/base/navbar.vue' + +Vue.component('configPopup',configPopup) +Vue.component('navbar',navbar) + +const app = new Vue({ + ...App, + store, +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { + createSSRApp +} from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..ea42a21 --- /dev/null +++ b/manifest.json @@ -0,0 +1,105 @@ +{ + "name" : "unapp模板", + "appid" : "__UNI__197A38F", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : { + "maps" : {} + } + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "wxe7ae8cbe1673834c", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true, + "permission" : { + "scope.userLocation" : { + "desc" : "你的位置信息将用于小程序位置接口的效果展示" + }, + "scope.userFuzzyLocation" : { + "desc" : "你的位置信息将用于小程序位置接口的效果展示" + } + }, + "requiredPrivateInfos" : [ "chooseLocation", "getLocation" ] + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "2", + "h5" : { + "sdkConfigs" : { + "maps" : { + "qqmap" : { + "key" : "XMBBZ-BCPCV-SXPPQ-5Y7MY-PHZXK-YFFVU" + } + } + }, + "devServer" : { + "https" : false, + "proxy" : { + "/ws/geocoder/v1/" : { + "target" : "https://apis.map.qq.com", + "changeOrigin" : true + }, + "/ws/location/v1/" : { + "target" : "https://apis.map.qq.com", + "changeOrigin" : true + } + } + } + } +} diff --git a/mixins/configList.js b/mixins/configList.js new file mode 100644 index 0000000..a79666f --- /dev/null +++ b/mixins/configList.js @@ -0,0 +1,47 @@ + + +import { mapState } from 'vuex' +export default { + data() { + return { + // 默认的全局分享内容 + Gshare: { + // title: '三只青蛙', + path: '/pages/index/index', // 全局分享的路径,比如 首页 + // imageUrl: '/static/image/login/logo.png', // 全局分享的图片(可本地可网络) + } + } + }, + computed: { + ...mapState(['configList', 'userInfo', 'riceInfo']), + }, + // 定义全局分享 + // 1.发送给朋友 + onShareAppMessage(res) { + let o = { + title : this.configList.logo_name, + ...this.Gshare, + } + if(this.userInfo.id){ + if(this.Gshare.path.includes('?')){ + o.path += '&shareId=' + this.userInfo.id + }else{ + o.path += '?shareId=' + this.userInfo.id + } + } + return o + }, + //2.分享到朋友圈 + onShareTimeline(res) { + let o = { + ...this.Gshare, + title : this.configList.logo_name, + } + if(this.userInfo.id){ + o.path = this.Gshare.path + '?shareId=' + this.userInfo.id + } + return o + }, + methods: { + } +} \ No newline at end of file diff --git a/mixins/list.js b/mixins/list.js new file mode 100644 index 0000000..23bb70e --- /dev/null +++ b/mixins/list.js @@ -0,0 +1,78 @@ +/** + * 处理查询参数 + * @param {Object} self - 组件实例 + * @param {Object} queryParams - 额外的查询参数 + * @returns {Object} 合并后的查询参数 + */ +function query(self, queryParams){ + // 深度合并对象 + return self.$utils.deepMergeObject( + self.$utils.deepMergeObject(self.queryParams, + (self.beforeGetData && self.beforeGetData()) || {}), + queryParams) +} + +/** + * 列表数据加载混入 + * 提供列表数据的加载、分页、下拉刷新、上拉加载更多等功能 + */ +export default { + data() { + return { + queryParams: { + pageNo: 1, + pageSize: 10, + }, + total : 0, + list : [], + } + }, + // 下拉刷新 + onPullDownRefresh() { + this.getData() + }, + // 上拉加载更多 + onReachBottom() { + this.loadMoreData() + }, + // 页面显示时加载数据 + onShow() { + this.getData() + }, + methods: { + /** + * 获取列表数据 + * @param {Object} queryParams - 查询参数 + * @returns {Promise} 返回Promise对象 + */ + getData(queryParams){ + return new Promise((success, error) => { + if(!this.mixinsListApi){ + return console.error('mixinsListApi 缺失'); + } + this.$api(this.mixinsListApi, + query(this, queryParams), res => { + uni.stopPullDownRefresh() + if(res.code == 200){ + success(res.result) + // 更新列表数据 + this[this.mixinsListKey || 'list'] = res.result.records || res.result + // 更新总数 + this.total = res.result.total || res.result.length + // 调用数据加载完成的回调 + this.getDataThen && this.getDataThen(res.result.records, res.result.total, res.result) + } + }) + }) + }, + /** + * 加载更多数据 + */ + loadMoreData(){ + if(this.queryParams.pageSize < this.total){ + this.queryParams.pageSize += 10 + this.getData() + } + }, + } +} \ No newline at end of file diff --git a/mixins/order.js b/mixins/order.js new file mode 100644 index 0000000..b1650dd --- /dev/null +++ b/mixins/order.js @@ -0,0 +1,70 @@ + + +export default { + data() { + return { + } + }, + computed: { + }, + methods: { + // 立即支付 + toPayOrder(item){ + let api = '' + + // if([0, 1].includes(item.shopState)){ + // api = 'createOrderTwo' + // }else{ + api = 'createSumOrderAgain' + // } + + this.$api(api, { + orderId : item.id, + addressId : item.addressId + }, res => { + if(res.code == 200){ + uni.requestPaymentWxPay(res) + .then(res => { + uni.showToast({ + title: '支付成功', + icon: 'none' + }) + this.getData() + }).catch(n => { + this.getData() + }) + } + }) + }, + // 确认收货 + confirmOrder(item){ + uni.showModal({ + title: '您收到货了吗?', + success : e => { + if(e.confirm){ + this.$api('confirmOrder', { + orderId : item.id, + }, res => { + this.getData() + }) + } + } + }) + }, + // 取消订单 + cancelOrder(item){ + uni.showModal({ + title: '确认取消订单吗?', + success : e => { + if(e.confirm){ + this.$api('cancelOrder', { + orderId : item.id, + }, res => { + this.getData() + }) + } + } + }) + }, + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..136edbc --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "uniapp-project-templates", + "version": "1.0.0", + "description": "{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://gitee.com/huliyong/uniapp-project-templates.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ali-oss": "^6.21.0", + "dayjs": "^1.11.12" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..11693b1 --- /dev/null +++ b/pages.json @@ -0,0 +1,84 @@ +{ + "pages": [{ + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/index/order", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/index/category", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/index/center", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/index/cart", + "style": { + "navigationBarTitleText": "" + } + } + ], + "preloadRule": { + "pages/index/index": { + "network": "all", + "packages": ["pages_order"] + } + }, + "subPackages": [{ + "root": "pages_order", + "pages": [{ + "path": "order/orderDetail" + }, + { + "path": "mine/purse" + }, + { + "path": "mine/runningWater" + }, + { + "path": "mine/address" + }, + { + "path": "product/productDetail" + }, + { + "path": "order/refundsOrExchange" + }, + { + "path": "auth/wxLogin" + }, + { + "path": "auth/wxUserInfo" + }, + { + "path": "auth/loginAndRegisterAndForgetPassword" + }, + { + "path": "mine/help" + }, + { + "path": "mine/promotion" + } + ] + }], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "酒店桌布", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8", + "navigationStyle": "custom" + }, + "uniIdRouter": {} +} \ No newline at end of file diff --git a/pages/index/cart.vue b/pages/index/cart.vue new file mode 100644 index 0000000..381c5b0 --- /dev/null +++ b/pages/index/cart.vue @@ -0,0 +1,260 @@ + + + + + \ No newline at end of file diff --git a/pages/index/category.vue b/pages/index/category.vue new file mode 100644 index 0000000..a4a64b0 --- /dev/null +++ b/pages/index/category.vue @@ -0,0 +1,191 @@ + + + + + \ No newline at end of file diff --git a/pages/index/center.vue b/pages/index/center.vue new file mode 100644 index 0000000..4d30c46 --- /dev/null +++ b/pages/index/center.vue @@ -0,0 +1,353 @@ + + + + + \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..65effe5 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,412 @@ + + + + + diff --git a/pages/index/order.vue b/pages/index/order.vue new file mode 100644 index 0000000..24bdbb6 --- /dev/null +++ b/pages/index/order.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/pages_order/auth/loginAndRegisterAndForgetPassword.vue b/pages_order/auth/loginAndRegisterAndForgetPassword.vue new file mode 100644 index 0000000..7de7898 --- /dev/null +++ b/pages_order/auth/loginAndRegisterAndForgetPassword.vue @@ -0,0 +1,514 @@ + + + + + + \ No newline at end of file diff --git a/pages_order/auth/wxLogin.vue b/pages_order/auth/wxLogin.vue new file mode 100644 index 0000000..292f9d1 --- /dev/null +++ b/pages_order/auth/wxLogin.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/pages_order/auth/wxUserInfo.vue b/pages_order/auth/wxUserInfo.vue new file mode 100644 index 0000000..50c988f --- /dev/null +++ b/pages_order/auth/wxUserInfo.vue @@ -0,0 +1,133 @@ + + + + + \ No newline at end of file diff --git a/pages_order/components/address/addressList.vue b/pages_order/components/address/addressList.vue new file mode 100644 index 0000000..b75730b --- /dev/null +++ b/pages_order/components/address/addressList.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/pages_order/components/address/redactAddress.vue b/pages_order/components/address/redactAddress.vue new file mode 100644 index 0000000..e11d971 --- /dev/null +++ b/pages_order/components/address/redactAddress.vue @@ -0,0 +1,220 @@ + + + + + \ No newline at end of file diff --git a/pages_order/components/product/submit.vue b/pages_order/components/product/submit.vue new file mode 100644 index 0000000..e874e59 --- /dev/null +++ b/pages_order/components/product/submit.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/pages_order/components/product/submitUnitSelect.vue b/pages_order/components/product/submitUnitSelect.vue new file mode 100644 index 0000000..8d228a5 --- /dev/null +++ b/pages_order/components/product/submitUnitSelect.vue @@ -0,0 +1,367 @@ + + + + + diff --git a/pages_order/mine/address.vue b/pages_order/mine/address.vue new file mode 100644 index 0000000..65f82d7 --- /dev/null +++ b/pages_order/mine/address.vue @@ -0,0 +1,213 @@ + + + + + \ No newline at end of file diff --git a/pages_order/mine/help.vue b/pages_order/mine/help.vue new file mode 100644 index 0000000..23dc94a --- /dev/null +++ b/pages_order/mine/help.vue @@ -0,0 +1,172 @@ + + + + + \ No newline at end of file diff --git a/pages_order/mine/promotion.vue b/pages_order/mine/promotion.vue new file mode 100644 index 0000000..53cf18a --- /dev/null +++ b/pages_order/mine/promotion.vue @@ -0,0 +1,283 @@ + + + + + \ No newline at end of file diff --git a/pages_order/mine/purse.vue b/pages_order/mine/purse.vue new file mode 100644 index 0000000..fe7dd19 --- /dev/null +++ b/pages_order/mine/purse.vue @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/pages_order/mine/runningWater.vue b/pages_order/mine/runningWater.vue new file mode 100644 index 0000000..a14a621 --- /dev/null +++ b/pages_order/mine/runningWater.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/pages_order/order/orderDetail.vue b/pages_order/order/orderDetail.vue new file mode 100644 index 0000000..8ca27b7 --- /dev/null +++ b/pages_order/order/orderDetail.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/pages_order/order/refundsOrExchange.vue b/pages_order/order/refundsOrExchange.vue new file mode 100644 index 0000000..9ea20e6 --- /dev/null +++ b/pages_order/order/refundsOrExchange.vue @@ -0,0 +1,353 @@ + + + + + \ No newline at end of file diff --git a/pages_order/product/productDetail.vue b/pages_order/product/productDetail.vue new file mode 100644 index 0000000..43d797e --- /dev/null +++ b/pages_order/product/productDetail.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/pages_order/static/address/icon.png b/pages_order/static/address/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..63955019b3acbc16d89118e5c35166c16d063cdb GIT binary patch literal 4586 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 U(t7@~iU0rr07*qoM6N<$g31`yL;wH) literal 0 HcmV?d00001 diff --git a/pages_order/static/address/selectIcon.png b/pages_order/static/address/selectIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..12514747a8e99a5c19cdc3ba66699b1633796794 GIT binary patch literal 1366 zcmV-c1*!UpP)Px)5J^NqR9Hu?muYNNRTRhn|NGv&DbNiR5EGTOBnSfOOkLs!6-|_)DG+LhMT`N< z2S^$Of*4V#n5x8*keCom5JjMY84Ai$)L8i-ar#Fr+WX09+Trp0JkH1JsBX`T|iWog|?6pY9iy;1osHfOs$s zP)`v-JIGaLPH-(tj$cdE?*SD5=%#-IcRiqzW?v(i2D=(#)7+zpIHW;0X? zVAZ|Cy7h@ew&tuXU*iR$qqcG2fvWN5Gml=MB!*GfJ4`|XT&CcPfEFPSgB;jvlTd1J z2CaGb&HDN8Zs6^@QNt|h*9gI|6v|fs)S8xB$H@(+x@4~JEXwa6Q4^Gs#SnS{7>tmhV{7S;|Nc49~LL25kpXl9*l*oOcb*Eo3<0sU3WW)WHx#heC~sPpPAcz|k$TTyyPbPMJdp$x&Sxax zjQ}tc4lioaZ@YcRYBL4K z$5TPkQ?tvPPdYA9@mc~5Z7nWPhHRz7q{zUDo2HUiF(~g~tZsMeCGVvN#+&xlo6iB< z10X8{NT;Z1io9;z&fme=2ZM?F&YSnnqI}y{^8r+63=~wGHrH@w<5lM?lEPxpKW?N+ zbFBa`qze_uR+qAuvFz8gsdOA8jMpl! za&0SI0djS(Kw&E(^9&U3O7$nk@me?;4f#Ez75E8=(iG5$qAXDTZ*Abqr$c>ZB4tXu zCr~`KXUasl9*~?QgGyGJma1W?bCaairHMk~FV3^6D*=Ak<4mw$pq5#_hS+wV*4Jl* zT~Px#1am@3R0s$N2z&@+hyVZuO-V#SRCt{2oUw}}MHGiW^~4S?n9Mm?xDJHf%n5`w zIM@S&3(vqnFxb$)$Ad+znC?yi2X zW={KqVV3HhdOg3cdR6sa)xgZm%*@Qp%*@RHk#}}|10B@BA+Q9h?R%u%zBWJuTyFnv z%iiJ*`y${1I023j(ZXL`zy+*N?3Xc?$TkQXVL?=wB!799bFh5^#y$O;Rnx8qHQ}pc#di zfcKU1ma-wIfbI*mdmM$AfcKR0wUfOR7fN|;QF-YW7@X{-&}^EF#9jhwqwlp+?#W+D z`QG}#3SB_g*qlNtIz2Xh@CIH2?i<>ib1wzlS%xfu+e0la;4WHc%I0L3;x&k9H)i6v zN21v@@yDeF{Lsl>idre(YXP;9&uk4k0&Pxek~{ViP>Z+Kl*!0Nmgp_eBqr!3U_c*C zPMmCZp@psD{+h{nhO@LasA)hm!2&&?YnCha6fl(mJ9V@hd7QXr7S!+*Fpyrzdv@hV zq;oOB%8++b=?V$$cTvCgKbD*T4-(f?`I6Ci3)qs5{?^-fD-rv4d_4tzGqMGgNvvO! z-Z)urUsvQi_66eeQVIM9$w9x$w9!ck0b69$TcIb|KY`D{frEA;VWTXE>!3N^h_nDxxKB;z9WhmK&s19iew; zE8>>6KRk_;77*l%{f&QM;T&i2pnMlzlAh#R6OiP3@G?+JK{iH5 zup@^1RaozQ}RSz*5)E82_L{>(Z4*>IylDes+7=Lo2U>O)3d`$G1C#2f*;mO!mi{S-l1fDubgPi x6_SivBJs0dfuAz!**Bi^-~3)PGcz-8`~zj!4V2OTS|9)b002ovPDHLkV1lfoum=DD literal 0 HcmV?d00001 diff --git a/pages_order/static/auth/wx.png b/pages_order/static/auth/wx.png new file mode 100644 index 0000000000000000000000000000000000000000..38858c0a0595421eb2f3463a54230cb2c49397f5 GIT binary patch literal 453 zcmV;$0XqJPP)Px$e@R3^R5(wilshj4K^TUgH}1DWs3i)Cgn~kYN{FcZ2R}fqIB|&(T7{NGttAnO zib^!%k|@wT0$V^!NoYgTRH?q)x1xZV zbpW>+4jxDvNz)aE8_*6s0CfqlVM%eF zvO0bQR)OV|*S$-scNzyi0s2!8i~{=^Q&y1F;J~g}i3JEjYr*rUJ?N06Bd<1llE%%f z;H9W9>VOGgr;MW};Khr50?%RlMcZdUkEc2JC$AScO@Ma-*BR3g%VKaifl00BIw4;n zc-MEF1DYkxltTW{>oq?dmvd!i&h>pp*Nee4&SnCKY3c?pQsDE!FJYnB#~EG3GBaBQ vT-y9~1#|(8lH7z=4*n%w)j`ZTE?)W#u@8X3@On6b00000NkvXXu0mjfWs1LR literal 0 HcmV?d00001 diff --git a/pages_order/static/help/uploading.png b/pages_order/static/help/uploading.png new file mode 100644 index 0000000000000000000000000000000000000000..d558b9ed8492aec8cd11f12b79331ab51f0e3abc GIT binary patch literal 7380 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 literal 0 HcmV?d00001 diff --git a/pages_order/static/product/like.png b/pages_order/static/product/like.png new file mode 100644 index 0000000000000000000000000000000000000000..fecdaefdec490c23406706693313dcf56ea97fcb GIT binary patch literal 1128 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 TDoWti00000NkvXXu0mjf!F8`Q literal 0 HcmV?d00001 diff --git a/static/image/cart/2.png b/static/image/cart/2.png new file mode 100644 index 0000000000000000000000000000000000000000..64b1c45f7b04ddc6b508641919612f8de7fcc03e GIT binary patch literal 5540 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 literal 0 HcmV?d00001 diff --git a/static/image/center/10.png b/static/image/center/10.png new file mode 100644 index 0000000000000000000000000000000000000000..151633f42bdd896b9171b7286b4f853f749b0977 GIT binary patch literal 45856 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 \ No newline at end of file diff --git a/static/image/center/2.png b/static/image/center/2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0bedcd94bfe351a6f1e75ca1f36c648046f44b GIT binary patch literal 6235 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
7Qy#mD<#^N3>q8 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 literal 0 HcmV?d00001 diff --git a/static/image/home/address-icon.png b/static/image/home/address-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..51a11d26413957ef4c73ccc2cd4ae62b3834e977 GIT binary patch literal 1407 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 LNkvXXu0mjfn*5;F literal 0 HcmV?d00001 diff --git a/static/image/product/favorable.png b/static/image/product/favorable.png new file mode 100644 index 0000000000000000000000000000000000000000..edae056ac9eac6b684fdf44a4cd73d3cb25596e3 GIT binary patch literal 282 zcmV+#0p!00001b5ch_0Itp) z=>Px#)Ja4^R7gwhmb(hVKoCW5@Spqve^68qEQ}&p*x9Ous9=ovsBG+FP>?7HY23|Z zB&kHponj%`ehzcy&Mxc3QCLHY8EiX5P;LWs@WeV}@WYAkA&U_OLFqMs9=S-*CqXJ; zt#GoKAeoNA&!`x}s^0?nOHtVjW^KZyuu#@z!a{>I#uRU*haHeN2Z)S^_YJUirL!hg zw+`B^OJS1I|cj=qWCU#+#mg?hADy`cwf&|dcb=0C01?NY5&oQ>$-n8KKm gC%j#ml78!h4`L9O113>V0000007*qoM6N<$g2SwLa{vGU literal 0 HcmV?d00001 diff --git a/static/image/tabbar/cart-a.png b/static/image/tabbar/cart-a.png new file mode 100644 index 0000000000000000000000000000000000000000..b48261cb224d75d5c504638882f567dea05a4041 GIT binary patch literal 958 zcmV;v13~Px&cu7P-R9HvN*k6bhRUE+a?{8)nd@$I;NKw$B$S8MGq*U%zLV$ zQg)x`qKq+>Ct-a|xS6fu@Gam~%LJ~7$HqL!8Zb8et}xgLA#hFZ^R8SbEP`x=D~hZE zBZFo&9t#`#E^sL?Fbh`%ITLslcqapJ!1ehe4=@idFY?JhXc$x&S6J8(p^Ul#J8i%s zxID=-2l=1eP&&*IpIpzi&oEc>uBuTJtVR;;Lqgqjw^IpKVXADl$=K@v+ zO0wk5ub}>MeFo+fFf{3;xvGLHyFSm&DPUwc0en_NDaUZ~oo%fz5);P4)jpqJ>SJ?v z@w8#cfuF67wGrSbYbD@v;X#rPl;n)k&jiA2Z5T4EDtzeqoNEbK9nDe1m`Hj&t=$xK z0-PMmTo{so$(DhgfE3M<`yZ?(o;C~$d@iKZ%x#pfoJkJny%y17UWr`}L3)IpL>YA^ zIo+&&A>gB723(gv>bqB!Q7^}#UP~;Ch3hls)AYTw>K6irhCpC*qi%APmnGo;tS$@< zV*;NvtRL~J{J?)LPcxO(BmpdK0-QBP)W_9b1Uyx&%Ew;7*KGmA5|>0+*AVFNx_r+~ z%NK0AZF7W`a$)w(MWHU%5!T1buk{FppFE#Uwh^j^p}6s6-*jy+1WbQu!?qZX0*jNq zEO6fO*p=tDG^rnsuv0WWg!QNS;5XOfBNPx&b4f%&R9HvN*iVQ}Q5XR5@4M$tSx^=VQ7AH^Bov{X<~uV)Q7kBuSXdAXB|AkS zgls5N6d@K0ndY47C{qZf5DN<%rBKRS%;KH-%+Y<*?RodzbKksqZ|?4O&!68t-#dT4 zgD}A#oZvoa2~caj9uY4BKqn&JjiTs~l(G~uIHN#o?Ih>iRz#eXuE@+KA;e=Tai!Fm5MUrK2ssMWTCa_w=sq*g$UyWG(f&MOL0m2}a~4}`W9Qr- z0Qfg)nE91bYE>Sv+3)KvGsc*A0I)Ra)X(CV%?4z(hlrn}C_0-5ybb{ST7|0a2N6Hi z1!}DiBI1>H0h#$%U0{EI|B5JzUbhPf0JrM`t+kVriPA3P#@xMlWZC!t0E^oo{3(Q( znG4ifKS0E7Z2(>)q5~noqlkE})j(!mr<5AZ1sY>Ek8FXDS`7R~M6-RLxj<{}H0Rup z76UI6(UBmaFJz4Q4gk|zg&ZCpUe?{+?RT;K5%h($){hZ!Q;UEfiD*fsuiOwPBj}G= z$65hI#JyczT{nsX{jvT2I0H+}d_gI7BHd5W2wH19opYa374H$zj&TP6Yd#2=gxQ}B zCnu=4M6_Z;0kzhHh`1&}m56A{gaR64E&;&d6zYOcNt=W$BjOt(>Z@+ANQgH8z|$sy zYBs~nQYrPU@FejSk{rdKY!;3qawiepZ3vhkJIm$r4Mgn>+#AR7)vWr3 zfJu(>qDFXwl6q_HT<6^T)OuR^?#%jyfLiN^h`6Ozq=XRjq?BLlMbQ}J_t-rd^%qDf zzcjqeB)f?R%&FButtFzmT-8ND_3Pb4bZbn&k^i4T#I9OE=iH*6o}SP3MzG$ojhR;~ zrT)9QC=_C24Ef_>HG-L+D5ZRAQ1>y$WG(iYdwU^Z5@vsjIS&A{0Ki{p-V;I`2)Qlw z^#=w9_A|3j!lwG)BgxS~9LKw)l>XHI-%}V^X~A0SI~Z!@YS`~e05A;zN_ijFFfcEi b&3gYAt|3`bYVyU{00000NkvXXu0mjfq364k literal 0 HcmV?d00001 diff --git a/static/image/tabbar/category-a.png b/static/image/tabbar/category-a.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd7bc6cdd2f18492ee0283c2a0063111728bc6c GIT binary patch literal 1139 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 literal 0 HcmV?d00001 diff --git a/static/image/tabbar/home.png b/static/image/tabbar/home.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7accb206c7592511a22a7ccc48a44c6d926cfb GIT binary patch literal 2208 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 S?SxDK00005OUafkYqmlSEl)+V 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 SYs}WS&%*SCNx89m_ { + const configList = { + ...state.configList, + } + if (res.code == 200) { + res.result.forEach(n => { + configList[n.keyName] = n.keyContent; + configList[n.keyName + '_keyValue'] = n.keyValue; + }); + } + state.configList = configList + uni.$emit('initConfig', state.configList) + }) + + // let config = ['getPrivacyPolicy', 'getUserAgreement'] + // config.forEach(k => { + // api(k, res => { + // if (res.code == 200) { + // state.configList[k] = res.result + // } + // }) + // }) + }, + // 微信登录 + login(state){ + uni.showLoading({ + title: '登录中...' + }) + uni.login({ + success(res) { + if(res.errMsg != "login:ok"){ + return + } + + api('wxLogin', { + code : res.code + }, res => { + + uni.hideLoading() + + if(res.code != 200){ + return + } + + state.userInfo = res.result.userInfo + uni.setStorageSync('token', res.result.token) + + if(!state.userInfo.nickName || !state.userInfo.headImage){ + uni.navigateTo({ + url: '/pages_order/auth/wxUserInfo' + }) + }else{ + uni.navigateBack(-1) + } + }) + } + }) + }, + // 获取用户个人信息 + getUserInfo(state){ + api('getInfo', res => { + if(res.code == 200){ + state.userInfo = res.result + } + }) + }, + // 退出登录 + logout(state){ + uni.showModal({ + title: '确认退出登录吗', + success(r) { + if(r.confirm){ + state.userInfo = {} + state.role = false + uni.removeStorageSync('token') + uni.reLaunch({ + url: '/pages/index/index' + }) + } + } + }) + }, + }, + actions: {}, +}) + +export default store \ No newline at end of file diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js new file mode 100644 index 0000000..47fbce1 --- /dev/null +++ b/uni.promisify.adaptor.js @@ -0,0 +1,10 @@ +uni.addInterceptor({ + returnValue (res) { + if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) { + return res; + } + return new Promise((resolve, reject) => { + res.then((res) => res[0] ? reject(res[0]) : resolve(res[1])); + }); + }, +}); \ No newline at end of file diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..5dcc31f --- /dev/null +++ b/uni.scss @@ -0,0 +1,96 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ +/* 颜色变量 */ +$uni-color: #FD5100; + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16px; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; + + +.uni-color-btn{ + border-radius: 40rpx; + padding: 20rpx; + margin: 40rpx; + background: $uni-color; + color: #fff; + text-align: center; + font-size: 28rpx; +} +.uni-uncolor-btn{ + border-radius: 40rpx; + padding: 20rpx; + margin: 40rpx; + border: 1px solid $uni-color; + color: $uni-color; + text-align: center; + font-size: 28rpx; +} \ No newline at end of file diff --git a/uni_modules/uv-action-sheet/changelog.md b/uni_modules/uv-action-sheet/changelog.md new file mode 100644 index 0000000..ab3545e --- /dev/null +++ b/uni_modules/uv-action-sheet/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-07-02) +uv-action-sheet 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/actionSheet.html +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-action-sheet 底部操作菜单 diff --git a/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js b/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js new file mode 100644 index 0000000..8adffee --- /dev/null +++ b/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js @@ -0,0 +1,50 @@ +export default { + props: { + // 标题,有值则显示,同时会显示关闭按钮 + title: { + type: String, + default: '' + }, + // 选项上方的描述信息 + description: { + type: String, + default: '' + }, + // 数据 + actions: { + type: Array, + default: () => [] + }, + // 取消按钮的文字,不为空时显示按钮 + 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 @@ +

@w3t zc>qgc|3(k@u4_FuVxMouw^(%kjRl|``yxft@0`ab3i>`e4ZLQiU89xP7PZm=(}^;E zG`owX(3jS84<=L1(mlI!QeSHhVGzyIZ*N-pJd7Ow2GHEpVGAAa9OG*0;TJLwzlO5= za(u8iplRp*%$C^Jt93hcVuk0>Q(o2R-9ZAcDoix1Z|LjkcsSE{h(4$ zW_p_1#GVzB7<>cL;ZA;ly{b2|DPf{Nygm~<3L<5&!IO(77X2WNlh47_T}Z))T2E)q z-v>dB8i}WxYe4~pePqK%u2;OZQYMx&w>MK3D!h93&LZBim60TB#cg~eM0kV%7m1{; zLlhB(^*;YcCw4)(ce^#Pq@9j+3;u0;F-rhUPw1|{OiZ#M2XrSjf-xNNlmbw%pfs|-FF;aWPBi= z^PW2%F_`2ugCFmb@ZtqqN$qhhHvqL~S6$y!w&W6xR!g}NLSk3EvR-wh)(W6^X^3N% zVBxoHr^#_VNL(Hi?$^`!bEy1P8n|8nbHxchDXDZbkosB5#qe(IzhlO_pF#}hB?)$C z?ueRC;mbCsCBhgzmgFIgV`*{3P9XJTtBL5_)>fqE4iA7Uo`biTPbq8l+y;i51*FzZm#ZA>a&FyTkP+*>_jpO`*>${c3! zs??qap~Nz{{v#s)L^_F}+>QoKDpXQobf>DS8lCYnXelnoN8h?0cyt3PTh^K~*7`N? zhUF6M3R=ntD;SkM)ISuiD(K_Er6OGS$PZqyP-v~~SE_uSr@Kg2zryS;vBdlDXqJ9g zv-iD{_(peBFG<3%2EcW$&`2b*l0)8T<>ZMcmZtOU5(`61xI*|dnZ-_2LD!I!swAP3 z_kOm2QMta}&^?*`uyjCoQz6z2^z&0w)|K(HT1P+8z`Mh&feH{O3Ac%e=Nx{C9nBmC z@&fGGtcZhIMQ+Ibx14r43a(!YoEd%Dnh>}cunY?iH%KOII4Ai>7XHqT=7ep{!&fPw zDRQ>HX<3(bP?(99(bR4rG;`K(r2r;KNlZgT$(n@m^4~1OU>=!Cz^oYIP$ zS72A(HsyZh!X1cY(-XGGV;FTL4ifVc&sFsN+e+E)FL<&Y!DAJ*WezHFiO!zpY1?Rc zRJ*6T`gw3pllO=}bO$gyC{wQBICUy@ytOtv%rH-vwGChG6SBk+n+z51*LpYO4&XEo zYHhzG>JO0y@qUjeb6R|(92<5qsiyr1kS&W6eT~WY+GgB@mpbM0CXyFCM)V1A!q*OdY}q~CFPTQd+9&#DD)_PlBNuF$|@!WFT~ z8}vm>r-C@cf~*wUtE67ppKWAc`tiv!4V^#QkUu9Z3i(XOL5&8Jhg+oO)k*bdQgPAp zKAi+B#HfLEMw9teGc_6WC*r2m3KZ$4H2`NP)9QJ0EI)+1UJYDUgFpZ8Z8@R(7FT|BX0OX@1ZGzvgf_3@_pKc>%5 zC^9YQbMlJ+8e007nGN*cH7m)(H0?Mi?@7|rqRKJIY6&>=!LgP8#yKbMmTx z34yHI9DF-FKVK#@8IMo0seGEsL_B4*-*LM%Ty0T#jx4JIW>sHy8hAYl_iMUd^0{wB y;0@-Q^b!e3%PFsK{UX3YoVD=8{eNFZ0|8^cD$jpU^*wG204;TWwFVV%?Ee5OKjpjt literal 0 HcmV?d00001 diff --git a/static/image/center/3.png b/static/image/center/3.png new file mode 100644 index 0000000000000000000000000000000000000000..8b521acc50a68450e8f9ab4065a84ad1b267b6fb GIT binary patch literal 6082 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 Z@L$QN9Qtl}&$Ivl002ovPDHLkV1l-KW77Zt literal 0 HcmV?d00001 diff --git a/static/image/center/5.png b/static/image/center/5.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4a8ac51f8ca979ee5605d987f91229c1cfa242 GIT binary patch literal 2887 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 literal 0 HcmV?d00001 diff --git a/static/image/center/6.png b/static/image/center/6.png new file mode 100644 index 0000000000000000000000000000000000000000..9208b064b94754677116d296b3727f1a3e708070 GIT binary patch literal 2123 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 FV1i1+o+|(V literal 0 HcmV?d00001 diff --git a/static/image/center/8.png b/static/image/center/8.png new file mode 100644 index 0000000000000000000000000000000000000000..856616c3e1b68d7bb8d116bb8cfcf36b9a34b516 GIT binary patch literal 2576 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 literal 0 HcmV?d00001 diff --git a/static/image/home/0.png b/static/image/home/0.png new file mode 100644 index 0000000000000000000000000000000000000000..e221211dbbfa8fff7405616a87de7d7369ae09e7 GIT binary patch literal 14285 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 literal 0 HcmV?d00001 diff --git a/static/image/home/1.png b/static/image/home/1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7d3dcc5ab5b8425cca591ddd1a8a64ed5f7336 GIT binary patch literal 13719 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